From 7072f35b7a58b79124de5481c69180f96d5a04ef Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 4 Dec 2024 00:57:04 +0000 Subject: [PATCH] Deployed 580d8e4b with MkDocs version: 1.6.1 --- latest | 1 - sitemap.xml.gz | Bin 127 -> 127 bytes v13/01-canvas-components/index.html | 2747 ------- v13/01.01-flow-editor/index.html | 2862 ------- v13/01.01.01-nodes/index.html | 3036 -------- v13/01.01.02-links/index.html | 2924 ------- v13/01.01.03-comments/index.html | 2880 ------- v13/01.01.04-decorations/index.html | 2732 ------- v13/01.02-palette/index.html | 2779 ------- v13/01.03-context-menu/index.html | 2668 ------- v13/01.04-context-toolbar/index.html | 2671 ------- v13/01.05-toolbar/index.html | 2884 ------- v13/01.06-notification-panel/index.html | 2611 ------- v13/01.07-state-tag/index.html | 2610 ------- v13/01.08-tooltips/index.html | 2695 ------- v13/01.09-panels/index.html | 2679 ------- v13/01.10-common-properties/index.html | 2608 ------- v13/02-set-up/index.html | 2883 ------- v13/03-common-canvas/index.html | 3108 -------- v13/03.02-configuration/index.html | 2744 ------- v13/03.02.01-canvas-config/index.html | 4357 ----------- v13/03.02.02-toolbar-config/index.html | 3071 -------- v13/03.02.03-notification-config/index.html | 2653 ------- v13/03.02.04-context-menu-config/index.html | 2630 ------- v13/03.02.05-keyboard-config/index.html | 2618 ------- v13/03.03-callbacks/index.html | 2846 ------- v13/03.03.01-context-menu-handler/index.html | 3058 -------- .../index.html | 2682 ------- v13/03.03.03-edit-action-handler/index.html | 2754 ------- v13/03.03.04-layout-handler/index.html | 2667 ------- .../index.html | 2671 ------- v13/03.03.06-tip-handler/index.html | 2995 -------- v13/03.03.07-id-generator-handler/index.html | 2857 ------- .../index.html | 2764 ------- v13/03.03.09-click-action-handler/index.html | 2682 ------- v13/03.03.10-action-label-handler/index.html | 2665 ------- v13/03.04-canvas-controller/index.html | 3998 ---------- v13/03.04.01-decorations/index.html | 2822 ------- v13/03.04.02-api-object-structure/index.html | 2719 ------- .../index.html | 2768 ------- v13/03.04.05-notification-messages/index.html | 2692 ------- v13/03.04.06-styling-objects/index.html | 2659 ------- v13/03.05-keyboard-support/index.html | 2872 ------- v13/03.06.01-node-customization/index.html | 3416 --------- v13/03.06.02-comment-customization/index.html | 2775 ------- v13/03.06.03-link-customization/index.html | 2905 ------- v13/03.07-external-objects/index.html | 2740 ------- v13/03.08-external-pipeline-flows/index.html | 2857 ------- .../index.html | 2826 ------- v13/03.10-command-stack/index.html | 2765 ------- v13/03.11-internal-actions/index.html | 3111 -------- v13/03.30.01-context-menu-wrapper/index.html | 2718 ------- v13/03.30.02-flow-validation/index.html | 2710 ------- v13/04-common-properties/index.html | 2883 ------- v13/04.01-parameter-definition/index.html | 3059 -------- v13/04.02-callbacks/index.html | 3016 -------- v13/04.03-ui-hints/index.html | 3171 -------- v13/04.04-controls/index.html | 2917 ------- v13/04.05-conditions/index.html | 3148 -------- v13/04.06-custom-components/index.html | 3038 -------- v13/04.07-properties-controller/index.html | 3284 -------- v13/04.08-properties-config/index.html | 2663 ------- v13/05-faq/index.html | 2776 ------- v13/06-contributing/index.html | 2607 ------- v13/06.01-style-guidelines/index.html | 2668 ------- v13/06.02-testing-guidelines/index.html | 2782 ------- v13/404.html | 2513 ------ v13/assets/FlowIcon.png | Bin 4764 -> 0 bytes v13/assets/cc-app-tiny.png | Bin 200567 -> 0 bytes v13/assets/cc-comment-color.gif | Bin 68746 -> 0 bytes v13/assets/cc-comment-elements-dom.png | Bin 250157 -> 0 bytes v13/assets/cc-comment-link.gif | Bin 50450 -> 0 bytes v13/assets/cc-comment-markdown-edit.png | Bin 79971 -> 0 bytes v13/assets/cc-comment-markdown-out.png | Bin 558268 -> 0 bytes v13/assets/cc-comment-reg-edit.png | Bin 24824 -> 0 bytes v13/assets/cc-comment-reg-type.png | Bin 6892 -> 0 bytes v13/assets/cc-comment-resize.gif | Bin 108029 -> 0 bytes v13/assets/cc-comment1.png | Bin 29131 -> 0 bytes v13/assets/cc-comment2.png | Bin 22397 -> 0 bytes v13/assets/cc-context-menu.png | Bin 26866 -> 0 bytes .../cc-context-toolbar-open-overflow.png | Bin 27505 -> 0 bytes v13/assets/cc-context-toolbar.png | Bin 22689 -> 0 bytes v13/assets/cc-decoration-example-link.png | Bin 120906 -> 0 bytes v13/assets/cc-decoration-example-node.png | Bin 17473 -> 0 bytes v13/assets/cc-decoration-label-editable.gif | Bin 35346 -> 0 bytes v13/assets/cc-decoration-link-image.png | Bin 12158 -> 0 bytes v13/assets/cc-decoration-link-jsx.png | Bin 12305 -> 0 bytes v13/assets/cc-decoration-link-label.png | Bin 12792 -> 0 bytes v13/assets/cc-decoration-link-shape.png | Bin 10823 -> 0 bytes v13/assets/cc-decoration-node-image.png | Bin 14659 -> 0 bytes v13/assets/cc-decoration-node-jsx.png | Bin 15468 -> 0 bytes v13/assets/cc-decoration-node-label.png | Bin 15386 -> 0 bytes v13/assets/cc-decoration-node-shape.png | Bin 14766 -> 0 bytes v13/assets/cc-decoration-tooltip.png | Bin 19331 -> 0 bytes v13/assets/cc-elements.png | Bin 272773 -> 0 bytes v13/assets/cc-flow-editor-all-select.gif | Bin 271908 -> 0 bytes v13/assets/cc-flow-editor-clipboard.gif | Bin 191103 -> 0 bytes v13/assets/cc-flow-editor-command-stack.gif | Bin 350402 -> 0 bytes v13/assets/cc-flow-editor-create-link.gif | Bin 111245 -> 0 bytes v13/assets/cc-flow-editor-create-node.gif | Bin 260310 -> 0 bytes .../cc-flow-editor-linked-nodes-select.gif | Bin 273057 -> 0 bytes v13/assets/cc-flow-editor-move.gif | Bin 573859 -> 0 bytes v13/assets/cc-flow-editor-region-select.gif | Bin 407817 -> 0 bytes v13/assets/cc-flow-editor-zoom-to-fit.gif | Bin 629128 -> 0 bytes v13/assets/cc-flow-editor-zoom.gif | Bin 272413 -> 0 bytes v13/assets/cc-flow-editor.png | Bin 236541 -> 0 bytes v13/assets/cc-link-assoc.png | Bin 27236 -> 0 bytes v13/assets/cc-link-comment.png | Bin 29932 -> 0 bytes v13/assets/cc-link-elements-dom.png | Bin 303386 -> 0 bytes .../cc-link-freeform-curve-separation.gif | Bin 867484 -> 0 bytes v13/assets/cc-link-freeform-curve.png | Bin 31721 -> 0 bytes .../cc-link-freeform-elbow-self-ref.png | Bin 15617 -> 0 bytes v13/assets/cc-link-freeform-elbow.png | Bin 29782 -> 0 bytes v13/assets/cc-link-freeform-parallax.png | Bin 31090 -> 0 bytes .../cc-link-freeform-straight-separation.gif | Bin 420704 -> 0 bytes v13/assets/cc-link-freeform-straight.gif | Bin 455424 -> 0 bytes v13/assets/cc-link-freeform-straight.png | Bin 30610 -> 0 bytes v13/assets/cc-link-mapping-transformer.png | Bin 293132 -> 0 bytes v13/assets/cc-link-multi-ports-connected.png | Bin 117507 -> 0 bytes v13/assets/cc-link-multi-ports-quadrants.png | Bin 74860 -> 0 bytes v13/assets/cc-link-multi-ports.png | Bin 37274 -> 0 bytes v13/assets/cc-link-ports-curve.png | Bin 32743 -> 0 bytes v13/assets/cc-link-ports-elbow-loop.png | Bin 61451 -> 0 bytes v13/assets/cc-link-ports-elbow.png | Bin 30301 -> 0 bytes v13/assets/cc-link-ports-parallax.png | Bin 32642 -> 0 bytes v13/assets/cc-link-ports-straight.png | Bin 32593 -> 0 bytes v13/assets/cc-link-ports.gif | Bin 785154 -> 0 bytes v13/assets/cc-node-elements-dom.png | Bin 510643 -> 0 bytes v13/assets/cc-node-elements-pos.png | Bin 55208 -> 0 bytes v13/assets/cc-node-elements.png | Bin 174528 -> 0 bytes v13/assets/cc-node-filter.png | Bin 60667 -> 0 bytes v13/assets/cc-node-format.png | Bin 162702 -> 0 bytes v13/assets/cc-node-guide1.gif | Bin 68103 -> 0 bytes v13/assets/cc-node-guide2.gif | Bin 75215 -> 0 bytes v13/assets/cc-node-highlight-target.gif | Bin 261953 -> 0 bytes v13/assets/cc-node-image-jsx-app.png | Bin 200122 -> 0 bytes v13/assets/cc-node-image-jsx.png | Bin 13914 -> 0 bytes v13/assets/cc-node-image-svg.png | Bin 8648 -> 0 bytes v13/assets/cc-node-insert-to-link.gif | Bin 171865 -> 0 bytes v13/assets/cc-node-port-custom-resize.png | Bin 9709 -> 0 bytes v13/assets/cc-node-port-custom.png | Bin 8835 -> 0 bytes v13/assets/cc-node-react.png | Bin 53223 -> 0 bytes v13/assets/cc-node-resize.gif | Bin 160705 -> 0 bytes v13/assets/cc-node-supernode-create.gif | Bin 192789 -> 0 bytes v13/assets/cc-node-supernode-full-page.gif | Bin 417118 -> 0 bytes v13/assets/cc-node-supernode-in-place.png | Bin 100512 -> 0 bytes v13/assets/cc-node1.png | Bin 9617 -> 0 bytes v13/assets/cc-node2.png | Bin 16864 -> 0 bytes v13/assets/cc-node3.png | Bin 22613 -> 0 bytes v13/assets/cc-node4.png | Bin 16993 -> 0 bytes v13/assets/cc-node5.png | Bin 19746 -> 0 bytes v13/assets/cc-node6.png | Bin 6822 -> 0 bytes v13/assets/cc-node7.png | Bin 18980 -> 0 bytes v13/assets/cc-notif-icon-error.png | Bin 4727 -> 0 bytes v13/assets/cc-notif-icon-info.png | Bin 4684 -> 0 bytes v13/assets/cc-notif-icon-success.png | Bin 4867 -> 0 bytes v13/assets/cc-notif-icon-warning.png | Bin 4907 -> 0 bytes v13/assets/cc-notification-panel.png | Bin 79527 -> 0 bytes v13/assets/cc-palette-double-click.gif | Bin 165033 -> 0 bytes v13/assets/cc-palette.gif | Bin 294692 -> 0 bytes v13/assets/cc-panels.png | Bin 192931 -> 0 bytes .../cc-pipeline-flow-supernode-diagram.png | Bin 236020 -> 0 bytes v13/assets/cc-state-tag.png | Bin 24838 -> 0 bytes v13/assets/cc-toolbar-action-disabled.png | Bin 4618 -> 0 bytes v13/assets/cc-toolbar-action-dual-closed.png | Bin 16238 -> 0 bytes v13/assets/cc-toolbar-action-dual-open.png | Bin 32625 -> 0 bytes v13/assets/cc-toolbar-action-enabled.png | Bin 4660 -> 0 bytes v13/assets/cc-toolbar-action-jsx-buttons.png | Bin 26545 -> 0 bytes v13/assets/cc-toolbar-action-jsx.png | Bin 17311 -> 0 bytes v13/assets/cc-toolbar-action-kinds.png | Bin 24517 -> 0 bytes .../cc-toolbar-action-selected-menu.png | Bin 26248 -> 0 bytes .../cc-toolbar-action-selected-none.png | Bin 4504 -> 0 bytes v13/assets/cc-toolbar-action-selected.png | Bin 4529 -> 0 bytes .../cc-toolbar-action-sub-menu-open.png | Bin 23395 -> 0 bytes .../cc-toolbar-action-sub-panel-open.png | Bin 31544 -> 0 bytes v13/assets/cc-toolbar-action-text-after.png | Bin 6572 -> 0 bytes v13/assets/cc-toolbar-action-text-before.png | Bin 6476 -> 0 bytes v13/assets/cc-toolbar-action-tooltip.png | Bin 12793 -> 0 bytes v13/assets/cc-toolbar-auto-customize.png | Bin 67869 -> 0 bytes v13/assets/cc-toolbar-divider.png | Bin 5171 -> 0 bytes v13/assets/cc-toolbar-overflow-closed.png | Bin 14006 -> 0 bytes v13/assets/cc-toolbar-overflow-none.png | Bin 15947 -> 0 bytes v13/assets/cc-toolbar-overflow-open.png | Bin 28404 -> 0 bytes v13/assets/cc-toolbar-tooltips.gif | Bin 43579 -> 0 bytes v13/assets/cc-toolbar.png | Bin 9164 -> 0 bytes v13/assets/components.png | Bin 190462 -> 0 bytes v13/assets/cp-example.png | Bin 52509 -> 0 bytes v13/assets/ellipsis-icon.png | Bin 4410 -> 0 bytes v13/assets/faq-react-supernodes.png | Bin 355010 -> 0 bytes v13/assets/flow.svg | 1 - v13/assets/images/favicon.png | Bin 1870 -> 0 bytes v13/assets/javascripts/bundle.83f73b43.min.js | 16 - .../javascripts/bundle.83f73b43.min.js.map | 7 - .../javascripts/lunr/min/lunr.ar.min.js | 1 - .../javascripts/lunr/min/lunr.da.min.js | 18 - .../javascripts/lunr/min/lunr.de.min.js | 18 - .../javascripts/lunr/min/lunr.du.min.js | 18 - .../javascripts/lunr/min/lunr.el.min.js | 1 - .../javascripts/lunr/min/lunr.es.min.js | 18 - .../javascripts/lunr/min/lunr.fi.min.js | 18 - .../javascripts/lunr/min/lunr.fr.min.js | 18 - .../javascripts/lunr/min/lunr.he.min.js | 1 - .../javascripts/lunr/min/lunr.hi.min.js | 1 - .../javascripts/lunr/min/lunr.hu.min.js | 18 - .../javascripts/lunr/min/lunr.hy.min.js | 1 - .../javascripts/lunr/min/lunr.it.min.js | 18 - .../javascripts/lunr/min/lunr.ja.min.js | 1 - .../javascripts/lunr/min/lunr.jp.min.js | 1 - .../javascripts/lunr/min/lunr.kn.min.js | 1 - .../javascripts/lunr/min/lunr.ko.min.js | 1 - .../javascripts/lunr/min/lunr.multi.min.js | 1 - .../javascripts/lunr/min/lunr.nl.min.js | 18 - .../javascripts/lunr/min/lunr.no.min.js | 18 - .../javascripts/lunr/min/lunr.pt.min.js | 18 - .../javascripts/lunr/min/lunr.ro.min.js | 18 - .../javascripts/lunr/min/lunr.ru.min.js | 18 - .../javascripts/lunr/min/lunr.sa.min.js | 1 - .../lunr/min/lunr.stemmer.support.min.js | 1 - .../javascripts/lunr/min/lunr.sv.min.js | 18 - .../javascripts/lunr/min/lunr.ta.min.js | 1 - .../javascripts/lunr/min/lunr.te.min.js | 1 - .../javascripts/lunr/min/lunr.th.min.js | 1 - .../javascripts/lunr/min/lunr.tr.min.js | 18 - .../javascripts/lunr/min/lunr.vi.min.js | 1 - .../javascripts/lunr/min/lunr.zh.min.js | 1 - v13/assets/javascripts/lunr/tinyseg.js | 206 - v13/assets/javascripts/lunr/wordcut.js | 6708 ----------------- .../workers/search.6ce7567c.min.js | 42 - .../workers/search.6ce7567c.min.js.map | 7 - v13/assets/spss-modeler.gif | Bin 2277580 -> 0 bytes v13/assets/stylesheets/main.6f8fc17f.min.css | 1 - .../stylesheets/main.6f8fc17f.min.css.map | 1 - .../stylesheets/palette.06af60db.min.css | 1 - .../stylesheets/palette.06af60db.min.css.map | 1 - v13/css/styles.css | 33 - v13/index.html | 2676 ------- v13/js/links-in-new-tabs.js | 26 - v13/search/search_index.json | 1 - v13/sitemap.xml | 3 - v13/sitemap.xml.gz | Bin 127 -> 0 bytes versions.json | 9 - 241 files changed, 195996 deletions(-) delete mode 120000 latest delete mode 100644 v13/01-canvas-components/index.html delete mode 100644 v13/01.01-flow-editor/index.html delete mode 100644 v13/01.01.01-nodes/index.html delete mode 100644 v13/01.01.02-links/index.html delete mode 100644 v13/01.01.03-comments/index.html delete mode 100644 v13/01.01.04-decorations/index.html delete mode 100644 v13/01.02-palette/index.html delete mode 100644 v13/01.03-context-menu/index.html delete mode 100644 v13/01.04-context-toolbar/index.html delete mode 100644 v13/01.05-toolbar/index.html delete mode 100644 v13/01.06-notification-panel/index.html delete mode 100644 v13/01.07-state-tag/index.html delete mode 100644 v13/01.08-tooltips/index.html delete mode 100644 v13/01.09-panels/index.html delete mode 100644 v13/01.10-common-properties/index.html delete mode 100644 v13/02-set-up/index.html delete mode 100644 v13/03-common-canvas/index.html delete mode 100644 v13/03.02-configuration/index.html delete mode 100644 v13/03.02.01-canvas-config/index.html delete mode 100644 v13/03.02.02-toolbar-config/index.html delete mode 100644 v13/03.02.03-notification-config/index.html delete mode 100644 v13/03.02.04-context-menu-config/index.html delete mode 100644 v13/03.02.05-keyboard-config/index.html delete mode 100644 v13/03.03-callbacks/index.html delete mode 100644 v13/03.03.01-context-menu-handler/index.html delete mode 100644 v13/03.03.02-before-edit-action-handler/index.html delete mode 100644 v13/03.03.03-edit-action-handler/index.html delete mode 100644 v13/03.03.04-layout-handler/index.html delete mode 100644 v13/03.03.05-decoration-action-handler/index.html delete mode 100644 v13/03.03.06-tip-handler/index.html delete mode 100644 v13/03.03.07-id-generator-handler/index.html delete mode 100644 v13/03.03.08-selection-change-handler/index.html delete mode 100644 v13/03.03.09-click-action-handler/index.html delete mode 100644 v13/03.03.10-action-label-handler/index.html delete mode 100644 v13/03.04-canvas-controller/index.html delete mode 100644 v13/03.04.01-decorations/index.html delete mode 100644 v13/03.04.02-api-object-structure/index.html delete mode 100644 v13/03.04.03-creating-new-canvas-nodes/index.html delete mode 100644 v13/03.04.05-notification-messages/index.html delete mode 100644 v13/03.04.06-styling-objects/index.html delete mode 100644 v13/03.05-keyboard-support/index.html delete mode 100644 v13/03.06.01-node-customization/index.html delete mode 100644 v13/03.06.02-comment-customization/index.html delete mode 100644 v13/03.06.03-link-customization/index.html delete mode 100644 v13/03.07-external-objects/index.html delete mode 100644 v13/03.08-external-pipeline-flows/index.html delete mode 100644 v13/03.09-read-only-or-locked-flows/index.html delete mode 100644 v13/03.10-command-stack/index.html delete mode 100644 v13/03.11-internal-actions/index.html delete mode 100644 v13/03.30.01-context-menu-wrapper/index.html delete mode 100644 v13/03.30.02-flow-validation/index.html delete mode 100644 v13/04-common-properties/index.html delete mode 100644 v13/04.01-parameter-definition/index.html delete mode 100644 v13/04.02-callbacks/index.html delete mode 100644 v13/04.03-ui-hints/index.html delete mode 100644 v13/04.04-controls/index.html delete mode 100644 v13/04.05-conditions/index.html delete mode 100644 v13/04.06-custom-components/index.html delete mode 100644 v13/04.07-properties-controller/index.html delete mode 100644 v13/04.08-properties-config/index.html delete mode 100644 v13/05-faq/index.html delete mode 100644 v13/06-contributing/index.html delete mode 100644 v13/06.01-style-guidelines/index.html delete mode 100644 v13/06.02-testing-guidelines/index.html delete mode 100644 v13/404.html delete mode 100644 v13/assets/FlowIcon.png delete mode 100644 v13/assets/cc-app-tiny.png delete mode 100644 v13/assets/cc-comment-color.gif delete mode 100644 v13/assets/cc-comment-elements-dom.png delete mode 100644 v13/assets/cc-comment-link.gif delete mode 100644 v13/assets/cc-comment-markdown-edit.png delete mode 100644 v13/assets/cc-comment-markdown-out.png delete mode 100644 v13/assets/cc-comment-reg-edit.png delete mode 100644 v13/assets/cc-comment-reg-type.png delete mode 100644 v13/assets/cc-comment-resize.gif delete mode 100644 v13/assets/cc-comment1.png delete mode 100644 v13/assets/cc-comment2.png delete mode 100644 v13/assets/cc-context-menu.png delete mode 100644 v13/assets/cc-context-toolbar-open-overflow.png delete mode 100644 v13/assets/cc-context-toolbar.png delete mode 100644 v13/assets/cc-decoration-example-link.png delete mode 100644 v13/assets/cc-decoration-example-node.png delete mode 100644 v13/assets/cc-decoration-label-editable.gif delete mode 100644 v13/assets/cc-decoration-link-image.png delete mode 100644 v13/assets/cc-decoration-link-jsx.png delete mode 100644 v13/assets/cc-decoration-link-label.png delete mode 100644 v13/assets/cc-decoration-link-shape.png delete mode 100644 v13/assets/cc-decoration-node-image.png delete mode 100644 v13/assets/cc-decoration-node-jsx.png delete mode 100644 v13/assets/cc-decoration-node-label.png delete mode 100644 v13/assets/cc-decoration-node-shape.png delete mode 100644 v13/assets/cc-decoration-tooltip.png delete mode 100644 v13/assets/cc-elements.png delete mode 100644 v13/assets/cc-flow-editor-all-select.gif delete mode 100644 v13/assets/cc-flow-editor-clipboard.gif delete mode 100644 v13/assets/cc-flow-editor-command-stack.gif delete mode 100644 v13/assets/cc-flow-editor-create-link.gif delete mode 100644 v13/assets/cc-flow-editor-create-node.gif delete mode 100644 v13/assets/cc-flow-editor-linked-nodes-select.gif delete mode 100644 v13/assets/cc-flow-editor-move.gif delete mode 100644 v13/assets/cc-flow-editor-region-select.gif delete mode 100644 v13/assets/cc-flow-editor-zoom-to-fit.gif delete mode 100644 v13/assets/cc-flow-editor-zoom.gif delete mode 100644 v13/assets/cc-flow-editor.png delete mode 100644 v13/assets/cc-link-assoc.png delete mode 100644 v13/assets/cc-link-comment.png delete mode 100644 v13/assets/cc-link-elements-dom.png delete mode 100644 v13/assets/cc-link-freeform-curve-separation.gif delete mode 100644 v13/assets/cc-link-freeform-curve.png delete mode 100644 v13/assets/cc-link-freeform-elbow-self-ref.png delete mode 100644 v13/assets/cc-link-freeform-elbow.png delete mode 100644 v13/assets/cc-link-freeform-parallax.png delete mode 100644 v13/assets/cc-link-freeform-straight-separation.gif delete mode 100644 v13/assets/cc-link-freeform-straight.gif delete mode 100644 v13/assets/cc-link-freeform-straight.png delete mode 100644 v13/assets/cc-link-mapping-transformer.png delete mode 100644 v13/assets/cc-link-multi-ports-connected.png delete mode 100644 v13/assets/cc-link-multi-ports-quadrants.png delete mode 100644 v13/assets/cc-link-multi-ports.png delete mode 100644 v13/assets/cc-link-ports-curve.png delete mode 100644 v13/assets/cc-link-ports-elbow-loop.png delete mode 100644 v13/assets/cc-link-ports-elbow.png delete mode 100644 v13/assets/cc-link-ports-parallax.png delete mode 100644 v13/assets/cc-link-ports-straight.png delete mode 100644 v13/assets/cc-link-ports.gif delete mode 100644 v13/assets/cc-node-elements-dom.png delete mode 100644 v13/assets/cc-node-elements-pos.png delete mode 100644 v13/assets/cc-node-elements.png delete mode 100644 v13/assets/cc-node-filter.png delete mode 100644 v13/assets/cc-node-format.png delete mode 100644 v13/assets/cc-node-guide1.gif delete mode 100644 v13/assets/cc-node-guide2.gif delete mode 100644 v13/assets/cc-node-highlight-target.gif delete mode 100644 v13/assets/cc-node-image-jsx-app.png delete mode 100644 v13/assets/cc-node-image-jsx.png delete mode 100644 v13/assets/cc-node-image-svg.png delete mode 100644 v13/assets/cc-node-insert-to-link.gif delete mode 100644 v13/assets/cc-node-port-custom-resize.png delete mode 100644 v13/assets/cc-node-port-custom.png delete mode 100644 v13/assets/cc-node-react.png delete mode 100644 v13/assets/cc-node-resize.gif delete mode 100644 v13/assets/cc-node-supernode-create.gif delete mode 100644 v13/assets/cc-node-supernode-full-page.gif delete mode 100644 v13/assets/cc-node-supernode-in-place.png delete mode 100644 v13/assets/cc-node1.png delete mode 100644 v13/assets/cc-node2.png delete mode 100644 v13/assets/cc-node3.png delete mode 100644 v13/assets/cc-node4.png delete mode 100644 v13/assets/cc-node5.png delete mode 100644 v13/assets/cc-node6.png delete mode 100644 v13/assets/cc-node7.png delete mode 100644 v13/assets/cc-notif-icon-error.png delete mode 100644 v13/assets/cc-notif-icon-info.png delete mode 100644 v13/assets/cc-notif-icon-success.png delete mode 100644 v13/assets/cc-notif-icon-warning.png delete mode 100644 v13/assets/cc-notification-panel.png delete mode 100644 v13/assets/cc-palette-double-click.gif delete mode 100644 v13/assets/cc-palette.gif delete mode 100644 v13/assets/cc-panels.png delete mode 100644 v13/assets/cc-pipeline-flow-supernode-diagram.png delete mode 100644 v13/assets/cc-state-tag.png delete mode 100644 v13/assets/cc-toolbar-action-disabled.png delete mode 100644 v13/assets/cc-toolbar-action-dual-closed.png delete mode 100644 v13/assets/cc-toolbar-action-dual-open.png delete mode 100644 v13/assets/cc-toolbar-action-enabled.png delete mode 100644 v13/assets/cc-toolbar-action-jsx-buttons.png delete mode 100644 v13/assets/cc-toolbar-action-jsx.png delete mode 100644 v13/assets/cc-toolbar-action-kinds.png delete mode 100644 v13/assets/cc-toolbar-action-selected-menu.png delete mode 100644 v13/assets/cc-toolbar-action-selected-none.png delete mode 100644 v13/assets/cc-toolbar-action-selected.png delete mode 100644 v13/assets/cc-toolbar-action-sub-menu-open.png delete mode 100644 v13/assets/cc-toolbar-action-sub-panel-open.png delete mode 100644 v13/assets/cc-toolbar-action-text-after.png delete mode 100644 v13/assets/cc-toolbar-action-text-before.png delete mode 100644 v13/assets/cc-toolbar-action-tooltip.png delete mode 100644 v13/assets/cc-toolbar-auto-customize.png delete mode 100644 v13/assets/cc-toolbar-divider.png delete mode 100644 v13/assets/cc-toolbar-overflow-closed.png delete mode 100644 v13/assets/cc-toolbar-overflow-none.png delete mode 100644 v13/assets/cc-toolbar-overflow-open.png delete mode 100644 v13/assets/cc-toolbar-tooltips.gif delete mode 100644 v13/assets/cc-toolbar.png delete mode 100644 v13/assets/components.png delete mode 100644 v13/assets/cp-example.png delete mode 100644 v13/assets/ellipsis-icon.png delete mode 100644 v13/assets/faq-react-supernodes.png delete mode 100644 v13/assets/flow.svg delete mode 100644 v13/assets/images/favicon.png delete mode 100644 v13/assets/javascripts/bundle.83f73b43.min.js delete mode 100644 v13/assets/javascripts/bundle.83f73b43.min.js.map delete mode 100644 v13/assets/javascripts/lunr/min/lunr.ar.min.js delete mode 100644 v13/assets/javascripts/lunr/min/lunr.da.min.js delete mode 100644 v13/assets/javascripts/lunr/min/lunr.de.min.js delete mode 100644 v13/assets/javascripts/lunr/min/lunr.du.min.js delete mode 100644 v13/assets/javascripts/lunr/min/lunr.el.min.js delete mode 100644 v13/assets/javascripts/lunr/min/lunr.es.min.js delete mode 100644 v13/assets/javascripts/lunr/min/lunr.fi.min.js delete mode 100644 v13/assets/javascripts/lunr/min/lunr.fr.min.js delete mode 100644 v13/assets/javascripts/lunr/min/lunr.he.min.js delete mode 100644 v13/assets/javascripts/lunr/min/lunr.hi.min.js delete mode 100644 v13/assets/javascripts/lunr/min/lunr.hu.min.js delete mode 100644 v13/assets/javascripts/lunr/min/lunr.hy.min.js delete mode 100644 v13/assets/javascripts/lunr/min/lunr.it.min.js delete mode 100644 v13/assets/javascripts/lunr/min/lunr.ja.min.js delete mode 100644 v13/assets/javascripts/lunr/min/lunr.jp.min.js delete mode 100644 v13/assets/javascripts/lunr/min/lunr.kn.min.js delete mode 100644 v13/assets/javascripts/lunr/min/lunr.ko.min.js delete mode 100644 v13/assets/javascripts/lunr/min/lunr.multi.min.js delete mode 100644 v13/assets/javascripts/lunr/min/lunr.nl.min.js delete mode 100644 v13/assets/javascripts/lunr/min/lunr.no.min.js delete mode 100644 v13/assets/javascripts/lunr/min/lunr.pt.min.js delete mode 100644 v13/assets/javascripts/lunr/min/lunr.ro.min.js delete mode 100644 v13/assets/javascripts/lunr/min/lunr.ru.min.js delete mode 100644 v13/assets/javascripts/lunr/min/lunr.sa.min.js delete mode 100644 v13/assets/javascripts/lunr/min/lunr.stemmer.support.min.js delete mode 100644 v13/assets/javascripts/lunr/min/lunr.sv.min.js delete mode 100644 v13/assets/javascripts/lunr/min/lunr.ta.min.js delete mode 100644 v13/assets/javascripts/lunr/min/lunr.te.min.js delete mode 100644 v13/assets/javascripts/lunr/min/lunr.th.min.js delete mode 100644 v13/assets/javascripts/lunr/min/lunr.tr.min.js delete mode 100644 v13/assets/javascripts/lunr/min/lunr.vi.min.js delete mode 100644 v13/assets/javascripts/lunr/min/lunr.zh.min.js delete mode 100644 v13/assets/javascripts/lunr/tinyseg.js delete mode 100644 v13/assets/javascripts/lunr/wordcut.js delete mode 100644 v13/assets/javascripts/workers/search.6ce7567c.min.js delete mode 100644 v13/assets/javascripts/workers/search.6ce7567c.min.js.map delete mode 100644 v13/assets/spss-modeler.gif delete mode 100644 v13/assets/stylesheets/main.6f8fc17f.min.css delete mode 100644 v13/assets/stylesheets/main.6f8fc17f.min.css.map delete mode 100644 v13/assets/stylesheets/palette.06af60db.min.css delete mode 100644 v13/assets/stylesheets/palette.06af60db.min.css.map delete mode 100644 v13/css/styles.css delete mode 100644 v13/index.html delete mode 100644 v13/js/links-in-new-tabs.js delete mode 100644 v13/search/search_index.json delete mode 100644 v13/sitemap.xml delete mode 100644 v13/sitemap.xml.gz delete mode 100644 versions.json diff --git a/latest b/latest deleted file mode 120000 index 817ba4bfff..0000000000 --- a/latest +++ /dev/null @@ -1 +0,0 @@ -v13 \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 482a3ee64cb094aa4c1ed664bae75644f542fbff..412ffb42cf9313eca0cce074db1659ebcf95f4bb 100644 GIT binary patch delta 13 Ucmb=gXP58h;AoibKasrx036N)IsgCw delta 13 Ucmb=gXP58h;9&6bo5)@P02nm`XaE2J diff --git a/v13/01-canvas-components/index.html b/v13/01-canvas-components/index.html deleted file mode 100644 index 1c07da3005..0000000000 --- a/v13/01-canvas-components/index.html +++ /dev/null @@ -1,2747 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Components Overview - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

Elyra Canvas Components Overview

-

The Elyra Canvas package delivers two decoupled React objects: Common Canvas and Common Properties.

-

-

Common Canvas

-

Common Canvas displays a flow of data operations as nodes and links (edges) which the user can create and edit to get the flow they want. These visual flows of data operations are typically translated into data processing steps performed by the application. Common Canvas provides UI functionality for the visual display of flows in the browser and leaves persistence and execution of data flows to the application.

-

The common-canvas user can perform operations such as:

-
    -
  • Create a new node by dragging a node template from a palette onto the canvas.
  • -
  • Delete a node by clicking a context menu option.
  • -
  • Create a link by dragging a line from one node to another.
  • -
  • Delete a link by clicking a context menu option.
  • -
  • Add a comment to the canvas and draw a link from it to one or more nodes.
  • -
  • Edit a comment.
  • -
  • Move nodes and comments around in the canvas to get the desired arrangement.
  • -
  • Create a new node by dragging a node from the OS desktop (or elsewhere on the browser page) onto the canvas. This takes a little bit of development work.
  • -
  • And much more! …
  • -
-

Common Canvas Components

-

Common Canvas has several constituent parts that can be visible to the user and can be customized by the application:

-

-
    -
  • Flow editor - the main area of the UI where the flow is displayed and edited.
  • -
  • Palette - a set of node templates that can be dragged to the canvas to create new nodes
  • -
  • Context menu - a menu of options for nodes, comments, etc.
  • -
  • Context toolbar - a menu of options for nodes, comments, etc presented as a small toolbar
  • -
  • Toolbar - a set of tools across the top of the UI.
  • -
  • Notification panel - a panel for displaying runtime and other messages to the user.
  • -
  • State Tag - a small pill-shaped component that appears over the canvas to indicate its state: locked or -read-only.
  • -
  • Tooltips - information tips displayed when the mouse cursor is over an object.
  • -
-

In addition, there are three optional panels where application specific output can be displayed such as -properties, log info or data previews. -

-
    -
  • Right side flyout - a panel, often used to display node properties
  • -
  • Top panel - a panel which can be used to display other app related information
  • -
  • Bottom panel - a panel which can be used to display other app related information
  • -
-

Common Properties

-

Common Properties allows the application to display a Carbon compliant properties panel or dialog with just a Javascript (JSON) object as input. Common Properties supports the most commonly used UI components and also allows custom components to be added into its visual output.

-

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/01.01-flow-editor/index.html b/v13/01.01-flow-editor/index.html deleted file mode 100644 index 6f3023c486..0000000000 --- a/v13/01.01-flow-editor/index.html +++ /dev/null @@ -1,2862 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Editor Overview - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - - - - - -
-
- - - - - - - - - - - - -

Flow Editor Overview

-

The Flow Editor displays the flow to the user and allows the user to interact with the flow using the mouse/trackpad and the keyboard and other input devices. Typically, the flow shows a set of nodes connected by links (edges) that represent some flow of data, or flow of control, which is in the problem domain of the application.

-

-

The editor displays the following object types which the user can interact with:

- -

Pipeline Flow

-

The defintions of objects displayed within the flow editor are contained in a JavaScript object descibed by the pipeline flow schema. A pipeline flow object can be serialized to, or parsed from, JSON and consequently saved to, or read from, a file.

-

The storage and mangement of pipeline flow files is handled by the application. The pipeline flow can be read from the canvas controller:

-

    const pflow = canvasController.getPipelineFlow();
-
-and a previously saved pipeline flow can be provided to Common Canvas also using the canvas controller:

-
    canvasController.setPipelineFlow(pFlow);
-
-

A pipeline flow contains an array of pipelines, one of which is the ‘primary pipeline’. Other pipelines will be sub-flows for supernodes contained within the primary pipeline (or other pipelines).

-

Each pipeline defines sets of nodes, links and comments with all their associated attributes.

-

Create nodes

-

Nodes can be created by dragging from the palette and dropping onto the flow editor canvas:

-

-

Nodes can also be automatically added to the flow editor canvas by double clicking them in the palette. The node will be added at an appropriate place on the canvas and connected to the preceding node if one is available:

-

-

Object Selection

-

Objects (nodes, links and comments) on the flow editor canvas can be selected by single clicking on them. Subsequently, if the user Command/Ctrl + clicks on another object it will be:

-
    -
  • Added to the set of selected objects if it is not currently selected or
  • -
  • Removed from the set of selected objects if it is currently selected.
  • -
-

Clicking on the flow editor canvas background will deselect all canvas objects.

-

A selection region can be pulled out to select multiple objects at once by pressing the Shift key and dragging on the canvas background.

-

-

A set of connected nodes through a flow can be selected by, clicking on a node to select it and then, Shift + click another downstream node. If the nodes are joined together through a set of inter-connected nodes, all of those nodes will be selected.

-

-

All canvas objects can be selected by displaying the default context menu or context toolbar for the flow-editor background and then clicking the ‘Select All’ option. Note: If the application provides its own canvas menus then it would need to add the selectAll internal action to the menu to enable the ‘select all’ function.

-

Alternatively, the user can press Ctrl/Command + a keyborad shortcut to select all objects when the keyboard focus is on the canvas.

-

- -

Links can be created by dragging from one node’s output port to another node:

-

-

Reposition Objects

-

The Flow Editor allows direct manipulation of selected objects by dragging them to a new position.

-

-

Flow editor canvas context menu or context toolbar

-

The flow editor can display a context menu or context toolbar (depending on which is enabled) that can show options for the whole flow. It is displayed by the context menu gesture which is either right-clicking the mouse, or the trackpad equivalent, while the mouse cursor is over the canvas.

-

Zoom Objects

-

The objects on the flow-editor canvas can be zoomed in and out either using the zoomIn or zoomOut toolbar buttons or by performing the zoom gesture using the mouse or trackpad. The canvas background can be panned by dragging the background.

-

-

A large flow can be centrally positioned, making all the nodes visible within the viewport, by clicking the zoomToFit button.

-

-

Command Stack

-

Command actions that update the objects within the flow editor are added to the command stack and can be undone and then redone. The default toolbar has undo and redo buttons and the default context menu/toolbar for the canvas background has undo and redo options. There are also keyboard shortcuts to undo and redo.

-

-

Clipboard

-

Users can cut and copy one or more objects from the canvas onto the clipboard and paste them into the same flow or a different flow. The default canvas toolbar provides buttons for these three actions and they can also be accessed through the default context menus/toolbars for the objects on the canvas.

-

There are also keyboard shortcuts to cut, copy and paste.

-

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/01.01.01-nodes/index.html b/v13/01.01.01-nodes/index.html deleted file mode 100644 index 56735fa9ca..0000000000 --- a/v13/01.01.01-nodes/index.html +++ /dev/null @@ -1,3036 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Nodes - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - - - - - -
-
- - - - - - - - - - - - -

Nodes

-

Introduction

-

Nodes displayed in the flow editor can represent data operations or other types of -operations for the type of flow the application displays. Nodes are joined together in a flow by data links (edges). Association links can also join two nodes together (in a non-directional relationship) and nodes can be connected to comments with a comment link.

-

Nodes can be customized into a large number of different layouts depending on the needs of the application, as shown below:

-

- - - - - -

-

Pipeline Flow Node

-

Node objects are stored in the nodes array in a pipeline which itself is in the pipelines array of the pipeline flow. The node object in the pipeline holds some basic information used for node display such as:

-
    -
  • id - unique identifier
  • -
  • position - x/y position relative to the canvas origin
  • -
  • label
  • -
  • description – displayed in the node tooltip (if enabled)
  • -
  • image – image location on the server or a JSX object
  • -
  • ports info (inputs and outputs)
  • -
  • optional decoration information
  • -
-

Additional information on the node layout is configured in the node layout fields.

-

Node Elements

-

Nodes are made up of a number of display elements:

-

-

In addition, the node might have an ellipsis icon if context menus are enabled and one or more decorations. All of the node elements are optional, except the selection highlighting element.

-

Node Format

-

The enableNodeFormatType field of the canvas config object can be used to change the basic format of the node between “Horizontal” and “Vertical” format:

-

-

Each format type has its own set of node layout fields which can be overriden by the application for further customization.

-

Node image

-

The node image is specified in the image field of the node object in the pipeline flow and the palette. It can either be a URL to an image file on the server or a JSX object.

-

Here’s an example of a node using an image field with a URL that specifies an SVG object imported from a file on the server:

-

-

Here’s an example of a node using a JSX object which is an icon imported from the Carbon icons library.

-

-

Node positioning

-

Nodes are positioned at the x/y coordinate from the canvas origin of the node’s top-left corner. The x/y coordinates are stored in the node object from the pipeline flow.

-

Ports

-

A node can have zero or more input ports and zero or more output ports.

-
    -
  • Input ports are the objects to which connections are made from other nodes that indicate a flow of data or control into the node.
  • -
  • Output ports are the objects from which connections are made to other nodes that indicate a flow of data or control out of the node.
  • -
-

In many applications, nodes have just a single input and/or output port. There is no strict definition of why a node might have multiple input ports or multiple output ports. Often they are used to indicate a different kind of data flowing into or out of the node. For example, a relational-database Join node might have two input ports one for the left table data and one for the right table data in the join. Or a filter node might take data and split it into two parts based on some criteria and write out the different data to separate output nodes, like this:

-

-

There can be multiple connections made into an input port or out of an output port. Each port has a maximum and minimum cardinality values which indicate the limits on the number of connections for the port. Common Canvas ensures the maximum cardinality is not exceeded for port connections.

-

Ports can be shown visually on, or close to, the node as circles or images. This positioning is controlled by the node layout fields.

-

Node Selection

-

See the Object Selection section in the flow editor page for details.

- -

A guide is an image or shape drawn at the location of an output port. The user can drag the ‘guide’ to another node to create a new link connection to that node. The appearance of the guide can be customized by altering the node layout fields and CSS for the node. If output ports are visible, it appears as if the user is dragging the port but the guide is, in fact, a different node element.

-

-

-

Resizable nodes

-

Nodes can be resized if the enableResizeableNodes canvas config field is set to true. The node can be resized if the user drags the border area in the desired direction.

-

- -

Nodes can be inserted into a link and the flow re-wired appropritely, if enableInsertNodeDroppedOnLink canvas config field is set to true.

-

- -

A Node can be highlighted when a guide icon is being dragged towards it and a connection is allowed, if enableHighlightNodeOnNewLinkDrag canvas config field is set to true.

-

-

Other behaviors

-

There are other node behaviors which can be switched on or off. See the nodes section on the canvas config object.

-

React Nodes

-

The body of nodes can be drawn using a React object in place of the SVG elements usually displayed by Common Canvas. The React object is specified by the application in the nodeExternalObj field in the node layout fields.

-

Here is an example of two nodes using the CardNode React object from the Carbon Charts (React) library.

-

-

Branch highlighting

-

Branch highlighting allows the user to highlight upstream nodes, downstream nodes or the entire branch of nodes (both upstream and downstream) by choosing one of the ‘Highlight’ options from the context menu for a particular node.

-

Clicking this:

-

-

Results in this:

-

-

Common Canvas add a class called ‘d3-branch-highlight’ to the group <g> object of the node or the link in the branch. The application can use that class to specify its own CSS styling for the branch highlighting.

-

By default, Common Canvas provides colors and styles for the highlighted branch nodes and links, but the application can override them if desired using CSS like this.

-
d3-node-group.d3-branch-highlight {
-    .d3-node-body-outline {
-        stroke: red;
-    }
-}
-
-

Supernodes

-

A supernode is a special kind of node that can reference another pipeline in the same pipeline flow object (internal) or, in some cases, in another pipeline flow (external). The referenced pipeline is known as a sub-flow or sub-pipeline.

-

These types of supernodes/sub-flows combinations have different uses:

-
    -
  • Internal sub-flows are useful for organizing flows by separating out closely related sets of nodes from the main flow.
  • -
  • External sub-flows are useful for function reuse. That is, if a set of nodes performs some function that is needed by more than one pipeline flow, they would be placed into their own pipeline flow and referenced by the others.
  • -
-

-

Common Canvas allows the user to create a supernode by selecting a set of nodes to be placed in the sub-flow:

-

-

And then to view it as expanded ‘in-place:

-

-

The user can also navigate to a ‘full-page’ view (well, really it is a full-viewport view):

-

-

The sub-flow can be edited by the user, after it has been created, by adding, removing or editing its nodes, comments and links.

-

Supernodes can also be:

-
    -
  • Deconstructed – that is, the supernode is remove from the flow and the nodes from the sub-flow are inserted back into the parent flow.
  • -
  • Converted from internal to external - this means the sub-flow is removed from its current pipeline flow and placed in a separate pipeline flow object that can be saved by the application.
  • -
  • Converted from an external to internal - this means the sub-flow is copied from the external pipeline flow and placed into the pipeline flow of the supernode.
  • -
-

See the External Pipeline Flows page for more details.

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/01.01.02-links/index.html b/v13/01.01.02-links/index.html deleted file mode 100644 index c626242fc6..0000000000 --- a/v13/01.01.02-links/index.html +++ /dev/null @@ -1,2924 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Links - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
- -
- - - -
-
- - - - - - - - - - - - -

Links

- -

Introduction

-

Common Canvas will display one link line on the canvas for each link defined in the pipeline flow. There are three categories of links supported by Common Canvas:

-
    -
  • Data links - a directional link between the ports on two nodes
  • -
  • Association links - a relationsjip link between two nodes with no implied direction
  • -
  • Comment links - a link from a comment to a node
  • -
-

The appearance and behavior of links can be customized by:

- - -

Data links are designed to model a flow from a source node to a target node. Data links are specified in the pipeline flow to connect a port on the source node to a port on the target node. Data links are typically displayed with an arrow head to display the flow along the link from source to target.

-

There are 4 types of data link:

-
    -
  • Curve
  • -
  • Elbow
  • -
  • Parallax
  • -
  • Straight
  • -
-

These can be changed by specifying the enableLinkType configuration field.

-

Also, data links can be drawn either:

-
    -
  • between ports on the source and target nodes or
  • -
  • “freeform” which means the link is drawn from and to the source node ignoring port positions. Typically with “freeform” links the application customizes the canvas to NOT display ports.
  • -
-

This choice can be changed by specifying the enableLinkMethod configuration field.

-

This table shows the different combinations:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TypePortsFreeform
Curve
Elbow
Parallax
Straight
- -

The enableLinkMethod config field can be set to “Freeform”. With this option, links are drawn directly between nodes without any reference to ports.

-

Here is an example of a “Freeform” link with a “Straight link type:

-

-

The “Freeform” display is useful for flows where no particular direction of the flow needs to be enforced and also where the flow has nodes with multiple ports but the ports do not need to be shown in any particular order or context.

-

When more than one link enters or exits into/from one side of the node the freeform links will be drawn to maintain some reasonable separation like this:

-

-

- -

When enableLinkMethod is set to “Ports”, Common Canvas draws the links to maintain the flow from output ports to input ports regardless of where the nodes are positioned relative to one another.

-

Here is an example of the “Ports” links method with a “Curve” link type:

-

-

Links between ports can be useful if the application wants to allow the user to create loops in the flow, like this:

-

- -

Applications can configure Common Canvas to position ports by default in one of four different orientations:

-
    -
  • For “LeftRight” output ports will be on the right of the node and input ports will be on the left of the node
  • -
  • For “RightLeft” output ports will be on the left of the node and input ports will be on the right of the node
  • -
  • For “TopBottom” output ports will be on the bottom of the node and input ports will be on the top of the node
  • -
  • For “BottomTop” output ports will be on the top of the node and input ports will be on the bottom of the node
  • -
-

The application can further customize the position of the ports on the node if desired.

-

The position of the ports will affect the way links are drawn from/to the port.

-

This can result in this kind of display where links draw into/out of ports in multiple different directions:

-

- -

If the enableSelfRefLinks canvas config field is set to true, the user can create links that loop back to the node they originated from. These are created by the user dragging from the output port on the node and dropping the new link onto a input port, or the body, of the same node.

-

Here’s an example of a self-referencing link using a “Freeform” link method with an “Elbow” link type.

-

-

Self-referencing links behave the same as other links and can be displayed in the same combinations of link types (Curve, Elbow, Parallax and Straight) and link methods (Freeform or Ports) as other links.

- -

Note: Typically data links must be drawn between nodes however, if the config field enableLinkSelection is set to Detachable, the links are allowed to be drawn to and/or from arbitrary points on the canvas.

-

With this option, the start and end of existing links can be dragged away from the nodes they are connected to and dropped onto an arbitrary point on the canvas to create a ‘detached’ link. Additionally, the end of any detached link that originates from, or points to, a point on the canvas can be dragged to a node to form a connection. Also, nodes can be dragged to the available ends of those ‘detached’ links to form a connection.

- -

Association links are designed to capture a relationship between two nodes where there is no implied direction. By default these are displayed as a single straight link line in a dashed style. There are no arrow heads by default for that type of link.

-

- -

Comment links connect a comment to one or more nodes. They can be created by the user by: (a) pulling out the small handle/circle that appears below a comment and dropping it on a node. (2) by selecting nodes before the comment is selected and then creating the comment. This will automatically create a comment link from the selected nodes to the newly created comment.

-

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/01.01.03-comments/index.html b/v13/01.01.03-comments/index.html deleted file mode 100644 index c1ea682b6e..0000000000 --- a/v13/01.01.03-comments/index.html +++ /dev/null @@ -1,2880 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Comments - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - - - - - -
-
- - - - - - - - - - - - -

Comments

-

Introduction

-

Comments are used to display explanatory information to the user about the flow. Comments can be standalone:

-

-

or connected to one or more nodes with a link line:

-

-

Creating comments

-

Comments can be created by the user by clicking the ‘Create Comment’ button in the default toolbar or by clicking the ‘Create comment’ option in the default canvas background context menu/toolbar.

-

Note: If the application is providing its own toolbar it would need to have a button defined with the createAutoComment internal action and, in the context menu/toolbar for the canvas background there would need to be an option defined with the createComment internal action.

-

Editing comments

-

The comment can be changed to ‘edit mode’ by either double clicking it or clicking the ‘Edit Comment’ option in the default context menu/toolbar. If the application is providing its own context menu/toolbar it would need to provide an option with the setCommentEditingMode action defined.

- - - - - - - - - - - - - -
Doing this:Yields this:
-

After text has been entered into the comment entry area the user can click on the canvas background to finish editing and display the comment.

-

Comment Selection

-

See the Object Selection section in the flow editor page for details.

-

Resizing comments

-

Comments can be sized by dragging the border.

-

-

Connecting a comment to a node

-

The user can create a link from a comment to a node in one of two way:

-
    -
  1. By dragging the small gray ‘guide’ circle at the bottom of the comment and dropping it onto the target node or
  2. -
  3. By selecting one of more nodes and then creating the comment. This will automatically add comment links from the comments to each selected node.
  4. -
-

By default, the connection is shown as a dashed link line.

-

-

Coloring comment backgrounds

-

Comment backgrounds can be colored by clicking the ‘Change Color’ option in the default context menu/toolbar for the comment. If the application provides its own context menu/toolbar then the colorSelectedObjects action must be defined.

-

-

Markdown

-

Optionally, the application can switch on markdown support within comments. This allows the user to enter markdown syntax when the comment is in edit mode, which is then formated approriately in display mode.

- - - - - - - - - - - - - -
Entering this:Yields this:
-

HTML in Markdown

-

As well as markdown syntax, the user can also enter HTML into the markdown text. This is then run when the comment is presented in display mode. HTML support allows the user more extensive customization capabilities including the specification of CSS for the text.

-

For example, specifying this will color the word Red: -

Some <span style="color: red">Red</span> text
-
-Here’s an example comment with some sample HTML:

-

html-markdown

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/01.01.04-decorations/index.html b/v13/01.01.04-decorations/index.html deleted file mode 100644 index cabf7cc5e7..0000000000 --- a/v13/01.01.04-decorations/index.html +++ /dev/null @@ -1,2732 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Decorations - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

Decorations

-

Introduction

-

In Common Canvas, nodes and links can be enhanced with decorations. A decoration is either:

-
    -
  • -

    An image

    -

    -

    -
  • -
  • -

    A label

    -

    -

    -
  • -
  • -

    A shape (SVG path) or

    -

    -

    -
  • -
  • -

    A JSX object

    -

    -

    -
  • -
-

Decorations can be applied to a node or link in a number of ways and can be made interactable so when the user clicks on the decoration the decorationActionHandler is called.

-

Here are some node decorations displayed by IBM’s SPSS Modeler application:

-

-

Here are some link decorations displayed by IBM’s Data Stage application:

-

-

Note: The link labels and the small icons on the links are decorations as well as the circle at the source of each link.

-

Tips for Decorations

-

A decoration can have a tooltip:

-

-

Editable label decoration

-

Label decorations can be made to be editable.

-

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/01.02-palette/index.html b/v13/01.02-palette/index.html deleted file mode 100644 index ca6bd60d1e..0000000000 --- a/v13/01.02-palette/index.html +++ /dev/null @@ -1,2779 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Palette - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

Palette

- -

Introduction

-

Common Canvas can display a palette which appears in the left flyout panel. The palette can display a set of palette nodes (sometimes called node templates) split into different categories.

-

-

The user can drag any of the palette nodes from the palette onto the canvas to create a new instance of a node on the canvas. The user can then join nodes together by creating link lines.

-

-

Alternatively, the user can double click node templates to add, and automatically join, them to the current flow. When a palette node is double clicked, Common Canvas will look for the node at the end of the current flow of nodes and will add the node to the canvas to the right of the end node in the flow. Common Canvas will also automatically join the nodes together by creating a new link line.

-

-

Populating the palette

-

The host application must tell Common Canvas what node templates and categories it wants the user to see in the palette. This is done by providing Common Canvas with a palette (JavaScript) object by calling the canvas-controller setPipelineFlowPalette(palette) method. The palette object is often read from a JSON document stored in the host application’s repository or it can be automatically generated.

-

The palette object should conform to the palette schema. The host application can ensure that palette conforms to the schema by switching on schema validation in the canvas configuration.

-

Palette configuration

-

There are a number of configuration options that control the palette that are specified in the canvas config object:

- -

Palette operation

-

The palette contents can be manipulated calling these canvas-controller palette methods

-

The palette can be opened and closed using these canvas-controller operational methods

- -

The user can enter a search string into the Search field at the top of the palette. The behavior is as follows:

-
    -
  1. When the search field is empty, the palette shows categories which can be expanded to show the node templates within the expanded category.
  2. -
  3. As the user enters characters into the search field, Common Canvas immediately searches through the node template labels, node template descriptions and category labels for the characters entered and finds a subset of the node templates that match the search string. Common Canvas then replaces the category-based view of the palette with a list of node templates that match the search criteria. In this view the node templates also include the node description under the node label.
  4. -
  5. The search is case insensitive.
  6. -
  7. The search text is highlighted wherever it appears in the labels, descriptions or category labels.
  8. -
  9. Common Canvas uses a ranking algorithm to order the display of node templates so those most relevant to the search text are positioned at the top of the list. The ranking algorithm puts more weight on those node templates where the search text appears in the label than if the text appears in the description or the category label.
  10. -
  11. If the user enters words into the search field (separated by spaces), Common Canvas searches for each word separately. Therefore, if say the user entered “data import” into the search field, Common Canvas would find a node with “Import Data” as the label or even a node with a description that said “This node does lots of things and also data can be imported.”
  12. -
  13. Nodes that have text which have hits on multiple words are ranked more highly than node templates whose text only contains one search word.
  14. -
  15. Common Canvas uses a debounce function so that, if the user types the search string very quickly, Common Canvas does not perform multiple searches for each key press but only runs a full search when rapid typing has ended.
  16. -
-

Recommendation

-

According to the schema, node template descriptions are not mandatory in the palette object. However, it is recommended you provide descriptions for each of your node templates. The reason for this is that, the search function searches through node template descriptions, as well as node template labels and category labels. This means you can write your node template descriptions to contain appropriate keywords that a user might search for when looking for a node.

-

For example, if there is a node template called ‘Import Data’ and that node could import comma-separated files you could add ‘comma-separated’ and ‘csv’ into your description for that node template. If the user entered comma in the search field the ‘Import Data’ node template would be shown in the search results even though comma does not appear in the node template label.

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/01.03-context-menu/index.html b/v13/01.03-context-menu/index.html deleted file mode 100644 index bc021d03b8..0000000000 --- a/v13/01.03-context-menu/index.html +++ /dev/null @@ -1,2668 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Context Menu - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

Context menu

-

A context menu is a small window containing a list of options applicable to an object or set of selected objects.

-

A traditional context menu, like the one shown below, will be displayed when enableContextToolbar is set to false (or omitted) from the canvas config, and either:

-
    -
  • a right-click (or equivalent on a trackpad) is performed on a canvas object or the canvas background or
  • -
  • Control + click is done on an obejct or
  • -
  • the ellipsis icon (only shown for nodes) is clicked
  • -
-

image

-

Populating the context menus

-

By default, Common Canvas will display appropriate context toolmenus for all flow editor canvas objects. The application can override or replace the default menus by implementing the contextMenuHandler callback.

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/01.04-context-toolbar/index.html b/v13/01.04-context-toolbar/index.html deleted file mode 100644 index 05af38b2b8..0000000000 --- a/v13/01.04-context-toolbar/index.html +++ /dev/null @@ -1,2671 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Context Toolbar - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

Context Toolbar

-

Context toolbars are an alternative to traditional context menus. It can be enabled by setting enableContextToolbar to truein the canvas config.

-

A context toolbar is a small toolbar that appears above nodes, links and comments as the mouse cursor is hovered over them. A context toolbar for the canvas background can also be displayed by right-clicking on the canvas background.

-

The context toolbar displays a set of icons that represent the most likely actions the user would want to perform on the object under the mouse cursor. If necessary, the toolbar can also show an overflow (vertical ellipsis) icon that, when clicked, reveals additional actions that can be performed on the object.

-

For a “vertical” style node the context toolbar looks like this:

-

image

-

For a “horizontal” style node it looks like this:

-

image

-

when the user clicks the overflow icon it looks like this:

-

image

-

Note: Since the mouse cursor can be hovered over a node, comment or link that is NOT currently selected, the actions shown in the context toolbar will apply to just that object, even if there is one or more currently selected objects.

-

If the mouse cursor is hovered over a selected object when there are other selected objects, the actions in the context toolbar will be applicable to all the selected objects. This is the same as how a traditional content menu shows actions that are applicable to the set of selected objects.

-

Populating the context toolbars

-

By default, Common Canvas will display appropriate context toolbars for all flow editor canvas objects. The application can override or replace the default toolbars by implementing the contextMenuHandler callback.

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/01.05-toolbar/index.html b/v13/01.05-toolbar/index.html deleted file mode 100644 index 6f5ae7062b..0000000000 --- a/v13/01.05-toolbar/index.html +++ /dev/null @@ -1,2884 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Toolbar - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - - - - - -
-
- - - - - - - - - - - - -

Canvas Toolbar

-

The canvas toolbar appears at the top of the <div> occupied by Common Canvas. By default, the toolbar will be displayed with appropriate buttons to perform the most popular actions. The toolbar can be customized by the application to show whatever action buttons are required. Buttons can be positioned to the left or right of the toolbar area.

-

-

The toolbar is customized by providing a toolbar config object as one of the <CommonCanvas> props.

-

The toolbar can be hidden by setting the enableToolbarLayout field in the canvas config to “None”.

-

Overflow Menu Behavior

-

If there is enough width all toolbar buttons will be displayed:

-

-

but when the width is too narrow to accommodate all the buttons, the toolbar will display an overflow button:

-

-

and when the overflow button is clicked, a menu appears showing the extra action buttons:

-

-

Dividers

-

Action buttons can be separated by dividers so that related buttons can be grouped together:

-

-

Tooltips

-

Action buttons will show a tooltip on hover, if a label is provided:

-

-

Enabled/Disabled actions

-

Action buttons in the toolbar can be shown as either enabled or disabled:

-

-

-

Selected state

-

Action buttons that reflect a state can be displayed as unselected or selected:

-

-

-

Text with icon

-

Action buttons can be shown with text alongside the icon (either before or after), if a label is provided:

-

-

-

Carbon button styling

-

Action buttons can be styled like Carbon buttons, if required:

-

- -

Action buttons can be configured to display a menu of related actions:

-

-

Sub-panel

-

Action buttons can be configured to display an application-specific panel:

-

-

Dual purpose buttons

-

Action buttons can be configured to be ‘dual purpose’ where the left side of the button peforms the associated action:

-

-

and the right side opens a panel of application-specified settings, associated with the left side part of the button:

-

-

Imbedded JSX

-

JSX can be provided to add additional information into the toolbar. In this case, the Autosaved time is added amongst the regular toolbar action buttons.

-

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/01.06-notification-panel/index.html b/v13/01.06-notification-panel/index.html deleted file mode 100644 index 87915e9ca6..0000000000 --- a/v13/01.06-notification-panel/index.html +++ /dev/null @@ -1,2611 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Notification Panel - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

Notification Panel

-

The Notification Panel allows the application to display error, warning, success and info messages to the user.

-

-

The canvas toolbar provides a button to display a sub-panel that contains the notifications. The button will be added to the far right side of the toolbar whenever a Notification Config is specified to the <CommonCanvas> React object.

-

The notifications button in the toolbar indicates the state and number of the messages in the panel.

-

A colored circle will be shown to indicate the highest severity message to be shown in the notification panel: info/blue, success/green, warning/yellow or error/red. Also, a number is displayed within the icon to indicate the number of current messages.

-

- - -

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/01.07-state-tag/index.html b/v13/01.07-state-tag/index.html deleted file mode 100644 index 5674b5a737..0000000000 --- a/v13/01.07-state-tag/index.html +++ /dev/null @@ -1,2610 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - State Tag - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

State Tag

-

A State Tag is an optional pill-shaped object that can displays the state of the flow to the user. This can be either ‘Locked’ or ‘Read-only’. By default, no state tag is shown.

-

The application can request a state tag be shown by setting the enableStateTag canvas config field.

-

When the State Tag is display it will show a tooltip, with an appropriate message, if the mouse cursor is hovered over it. The application can override the default message by implementing the Tip Handler callback.

-

-
-

Note

-

It is the application’s reponsibility for making the flow read-only. See the Read Only or Locked Flows page for more details.

-
- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/01.08-tooltips/index.html b/v13/01.08-tooltips/index.html deleted file mode 100644 index e1c6698c58..0000000000 --- a/v13/01.08-tooltips/index.html +++ /dev/null @@ -1,2695 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Tooltips - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

Tooltips

-

Tooltips (sometimes referred to as just ‘tips’) can be shown for the following objects in Common Canvas:

- -

The application can switch tooltips on and off as required for the different types of object and can also customize what text is displayed in the tooltip.

-

Tooltips for the toolbar:

-

-

Configuring tooltips

-

By default, Common Canvas will display tooltips where appropriate. Tooltips can be switched on or off, for evertything except the toolbar, by specifying the tipConfig field for the canvas config object.

-

Customizing tooltip text

-

The text for tooltips can be customized, for evertything except the toolbar, by implementing the Tip Handler callback.

-

The toolbar tooltips can be customized as part of the Toolbar Config.

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/01.09-panels/index.html b/v13/01.09-panels/index.html deleted file mode 100644 index 5e36fd5377..0000000000 --- a/v13/01.09-panels/index.html +++ /dev/null @@ -1,2679 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Panels - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

Panels

-

Common Canvas has three additional optional panels: top panel, bottom panel, right-flyout. These can be used by the application to display any additional content to the user such as logs or data previews or properties of selected objects. Traditionally, the right-flyout is used to display node properties.

-

The application can, optionally, use Common Properties to display the controls for the properties of a node.

-

-

Customizing content and display

-

The content and display of the panels is controlled by these six props of the <CommonCanvas> React object:

-
    -
  • showRightFlyout - a Boolean
  • -
  • -

    rightFlyoutContent - JSX object showing content

    -
  • -
  • -

    showBottomPanel - a Boolean

    -
  • -
  • -

    bottomPanelContent - JSX object showing content

    -
  • -
  • -

    showTopPanel - a Boolean

    -
  • -
  • topPanelContent - JSX object showing content
  • -
- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/01.10-common-properties/index.html b/v13/01.10-common-properties/index.html deleted file mode 100644 index 3f2b0a033f..0000000000 --- a/v13/01.10-common-properties/index.html +++ /dev/null @@ -1,2608 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Common Properties - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

Common Properties

-

Common Properties is a React component that allows the application to display a set of UI components (radio buttons, text entry areas, drop down lists, sliders, tables, etc) to present the properties of a node to the user. Common Properties supports the most commonly used UI components and also allows custom components to be added into its visual output.

-

The Common Properties React object has a ‘prop’ called the Parameter Definition which is a Javascript (JSON) object and some configuration objects as props.

-

Traditionally, the right-flyout is used to display properties but the application can choose to display them elsewhere. The UI elements displayed by Common Properties comply with the Carbon design language.

-

For more details and examples of the components supported by Common Properties, see the Common Properties Components page.

-

Here’s an example of the type of output a <CommonProperties> React object can produce. This is from the IBM SPSS Modeler application:

-

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/02-set-up/index.html b/v13/02-set-up/index.html deleted file mode 100644 index 1086fa3340..0000000000 --- a/v13/02-set-up/index.html +++ /dev/null @@ -1,2883 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Installation - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
- -
- - - -
-
- - - - - - - - - - - - -

Installation

-

NPM Install

-

You’ll need to build your application with Elyra Canvas.

-
    -
  • Elyra Canvas requires react, react-dom, react-intl, and react-redux libraries to be installed. See peerDependencies in package.json for versions requirements.
  • -
-

Use the command: -

npm install @elyra/canvas --save-dev
-
-or add this to your package.json file:

-

  "@elyra/canvas": "x.x.x"
-
-where x.x.x is the latest build and then run: -
npm install
-

-

Localization

-

If you want to see text displayed by Elyra Canvas components in different languages you must wrapper <CommonCanvas> and <CommonProperties>in an <IntlProvider> object.

-

The sample code below shows how <IntlProvider> should be imported and initialized. Your code can set this.locale to indicate which language should override the default which, in this sample code, is set to English en. The default locale will be used if this.locale is set to a language which is not currently supported.

-

If you want to provide translations for your own application’s text you can import your own bundles and load them into the this.messages object along with the common-canvas and common-properties text. If you do this you will have to move <IntlProvider/> so that it wrappers your React objects as well as <CommonCanvas/> and/or <CommonProperties>.

-
import { IntlProvider } from "react-intl";
-
-import CommandActionsBundles from "@elyra/canvas/locales/command-actions/locales";
-import CommonCanvasBundles from "@elyra/canvas/locales/common-canvas/locales";
-import CommonPropsBundles from "@elyra/canvas/locales/common-properties/locales";
-import PaletteBundles from "@elyra/canvas/locales/palette/locales";
-import ToolbarBundles from "@elyra/canvas/locales/toolbar/locales";
-
-class App extends React.Component {
-
-constructor() {
-    this.locale = "en";
-    // Create messages object once (here in constructor) - do not create messages
-    // in the render method, otherwise unnecessary renders inside
-    // common-canvas/common-properties will be performed.
-    this.messages = this._getMessages(
-        this.locale,
-        [CommandActionsBundles, CommonCanvasBundles, CommonPropsBundles,
-         PaletteBundles, ToolbarBundles]
-    );
-}
-
-_getMessages(locale, bundles) {
-  const messages = {};
-  for (const bundle of bundles) {
-    Object.assign(messages, bundle[locale]);
-  }
-  return messages;
-}
-
-render() {
-  <IntlProvider locale={this.locale} defaultLocale="en" messages={this.messages}>
-    {Add your <CommonCanvas/> or <CommonProperties/> element here.}
-  </IntlProvider>
-}
-
-

Overriding Styles and Color Themes

-

When building your application you will need to load fonts and override styles:

-

CSS styling for quick start

-

If you just want to get up and running and don’t care about scss then import these regular CSS files:

-
    -
  • @elyra/canvas/dist/styles/common-canvas.min.css
      -
    • version 8.x and older @elyra/canvas/dist/common-canvas.min.css
    • -
    -
  • -
-

More information about carbon components can be found here https://carbondesignsystem.com/developing/frameworks/react#getting-started

- -

If you want to use the full power of scss styling with variable overrides etc then include these imports in your main SCSS file: -

@use "@carbon/react"; // Bring in all the styles for Carbon in your root/global stylesheet
-@import "@elyra/canvas/src/index.scss";
-

-
    -
  • use autoprefixer when building
  • -
  • if using webpack under the sass-loader and make sure to include
  • -
-
options: { includePaths: ["node_modules"] }
-
-

Again, you can refer to the test harness harness.scss and common.scss files for sample code.

-

3rd party styling

-

If you are using Common Properties then also include the react-virtualized styles: - - react-virtualized/styles.css

-

Loading Fonts

-

To get correct and efficient display of fonts in Elyra Canvas, the build process for your application should copy the IBM Plex font files from /node_modules/@ibm/plexto a ./fonts folder and the following should be added to the .scss file for your application:

-
@use "@carbon/react" as * with (
-    $font-path: "/fonts"
-);
-
-$font-prefix: './fonts';
-@import 'node_modules/@ibm/plex/scss/ibm-plex.scss';
-
-

You can see an example of this in the common.scss file for the Elyra Canvas Test Harness. The Test Harness is the equivalent of a host application.

-

The Gruntfile that builds the Test Harness contains the following, that ensures the fonts are copied from /node_modules/@ibm/plex to the <carbon fonts folder>: -

copy: {
-    fonts: {
-        files: [{
-            expand: true,
-            flatten: false,
-            cwd: "./node_modules/@ibm/plex",
-            src: ["IBM-Plex*/**"],
-            dest: ".build/fonts"
-        }]
-    }
-}
-...
-var buildTasks = ["copy:fonts"];
-

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/03-common-canvas/index.html b/v13/03-common-canvas/index.html deleted file mode 100644 index 749a4f1109..0000000000 --- a/v13/03-common-canvas/index.html +++ /dev/null @@ -1,3108 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Getting Started - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - - - - - -
-
- - - - - - - - - - - - -

Getting started with Common Canvas

-

Hello Canvas!

-

Common Canvas is a React component. The <CommonCanvas> component is displayed in a <div> provided by your application. Here’s some sample code to show the minimum code needed to get a working canvas.

-
import React from "react";
-import AllTypesCanvas from "../../test_resources/diagrams/allTypesCanvas.json";
-import ModelerPalette from "../../test_resources/palettes/modelerPalette.json";
-import { CommonCanvas, CanvasController } from "@elyra/canvas";
-
-class App extends React.Component {
-    constructor(props) {
-        super(props);
-
-        this.canvasController = new CanvasController();
-        this.canvasController.setPipelineFlow(AllTypesCanvas);
-        this.canvasController.setPipelineFlowPalette(ModelerPalette);
-    }
-
-    render() {
-        return (
-            <div id="harness-app-container">
-                <CommonCanvas
-                    canvasController={this.canvasController}
-                />
-            </div>
-        );
-    }
-}
-
-

This code will display this:

-

-

The “Tiny App” is available as part of the test harness function. Click here to see the app running. You can try: dragging a node, editing a comment (double click on it), drag a node from the palette, click a button on the toolbar, zoom in and out using the scroll gesture.

-

Some sample code to look at:

-
    -
  • -

    This is the source code for app-tiny.js.

    -
  • -
  • -

    This app app-small.js, is more sophisticated and shows many of the options available to a Common Canvas developer such as configurations and callback handlers.

    -
  • -
  • -

    You can also look at the App.js file in the test harness section of this repo to see examples of code that uses the common-canvas component.

    -
  • -
-

Canvas Controller

-

The only mandatory prop for the <CommonCanvas> component is a regular JavaScript class called the Canvas Controller.

-

The Canvas Controller handles calls from the host application and actions performed by the user. It then updates the internal object model which stores:

-
    -
  1. The data that describes the flow of nodes, links and comments (called a pipelineFlow);
  2. -
  3. The data that describes the definition of the palette which contains node templates that can dragged to add nodes to the canvas;
  4. -
  5. The set of currently selected objects.
  6. -
  7. Notification messages
  8. -
  9. Breadcrumbs that indicate which sub-flow is being viewed
  10. -
  11. Layout information
  12. -
  13. And more …
  14. -
-

The Canvas Controller provides an API which allows the application to:

-
    -
  1. Set a new Pipeline Flow
  2. -
  3. Get the current pipelineFlow (after the user has edited it)
  4. -
  5. Update and edit objects in the canvas (for example, add node, delete link etc.)
  6. -
  7. Set the node definition data (for display of nodes in the palette)
  8. -
  9. Operate other aspets of the UI like opening panels, zooming, etc, etc.
  10. -
-

Getting started

-

To use Common Canvas in your React application complete the following steps:

-

Step 1 : Setup

-

Complete the setup steps documented in the Initial Setup page.

-

Step 2 : Import Common Canvas

-

Import the Common Canvas and Canvas Controller from the Elyra Canvas library. Elyra Canvas produces both esm and cjs outputs. By default esm will be used when webpack is used to build the application.

-

    import { CommonCanvas, CanvasController } from "@elyra/canvas";
-
-Common Canvas Only

-

To import only Common Canvas functionality in cjs format use:

-
    import { CommonCanvas, CanvasController } from "@elyra/canvas/dist/lib/canvas";
-
-

Step 3 : Create an instance of the canvas controller

-

To control the canvas you’ll need an instance of the canvas controller. Create an instance like this (probably in the constructor of your object). -

    this.canvasController = new CanvasController();
-

-

Step 4 : Set the palette data

-

Next you’ll need to populate the palette data. This step is optional if you don’t want to use the palette.

-

The palette data will specify the nodes (split into categories) that will appear in the palette. This is done by calling the canvas controller with:

-
    this.canvasController.setPipelineFlowPalette(pipelineFlowPalette);
-
-

The pipelineFlowPalette object should conform to the JSON schema found here:
-https://github.com/elyra-ai/pipeline-schemas/tree/master/common-canvas/palette

-

Some examples of palette JSON files can be found here:
-https://github.com/elyra-ai/canvas/tree/master/canvas_modules/harness/test_resources/palettes

-
-

Images

-

If the palette file references any images using a path you need those image files at the appropriate location.

-
-

Step 5 : (Optional) Set the flow data

-

This is an optional step. If you want a previously saved flow to be shown in the flow editor, so the user can start to edit it, you will need to call the canvas controller with:

-
    this.canvasController.setPipelineFlow(pipelineFlow);
-
-

The pipelineFlow object should conform to the JSON schema found here:
-https://github.com/elyra-ai/pipeline-schemas/tree/master/common-pipeline/pipeline-flow

-

Some examples of pipeline flow JSON files can be found here:
-https://github.com/elyra-ai/canvas/tree/master/canvas_modules/harness/test_resources/diagrams

-
-

Images

-

If the palette file references any images using a path you need those image files at the appropriate location.

-
-

Step 6 : Display the canvas

-

Inside your render code, add the following:

-

    return (
-        <div>
-            <IntlProvider>
-                <CommonCanvas canvasController={this.canvasController} />
-            </IntlProvider>
-        </div>
-    );
-
-The <div> should have the dimensions you want for your canvas to display in your page. For the canvasController prop, pass the instance of canvas controller created earlier. This is the only mandatory property. After providing this, and running your code, you will have a fully functioning canvas including: a palette; default toolbar; context menus; direct manipulation (move and resize) etc. To customize these behaviors and presentation continue with the sections below.

-

See the Localization section of the Initial Setup page to see how <IntlProvider> can be configured.

-

Common Canvas customization

-

If you want to customize the behavior of Common Canvas you can specify any combination of the following optional settings: -

    return (
-        <div>
-            <CommonCanvas
-                canvasController={this.canvasController}
-
-                config={this.canvasConfig}
-                toolbarConfig={this.toolbarConfig}
-                notificationConfig={this.notificationConfig}
-                contextMenuConfig={this.contextMenuConfig}
-                keyboardConfig={this.keyboardConfig}
-
-                contextMenuHandler={this.contextMenuHandler}
-                beforeEditActionHandler={this.beforeEditActionHandler}
-                editActionHandler={this.editActionHandler}
-                clickActionHandler={this.clickActionHandler}
-                decorationActionHandler={this.decorationActionHandler}
-                layoutHandler={this.layoutHandler}
-                tipHandler={this.tipHandler}
-                idGeneratorHandler={this.idGeneratorHandler}
-                selectionChangeHandler={this.selectionChangeHandler}
-                actionLabelHandler={this.actionLabelHandler}
-
-                showRightFlyout={showRightFlyout}
-                rightFlyoutContent={rightFlyoutContent}
-
-                showBottomPanel={showBottomPanel}
-                bottomPanelContent={bottomPanelContent}
-
-                showTopPanel={showTopPanel}
-                topPanelContent={topPanelContent}
-            >
-            </CommonCanvas>
-        </div>
-    );
-

-

Config objects

-

Common Canvas has five optional configuration objects. They are documented here: Config Objects

-

Handlers

-

There are several optional handlers implemented as callback functions. They are documented here: Common Canvas Callbacks

-

Right-flyout panel parameters

-

The right flyout panel appears on the right of the canvas area. You can add whatever content you like to this panel. Typically, it is used to display properties of nodes on the canvas. There are two optional parameters to let you manage the right flyout panel These are:

-
    -
  • showRightFlyout: This can be true or false to indicate whether the flyout panel is shown or not. The default is false.
  • -
  • rightFlyoutContent: content to display in the right flyout which is a JSX object. Nothing is displayed by default.
  • -
-

Bottom panel parameters

-

The bottom panel appears below the canvas area and between the palette and the right flyout panel. You can add whatever content you like to this panel. There are two optional parameters to let you manage the bottom panel. These are:

-
    -
  • showBottomPanel: This can be true or false to indicate whether the bottom panel is shown or not. The default is false.
  • -
  • bottomPanelContent: content to display in the bottom panel which is a JSX object. Nothing is displayed by default.
  • -
-

Top panel parameters

-

The top panel appears below the toolbar and between the palette and the right flyout panel. You can add whatever content you like to this panel. There are two optional parameters to let you manage the top panel. These are:

-
    -
  • showTopPanel: This can be true or false to indicate whether the top panel is shown or not. The default is false.
  • -
  • topPanelContent: content to display in the top panel which is a JSX object. Nothing is displayed by default.
  • -
- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/03.02-configuration/index.html b/v13/03.02-configuration/index.html deleted file mode 100644 index 039c2aa916..0000000000 --- a/v13/03.02-configuration/index.html +++ /dev/null @@ -1,2744 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Configuration Overview - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

Configuration Overview

-

There are five configuration objects that can be passed as props to the <CommonCanvas> -React object:

-

Canvas Config

-

This is the main canvas configuration. It allows customization of many aspects of the flow editor, visual layout, palette and tooltips.

-

Toolbar Config

-

Allows customization of the toolbar including the addition of application specific buttons.

-

Notification Config

-

Allows customization of the notification panel which is displayed by clicking the notification icon on the toolbar.

-

Context Menu Config

-

Allows some minor customization of the what options the context menus/toolbars display.

-

Keyboard Config

-

Allows customization of the shortcut keys supported by the flow editor.

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/03.02.01-canvas-config/index.html b/v13/03.02.01-canvas-config/index.html deleted file mode 100644 index 05b40dad17..0000000000 --- a/v13/03.02.01-canvas-config/index.html +++ /dev/null @@ -1,4357 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Canvas Config - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

Canvas Config object

-

The canvas config object is optional. If it is not provided, or any of the properties within it are not provided, Common Canvas will use reasonable defaults. Here’s an example of a canvas config object: -

    const commonCanvasConfig = {
-       "enableNodeFormatType": "Vertical",
-       "enableLinkType": "Straight"
-       }
-    };
-
-and this is how it is specified to Common Canvas: -
    render() {
-        return (
-            <CommonCanvas
-                canvasController={this.canvasController}
-                config={commonCanvasConfig}
-            />
-        );
-    }
-

-

Nodes

-

enableNodeFormatType

-

This can be “Horizontal” or “Vertical”. “Horizontal” is the default. “Horizontal” will display a node with an image and the label to the right of the image. “Vertical” will display the node with the label underneath the image. See the node customization section for details on what this will do.

-

enableNodeLayout

-

This is a simple Javascript object, the properties of which override the default node layout properties. For more details see the node customization section.

-

enableResizableNodes

-

This is a boolean. The default is false. If set to true, the user can resize nodes by dragging the edges of the node to increase or decrease the width and/or height of the node. When hovering the mouse cursor over the edge of the node the user will see a sizing cursor to indicate the resize function is available. This option works best when the node has a background rectangle that shows the extent of the sizing area.

- -

This is a boolean. The default is false. If set to true, the user is allowed to create a link that points to the node the link originated from: a loop-back link. This is created by the user by dragging from the output port on the node and dropping the new link onto the same node.

-

enableLinkDirection

-

This can be “LeftRight”, “RightLeft”, “TopBottom”, or “BottomTop”. “LeftRight” is the default. This alters the default location for input and output ports on the node, as follows:

-
    -
  • For “LeftRight” input ports will be on the left of the node and output ports will be on the right of the node
  • -
  • For “RightLeft” input ports will be on the right of the node and output ports will be on the left of the node
  • -
  • For “TopBottom” input ports will be on the top of the node and output ports will be on the bottom of the node
  • -
  • For “BottomTop” input ports will be on the bottom of the node and output ports will be on the top of the node
  • -
-

In addition to these positions, the port positions can be further customized using the nodeLayout options.

- -

This is a boolean. The default is false. If set to true, the user can drag nodes from the palette or from the canvas and drop them onto existing links in the flow. This causes the dropped node to be inserted between the two nodes joined by the link, meaning new links are created that join the new node to the previously joined nodes and the old link is removed. When the user performs the drop Common Canvas will call the editActionHandler with one of two possible commands:

-
    -
  • “createNodeOnLink” - when a node is being dragged from the palette leading to node creation & insertion
  • -
  • “insertNodeIntoLink” - when an existing node is dragged from the canvas leading to insertion of the existing node into the link
  • -
-

enablePositionNodeOnRightFlyoutOpen

-

This can be a boolean or an object. The default is false. If set to true, when the right-side flyout is open the currently selected node (assuming there is one) will be automatically positioned in the center of the viewport (canvas area). Instead of true this field can also be set to a simple JavaScript object like this { x: 30, y: 40 } where x and y indicate the position where the node will be positioned as a percentage of the width and height of the viewport respectively.

-

enableHighlightNodeOnNewLinkDrag

-

This is a boolean. The default is false. If set to true Common Canvas will add the “data-new-link-over” attribute to the node’s group <g> element, when the end of a new link is dragged to be close to and over a target node. This allows applications to alter the appearance of the target node as a new link is dragged towards it.

-

enableHighlightUnavailableNodes

-

This is a boolean. The default is false. If set to true, when the user begins to drag a new link line, Common Canvas will add a new class called d3-node-unavailable to all nodes which cannot accept the link as input. The class will be applied to each node’s group <g> element in the DOM. This class can be used for styling the unavailable nodes as desired using CSS. The default styling will ‘gray out’ the node label, node outline rectangle (if there is one) and the node icon (provided it is an SVG image). These styles can be overridden in the applications CSS if different styling is needed. This behavior also applies if the end of a partially or fully detached link is dragged.

-

enableRaiseNodesToTopOnHover

-

This is a boolean. The default is true. If set to false the nodes will be left in their original place in the DOM. If set to true, when the user moves the mouse cursor over a node, that node will be moved in the DOM so that the node appears on top of all other nodes. This is only really noticeable if nodes, or parts of nodes, overlap other nodes. It can be useful if your nodes have protruding ports or decorations and your users sometimes position nodes very close to one another. Note: the ‘true’ setting can adversely affect the behavior of scroll areas in a node that are displayed using a React object (using the nodeExternalObject node layout option) because when the node is moved in the DOM the scroll area gets reset to its initial position. Set this to false if you are displaying nodes using React objects.

-

enableMoveNodesOnSupernodeResize

-

This is a boolean. The default is true. If true, nodes surrounding a supernode will be moved when the supernode is expanded or manually resized so that the supernode does not overlay them. When set to false, the nodes surrounding a supernode will stay in their current positions when the supernode is expanded or manually resized. This may result in the nodes being overlaid by the supernode.

-

enableDisplayFullLabelOnHover

-

This is a boolean. The default is false. If set to true, any abbreviated node label will be displayed in full when the pointer hovers over the label. If set to false, abbreviated node labels will remain the same when the pointer hovers over them.

-

enableSingleOutputPortDisplay

-

This is a boolean. The default is false. If set to true, only the last of the ports from the array of output ports will be displayed for each node. This config property is only applicable to applications with very specialized styling and handling of ports. If set to true with regular applications, it may result in a confusing display to the user. The single port is displayed at a position specified by outputPortRightPosX and outputPortRightPosY layout properties. For exmaple: -

config = {
-    enableSingleOutputPortDisplay: true,
-    enableNodeLayout: {
-      outputPortRightPosX: 0,
-      outputPortRightPosY: 20
-};
-

- -

enableLinkType

-

This can be “Curve”, “Elbow”, “Parallax” or “Straight”. “Curve” is the default. This will set the link style used to connect nodes.

-

enableLinkMethod

-

This can be: “Ports” or “Freeform”. The default is “Ports”. When set to “Ports”, each link will be drawn from a specific output port on the source node to a specific input port on the target node. Note: With this option, links will be drawn to the port locations even if the port display has been switched off by the application. When set to “Freeform” links will be drawn from the source node to the taget node ignoring where ports have been positioned. Applications displaying freeform links usually choose not to display input and output ports.

-

enableStraightLinksAsFreeform

-

This is a boolean. The default is true. If set to true then, when enableLinkType is set to “Straight”, enableLinkMethod will always be treated as if it is set to “Freeform”. If it is set to false, Common Canvas will use whatever value is specified in enableLinkMethod when enableLinkType is set to “Straight”.

-

This config field was introduced to enforce the earlier Elyra Canvas behavior, where “Straight” links are automatically displayed as “Freeform”.

-
-

enableStraightLinksAsFreeform - deprecated

-

This field is deprecated and will be removed in the next major Elyra Canvas version so it is recommeneded that applications using “Straight” links explicitely set enableLinkMethod to “Freeform” now because that will be mandatory when migrating to the next verion.

-
-

enableLinkSelection

-

This can be: “None”, “LinkOnly”, “Handles” or “Detachable”. The default is “None”. These have the following affect on the canvas:

-
    -
  • “None” - no selection of links is possible however user can right click on a link to get a context menu.
  • -
  • “LinkOnly” - a link may be selected and added to the set of currently selected objects (nodes and/or comments).
  • -
  • “Handles” - This includes the “LinkOnly” function. In addition, when a link is selected a handle (either a circle or an image) is displayed at the start and end of the link. The link handle can be dragged to a new node/port position to rewire the flow.
  • -
  • -

    “Detachable” - This includes the “LinkOnly” and “Handles” function. In addition, this option enables detachable links for the canvas. This means a link can exist either:

    -
      -
    • between a source node and an arbitrary point on the canvas (semi-detached) OR
    • -
    • between an arbitrary point on the canvas and a target node (semi-detached) OR
    • -
    • between two arbitrary points on the canvas (detached)
    • -
    -

    Additionally, “Detachable” mode, allows:

    -
      -
    • semi-detached or fully-detached links to be stored in and retrieved from the pipeline flow document.
    • -
    • semi-detached or fully-detached links to be manipulated with link handles. The link handles can be used to drag the end of the link away from its connecting source or target nodes and onto the canvas. Or semi-detached or fully detached links can be reattached to nodes/ports.
    • -
    • a new detached link to be created by drawing out a new link from a node and dropping it onto the canvas.
    • -
    • palette and canvas nodes, when they are dragged, to be dropped onto the ends of detached links to automatically attach them to the node being dragged.
    • -
    -
  • -
-

enableLinkReplaceOnNewConnection

-

This is a boolean. The default is false. If set to true, the user can drag a new connection to a target node, and if the input port on the target node has a maximum cardinality of one AND there is currently a connection to that port, the existing connection will be removed and the new connection is created; essentially this gesture replaces the existing link with the new one. If set to false the new connection will not be completed and the existing link will remain in place.

-

When set to true and a link is replaced, Common Canvas will call the beforeEditActionHandler the editActionHandler callback functions, if either are provided by the host application, with a data object parameter with the editType field set to "linkNodesAndReplace".

-

enableAssocLinkCreation

-

This is a Boolean. The default is false. If set to true it changes the nature of links that are created between nodes as follows:

-
    -
  • The user is able to pull out a link from either port on the node and drag it to another node
  • -
  • When a link is completed an association link is created rather than the regular data flow link that is created when this field is set to true. Association links describe an association between pairs of nodes and do not indicate any kind of data flow between those nodes.
  • -
-

enableAssocLinkType

-

This can be “Straight” or “RightSideCurve”. The default it “Straight”. This field changes the way association links are drawn on the canvas.

-

enableLinksOverNodes

-

This is a boolean. The default value is false. If set to true links are placed above nodes in the canvas. Hover over nodes/links would still have links above nodes if enableLinksOverNodes is set to true. This is useful if the ports are positioned within the boundaries of the node and the link lines need to be displayed to those positions.

-

Comments

-

enableMarkdownInComments

-

This is a boolean. The default is false. When set to true the user may enter markdown syntax into comments on the canvas when in edit mode for the comment. When the editing ends, the comment is shown in presentation mode and the markdown syntax is converted to HTML which is displayed in the comment and is styled by CSS.

-

Toolbar

-

enableToolbarLayout

-

This can be: “Top” or “None”. The default is “Top”. “Top” displays a toolbar at the top of the canvas area. See the Toolbar Config docs for details on how to customize the toolbar. “None” stops the toolbar from appearing.

-

Tips

-

tipConfig

-

This is a simple JavaScript object that configures whether tips for palette items, nodes, ports, links, decorations or the state tag are enabled (value set to true) or disabled (value set to false). By default, all tips are enabled. The following would switch off tips for ports and links. -

       "tipConfig": {
-           "palette": true,
-           "nodes": true,
-           "ports": false,
-           "links": false,
-           "decorations": true,
-           "stateTag": true
-       }
-
-The tips displayed by the palette can be further refined. For example, this would prevent tips for palette categories from being displayed, but would still display tips for node templates in the categories: -
       "tipConfig": {
-           "palette": {
-              "categories": false,
-              "nodeTemplates": true
-           },
-           "nodes": true,
-           "ports": false,
-           "links": false,
-           "decorations": true,
-           "stateTag": true
-       }
-

-

Note: The default content of tips can be overwritten by implementing the Tip Handler callback.

-

Context Toolbar

-

enableContextToolbar

-

This is a boolean. The default is false. When set to true, Common Canvas will display a context toolbar instead of a context menu for performing actions on canvas objects. A context toolbar is a small toolbar that appears above nodes, links and comments as the mouse cursor is hovered over them. The toolbar shows icons for actions the user is most likely to want to perform on the object. An overflow icon is displayed which, when clicked, shows a menu of additional actions. A context toolbar for the canvas background can also be displayed by right-clicking on the background. Common Canvas will display default context toolbars for nodes, links comments and the canvas background however, the default actions can be customized by implementing the Context Menu Handler` callback.

-

Palette

-

enablePaletteLayout

-

This can be: “Modal” or “Flyout” or “None”. The default is “Flyout”. “Flyout” displays a panel on the left side of the canvas containing the palette icons and “Modal” shows the palette icons in a dialog window. “None” stops the palette from appearing.

-

enableAutoLinkOnlyFromSelNodes

-

This is a boolean. The default is false. When set to true the auto-add function (where double clicking a node in the palette automatically adds it to the canvas) will only link up nodes when a node is already selected on the canvas and then, only if the selected node can be linked to the node that was double clicked. If false, the auto-add function will make a best guess at which node the double-clicked node should be added to.

-

enablePaletteHeader

-

This is a JSX object that will displayed in an open, wide palette. It is positioned below the Seach bar and above the categories and nodes. The default is null, which means nothing will be displayed. This option can be used by the application to add application specific function into the palette, for example, a button could be added.

-

enableNarrowPalette

-

This is a boolean. true is the default. If true when the palette is closed the narrow palette will be shown. When false the palette completely closes.

-
-

paletteInitialState - deprecated

-

Deprecated – This option is deprecated and will be removed soon. Use CanvasController.openPalette() to display an opened palette at start-up. This openPalette() can be called immediately after creating the canvas controller.

-

paletteInitialState is a boolean. false is the default. If set to true the palette will be opened when Common Canvas first appears to its full (non-narrow) state.

-
-

Zoom (scale and pan)

-

enableSaveZoom

-

This can be: “None”, “LocalStorage” or “Pipelineflow”. The default is “None”.

-
    -
  • “None” - When the canvas is zoomed, the zoom (scale and x/y pan) are not saved anywhere so if the canvas is closed and reopened it reopens with the default zoom which is a scale of 1 and x/y pan values of 0.
  • -
  • “LocalStorage” - The zoom for the canvas is stored in the browser’s local storage and will be reapplied to the canvas each time that canvas is shown in that browser. This applies to sub-flows, when the user displays them full-screen, as well as the primary flow. Sub-flows and the primary flow each have their own zoom amounts stored in local storage. Note: Zoom amounts stored in local storage can be cleared from storage by calling the canvasController.clearSavedZoomValues() API method.
  • -
  • “Pipelineflow” - The zoom is serialized into the pipeline flow document and when a pipeline flow document is provided to Common Canvas through the API the zoom will be applied to the canvas display. Zoom amounts can be stored for both primary and sub pipelines. (See the pipelineFlow schema specification).
  • -
-

enablePanIntoViewOnOpen

-

This can be either true or false. The default is false. If set to true, the canvas will be panned so as much of the canvas area (the area containing the nodes and comments) is visible in the viewport as possible. This will only happen when enableSaveZoom === “None” or if there is no saved zoom available either in local storage (when enableSaveZoom === “LocalStorage”) or in the pipelineFlow (when enableSaveZoom === “Pipelineflow”).

-

enableZoomIntoSubFlows

-

This is a boolean. The default is false. When set to true, Common Canvas will override the maximum zoom extent value which, by default is used for the entire canvas, to allow the user to zoom in on in-place sub-flows further than they can do on containing flows. This means the user can zoom in on multi-nested sub-flows so they are easier to view. To see this effect, the user must position the mouse pointer over the sub-flow before performing the zoom gesture.

-

Canvas Content

-

emptyCanvasContent

-

This is a JSX or HTML snippet that contains some text or any elements (such as an image) that you want to display when the canvas is empty, that is, when it doesn’t have any nodes or comments. The default behavior if this config parameter is not provided is that Common Canvas will display an image and message saying: “Your flow is empty!”.

-

dropZoneCanvasContent

-

This is a JSX or HTML snippet that contains some text or any elements (such as an image) that you want to display when a data object is dragged from the desktop over the canvas. The default behavior if this config parameter is not provided is that Common Canvas will display an image and a message saying: “Drop to add to canvas and project”. The content will not be displayed unless the enableDropZoneOnExternalDrag configuration parameter (see above) is set to true.

-

enableDropZoneOnExternalDrag

-

This is a boolean. The default is false. If set to true a graphic overlay will be displayed over the canvas when a data object icon is dragged from the desktop over the canvas. The default graphic overlay will be an image and a message saying: “Drop to add to canvas and project” unless the dropZoneCanvasContent configuration parameter is provided.

-

See the Dragging an object from the desktop section for details on how to handle the drop of an external object onto the canvas.

-

enableStateTag

-

This can be either “None”, “Locked” or “ReadOnly”. The default is “None”. When set to either “Locked” or “ReadOnly”, a ‘state tag’ object will be shown permanently over the top of the canvas. The state tag will be positioned in the center and towards the top of the canvas. The state tag consists of a black background rectangle with rounded corners overlaid with an icon and a text label. A tooltip is displayed when the mouse pointer is hovered over the state tag. The icon, label and default tooltip will be set appropriately based on the value (“Locked” or “ReadOnly”) for this setting. The host application can override the tooltip by implementing the Tip Handler callback.

-

Canvas Operation

-

enableInteractionType

-

This can be “Mouse”, “Carbon” or “Trackpad”. The default is “Mouse”. -“Trackpad” has been deprecated and will be removed in the future.

-
    -
  • -

    With this set to “Mouse” the following interaction is enabled:

    -
      -
    • Zoom canvas = Rotate mouse wheel. -(Can be simulated with a trackpad with two finger up and down scroll)
    • -
    • Pan canvas = Left mouse key down on canvas background + drag. -(Can be simulated with a trackpad with press down on trackpad and drag.)
    • -
    • Region select on canvas = Shift key + left mouse key down on canvas background + drag. -(Can be simulated with a trackpad with Shift + finger down on trackpad + drag across canvas background)
    • -
    -
  • -
  • -

    With this set to “Carbon” the following interaction is enabled:

    -
      -
    • Zoom canvas = Rotate mouse wheel. -(Can be simulated with a trackpad with two finger up and down scroll)
    • -
    • Pan canvas = Press and hold space bar then left mouse key down on canvas background + drag. -(Can be simulated with a trackpad by press and hold space bar then press down on trackpad and drag.)
    • -
    • Region select on canvas = Left mouse key down on canvas background + drag. -(Can be simulated with a trackpad with press down on trackpad and drag.)
    • -
    -
  • -
  • -

    This setting is now deprecated With this set to “Trackpad” the following interactions are enabled:

    -
      -
    • Zoom canvas = Two finger pinch or two finger spread gesture. -(Can be simulated with a mouse as follows: Ctrl + rotate mouse wheel.)
    • -
    • Pan canvas = Two finger horizontal or vertical scroll gesture. -(Can be simulated with a mouse as follows: Vertical pan is rotate mouse wheel; Horizontal pan is Shift + rotate mouse wheel)
    • -
    • Region select on canvas = Finger down + drag. -(Can be simulated with a mouse as follows: Left button down + drag on canvas background)
    • -
    -
  • -
-

enableParentClass

-

This is a string which is a class name. The default is empty string. If a class name is provided it is applied to the top-most DOM element for Common Canvas. This can be used to make you CSS override rules more specific which means they will be used in preference to any default styles. For example, if you specify “my-app-styles” for this field then CSS like this: -

    .my-app-styles .d3-node-body-outline {
-        fill: orange;
-    }
-
-will override the style from the common-canvas CSS -
    .d3-node-body-outline {
-        fill: white;
-    }
-

-

enableDragWithoutSelect

-

This can be either true or false. The default is false. If set to true, the user can drag and drop a single node or a single comment without that gesture removing selection on any other nodes or comments. If the node being dragged was selected prior to the drag gesture then it and any other objects that are currently selected will be moved. With this parameter set to false (or missing) a drag and drop gesture will select the node or comment being dragged and will deselect any currently selected objects.

-

enableEditingActions

-

This is a boolean. The default is true. If set to false, various editing actions on the canvas will be prevented, as follows:

-
    -
  1. -

    Nodes cannot be created on the canvas using any of the following:

    -

    (a) dragging and dropping a node template from the palette onto the canvas or

    -

    (b) dragging and dropping an object onto the canvas from outside the canvas area, such as a file being dragged from the computer desktop onto the canvas (see note below), or

    -

    (c) double clicking a node in the palette to create a node

    -

    Note: It is not possible for Common Canvas to prevent an object being dragged from the computer desktop to the canvas so it is recommended the drop zone (which provides visual feedback about the drop) should be switched off by setting the enableDropZoneOnExternalDrag config field to false.

    -
  2. -
  3. -

    Nodes and comments cannot be dragged and moved.

    -
  4. -
  5. The end points of Links, when enableLinkSelection is set to "Detachable" or "Handles", cannot be dragged and moved.
  6. -
  7. Links from nodes and comments cannot be created by dragging from the port object on the source node or comment to the target node.
  8. -
  9. Comments, node labels and text decorations cannot be edited, neither by clicking the edit icon (which does not appear) nor by double clicking the text.
  10. -
  11. -

    Context menu options that alter the canvas objects will be removed from the context menu before it is displayed by Common Canvas. The options that will be removed are:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Option TextAction Identifier
    New CommentcreateComment
    DisconnectdisconnectNode
    Edit->Cutcut
    Edit->Copycopy
    Edit-Pastepaste
    Undoundo
    Redoredo
    DeletedeleteSelectedObjects
    Create supernodecreateSuperNode
    Create external supernodecreateSuperNodeExternal
    Deconstruct supernodedeconstructSuperNode
    Collapse supernodecollapseSuperNodeInPlace
    Expand supernodeexpandSuperNodeInPlace
    Convert external to localconvertSuperNodeExternalToLocal
    Convert local to externalconvertSupernodeLocalToExternal
    DeletedeleteLink
    Save to palettesaveToPalette
    -

    If your application adds its own editing actions to the context menu your code must remove them if they are not needed in some situations (e.g. you are displaying a read-only canvas).

    -
  12. -
  13. -

    Any default toolbar actions (tools) that alter the canvas objects will be disabled regardless of their specified enablement status. These actions are:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Default TooltipAction
    Undoundo
    Redoredo
    Cutcut
    Copycopy
    Pastepaste
    DeletedeleteSelectedObjects
    New commentcreateAutoComment
    Arrange HorizontallyarrangeHorizontally
    Arrange VerticallyarrangeVertically
    -
  14. -
  15. -

    Keyboard shortcuts that alter the canvas will not work. These are:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    ShortcutAction
    deletedelete
    Ctrl/Cmd + xcut
    Ctrl/Cmd + ccopy
    Ctrl/Cmd + vpaste
    Ctrl/Cmd + zundo
    Ctrl/Cmd + Shift + zredo
    Ctrl/Cmd + yredo
    -
  16. -
  17. -

    The browser’s Edit menu options (cut, copy, paste) will not work with the canvas objects regardless of the setting for enableBrowserEditMenu.

    -
  18. -
-

enableImageDisplay

-

This can be set to: “SVGInline”, “LoadSVGToDefs” or “SVGAsImage”. The default is “SVGInline”. This field controls the display of SVG image files (that is, files with a .svg extension) on the canvas, such as those displayed for node icons or decoration images. This option can be useful to improve performance when images are repeated a large number of times on the canvas and particularly when the browser cache is disabled. Note: this does not affect the display behavior of non-SVG files which are always displayed inside an <image> tag. The behavior for SVG image files is as follows:

-
    -
  • “SVGInline” - This is the default. With this setting, the image file is read in – from the server or cache (if available) – and the SVG tags within the file displayed in-line in the DOM. This means elements within the SVG can be customized using CSS on a node-by-node basis.
  • -
  • “LoadSVGToDefs” - With this option, each unique SVG file is read from the server (or cache) and written into a <symbol> element within the <defs> element of the canvas SVG area. A <use> element is then written to the place in the DOM for each place where the image should be displayed. Using this option means the SVG file for each image is only read once which should improve performance if images are repeated a lot on the canvas. However, it does limit the customization possibilities for the images on a node-by-node basis. Customization colors can be passed into the images using CSS inheritance, or the currentColor keyword, provided there are no internal classes applied to the elements in the SVG.
  • -
  • “SVGAsImage” - This option causes the SVG file to be displayed within an <image> element in the DOM. The file loading is handled internally by the browser. Again, with this option customization capabilities on a node-by-node basis are limited. Customization colors can be passed into the images using CSS inheritance, or the currentColor keyword, provided there are no internal classes applied to the elements in the SVG.
  • -
-

enableInternalObjectModel

-

This is a boolean. The default is true. It is recommended you leave this set to true. If you set this to false your code will be responsible for handling the object model, which is NOT recommended. When set to false, changes are not automatically saved into the common-canvas object model and are not reflected in the canvas display. Consequently, the application is expected to listen to events and update the common-canvas object model using the canvas-controller API if it want visual changes to the canvas.

-

enableRightFlyoutUnderToolbar

-

This is a boolean. The default is false. If set to true the right flyout panel, when opened, will appear below the toolbar and will not cause the toolbar to compress. The default behavior is that the right flyout panel, when opened, will appear at the side of the toolbar and will compress the space available for the toolbar to be displayed. Warning: the notifications panel which is tied to the notifications icon in the toolbar will appear over the top of the right-side flyout with this option set to true.

-

enableRightFlyoutDragToResize

-

This is a boolean. The default is false. If set to true, the right flyout panel can be resized by dragging its left border. When hovering over the left border of the flyout, the cursor will change to indicate that resizing is possible. Users can drag the border to adjust the width of the flyout, allowing it to expand or collapse. This functionality offers more flexible layout options for the user. If set to false, the right-flyout panel, when open, will be displayed with a default width and cannot be resized by dragging its edge. The application can add its own sizing function if required.

-

enableLeftFlyoutUnderToolbar

-

This is a boolean. The default is false. If set to true the left flyout panel, when opened, will appear below the toolbar and will not cause the toolbar to compress. The default behavior is that the left flyout panel, when opened, will appear at the side of the toolbar and will compress the space available for the toolbar to be displayed.

-

enableExternalPipelineFlows

-

This is a boolean. The default is false. If true, the context menu will include a Create External Supernode option when a set of objects are selected from which a supernode can be created.

-

Waring: The host application must implement some of the common-canvas callbacks for external pipeline flow support to work correctly. See the section on External Pipeline Flow support for more details.

-

enableSnapToGridType

-

This can be: “None”, “During” or “After”. The default is “None”.

-
    -
  • “None” - there is no snap to grid and objects can be moved to any position on the canvas.
  • -
  • “During” - when nodes or comments are moved or sized, the objects snap to an imaginary grid while the objects are being dragged or sized. This gives a somewhat jerky effect as the move or size is happening but has the advantage of telling the user exactly where the object will be when they release the mouse button to end the action.
  • -
  • “After” - nodes or comments snap to a grid when the drag or size event ends. This gives a smooth dragging and sizing effect but the user does not see the final position until they release the mouse button at the end of the action. By default the canvas uses reasonable values for the grid increments.
  • -
-

enableSnapToGridX

-

This optional value overrides the default horizontal increment of the snap-to-grid grid. It can be either a numeric value which is a number of pixels or it can be a numeric value followed by a % sign (e.g. “25%”) which indicates the grid will be a percentage of the default node width. Its default is dependent on whatever is set for enableNodeFormatType. That is for “Horizontal” it will be “20%” and for “Vertical” it will be “25%”.

-

enableSnapToGridY

-

This optional value overrides the default vertical increment of the snap-to-grid grid. It can be either a numeric value which is a number of pixels or it can be a numeric value followed by a % sign (e.g. “25%”) which indicates the grid will be a percentage of the default node height. Its default is dependent on whatever is set for enableNodeFormatType. That is for “Horizontal” it will be “33.33%” and for “Vertical” it will be “20%”.

-

enableAutoLayoutVerticalSpacing

-

This is the spacing in pixels which is used to separate nodes vertically when either the vertical or horizontal auto layout action is used.

-

enableAutoLayoutHorizontalSpacing

-

This is the spacing in pixels which is used to separate nodes horizontally when either the vertical or horizontal auto layout action is used. For horizontal auto layout, Common Canvas may override this value if it decides that more space is needed to prevent connecting lines from doubling back on themselves.

-

enableBrowserEditMenu

-

This is a boolean. true is the default. If true, the Cut/Copy/Paste items in the Browser’s Edit menu, including keyboard input for those actions, can be used for performing those actions on objects (e.g. Nodes) in the canvas. When false, those items in the Browser’s edit menu, including keyboard input for those actions, will not work for objects in the canvas. This will not prevent those actions working in the canvas when, say, invoked with the toolbar or canvas context menus, but this property can be used if the keyboard input for those actions into the canvas is disabled for Common Canvas using the Keyboard Config object.

-

schemaValidation

-

This is a boolean. false is the default. It tells Common Canvas whether you want pipleineFlow and palette objects to be validated against the schema files when they are submitted to the canvas controller, using the setPipelineFlow(pFlow) or setPipelineFlowPalette(palette) methods. If any validation errors are found messages are displayed in the browser console. It is recommended this option be set to true during development and testing but switched off in production since schema validation can be somewhat slow for large objects.

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/03.02.02-toolbar-config/index.html b/v13/03.02.02-toolbar-config/index.html deleted file mode 100644 index 201597cfc8..0000000000 --- a/v13/03.02.02-toolbar-config/index.html +++ /dev/null @@ -1,3071 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Toolbar Config - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
- -
- - - -
-
- - - - - - - - - - - - -

Toolbar Config object

-

The canvas toolbar config object is optional. If it is not provided Common Canvas will display a reasonable default toolbar.

-

-

If the toolbar config is provided, it configures which action buttons and dividers are shown in the toolbar. A toolbar will be displayed for Common Canvas if the canvas configuration field enableToolbarLayout is set to “Top” (which is the default).

-

The toolbar config object specifies actions for the left and right side of the toolbar. The application can also optionally tell the toolbar not to handle the enable/disable state for the standard toolbar buttons using overrideAutoEnableDisable.

-

When the user clicks one of the action buttons the action will be performed either by Common Canvas or by the application, if it is an applicaiton specific action. In both cases, Common Canvas will call the beforeEditActionHandler and editActionHandler callbacks.

-

The toolbar supports a number of keyboard shortcuts for accessibility

-

The leftBar and rightBar fields contain an array of action objects: one element for each toolbar item. Here is an example, toolbar configuration object:

-

    import { Bookmark } from "@carbon/react/icons";
-    ...
-    ...
-    const toolbarConfig = {
-        leftBar: [
-            { action: "undo", label: "Undo" },
-            { action: "redo", label: "Redo" },
-            { divider: true },
-            { action: "cut", label: "Cut" },
-            { action: "copy", label: "Copy" },
-            { action: "paste", label: "Paste" },
-            { divider: true },
-            { action: "createAutoComment", label: "Add Comment", enable: true },
-            { action: "deleteSelectedObjects", label: "Delete" },
-            { action: "arrangeHorizontally", label: "Arrange Horizontally", enable: true }
-            { divider: true },
-            { action: "myBookmrk", label: "Add bookmark", enable: true, iconEnabled: (<Bookmark size={32}/>) }
-        ],
-        rightBar: [
-            { action: "stop", label: "Stop Execution", enable: false },
-            { divider: true },
-            { action: "run", label: "Run Pipeline", enable: false }
-        ],
-        overrideAutoEnableDisable: false
-    };
-    ...
-    ...
-    return <CommonCanvas toolbarConfig={toolbarConfig} canvasController={canvasController}/>
-
-Where:

-
    -
  • -

    leftBar - an array of action items to specify what is displayed on the left side of the toolbar.

    -
  • -
  • -

    rightBar - an array of action items to specify what is displayed on the right side of the toolbar. If this is omitted, Common Canvas will automatically populate the right side of the toolbar with zoom-in, zoom-out, and zoom-to-fit actions. To suppress these right side actions, specify the rightBar field as an empty array or an array containing the actions required on the right.

    -
  • -
  • -

    overrideAutoEnableDisable - a boolean. The default is false. By default Common Canvas has an auto-enablement feature that controls the enablement of common tools in the toolbar based on user actions (e.g enable the Delete icon when items are selected). If overrideAutoEnableDisable set to true it will switch off the auto-enablement feature. This is useful if the host application wants to disable all the nodes under certain circumstances. If set to true, the enable property in the action items for each tool is used to decide whether to display the icon as enabled or disabled. If set to false or omitted, Common Canvas will handle the auto-enablement of common actions. (See the actionsection below for more details.)

    -
  • -
-

The toolbar will display the objects in the same order they are defined in the leftBar and rightBar arrays.

-

Toolbar action object definition

-

Here is an example of an action object which must contain a unique action field as a minimum. -

    {
-        action: "run",
-        label: "Run",
-        enable: true,
-        iconEnabled: "/image/myOwnEnabledIcon.svg",
-        iconDisabled: "/image/myOwnDisabledIcon.svg",
-        incLabelWithIcon: "before",
-        kind: "primary",
-        tooltip: "Run the flow",
-        isSelected: false
-    }
-

-
    -
  • -

    action - a unique identifier string which is the name of the action to be performed. This action name will set in the editType field of the data parameter passed into the beforeEditActionHandler and editActionHandler callback methods. The application can use these callbacks to detect what action the user clicked in the toolbar.

    -

    The toolbar supports two types of action:

    -
      -
    • -

      Internal actions - These are requested by the application by specifying one of the reserved internal actions names. These actions are performed internally by Common Canvas. A default icon will be provided by Common Canvas for the most popular actions. For example, if the deleteSelectedObjects action is specified a trash can icon will be displayed in the toolbar and any selected objects will be deleted from the flow editor when the action is clicked. The application can override the default icon by specifying the iconEnabled field.

      -

      Disablement of these built in actions is also handled by Common Canvas: “undo”, “redo”, “cut”, “copy”, “paste”, “deleteSelectedObjects”, “createAutoComment”, “arrangeHorizontally” “arrangeVertically”, “zoomIn”, “zoomOut”, “zoomToFit”.

      -

      For example, when no canvas objects are selected the deleteSelectedObjects action (trash can icon) will be automatically disabled.

      -

      The application can switch off this automatic enable/disable function by setting overrideAutoEnableDisable field in the toolbar config to true. When overrideAutoEnableDisable set to true, the enable field in each action object will set the enablement appearance of the item.

      -
    • -
    • -

      External actions - These are specified by the application and must be handled by the application in the beforeEditActionHandler and editActionHandler callbacks. An icon must be specified for these actions. The application can use icons imported from the Carbon Icon library. For example, in the sample code above myBookmrk has been specified as a external action with the Carbon Bookmark icon specified. Common Canvas will ignore this action when the button is clicked and pass it through in the data.editType field to the editActionHandler callback.

      -
    • -
    -
  • -
  • -

    label - a short string or a JSX object that describes the action. This is used as the tooltip text or is (optionally) displayed next to the icon if incLabelWithIcon is specified.

    -
  • -
  • -

    enable - A boolean. The action button is clickable when set to true. If false, the button will be disabled. If not set, it will default to disabled (false). If overrideAutoEnableDisable is set to false, or omitted, this field is ignored for the standard action items (like cut, copy, paste) because Common Canvas handles their enable/disable appearance. If overrideAutoEnableDisable is set to true, this field will be used for standard action items.

    -

    -

    -
  • -
  • -

    iconEnabled - specifies the icon to display when enable is true. Common Canvas will provide icons for some of the reserved internal actions so the application doesn’t need to specify iconEnabled or iconDisabled for them:

    -

    It can be either:

    -
      -
    • a string containing the path to a custom SVG file to display or
    • -
    • a JSX expression, for example (<Edit32 />) where Edit32 is an icon imported from carbon icons. It is recommended to only pass very simple JSX expressions.
    • -
    -
  • -
  • -

    iconDisabled - specifies the icon to display when enable is false. If iconDisabled is not specified iconEnabled will be used instead. It can be omitted for any of the standard actions (see iconEnabled above).

    -

    It can be either:

    -
      -
    • a string containing the path to a custom SVG file to display or
    • -
    • a JSX expression, for example (<Edit32 />) where Edit32 is an icon imported from carbon icons. It is recommended to only pass very simple JSX expressions.
    • -
    -
  • -
  • -

    incLabelWithIcon - can be set to “no”, “before” or “after”. The default is “no”. This field specifies whether the label should be displayed in the toolbar with the icon and if so, where it is displayed with respect to the icon.

    -

    -

    -
  • -
  • -

    kind - can be set to “default”, “primary”, “danger”, “secondary”, “tertiary” or “ghost”. The default it “default”. These give the action the same styling as the equivalent kind’s of buttons in the carbon library.

    -

    -
  • -
  • -

    tooltip - A string or JSX object. The tooltip that will be displayed for the action. If this is not provided the label will be displayed as the tooltip instead.

    -
  • -
  • -

    isSelected - A boolean. When set to true the toolbar button displays a selection highlight. This is displayed as either a blue bar along the bottom border of buttons in the toolbar

    -

    -

    -

    or a checkmark for items that appear in sub-menus.

    -

    -

    When applied This is useful for implementing a button that switches on and off a mode, as opposed to a regular button which does not have any state.

    -

    This property can also be used to indicate a current state between a number of mutually exclusive settings. In this case, one button would be added to the toolbar for each setting and then the isSelected property would be set to true for the setting that is currently active. Then, when the user clicks a different option in the set, the application code would set isSelected to true for that button and set it to false for the previously selected button. (This would give behavior like a radio button set.)

    -
  • -
  • -

    className - This a string that will be appended to the class field for the top-level <div> that surrounds the action button. This can be used to set application-specific CSS for the button.

    -
  • -
  • -

    textContent - This is an additional string that will be displayed on top of the action button. It can be used to specify adittional information to enahance the icon. For example, a count of messages could be displayed over a icon that, when clicked, shows a messages panel.

    -
  • -
-

Automatic toolbar items

-

Two toolbar items are automatically added to the toolbar:

-
    -
  • A palette action which is used for opening and closing the palette. This is added to the left side of the toolbar if the enablePaletteLayout field is set to either “Flyout” (the default) or “Modal” in the canvas configuration.
  • -
  • A notification panel action which is used to open and close the notifications panel. This will be added to the right side of the toolbar if a notification configuration object is specified to the <CommonCanvas> react object.
  • -
-

The position and a subset of fields for these items can be customized by providing an appropriate object in either the leftBar or rightBar arrays. The action field for the items should be either “togglePalette” or “toggleNotificationPanel”. Any of the following fields can be optionally provided to override the default values: label, iconEnabled, incLabelWithIcon and tooltip.

-

For example, if the application provides the following in, say, the leftBar array: -

   import { AddAlt, SubtractAlt, Notification } from "@carbon/react/icons";
-   ...
-
-   const toolbarConfig = {
-       leftBar: [
-           ...
-           { action: "togglePalette",
-             label: this.canvasController.isPaletteOpen() ? "Close Palette" : "Open Palette",
-              iconEnabled: this.canvasController.isPaletteOpen() ? (<SubtractAlt />) : (<AddAlt />),
-              incLabelWithIcon: "after" },
-           { divider: true },
-           { action: "toggleNotificationPanel", iconEnabled: (<Notification />) },
-           ...
-       ]
-   };
-

-

Will look like this:

-

-

Sub-area properties

-

The toolbar button can show a ‘sub-area’ below the button when the button is clicked. This can be either a sub-menu which is a list of text options or a sub-panel which is a small window that can show whatever the application wants such as settings or messages.

-
    -
  • -

    subMenu - Specify either this or the subPanel field. This is an array of action objects (the same as those specified for the toolbar) which will displayed as a menu of options that appears under the icon on the toolbar.

    -

    This code:

    -

    import { TextScale } from "@carbon/react/icons";
    -...
    -const subMenuTextSize = [
    -    { action: "title", label: "Title", enable: true },
    -    { action: "header", label: "Header", enable: true },
    -    { action: "subheader", label: "Subheader", enable: true },
    -    { action: "body", label: "Body", enable: true }
    -];
    -...
    -const toolbarConfig = {
    -  leftBar: [
    -    ...
    -    { action: "text-size-submenu", incLabelWithIcon: "after", iconEnabled: (<TextScale size={32} />),
    -          label: "Text Size", enable: true, subMenu: subMenuTextSize, closeSubAreaOnClick: true
    -    }
    -    ...
    -  ]
    -}
    -
    -will display this:

    -

    -

    when the user clicks the options in the menu the associated action will be executed by calling the beforeEditActionHandler and editActionHandler callbacks.

    -
  • -
  • -

    subPanel - Specify either this or the subMenu field. This is a React object that will render the contents of a panel that appears under the action icon.

    -

    This code:

    -

    import { Settings } from "@carbon/react/icons";
    -...
    -const toolbarConfig = {
    -  leftBar: [
    -    ...
    -      { action: "settingspanel", iconEnabled: (<Settings />), label: "Settings", enable: true,
    -        subPanel: AppSettingsPanel,
    -        subPanelData: { saveData: (settings) => window.alert("Settings: " + settings) }
    -      }
    -    ...
    -  ]
    -}
    -
    -where this is the AppSettingsPanel class

    -

    will display this:

    -

    -
  • -
  • -

    subPanelData - This is a JavaScript object that will be passed as one of the props into the React object specified in the subPanel field. The application can use this to pass into the subPanel class any data or callback functions needed for the panel to do its job.

    -
  • -
  • -

    purpose - can be set to “single” or “dual”. The default is “single”. If set to “dual” the button will have two parts. The icon will be displayed to the left and to the right will be an up/down chevron icon. If the user clicks the icon on the left the action specified in the action field will be executed. If the user clicks the chevron a panel will be displayed below the chevron with the contents that are specified in the object specified in the subPanel field.

    -

    This code:

    -
    const toolbarConfig = {
    -  leftBar: [
    -    ...
    -      { action: "undo", label: "Undo", enable: true, purpose: "dual",
    -          subPanel: MultiCommandPanel, subPanelData: {} }
    -    ...
    -  ]
    -}
    -
    -

    where this is the MultiCommandPanel class

    -

    will display this:

    -

    -
  • -
  • -

    closeSubAreaOnClick - This is a boolean. The default is false. If set to true the sub-area will be close when sany element in it is clicked. This behavior might be useful if the sub-area displays a menu of options where only a single click on one of them is required.

    -
  • -
-

Toolbar divider object definition

-

Dividers can be added to separate groups of actions from other actions. This is displayed as a thin gray line. The divider object has one attribute: -

    {
-       divider: true
-    }
-

-
    -
  • divider - To show a divider in the toolbar, add an object with divider attribute set to true.
  • -
-

Advanced: JSX actions

-

Regular toolbar buttons, explained above, are displayed as set of Carbon Buttons. If the application needs to display something not wrappered in a button, you can provide your own JSX to display in the toolbar. Be aware however that, because of the way the toolbar is designed, there are restrictions on what the toolbar can do to display your JSX. For example, it cannot display anything with a height greater than the toolbar height.

-

If you provide your own JSX object it is displayed in a simple div in the toolbar. Some attributes are applied to the div to allow the action to work correctly within the toolbar - these cannot be changed. You are responsible for styling your JSX object to get it to appear the way you want.

-

Also be aware that, if the width of the toolbar reduces (maybe by the user sizing the page) your action may get moved into the overflow menu. It is also your responsibility to style the button so it appears as you want in the overflow menu as well as in the toolbar.

-

The JSX can be provided in the jsx field. Here is an example. The only other fields that are recognized with the jsx field are action and tooltip, all other fields will be ignored.

-
    {
-       action: "custom-loading",
-       jsx: (<div style={{ padding: "0 11px" }}><InlineLoading
-                status="active" description="Loading..." /></div>),
-       tooltip: "Loading the thing you wanted."
-    }
-
-
    -
  • -

    action - a unique identifier and the name of the action to be performed.

    -
  • -
  • -

    jsx - A JSX object or a funciton returning a JSX object. This will be displayed as the action in the toolbar.

    -

    To make the JSX object accessible inside the toolbar this field should be provided as a function. The function will pass a tabIndex field which should be set into the tabIndex property of the display object being created (see expample below). Additionally, the display object should have the `className set to “toolbar-jsx-obj” (see example below).

    -
  • -
  • -

    tooltip - A string or JSX object. This will be displayed as the tooltip for the action in the toolbar. If tooltip is omitted no tooltip will be added to your action. If tooltip is specified the jsx will be inside a tooltip div which is in the toolbar div mentioned above.

    -
  • -
-

For example, the following code that includes some Carbon React components: -

toolbarConfig = {
-    leftBar: [
-        {
-            action: "custom-loading",
-            tooltip: "A custom loading!",
-            jsx: (tabIndex) => (
-                <div style={{ padding: "4px 11px" }}>
-                    <InlineLoading status="active" description="Loading..."
-                        className={"toolbar-jsx-obj"}
-                        tabIndex={tabIndex}
-                    />
-                </div>
-            )
-        },
-        { divider: true },
-        {
-            action: "custom-dropdown",
-            tooltip: () => (this.suppressTooltip ? null : "A drop down using the overflow menu!"),
-            jsx: (tabIndex) => (
-                <div className="toolbar-custom-button">
-                    <OverflowMenu
-                        id={"ovf1"}
-                        renderIcon={TextScale32}
-                        iconDescription={""}
-                        onOpen={() => (
-                            this.suppressTooltip = true)
-                        }
-                        onClose={() => {
-                            this.suppressTooltip = false;
-                            window.alert("Option selected");
-                        }}
-                        className={"toolbar-jsx-obj"}
-                        tabIndex={tabIndex}
-                    >
-                        <OverflowMenuItem itemText="Big" />
-                        <OverflowMenuItem itemText="Medium" />
-                        <OverflowMenuItem itemText="Little" />
-                  </OverflowMenu>
-                </div>
-            )
-        }
-    ]
-};
-

-

will display this:

-

-
-

Deprecated toolbar config

-

The old toolbar configuration is still supported for now (but is deprecated). This allows the config to be provided as an array that defines just the left side of the toolbar. The right side will always show the zoom actions (zoomIn, zoomOut, zoomToFit) and a notifications panel icon (if a notification configuration object is provided in the <CommonCanvas> React object). These right side actions will always show on the right-hand side of the toolbar and are handled internally by the canvas. The entries in the array follow the same definition as described above. Note: there is no need to provide a palette action in the array because a palette icon and following divider will automatically be added to the toolbar when a palette is specified for the canvas.

-

An example of the toolbar config array should look like this: -

const toolbarConfig = [
-   { action: "stop", label: "Stop Execution", enable: false },
-   { action: "run", label: "Run Pipeline", enable: false },
-   { action: "undo", label: "Undo", enable: true },
-   { action: "redo", label: "Redo", enable: true },
-   { action: "cut", label: "Cut", enable: false },
-   { action: "copy", label: "Copy", enable: false },
-   { action: "paste", label: "Paste", enable: false },
-   { action: "createAutoComment", label: "Add Comment", enable: true },
-   { action: "deleteSelectedObjects", label: "Delete", enable: true },
-   { action: "arrangeHorizontally", label: "Arrange Horizontally", enable: true }
-];
-

-
- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/03.02.03-notification-config/index.html b/v13/03.02.03-notification-config/index.html deleted file mode 100644 index eb651c0b5b..0000000000 --- a/v13/03.02.03-notification-config/index.html +++ /dev/null @@ -1,2653 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Notification Config - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

Notification Config object

-

The Notification Config object specifies the appearance of the notifications panel. If a Notification Config is passed to Common Canvas a notifications button will be shown on the far right of the canvas toolbar. When clicked, the button opens the Notificaiton Panel.

-

For information about the structure of notification messages, refer to the Notification Messages page. Messages can be added and removed from the notification panel by calling the notification methods in the canvas-controller..

-

The Notification Config object looks like this: -

    const notificationConfig = {
-       action: "notification",
-       label: "Notifications",
-       enable: true,
-       notificationHeader: "Notification Messages",
-       notificationSubtitle: "subtitle",
-       emptyMessage: "You don't have any notifications right now.",
-       clearAllMessage: "Clear all",
-       keepOpen: true,
-       clearAllCallback: () => { console.log("Clear All clicked"); }
-    };
-

-
    -
  • -

    action - “notification” enables the notifications button to appear in the far right of the toolbar.

    -
  • -
  • -

    label - the Tooltip label to display for the notifications button in the toolbar.

    -
  • -
  • -

    enable - Toolbar button will have hover effect and is clickable when set to true. If false, the button will be disabled and unclickable. If not set, it will default to disabled (enable: false)

    -
  • -
  • -

    notificationHeader - String to display in the notification panel header. If not set, it will default to “Notifications”.

    -
  • -
  • -

    notificationSubtitle - String to be displayed as a sub-title in the panel header. If not set, panel header will be sized to only contain the notificationHeader string.

    -
  • -
  • -

    emptyMessage - String to be displayed when there are no notification messages to display.

    -
  • -
  • -

    clearAllMessage - String to be displayed on a button displayed at the bottom of the panel. The button can be clicked to clear all the messages from the panel. If omitted the button, and the footer area of the panel it appears in, will not be displayed.

    -
  • -
  • -

    keepOpen - A boolean which indicates when the panel will close. The default is false. If set to false, the panel will close when the user clicks on the page somewhere outside the panel. If set to true the panel will remain open when the user clicks somewhere on the page outside of the panel. With the option the user must click the x icon in the top right of the panel, or click the notification toolbar icon, to close the panel.

    -
  • -
  • -

    clearAllCallback - An optional callback function that will be called every time the “clear all” button is clicked.

    -
  • -
  • -

    secondaryButtonLabel - Label for the optional secondary button to be displayed in the notification panel. Both secondaryButtonLabel and secondaryButtonCallback must be specified for the button to appear.

    -
  • -
  • secondaryButtonCallback - A callback function that will be called when the secondary button is clicked.
  • -
  • secondaryButtonDisabled - Specify whether the secondary button is disabled or not.
  • -
- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/03.02.04-context-menu-config/index.html b/v13/03.02.04-context-menu-config/index.html deleted file mode 100644 index dac6e9704e..0000000000 --- a/v13/03.02.04-context-menu-config/index.html +++ /dev/null @@ -1,2630 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Context Menu Config - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

Context Menu Config object

-

The context menu config object configures whether certain actions are available in the default context menu.

-
    const contextMenuConfig = {
-       enableCreateSupernodeNonContiguous: false,
-       defaultMenuEntries: {
-          saveToPalette: true,
-          createSupernode: false,
-          displaySupernodeFullPage: true,
-          colorBackground: false
-       }
-    };
-
-
    -
  • -

    enableCreateSupernodeNonContiguous - Allows the creation of supernodes from non-contiguous nodes. When set to true, the “Create supernode” menu item will be added to the default context menu when the currently selected nodes are contiguous or non-contiguous. When set to false, the “Create supernode” menu item is only added to the default context menu when the selected nodes are contiguous. The default value is false.

    -
  • -
  • -

    defaultMenuEntries - Controls what entries are generated in the default context menu generated by Common Canvas. This has the following properties:

    -
      -
    • ‘saveToPalette’ - This is a boolean. The default is false. If set to true, Common Canvas will add a ‘Save to palette’ option to the default node context menu.
    • -
    • ‘createSupernode’ - This is a boolean. The default is true. If set to false, Common Canvas will not show the ‘Create Supernode’ option in the default context menu for nodes.
    • -
    • ‘displaySupernodeFullPage’ - This is a boolean. The default is true. If set to false, Common Canvas will not show the ‘Display full page’ option in the default context menu for supernodes. When true, the option will be displayed. Clicking that option navigates the user to the full page view of the supernode’s pipeline as if the user had clicked the expansion icon of the expanded in-place supernode view.
    • -
    • ‘colorBackground’ - This is a boolean. The default is true. If set to false, Common Canvas will not show the ‘Color background’ option in the default context menu for comments. When true, the option will be displayed.
    • -
    -
  • -
-

[Note: If any host app wants more control over the default context menu here, please open an issue.]

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/03.02.05-keyboard-config/index.html b/v13/03.02.05-keyboard-config/index.html deleted file mode 100644 index 8242bd8952..0000000000 --- a/v13/03.02.05-keyboard-config/index.html +++ /dev/null @@ -1,2618 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Keyboard Config - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

Keyboard Config object

-

The keyboard config object configures whether certain actions are available from the keyboard when focus is on the flow editor. -See the Keyboard Support section for what key combinations are supported.

-

    const keyboardConfig = {
-       actions: {
-          delete: false,
-          undo: false,
-          redo: false,
-          selectAll: false,
-          cutToClipboard: false,
-          copyToClipboard: false,
-          pasteFromClipboard: false
-    };
-
-All actions are true by default so it is only necessary to specify those actions you don’t want as false.

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/03.03-callbacks/index.html b/v13/03.03-callbacks/index.html deleted file mode 100644 index 9e2f648aa5..0000000000 --- a/v13/03.03-callbacks/index.html +++ /dev/null @@ -1,2846 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Callbacks Overview - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - - - - - -
-
- - - - - - - - - - - - -

Callbacks Overview

-

You can optionally provide callback listeners. These will be called when the user interacts with the canvas and allows -your application to perform processing specific to your application’s needs based on user interactions. If you don’t implement any of the callbacks, Common Canvas will perform appropriate actions if necessary.

-

These listeners are as follows:

-

Context Menu Handler

-

Overrides or adds to the default context menu (or context toolbar) displayed for nodes, links, comments, etc.

-

Before Edit Action Handler

-

Called for each edit action on the canvas. It is called before the internal object model has been updated and the edit action has completed, so this can be used to cancel user actions if necessary.

-

Edit Action Handler

-

Called for each edit action on the canvas. It is called after the internal object model has been updated and the edit action has completed.

-

Layout Handler

-

Allows the application to override layout settings for nodes on a node-by-node basis.

-

Decoration Action Handler

-

Called whenever the user clicks on a decoration which has its hotspot field set to true.

-

Tip Handler

-

Allows the application to override the tips displayed for canvas objects such as nodes and links.

-

ID Generator Handler

-

Called whenever a new object is created and allows the application to specify its own IDs for canvas objects.

-

Selection Change Handler

-

Called whenever the set of selected objects changes.

-

Click Action Handler

-

Called whenever something is clicked, double-clicked or right-clicked on the canvas. This can be used, for example, -to open a properties window when a node is double clicked.

-

Action Label Handler

-

Allows the application to override labels displayed for command actions that are shown for undo and redo actions.

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/03.03.01-context-menu-handler/index.html b/v13/03.03.01-context-menu-handler/index.html deleted file mode 100644 index 1c82d9d8fe..0000000000 --- a/v13/03.03.01-context-menu-handler/index.html +++ /dev/null @@ -1,3058 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Context Menu Handler - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - - - - - -
-
- - - - - - - - - - - - -

Context Menu Handler

-

This callback is optional. You don’t need to implement anything for it. If implemented, it must return an array of actions that describe what options are displayed in the Context Menu or Context Toolbar.

-

If this callback is not provided Common Canvas will handle context menu/toolbars, and their actions, internally. You only need to implement this callback if you want to add or remove options to/from the context menu/toolbar or provide your own menus in place of the default ones.

-

When is it called

-

For Context Menu

-

This callback will be called if the enableContextToolbar canvas config option is set to false (which is the default) and when the user performs a context menu gesture, such as mouse ‘right click’ or clicking an ellipsis icon, on a:

-
    -
  • Node
  • -
  • Link
  • -
  • Comment
  • -
  • Port
  • -
  • The canvas background or
  • -
  • Combination of objects - if a number of objects are selected
      -
    • Note: With multiple selected objects, the convention is that a context menu/toolbar should display actions that are applicable to all the objects that are selected, rather than just the object for which the menu was requested.
    • -
    -
  • -
-

For Context Toolbar

-

This callback will be called if the enableContextToolbar canvas config option is set to true and when the mouse cursor is hovered over any of the objects mentioend above.

-

contextMenuHandler

-
    contextMenuHandler(source, defaultMenu)
-
-

‘source’ parameter

-

The source object passed in looks like this: -

    {
-      type: "node",
-      targetObject: {<object_info>},
-      selectedObjectIds: ["node_1", "node_2"],
-      mousePos: {x: "10", y:"20"}
-    }
-
-type - Indicates the type of object for which the context menu was selected. Can be “node”, “input_port”, “output_port”, “link”, “canvas” or “comment”

-

targetObject - The object for which the context menu was requested. Not provided when type is “canvas”.

-

selectedObjectIds - An array containing the IDs of all currently selected nodes and/or comments and/or links.

-

mousePos - An object containing the coords of the mouse when the context menu was requested

-

‘defaultMenu’ parameter

-

This is an array describing the default menu that Common Canvas would usually display. If necessary, you can modify this array with your own elements or remove elements and then return the modified array. Alternatively, you can ignore this parameter and just return your own array.

-

Return array for Context Menus

-

The callback must return an array, that describes the context menu to be displayed. If the callback returns a null, then no menu/toolbar will be displayed.

-

There is one element in the array for each entry in the context menu. An entry can be either a context menu item, which consists of a label and an action, or a divider. An action can be disabled by setting the ‘enable’ field to false.

-

Here’s an example of a contextMenuHandler:

-
    contextMenuHandler(source, defaultMenu) {
-        if (source.type === "node") {
-            return [
-                { action: "deleteSelectedObjects", label: "Delete" },
-                { divider: true},
-                { action: "myApp_Action1", label: "My Action" },
-                { action: "paste", label: "Paste from clipboard", enable: false }
-            ];
-        }
-        return defaultMenu;
-    }
-
-

The above array will produce a context menu like this:

-

-

Customizing the default context menu

-

If you want to simply add your action to the default context menu provided by Common Canvas you can take the defaultMenu parameter provided to the callback, and add your menu item to it. Alternatively, you can provide a complete new context menu of your own.

-

Here is a sample implementation of contextMenuHandler, which takes a source object (described above) and the defaultMenu as parameters, and adds a custom action to the default menu when the user ‘right clicks’ the canvas background.

-
    contextMenuHandler(source, defaultMenu) {
-        let customMenu = defaultMenu;
-        if (source.type === "canvas") {
-            customMenu = customMenu.concat({ action: "myApp_Action1", label: "My Action" });
-        }
-        return customMenu;
-    }
-
-

Return array for Context Toolbar

-

To display a context toolbar the same type of array is returned as described above for context menu. However, there are some extra fields for the action elements in the array. These are

-

isToolbarItem - This is a boolean. The default is false. If set to true the action will be added to the toolbar and if set to false the action will be displayed in the overflow menu.

-

icon - This is the icon to display for the action. If isToolbarItem is set to true you must provide an icon otherwise the action will show as an empty space in the toolbar. If an icon is specified and isToolbarItem is set to false, the icon will be displayed next to the action in the overflow menu. For many internal actions, Common Canvas will automatically display an appropriate Carbon icon. See the Internal Actions page for a list of actions that have associated icons.

-

Dividers can also be added to the context toolbar by specifying ‘toolbarItem: true’

-

  import { Add } from "@carbon/react/icons";
-
-  ...
-
-  contextMenuHandler(source, defaultMenu) {
-        if (source.type === "node") {
-            return [
-                { action: "deleteSelectedObjects", label: "Delete", toolbarItem: true },
-                { divider: true, toolbarItem: true },
-                { action: "myAction1", label: "My Action1", toolbarItem: true, icon: (<Add />) },
-                { action: "disconnectNode", label: "Disconnect", enable: false },
-                { action: "cut", label: "Cut" },
-                { action: "copy", label: "Copy" }
-            ];
-        }
-        return defaultMenu;
-    }
-
-This will produce a context toolbar like this:

-

-

And when the overflow icon is clicked, like this:

-

-

Warning

-

The contents of the context toolbar is dependent on which object the mouse cursor is currently hovering over (which may be different to any of the currently selected objects). You should make sure the actions you return in the array are applicable to the object the mouse cursor is hovering over or, if it is hovering over a selected object and other objects are also selected, to the set of selected objects.

-

To help decide whether the mouse cursor is hovering over a selected object or not, the application can call the canvas controller’s helper function: ‘isContextToolbarForNonSelectedObj(source)’. This will return true if the mouse cursor is over a non-selected object.

-

Actions

-

When the user clicks an action in the menu the action is executed either internally or externally.

-

Internal acitons

-

Internal actions are implemented inside Common Canvas, like “deleteSelectedObjects” in the example above. Common Canvas supports a large number of internal actions.

-

External actions

-

External actions are custom actions you want Common Canvas to display for your application like “myApp_Action1”, in the example above. -Tip: To avoid any future name clashes with internal actions that might be added it is recommended you should make sure you action names are unique. For example, by adding a prefix to your application specfic actions.

-

Handling actions

-

When the user clicks an option in the context menu (or context toolbar) it causes the Before Edit Action Handler and then the Edit Action Handler callbacks to be called.

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/03.03.02-before-edit-action-handler/index.html b/v13/03.03.02-before-edit-action-handler/index.html deleted file mode 100644 index d39acd5db1..0000000000 --- a/v13/03.03.02-before-edit-action-handler/index.html +++ /dev/null @@ -1,2682 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Before Edit Action Handler - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

Before Edit Action Handler

-

This callback is optional. It is called before user actions are completed, so it provides the opportunity for the application to alter or cancel an action before it is applied to the object model and reflected in the flow editor display.

-

beforeEditActionHandler

-

    beforeEditActionHandler(data, command)
-
-You don’t need to implement anything for it but if you do implement it you must return either a data object or null. This callback is called in all the same instances where the editActionHandler is called. The difference is that this callback is called before the internal object model is updated. This gives your application the opportunity to examine the action that is about to be performed and either: let it continue; modify it and let it continue; or cancel it.

-

This callback is provided with two parameters: data and command.

-
    -
  1. data parameter - this is the same as the data object described for editActionHandler (see above)
  2. -
  3. command parameter - typically this will be null but for undo operations (that is where data.editType === “undo”) this will be the command that is about to be undone. For redo operations (that is where data.editType === “redo”) this will be the command that is about to be redone.
  4. -
-

This callback must return either the data object that was passed in or null. beforeEditActionHandler will behave as follows based on what is returned:

-
    -
  • If the data object is returned unmodified: the action will be performed as normal.
  • -
  • If the data object is returned modified: the action will be performed based on the modified data object. This means your application can alter the behavior of the action that will be performed. For example, you could intercept a createNode command and change the label for the new node in the nodeTemplate to something different. Then when the node is created the new label will be used. It is recommended you be very very careful when updating this object since there is no error checking in Common Canvas to ensure you modified the object correctly.
  • -
  • If null is returned: the action will be cancelled and not performed on the internal object model nor will editActionHandler be called.
  • -
-

If you need to do any asynchronous activity in the beforeEditActionHandler callback you can:

-
    -
  • Return null from the callback - which will cancel the current action
  • -
  • Do your asynchronous activity. While this is happening, the user ought to be prevented from modifying the canvas so you should display some sort of progress indicator or modal dialog to inform the user that some activity is occurring.
  • -
  • Then call CanvasController.editActionHandler(data) passing in the data object as a parameter with the modified properties. This will then execute the action as before. Note: This means the beforeEditActionHandler will be called a second time so be sure you put in a check to make sure you don’t get into a loop.
  • -
- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/03.03.03-edit-action-handler/index.html b/v13/03.03.03-edit-action-handler/index.html deleted file mode 100644 index b11329fb84..0000000000 --- a/v13/03.03.03-edit-action-handler/index.html +++ /dev/null @@ -1,2754 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Edit Action Handler - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

Edit Action Handler

-

This callback is optional. You don’t need to implement anything for it and it doesn’t return anything. It is called whenever the user does the following gestures on the canvas:

-
    -
  • Clicks a tool/icon in the toolbar.
  • -
  • Clicks an option in the context menu or context toolbar
  • -
  • Presses a key combination on the keyboard to cause the canvas to change.
  • -
  • Performs some direct manipulation on the canvas such as:
      -
    • Create a node
    • -
    • Moves one or a set of nodes/comments
    • -
    • Edits a comment
    • -
    • Links two nodes together
    • -
    • etc
    • -
    -
  • -
-

These is will either perform one of the many internal actions supported by Common Canvas or the application’s own external actions, if they have been added to the context menu/toolbar or the main canvas toolbar.

-

editActionHandler

-
    editActionHandler(data, command)
-
-

This callback is called after the common-canvas internal object model has been updated. This callback is provided with two parameters: data and command.

-
    -
  1. data parameter - This is the data for the initial request create by whatever action the user performed. The data fields can vary depending on the action. Here is an example: -
        {
    -      editType: "createComment",
    -      editSource: "contextmenu",
    -      selectedObjects: [],
    -      selectedObjectIds: [],
    -      offsetX: 100,
    -      offsetY: 42
    -    }
    -
  2. -
-
    -
  • -

    editType - This is the action that originates from either the toolbar, context menu, keyboard action or direct manipulation on the canvas. If you specified your own action in the context menu or in the toolbar this field will be your action’s name.

    -
  • -
  • -

    editSource - This is the source of the action. It can be set to “toolbar”, “contextmenu”, “keyboard” or “canvas” (for an action caused by direct manipulation on the canvas).

    -
  • -
  • -

    selectedObjects - An array of the currently selected objects.

    -
  • -
  • -

    selectedObjectIds - An array of the IDs of currently selected objects. Included for backward compatibility.

    -
  • -
  • -

    Other fields - Numerous other fields which vary based on the action and the source of the action.

    -
  • -
-
    -
  1. -

    command parameter - This is a Javascript class which is the command object that was executed to run the action ‘requested’ by the user and added to the command stack. The command object may contain fields which are the result of executing the command. For example, when the user creates a new node on the canvas the ‘createNode’ action will be performed and the command parameter in editActionHandler will contain a field called newNode which is the node that was created on the canvas.

    -

    If the user performed an undo action this will be the command that has been undone. If the user performed a redo action this will be the command that was redone.

    -
  2. -
-

Handling external actions

-

If you specified your application’s own ‘external’ action you can do whatever is necessary in this callback.

-

The editType field of the first parameter, passed in to the callback, will be set to the action name.

-

Here’s a simple expmple:

-
    editActionHandler(data, command) {
-        if (data.editType === "myAction") {
-            // Execute my action code here.
-        }
-    }
-
- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/03.03.04-layout-handler/index.html b/v13/03.03.04-layout-handler/index.html deleted file mode 100644 index 8e30882cb6..0000000000 --- a/v13/03.03.04-layout-handler/index.html +++ /dev/null @@ -1,2667 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Layout Handler - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

Layout Handler

-

This is an optional handler you don’t need to implement anything for it unless you want to. The layoutHandler callback, when provided, is called for each node on the canvas and allows the application to customize the node layout properties on a -node-by-node basis.

-

layoutHandler

-

    layoutHandler(data)
-
- The callback should return a JavaScript object whose properties will override the default properties for node layout. The callback is provided with a parameter data which is the node object. Your code can look at the node properties and decide which properties it needs to override. This can be used to change the node shape, styling and position and size of node elements like the image, main label etc.

-

For more details see the Node Customization section for more details.

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/03.03.05-decoration-action-handler/index.html b/v13/03.03.05-decoration-action-handler/index.html deleted file mode 100644 index 75aad072dc..0000000000 --- a/v13/03.03.05-decoration-action-handler/index.html +++ /dev/null @@ -1,2671 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Decoration Action Handler - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

Decoration Action Handler

-

Decorations are small images that can be displayed on or near to your nodes and links. They can be for display only or actionable (so the user can click on them). See the canvas JSON schema for information on how to define decorations for your nodes.

-

This callback is called when the user clicks on an actionable decoration. You don’t need to implement anything for this callback unless you added actionable decorations to your nodes. It doesn’t return anything. It is called whenever the user clicks on a decoration that you added to a node in the canvas JSON.

-

decorationActionHandler

-
    decorationActionHandler(object, id, pipelineId)
-
-

It is provided with these parameters:

-
    -
  • object – the node or link with which the decoration is associated.
  • -
  • id – the ID of the decoration that you provided in the canvas JSON or through the canvas-controller API
  • -
  • pipelineId – the ID of the pipeline for the node or link.
  • -
- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/03.03.06-tip-handler/index.html b/v13/03.03.06-tip-handler/index.html deleted file mode 100644 index b14c4a1c14..0000000000 --- a/v13/03.03.06-tip-handler/index.html +++ /dev/null @@ -1,2995 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Tip Handler - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

Tip Handler

-

This optional callback can be implemented to override the tooltip content that is displayed by default for each canvas object. It is called before tips are shown for: palette categories, palette node templates, nodes, ports, links, decorations and the state tag.

-

tipHandler

-

    tipHandler(tipType, data)
-
-Note: The display of tooltips (or not) can be controlled using the tipConfig field of the canvas config object.

-

Common Canvas provides default implementations for all of the tips except for links and decorations, as follows:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ObjectDefault tip behavior
Palette categoryContains the category name and the category description.
Palette node templateContains the category name, the node type and node description.
NodeContains the name, description and status icon and optionally, if the name was modified from the original name, the original node type.
PortThe port label is shown
LinkNo tip is shown by default
DecorationNo tip is shown by default
State tagAn appropriate explanation for the state displayed by the tag
-

To override the content, you can return either a string or JSX object. If your code returns null for a particular type of tip, Common Canvas will display the default tip for that object. See App.js in the test harness code for an example tipHandler.

-

Common Canvas calls the tipHandler callback with two parameters:

-
    -
  • tipType - the type of the tip
  • -
  • data - an object that describes the canvas element for which the tip was requested
  • -
-

Here are some specific examples:

-

Palette categories:

-
    -
  • tipType: “tipTypePaletteCategory”
  • -
  • data: An object with category information, like this:
  • -
-
{
-    category: {
-        id: "1234",
-        label: "Import",
-        description: "Category for import nodes",
-        image: "/images/import.svg"
-    }
-}
-
-

Palette nodes templates:

-
    -
  • tipType: “tipTypePaletteItem”
  • -
  • data: An object with node template information: -
    {
    -    nodeTemplate: {
    -        label: "C50",
    -        description: "C50 Model",
    -        operator_id_ref: "com.ibm.commonicons.models.c50",
    -        type: "model_node",
    -        image: "/images/common_node_icons/models/model_c50.svg",
    -        input_ports: [{...}],
    -        output_ports: []
    -    }
    -}
    -
  • -
-

Nodes:

-
    -
  • tipType: “tipTypeNode”
  • -
  • data: An object with pipelineId and node information: -
    {
    -    pipelineId: "153651d6-9b88-423c-b01b-861f12d01489",
    -    node: {
    -        id: "idGWRVT47XDV",
    -        type: "execution_node",
    -        operator_id_ref: "type",
    -        output_ports: [...],
    -        input_ports: [...],
    -        label: "Define Types",
    -        description: "",
    -        image: "",
    -        x_pos: 445,
    -        y_pos: 219
    -    }
    -}
    -
  • -
-

Ports:

-
    -
  • tipType: “tipTypePort”
  • -
  • data: An object with pipelineId, node and port information: -
    {
    -    pipelineId: "153651d6-9b88-423c-b01b-861f12d01489",
    -    node: {
    -        id: "idGWRVT47XDV",
    -        type: "execution_node",
    -        operator_id_ref: "type",
    -        output_ports: [{...}],
    -        input_ports: [{...}],
    -        label: "Define Types",
    -        description: "",
    -        image: "",
    -        x_pos: 445,
    -        y_pos: 219
    -    },
    -    port: {
    -        id: "outPort",
    -        label: "Output Port"
    -    }
    -}
    -
  • -
- -
    -
  • tipType: “tipTypeLink”
  • -
  • data: An object with pipelineId and link information. -
    {
    -    pipelineId: "153651d6-9b88-423c-b01b-861f12d01489",
    -    link: {
    -        id: "canvas_link_3",
    -        x1: 515,
    -        y1: 248,
    -        x2: 611,
    -        y2: 180,
    -        class_name: "canvas-data-link",
    -        type: "nodeLink",
    -        src: {
    -            id: "idGWRVT47XDV",
    -            type: "execution_node",
    -            operator_id_ref: "type",
    -            output_ports: [{...}],
    -            input_ports: [{...}],
    -            label: "Define Types",
    -            description: "",
    -            image: "",
    -            x_pos: 445,
    -            y_pos: 219
    -        },
    -        srcPortId: "outPort",
    -        trg: {
    -            id: "id8I6RH2V91XW",
    -            type: "binding",
    -            operator_id_ref: "c50",
    -            output_ports: [],
    -            input_ports: [{...}],
    -            label: "C5.0",
    -            description: "",
    -            image: "",
    -            x_pos: 611,
    -            y_pos: 151
    -        },
    -        trgPortId: "inPort"
    -    }
    -}
    -
  • -
-

Decorations

-
    -
  • tipType: “tipTypeDec”
  • -
  • data: An object with pipelineId and decoration information. -
    {
    -    pipelineId: "153651d6-9b88-423c-b01b-861f12d01489",
    -    decoration: {
    -        "id": "2016",
    -        "position": "topRight",
    -        "label": "LCFC",
    -        "tooltip": "Foxes never quit"
    -    }
    -}
    -
  • -
-

State tag

-
    -
  • tipType: “tipTypeStateTag”
  • -
  • data: An object with pipelineId and decoration information. -
    {
    -    stateTagText: "This flow is locked and cannot be edited.",
    -    stateTagType: "Locked"
    -}
    -
  • -
- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/03.03.07-id-generator-handler/index.html b/v13/03.03.07-id-generator-handler/index.html deleted file mode 100644 index e7cd4fe5f6..0000000000 --- a/v13/03.03.07-id-generator-handler/index.html +++ /dev/null @@ -1,2857 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - ID Generator Handler - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

ID Generator Handler

-

This is an optional callback. It is called when new objects are created in the canvas and allows the application to provide its own method to generate a unique id for the object.

-

idGeneratorHandler

-

    idGeneratorHandler(action, data)
-
- If no idGeneratorHandler is set or the method returns null, an appropriate UUID is generated by Common Canvas for each object. The callback is called with a two parameters: - * An enumerated string to describe the action being performed (create_node, create_comment, create_node_link, create_comment_link, clone_node, clone_comment, clone_node_link or clone_comment_link) and - * A JavaScript object with additional data to describe the object

-

The callback should return a string containing the application’s unique ID for the object. -Here are more details about the different action and their parameters.

-
    -
  • Create node:
      -
    • action: create_node
    • -
    • data:
    • -
    -
  • -
-
nodeType:
-{
-   "label":"C50",
-   "description":"C50 Model",
-   "operator_id_ref":"com.ibm.commonicons.models.c50",
-   "type":"model_node",
-   "image":"/images/common_node_icons/models/model_c50.svg",
-   "input_ports":[
-      {
-         "id":"inPort",
-         "label":"Input Port",
-         "cardinality":{
-            "min":0,
-            "max":1
-         }
-      }
-   ],
-   "output_ports":[
-
-   ]
-}
-
-
    -
  • -

    Create comment:

    -
      -
    • action: create_comment
    • -
    • data: n/a
    • -
    -
  • -
  • -

    Create node link:

    -
      -
    • action: create_node_link
    • -
    • data:
    • -
    -
  • -
-
sourceNode: {
-   "id":"6a547456-f1ea-48a6-9721-45d6ae70dd6b",
-   "label":"Aggregate",
-   "type":"execution_node",
-   "operator_id_ref":"com.ibm.commonicons.operations.aggregate",
-   "image":"/images/common_node_icons/operations/operation_aggregate.svg",
-   "class_name":"d3-node-body",
-   "input_ports":[...],
-   "output_ports":[...],
-   "x_pos":55,
-   "y_pos":97.5,
-   "inputPortsHeight":20,
-   "outputPortsHeight":20,
-   "height":75,
-   "width":70
-},
-targetNode: {
-   "id":"71c96629-be46-418b-be63-0a02ef2fe2e0",
-   "label":"Append",
-   "type":"execution_node",
-   "operator_id_ref":"com.ibm.commonicons.operations.append",
-   "image":"/images/common_node_icons/operations/operation_append.svg",
-   "class_name":"d3-node-body",
-   "input_ports":[...],
-   "output_ports":[...],
-   "x_pos":264,
-   "y_pos":83.5,
-   "inputPortsHeight":20,
-   "outputPortsHeight":20,
-   "height":75,
-   "width":70
-}
-
-
    -
  • Create comment link:
      -
    • action: create_comment_link
    • -
    • data:
    • -
    -
  • -
-
comment: {
-   "id":"8c81aac7-ebe5-4f96-9d63-eabc22b09635",
-   "class_name":"d3-comment-rect",
-   "content":"",
-   "height":42,
-   "width":175,
-   "x_pos":50,
-   "y_pos":50
-},
-targetNode: {
-   "id":"71c96629-be46-418b-be63-0a02ef2fe2e0",
-   "label":"Append",
-   "type":"execution_node",
-   "operator_id_ref":"com.ibm.commonicons.operations.append",
-   "image":"/images/common_node_icons/operations/operation_append.svg",
-   "class_name":"d3-node-body",
-   "input_ports":[...],
-   "output_ports":[...],
-   "x_pos":264,
-   "y_pos":83.5,
-   "inputPortsHeight":20,
-   "outputPortsHeight":20,
-   "height":75,
-   "width":70
-}
-
-
    -
  • Clone node: triggered when copying & pasting a node
      -
    • action: clone_node
    • -
    • data:
    • -
    -
  • -
-
node: {
-   "id":"56d30c83-3a08-4147-933e-b01d3c348ac1",
-   "label":"Append",
-   "type":"execution_node",
-   "operator_id_ref":"com.ibm.commonicons.operations.append",
-   "image":"/images/common_node_icons/operations/operation_append.svg",
-   "class_name":"d3-node-body",
-   "input_ports":[...],
-   "output_ports":[...],
-   "x_pos":265,
-   "y_pos":177.5,
-   "inputPortsHeight":20,
-   "outputPortsHeight":20,
-   "height":75,
-   "width":70
-}
-
-
    -
  • Clone comment: triggered when copying & pasting a comment
      -
    • action: clone_comment
    • -
    • data:
    • -
    -
  • -
-
comment: {
-   "id":"8c81aac7-ebe5-4f96-9d63-eabc22b09635",
-   "class_name":"d3-comment-rect",
-   "content":"",
-   "height":42,
-   "width":175,
-   "x_pos":50,
-   "y_pos":50
-}
-
-
    -
  • Clone node link: triggered when copying & pasting two connected nodes
      -
    • action: clone_node_link
    • -
    • data:
    • -
    -
  • -
-

link: {
-   "id":"12c4308e-f572-402a-8dd3-604d438539d4",
-   "class_name":"d3-data-link",
-   "srcNodeId":"2b1af6c2-f98b-4728-97b3-416d40224bce",
-   "trgNodeId":"b43fffe6-dc01-4d30-8b6d-abd977850a2e",
-   "type":"nodeLink"
-},
-sourceNodeId: "56d30c83-3a08-4147-933e-b01d3c348ac1",
-targetNodeId: "815271f0-f4da-4793-ab8f-c4c32d3dd7e0"
-
-Note that the link to be cloned has references to the original source and target nodes, while the sourceNodeId and targetNodeId are the new node ids for the copied nodes. The new nodes are not part of the model yet.

-
    -
  • clone comment link: triggered when copying&pasting a comment and a node that are connected
      -
    • action: clone_comment_link
    • -
    • data:
    • -
    -
  • -
-

link: {
-   "id":"12c4308e-f572-402a-8dd3-604d438539d4",
-   "class_name":"d3-comment-link",
-   "srcNodeId":"2b1af6c2-f98b-4728-97b3-416d40224bce",
-   "trgNodeId":"b43fffe6-dc01-4d30-8b6d-abd977850a2e",
-   "type":"commentLink"
-},
-sourceNodeId: "56d30c83-3a08-4147-933e-b01d3c348ac1",
-targetNodeId: "815271f0-f4da-4793-ab8f-c4c32d3dd7e0"
-
-Note that the link to be cloned has references to the original comment and target node, while the sourceNodeId and targetNodeId are the new ids for the copied comment and node. The new node and comment are not part of the model yet.

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/03.03.08-selection-change-handler/index.html b/v13/03.03.08-selection-change-handler/index.html deleted file mode 100644 index ff133fa8ec..0000000000 --- a/v13/03.03.08-selection-change-handler/index.html +++ /dev/null @@ -1,2764 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Selection Change Handler - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

Selection Change Handler

-

This is an optional callback. It is triggered whenever the set of selected objects on the canvas changes -either through selection or deselection.

-

selectionChangeHandler

-

    selectionChangeHandler(data)
-
-The callback contains a JavaScript object with the following format: -
{
-    "selection": [
-      "id6PXRG57DGIV"
-    ],
-    "selectedNodes": [
-      {
-        "id": "id6PXRG57DGIV",
-        "type": "binding",
-        "operator_id_ref": "variablefile",
-        "output_ports": [...],
-        "input_ports": [],
-        "label": "DRUG1n",
-        "description": "",
-        "image": "",
-        "x_pos": 96,
-        "y_pos": 219,
-        "class_name": "canvas-node",
-        "decorations": [],
-        "parameters": [],
-        "messages": [],
-        "inputPortsHeight": 0,
-        "outputPortsHeight": 20,
-        "height": 75,
-        "width": 70
-      }
-    ],
-    "selectedComments": [],
-    "addedNodes": [
-      {
-        "id": "id6PXRG57DGIV",
-        "type": "binding",
-        "operator_id_ref": "variablefile",
-        "output_ports": [...],
-        "input_ports": [],
-        "label": "DRUG1n",
-        "description": "",
-        "image": "",
-        "x_pos": 96,
-        "y_pos": 219,
-        "class_name": "canvas-node",
-        "decorations": [],
-        "parameters": [],
-        "messages": [],
-        "inputPortsHeight": 0,
-        "outputPortsHeight": 20,
-        "height": 75,
-        "width": 70
-      }
-    ],
-    "addedComments": [],
-    "deselectedNodes": [
-      {
-        "id": "id2PZSCTRPRIJ",
-        "type": "execution_node",
-        "operator_id_ref": "derive",
-        "output_ports": [...],
-        "input_ports": [...],
-        "label": "Na_to_K",
-        "description": "",
-        "image": "",
-        "x_pos": 219.01116943359375,
-        "y_pos": 162.3754425048828,
-        "class_name": "canvas-node",
-        "decorations": [],
-        "parameters": [],
-        "messages": [...],
-        "inputPortsHeight": 20,
-        "outputPortsHeight": 20,
-        "height": 75,
-        "width": 70
-      }
-    ],
-    "deselectedComments": [
-      {
-        "id": "id42ESQA3VPXB",
-        "content": " comment 1",
-        "height": 34,
-        "width": 128,
-        "x_pos": 132,
-        "y_pos": 103,
-        "class_name": "canvas-comment-1"
-      }
-    ],
-    previousPipelineId: "123-456",
-    selectedPipelineId: "789-012"
-}
-

-
    -
  • selection: Array with ids of selected nodes and comments
  • -
  • selectedNodes: Array of selected node objects
  • -
  • selectedComments: Array of selected comment objects
  • -
  • addedNodes: Array with node objects that were added to the selection
  • -
  • addedComments: Array with comment objects that were added to the selection
  • -
  • deselectedNodes: Array with node objects that were removed from the selection
  • -
  • deselectedComments: Array with comment objects that were removed from the selection
  • -
  • previousPipelineId: The ID of the Pipeline for the selected objects prior to the selection action
  • -
  • selectedPipelineId: The ID of the Pipeline for the newly selected objects
  • -
- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/03.03.09-click-action-handler/index.html b/v13/03.03.09-click-action-handler/index.html deleted file mode 100644 index 88c477667b..0000000000 --- a/v13/03.03.09-click-action-handler/index.html +++ /dev/null @@ -1,2682 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Click Action Handler - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

Click Action Handler

-

This callback is optional. You don’t need to implement anything for it and it doesn’t need to return anything to Common Canvas. It is called whenever the user clicks or double clicks on something on the canvas. You could use this callback to implement opening a properties dialog when the user double clicks a node.

-

clickActionHandler

-
    clickActionHandler(source)
-
-

The callback is called with a single source parameter which contain information about the object that was clicked.

-

Note: When handling selections, it is recommended the selectionChangeHandler be used in preference to this handler when possible. selectionChangeHandler will notify you of all selection changes regardless of how they occur, such as when the user presses Ctrl+A on the keyboard to select all objects.

-

At the moment only click/double-click/context-menu on nodes and the canvas background are returned. It is provided with one parameter that looks like this:

-

    {
-      clickType: "DOUBLE_CLICK"
-      id: "node_1",
-      objectType: "node",
-      selectedObjectIds: ["node_1", "node_2"]
-    }
-
-The fields can be:

-
    -
  • clickType - This can be either “SINGLE_CLICK”, “SINGLE_CLICK_CONTEXTMENU” or “DOUBLE_CLICK”
  • -
  • objectType - Can be either “node”, “comment”, “canvas” or “region”. “region” is specified when the user pulls out a selection rectangle around a set of objects that might include nodes and comments.
  • -
  • id - The ID of the node or comment clicked. Only provided when objectType is “node” or “comment”
  • -
  • selectedObjectIds - An array of the selected objects (after the click action was performed).
  • -
-

Note: “SINGLE_CLICK_CONTEXTMENU” indicates that the user performed a contextmenu gesture when doing the click such as pressing the right-side mouse button or a two finger tap on a trackpad.

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/03.03.10-action-label-handler/index.html b/v13/03.03.10-action-label-handler/index.html deleted file mode 100644 index 8e545a64e0..0000000000 --- a/v13/03.03.10-action-label-handler/index.html +++ /dev/null @@ -1,2665 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Action Label Handler - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

Action Label Handler

-

This is an optional handler you don’t need to implement anything for it unless you want to. This callback allows your code to override the default tooltip text for the Undo and Redo buttons.

-

actionLabelHandler

-
    actionLabelHandler(action)
-
-

The actionLabelHandler callback, when provided, is called for each action that is performed in Common Canvas. The action object parameter, passed in to the callback, contains details of the action being performed. This callback should return either a string or null. If a string is returned it will be shown in the tooltip for the Undo button in the toolbar preceded by “Undo:” and the string will also appear in the tooltip for the Redo button (when appropriate) preceded by “Redo:”. If null is returned, Common Canvas will display the default text for the Undo and Redo buttons.

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/03.04-canvas-controller/index.html b/v13/03.04-canvas-controller/index.html deleted file mode 100644 index 3e274d54cb..0000000000 --- a/v13/03.04-canvas-controller/index.html +++ /dev/null @@ -1,3998 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - API - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - - - - - -
-
- - - - - - - - - - - - -

Canvas Controller API

-

Your application code can programmatically perform many of the actions that the user can do in the Common Canvas using the Canvas Controller API. -Note: See this page for differences between the structure of objects in the API and the schema.

-

In most cases within the API, the pipelineId parameter is optional. If pipelineId is omitted, the method will default to the pipeline that is currently displayed in the main canvas viewport.

-

Warning 1: Do not alter the IDs of objects that currently exist on the canvas. Changing object IDs can cause internal problems, in particular with the command stack.

-

Warning 2: When using external pipeline flows, Pipeline IDs must be globally unique identifiers.

-

The API provides the following:

-

Pipeline Flow methods

-
// Loads the pipelineFlow document provided into Common Canvas and displays it.
-// The document must conform to the pipelineFlow schema as documented in the
-// elyra-ai pipeline-schemas repo. Documents conforming to older versions may be
-// provided but they will be upgraded to the most recent version.
-setPipelineFlow(flow)
-
-// Clears the pipleine flow and displays an empty canvas.
-clearPipelineFlow()
-
-// Returns the current pipelineFlow document in the latest version of the
-// pipelineFlow schema as documented in the elyra-ai pipeline-schemas repo.
-getPipelineFlow()
-
-// Returns the current pipelineFlow document ID.
-getPipelineFlowId()
-
-// Returns the ID of the primary pipeline from the pipelineFlow.
-getPrimaryPipelineId()
-
-// Returns the external pipeline flow for the url passed in. The external
-// flow must have been loaded through some Common Canvas action for this
-// method to be able to return anything.
-getExternalPipelineFlow(url)
-
-// Returns the internal format of all canvas data stored in memory by
-// Common Canvas. Nodes, comments and links are returned in the internal
-// format.
-getCanvasInfo()
-
-// Returns the IDs of the ancestor pipleline of the pipeline ID passed in.
-getAncestorPipelineIds(pipelineId)
-
-// Removes all styles from nodes, comments and links. See the setObjectsStyle
-// and setLinkStyle methods for details on setting styles.
-// temporary - is a boolean that indicates whether temporary or permanent
-// styles should be removed.
-removeAllStyles(temporary)
-
-// Specifies the new styles for objects that are not highlighted during
-// branch highlighting.
-// newStyle - is a style specification object.
-setSubdueStyle(newStyle)
-
-

Pipeline methods

-
// Returns the pipeline object for the pipeline Id passed in.
-getPipeline(pipelineId)
-
-// Returns the ID of the pipeline object which is currently on display
-// in the canvas. Typically, this is the primary pipeline but will be
-// different if the user has navigated into one or more supernodes; in
-// which case it will be the ID of the pipeline at the level in the
-// supernode hierarchy that is currently on display.
-getCurrentPipelineId()
-
-// Returns truty if the pipeline is external (that is it is part of an
-// external pipeline flow). Otherwise, return falsy to indicate the pipeline
-// is local.
-isPipelineExternal(pipelineId)
-
-// Returns the flow validation messages for the pipeline ID passed in.
-getFlowMessages(pipelineId)
-
-// Returns a boolean to indicate whether there are any messages of
-// includeMsgsType in the pipeline identified by the pipeline ID passed in.
-// includeMsgsType - can be either "error" or "warning"
-isFlowValid(includeMsgTypes, pipelineId)
-
-// Rearranges the nodes in the canvas in the direction specified for the
-// pipeline ID passed in.
-// layoutDirection - can be "horizontal" or "vertical"
-autoLayout(layoutDirection, pipelineId)
-
-

Palette methods

-
// Loads the palette data as described in the palette schema in
-// elyra-ai pipeline-schemas repo. Any version can be loaded and it will be
-// upgraded to the latest version.
-setPipelineFlowPalette(palette)
-
-// Clears the palette data from Common Canvas.
-clearPaletteData()
-
-// Sets the loading text of the category. If set to a non-empty string the
-// category will show an InlineLoading control in the palette category div
-// with this text as the label. If set to falsey the palette category
-// will display as normal.
-setCategoryLoadingText(categoryId, loadingText)
-
-// Sets the empty text of the category. If set to a non-empty string and the
-// category does not have any nodes, the palette will show a warning icon with
-// this text as a message under the category title when the category is opened.
-// This message will not be displayed if the field is set to falsey or if
-// nodetypes are added to the category.
-setCategoryEmptyText(categoryId, emptyText)
-
-// Adds a new node into the palette:
-// nodeTypeObj - must conform to the style of node used by the palette as
-// described in the palette schema. See objects in nodeTypes array in the
-// palette schema:
-//  https://github.com/elyra-ai/pipeline-schemas/blob/master/common-canvas/palette/palette-v3-schema.json
-// category - is the name of the palette category where the node will be
-// added. If the category doesn't exist it will be created.
-// categoryLabel - Is an optional param. If a new category is created it will
-// be displayed with this label.
-// categoryDescription - Is an optional param. If a new category is created
-// it will be displayed with this description.
-// categoryImage - Is an optional param. The image displayed for the category provided as a
-// reference to an image or the image itself.
-addNodeTypeToPalette(nodeTypeObj, categoryId, categoryLabel, categoryDescription, categoryImage)
-
-// Adds an array of new node into the palette:
-// nodeTypeObjs - an array of nodetypes that must conform to the style of
-// nodes used by the palette as described in the palette schema. See objects
-// in nodeTypes array in the palette schema:
-//  https://github.com/elyra-ai/pipeline-schemas/blob/master/common-canvas/palette/palette-v3-schema.json
-// category - is the name of the palette category where the node will be
-// added. If the category doesn't exist it will be created.
-// categoryLabel - is an optional param. If a new category is created it will
-// be displayed with this label.
-// categoryImage - the image displayed for the category provided as a
-// reference to an image or the image itself.
-// categoryDescription - Is an optional param. If a new category is created
-// it will be displayed with this description.
-// categoryImage - Is an optional param. The image displayed for the category provided as a
-// reference to an image or the image itself.
-addNodeTypesToPalette(nodeTypeObjs, categoryId, categoryLabel, categoryDescription, categoryImage)
-
-// Removes nodetypes from a palette category
-// selObjectIds - an array of object IDs to identify the nodetypes to be
-// removed
-// categoryId - the ID of the category from which the nodes will be removed
-removeNodesFromPalette(selObjectIds, categoryId)
-
-// Returns the palette data document which will conform to the latest version
-// of the palette schema.
-getPaletteData()
-
-// Returns the palette node identified by the operator ID passed in.
-getPaletteNode(operatorId)
-
-// Returns the palette node identified by the node ID passed in.
-getPaletteNodeById(nodeId)
-
-// Returns the category of the palette node identified by the operator passed in
-getCategoryForNode(nodeOpIdRef)
-
-// Converts a node template from the format use in the palette (that conforms
-// to the schema) to the internal node format.
-convertNodeTemplate(nodeTemplate)
-
-// Opens the palette category identified by the category ID passed in.
-openPaletteCategory(categoryId)
-
-// Closes the palette category idetified by the category ID passed in.
-closePaletteCategory(categoryId)
-
-// Opens all the palette categories.
-openAllPaletteCategories()
-
-// Closes all the palette categories.
-closeAllPaletteCategories()
-
-// Returns true or false to indicate whether a palette category is open or not.
-isPaletteCategoryOpen(categoryId)
-
-

Selections methods

-
// Sets the currently selected objects replacing any current selections.
-// newSelection - An array of object IDs for nodes and/or comments
-// pipelineId - Optional. The ID of the pipeline where the objects exist.
-// Selected objects can only be in one pipeline. If this parameter is omitted
-// it is assumed the selections will be for objects in the 'top-level' pipeline
-// being displayed.
-setSelections(newSelection, pipelineId)
-
-// Clears all the current selections from the canvas.
-clearSelections()
-
-// Selects all the objects on the canvas.
-selectAll()
-
-// Returns an array of the IDs of the currently selected objects.
-getSelectedObjectIds()
-
-// Returns the currently selected Nodes.
-getSelectedNodes()
-
-// Returns the currently selected Comments.
-getSelectedComments()
-
-// Returns the ID of the pipeline in which the currently selected objects
-// exist. Only one pipeline may contain selected objects.
-getSelectedPipelineId()
-
-// Deletes all currently selected objects.
-deleteSelectedObjects()
-
-// Returns true if the currently selected objects are all linked together.
-// This is used when deciding to creating a supernode.
-areSelectedNodesContiguous()
-
-

Notification messages methods

-

The notification panel is displayed by the user by clicking the notifications icon in the toolbar. Your application can display whatever messages it wants in the notification panel. See the Notification Messages paage for the structure of message objects. The contents of the notification panel can be managed using the methods below: -

// Overwrites the array of notification messages shown in the notification
-// panel.
-// newMessage - An array of messages (see getNotificationMessages)
-setNotificationMessages(newMessages)
-
-// Deletes all notification messages shown in the notification panel.
-clearNotificationMessages()
-
-// Removes the notification messages from the given array of ids
-deleteNotificationMessages(ids)
-
-// Returns the array of current notification messages. If the messageType is
-// provided only messages of that type will be returned. If messageType is
-// not provided, all messages will be returned. The format of a notification
-// message is an object with these fields:
-// {
-//   "id": string (Required),
-//   "type" : enum, oneOf ["info", "success", "warning", "error"] (Required),
-//   "callback": function, the callback function when a message is clicked (Required),
-//   "title": string (Optional),
-//   "content": string, html, JSX Object (Optional),
-//   "timestamp": string (Optional),
-//   "closeMessage": string (Optional)
-// }
-getNotificationMessages(messageType)
-
-// Returns the maximum notification message type present in the current set
-// of notification messages. For this: ("error" > "warning" > "success" > "info")
-getNotificationMessagesMaxType()
-

-

Node AND comment methods

-

In Common Canvas nodes and comments are collectively known as objects. The following methods may be used to manage either collections of comments or nodes or a mixture of both. -Note:

-
    -
  • See this sections if you are working with styles.
  • -
  • See this section if you are working with decorations.
  • -
  • See this section for differences between the structure of objects in the API and the schema. -
    // Moves the objects identified in the data object which must be in the
    -// pipeline identified by the pipeline ID.
    -// data - A javascript object like this:
    -// {
    -//   nodes: []       // An array of node and comment IDs
    -//   offsetX: number // Offset in pixels the objects will move in the X dir
    -//   offsetY: number // Offset in pixels the objects will move in the Y dir
    -// }
    -moveObjects(data, pipelineId)
    -
    -// Deletes the objects specified in objectIds array.
    -// objectIds - An array of node and comment IDs
    -deleteObjects(objectIds, pipelineId)
    -
    -// Removes the links to and from the objects specified in the objectIds array.
    -// objectIds - An array of node and comment IDs
    -disconnectObjects(objectIds, pipelineId)
    -
    -// Deletes the object specified by the id in the pipleine specified by
    -// pipeline ID.
    -// @Deprecated Use deleteNode or deleteComment as appropriate instead.
    -deleteObject(id, pipelineId)
    -
    -// Sets the style of the objects specified by pipelineObjectIds to be
    -// the newStyle which will be either temporary or permanent.
    -// pipelineObjectIds: This identified the objects to be styles. It is a
    -// javascript object like this:
    -//   {
    -//     <pipelineID_1>: [
    -//       <objectID_1_1>,
    -//       <objectID_1_2>
    -//     ],
    -//     <pipelineID_2>: [
    -//         <objectID_2_1>,
    -//         <objectID_2_2>
    -//     ]
    -//   }
    -// newStyles - This is a style specification objects.
    -// temporary - A boolean to indicate if the style is serialized when
    -//             getPipelineFlow() method is called or not.
    -setObjectsStyle(pipelineObjectIds, newStyle, temporary)
    -
    -// Sets the styles of multiple objects at once.
    -// pipelineObjStyles - Specified the objects and the styles each should be
    -// set to. It is a javascript array like this:
    -//   [
    -//     { pipelineId: <pipelineId>, objId: <objectId>, style: <style_spec>},
    -//     { pipelineId: <pipelineId>, objId: <objectId>, style: <style_spec>},
    -//     { pipelineId: <pipelineId>, objId: <objectId>, style: <style_spec>}
    -//   ]
    -// temporary - A boolean to indicate if the styles are serialized when
    -//             getPipelineFlow() method is called or not.
    -setObjectsMultiStyle(pipelineObjStyles, temporary)
    -
  • -
-

Node methods

-
// Retuns an array of nodes for the pipeline specified by the pipelineId.
-getNodes(pipelineId)
-
-// Returns a new node created from the data parameter in the pipeline
-// identified by the pipelineId.
-// The data parameter must contain:
-// nodeTemplate -  a node template from the palette. The nodeTemplate
-//                 can be retrieved from the palette using with Canvas
-//                 Controller methods: getPaletteNode or getPaletteNodeById.
-// offsetX - the x coordinate of the new node
-// offsetY - the y coordinate of the new node
-createNode(data, pipelineId)
-
-// Adds a new node into the pipeline specified by the pipelineId.
-addNode(node, pipelineId)
-
-// Creates a node using the data parameter provided in the pipeline specified
-// by pipelineId and adds the command to the command stack (so the user can
-// undo/redo the command). This will also cause the beforeEditActionHandler
-// and editActionHandler callbacks to be called.
-// The data parameter must contain:
-// nodeTemplate -  a node template from the palette. The nodeTemplate
-//                 can be retrieved from the palette using with Canvas
-//                 Controller methods: getPaletteNode or getPaletteNodeById.
-// offsetX - the x coordinate of the new node
-// offsetY - the y coordinate of the new node
-//
-// If pipelineId is omitted the node will be created in the current
-// "top-level" pipeline.
-createNodeCommand(data, pipelineId)
-
-// Deletes the node specified.
-// nodeId - The ID of the node
-// pipelineId - The ID of the pipeline
-deleteNode(nodeId, pipelineId)
-
-// Sets the node properties
-// nodeId - The ID of the node
-// properties - An object containing properties to be overriden in the node
-// pipelineId - The ID of the pipeline
-setNodeProperties(nodeId, properties, pipelineId)
-
-// Sets the node parameters
-// nodeId - The ID of the node
-// parameters - An array of parameters
-// pipelineId - The ID of the pipeline
-setNodeParameters(nodeId, parameters, pipelineId)
-
-// Sets the node UI parameters
-// nodeId - The ID of the node
-// parameters - An array of UI parameters
-// pipelineId - The ID of the pipeline
-setNodeUiParameters(nodeId, uiParameters, pipelineId)
-
-// Sets the node messages
-// nodeId - The ID of the node
-// messages - An array of messages
-// pipelineId - The ID of the pipeline
-setNodeMessages(nodeId, messages, pipelineId)
-
-// Sets a single message on a node
-// nodeId - The ID of the node
-// message - A message
-// pipelineId - The ID of the pipeline
-setNodeMessage(nodeId, message, pipelineId)
-
-// Sets the lable for a node
-// nodeId - The ID of the node
-// ndeLabel - The label
-// pipelineId - The ID of the pipeline
-setNodeLabel(nodeId, newLabel, pipelineId)
-
-// Sets the class name to newClassName of the nodes identified by nodeIds
-// array in the pipleine specified by pipeline ID. The class name will be
-// applied to the node body path.
-setNodesClassName(nodeIds, newClassName, pipelineId)
-
-// Sets the decorations on a node. The decorations array passed in
-// will replace any decorations currently applied to the node.
-// nodeId - The ID of the node
-// newDecorations - An array of decoration objects.
-// pipelineId - The ID of the pipeline
-setNodeDecorations(nodeId, newDecorations, pipelineId)
-
-// Sets the input ports on a node. The inputs array of ports provided will
-// replace any input ports for a node.
-// nodeId - The ID of the node
-// inputs - An array of input port objects.
-// pipelineId - The ID of the pipeline
-setNodeInputPorts(nodeId, inputs, pipelineId)
-
-// Sets the output ports on a node. The outputs array of ports provided will
-// replace any output ports for a node.
-// nodeId - The ID of the node
-// outputs - An array of output port objects.
-// pipelineId - The ID of the pipeline
-setNodeOutputPorts(nodeId, outputs, pipelineId)
-
-// Sets the decorations of multiple nodes at once. The decorations array
-// passed in will replace any decorations currently applied to the nodes.
-// pipelineNodeDecorations - Specifies the nodes and their decorations.
-// It is a JavaScript array like this:
-//   [
-//     { pipelineId: <pipelineId>, nodeId: <nodeId>, decorations: <decoration_spec_array>},
-//     { pipelineId: <pipelineId>, nodeId: <nodeId>, decorations: <decoration_spec_array>},
-//     { pipelineId: <pipelineId>, nodeId: <nodeId>, decorations: <decoration_spec_array>}
-//   ]
-setNodesMultiDecorations(pipelineNodeDecorations)
-
-// Sets the input port label on a node
-// nodeId - The ID of the node
-// portId - The ID of the input port
-// newLabel - The label
-// pipelineId - The ID of the pipeline
-setInputPortLabel(nodeId, portId, newLabel, pipelineId)
-
-// Sets the output port label on a node
-// nodeId - The ID of the node
-// portId - The ID of the output port
-// newLabel - The label
-// pipelineId - The ID of the pipeline
-setOutputPortLabel(nodeId, portId, newLabel, pipelineId)
-
-// Gets a node
-// nodeId - The ID of the node
-// pipelineId - The ID of the pipeline
-getNode(nodeId, pipelineId)
-
-// Gets the UI parameters for a node
-// nodeId - The ID of the node
-// pipelineId - The ID of the pipeline
-getNodeUiParameters(nodeId, pipelineId)
-
-// Gets the supernodes for a pipeline.
-// pipelineId - The ID of the pipeline
-getSupernodes(pipelineId)
-
-// Returns supernode ID that has a subflow_ref to the given pipelineId.
-getSupernodeObjReferencing(pipelineId)
-
-// Gets the messages for a node
-// nodeId - The ID of the node
-// pipelineId - The ID of the pipeline
-getNodeMessages(nodeId, pipelineId)
-
-// Gets the array of input ports for the node or null if the node ID is
-// not recognized.
-// nodeId - The ID of the node
-// pipelineId - The ID of the pipeline
-getNodeInputPorts(nodeId, pipelineId)
-
-// Gets the array of output ports for the node or null if the node ID is
-// not recognized.
-// nodeId - The ID of the node
-// pipelineId - The ID of the pipeline
-getNodeOutputPorts(nodeId, pipelineId)
-
-// Gets a message for a specific control for a node
-// nodeId - The ID of the node
-// controlName - The control name
-// pipelineId - The ID of the pipeline
-getNodeMessage(nodeId, controlName, pipelineId)
-
-// Gets an array of decorations for a node
-// nodeId - The ID of the node
-// pipelineId - The ID of the pipeline
-getNodeDecorations(nodeId, pipelineId)
-
-// Gets the class name associated with the node specified by nodeId in the
-// pipeline specified by pipelineId.
-getNodeClassName(nodeId, pipelineId)
-
-// Gets the style spcification for a node.
-// nodeId - The ID of the node
-// temporary - A boolean to indicate if the style is serialized when
-//             getPipelineFlow() method is called or not.
-// pipelineId - The ID of the pipeline
-getNodeStyle(nodeId, temporary, pipelineId)
-
-// Returns an array of nodes that are for the branch(es) that the nodes,
-// identified by the node IDs passed in, are within.
-// nodeIds - An array of node Ids
-// pipelineId - The ID of the pipeline where the nodes exist
-getBranchNodes(nodeIds, pipelineId)
-
-// Returns an array of nodes that are upstream from the nodes
-// identified by the node IDs passed in.
-// nodeIds - An array of node Ids
-// pipelineId - The ID of the pipeline where the nodes exist
-getUpstreamNodes(nodeIds, pipelineId)
-
-// Returns an array of nodes that are downstream from the nodes
-// identified by the node IDs passed in.
-// nodeIds - An array of node Ids
-// pipelineId - The ID of the pipeline where the nodes exist
-getDownstreamNodes(nodeIds, pipelineId)
-
-// Returns a boolean to indicate whether the supernode is expanded in place.
-// nodeId - The ID of the node
-// pipelineId - The ID of the pipeline
-isSuperNodeExpandedInPlace(nodeId, pipelineId)
-
-// Sets the label, for the node identified, to edit mode, provided the node
-// label is editable. This allows the user to edite the label text.
-setNodeLabelEditingMode(nodeId, pipelineId)
-
-// Sets the decoration label, for the decoration in the node identified, to edit
-// mode, provided the node label is editable. This allows the user to edit the
-// label text.
-setNodeDecorationLabelEditingMode(decId, nodeId, pipelineId)
-
-

Comment methods

-
// Returns the comments from the pipeline.
-// pipelineId - The ID of the pipeline
-getComments(pipelineId)
-
-// Returns a comment from the pipeline.
-// comId - The ID of the comment
-// pipelineId - The ID of the pipeline
-getComment(comId, pipelineId)
-
-// Returns a position object which indicates the position of where a new
-// comment should be placed in a situation where the mouse position cannot be
-// used (e.g. the toolbar button was clicked).
-// pipelineId - The ID of the pipeline
-getNewCommentPosition(pipelineId)
-
-// Creates a comment for the pipeline.
-// source - Input data
-// pipelineId - The ID of the pipeline
-createComment(source, pipelineId)
-
-// Adds a comment to the pipeline.
-// data - the data describing the comment
-// pipelineId - The ID of the pipeline
-addComment(data, pipelineId)
-
-// Edits a comment with the data.
-// data - the comment
-// pipelineId - The ID of the pipeline
-editComment(data, pipelineId)
-
-// Sets the properties in the comment identified by the commentId. The
-// commentProperties is an object containing one or more properties that will
-// replace the corresponding properties in the comment. For example: if
-// commentProperties is { x_pos: 50, y_pos: 70 } the comment
-// will be set to that position.
-setCommentProperties(commentId, commentProperties, pipelineId)
-
-// Sets the class name to newClassName of the comments identified by commentIds
-// array in the pipleine specified by pipeline ID. The class name will be
-// applied to the comment body path.
-setCommentsClassName(commentIds, newClassName, pipelineId)
-
-// Deletes a comment
-// comId - The ID of the comment
-// pipelineId - The ID of the pipeline
-deleteComment(comId, pipelineId)
-
-// Gets the class name associated with the comment specified by commentId in the
-// pipeline specified by pipelineId.
-getCommentClassName(commentId, pipelineId)
-
-// Gets the style spcification for a comment
-// commentId - The ID of the node
-// temporary - A boolean to indicate if the style is serialized when
-//             getPipelineFlow() method is called or not.
-// pipelineId - The ID of the pipeline
-getCommentStyle(commentId, temporary, pipelineId)
-
-// Hides all comments on the canvas.
-hideComments()
-
-// Shows all comments on the canvas - if they were previously hiding.
-showComments()
-
-// Returns true if comments are currently hiding.
-isHidingComments()
-
-// Sets the comment identified, to edit mode so the user can
-// edit the comment.
-setCommentEditingMode(commentId, pipelineId)
-
- -
// Gets a link
-// linkId - The ID of the link
-// pipelineId - The ID of the pipeline
-getLink(linkId, pipelineId)
-
-// Returns an array of link objects for the pipelineId passed in.
-// pipelineId - The ID of the pipeline
-getLinks(pipelineId)
-
-// Sets the properties in the link identified by the linkId. The
-// linkProperties is an object containing one or more properties that will
-// replace the corresponding properties in the link. For exam`ple: if
-// linkProperties is { trgNodeId: "123", trgNodePortId: "789" } the target
-// node ID will be set to "123" and the target port ID set to "789".
-setLinkProperties(linkId, linkProperties, pipelineId)
-
-// Sets the source properties in the data link identified by the linkId. The
-// srcNodeId and srcNodePortId will be set to the values provided. If
-// srcNodePortId is set to null the current srcNodePortId will be removed
-// from the link. Also, if the link has a srcPos property (because its
-// source end is detached) that will be removed.
-setNodeDataLinkSrcInfo(linkId, srcNodeId, srcNodePortId, pipelineId)
-
-// Sets the target properties in the data link identified by the linkId. The
-// trgNodeId and trgNodePortId will be set to the values provided. If
-// trgNodePortId is set to null the current trgNodePortId will be removed
-// from the link. Also, if the link has a trgPos property (because its
-// target end is detached) that will be removed.
-setNodeDataLinkTrgInfo(linkId, trgNodeId, trgNodePortId, pipelineId)
-
-// Gets a node to node data link
-// srcNodeId - The ID of the source node
-// srcNodePortId - The ID of the source node port
-// trgNodeId - The ID of the target node
-// trgNodePortId - The ID of the target node port
-// pipelineId - The ID of the pipeline
-getNodeDataLinkFromInfo(srcNodeId, srcNodePortId, trgNodeId, trgNodePortId, pipelineId)
-
-// Gets a comment to node link
-// id1 - The ID of the comment
-// id2 - The ID of the node
-// pipelineId - The ID of the pipeline
-getCommentLinkFromInfo(id1, id2, pipelineId)
-
-// Gets a node to node association link
-// id1 - The ID of one of the node
-// id2 - The ID of one of the node
-// pipelineId - The ID of the pipeline
-getNodeAssocLinkFromInfo(id1, id2, pipelineId)
-
-// Adds links to a pipeline
-// linkList - An array of links
-// pipelineId - The ID of the pipeline
-addLinks(linkList, pipelineId)
-
-// Deletes a link
-// link - the link object to be deleted
-// pipelineId - The ID of the pipeline
-deleteLink(link, pipelineId)
-
-// Creates node to node links
-// data - Data describing the links
-// pipelineId - The ID of the pipeline
-createNodeLinks(data, pipelineId)
-
-// Creates comment links
-// data - Data describing the links
-// pipelineId - The ID of the pipeline
-createCommentLinks(data, pipelineId)
-
-// Sets the class name to newClassName of the links identified by linkIds
-// array in the pipleine specified by pipeline ID. The class name will be
-// applied to the link line path.
-setLinksClassName(linkIds, newClassName, pipelineId)
-
-// Sets the style of the links specified by pipelineLinkIds to be
-// the newStyle which will be either temporary or permanent.
-// pipelineLinkIds - This identifies the objects to be styles. It is a
-// javascript object like this:
-//   {
-//     <pipelineID_1>: [
-//       <linkID_1_1>,
-//       <linkID_1_2>
-//     ],
-//     <pipelineID_2>: [
-//         <linkID_2_1>,
-//         <linkID_2_2>
-//     ]
-//   }
-// newStyle - This is a style specification objects.
-// temporary - A boolean to indicate if the style is serialized when
-//             getPipelineFlow() method is called or not.
-setLinksStyle(pipelineLinkIds, newStyle, temporary)
-
-// Sets the styles of multiple links at once.
-// pipelineObjStyles - Specified the links and the styles each should be
-// set to. It is a javascript array like this:
-//   [
-//     { pipelineId: <pipelineId>, objId: <linkId>, style: <style_spec>},
-//     { pipelineId: <pipelineId>, objId: <linkId>, style: <style_spec>},
-//     { pipelineId: <pipelineId>, objId: <linkId>, style: <style_spec>}
-//   ]
-// temporary - A boolean to indicate if the styles are serialized when
-//             getPipelineFlow() method is called or not.
-setLinksMultiStyle(pipelineObjStyles, temporary)
-
-// Gets the class name associated with the link specified by linkId in the
-// pipeline specified by pipelineId.
-getLinkClassName(linkId, pipelineId)
-
-// Returns the style specification for a link.
-// linkIds - An array of links
-// temporary - A boolean to indicate if the style is serialized when
-//             getPipelineFlow() method is called or not.
-// pipelineId - The ID of the pipeline
-getLinkStyle(linkId, temporary, pipelineId)
-
-// Sets the decorations on a link. The decorations array passed in
-// will replace any decorations currently applied to the link.
-// linkId - The ID of the link
-// newDecorations - An array of decoration objects.
-// pipelineId - The ID of the pipeline
-setLinkDecorations(linkId, newDecorations, pipelineId)
-
-// Sets the decorations of multiple links at once. The decorations array
-// passed in will replace any decorations currently applied to the links.
-// pipelineLinkDecorations - Specifies the links and their decorations.
-// It is a javascript array like this:
-//   [
-//     { pipelineId: <pipelineId>, linkId: <linkId>, decorations: <decoration_spec_array>},
-//     { pipelineId: <pipelineId>, linkId: <linkId>, decorations: <decoration_spec_array>},
-//     { pipelineId: <pipelineId>, linkId: <linkId>, decorations: <decoration_spec_array>}
-//   ]
-setLinksMultiDecorations(pipelineLinkDecorations)
-
-// Gets an array of decorations for a link
-// linkId - The ID of the link
-// pipelineId - The ID of the pipeline
-getLinkDecorations(linkId, pipelineId)
-
-// Sets the decoration label, for the decoration in the link identified, to edit
-// mode provided the link label is editable. This allows the user to edit the
-// label text.
-setLinkDecorationLabelEditingMode(decId, linkId, pipelineId)
-
- -
// Returns the current array of breadcrumbs. There will one breadcrumb object
-// for each level of supernode that the user has navigated into. This array
-// can be used to display breadcrumbs to the user to show where they are
-// within the navigation hierarchy within Common Canvas.
-getBreadcrumbs()
-
-// Returns the last breadcrumb which represents the level with supernode
-// hierarchy that the user has currently navigated to.
-getCurrentBreadcrumb()
-
-

Branch Highlight methods

-
// Highlights the branch(s) (both upstream and downstream) from the node
-// IDs passed in and returns the highlighted object Ids.
-// nodeIds - An array of node Ids
-// pipelineId - The ID of the pipeline
-highlightBranch(nodeIds, pipelineId)
-
-// Highlights the upstream nodes from the node IDs passed in
-// and returns the returns the highlighted object Ids.
-// nodeIds - An array of node Ids
-// pipelineId - The ID of the pipeline
-highlightUpstream(nodeIds, pipelineId)
-
-// Highlights the downstream nodes from the node IDs passed in
-// and returns highlighted object Ids.
-// nodeIds - An array of node Ids
-// pipelineId - The ID of the pipeline
-highlightDownstream(nodeIds, pipelineId)
-
-

Operational methods

-

These are general purpose methods for operation of the common-canvas components:

-

Logging methods

-
// Returns a Boolean to indicate whether canvas logging is switched on or off.
-getLoggingState()
-
-// Sets canvas logging based on the Boolean passed in.
-setLoggingState(state)
-
-

Palette methods

-
// Opens the palette
-openPalette()
-
-// Closes the palette
-closePalette()
-
-// Returns true if the palette is currently open
-isPaletteOpen()
-
-

Context menu methods

-
// Opens the context menu
-openContextMenu(menuDef)
-
-// Closes the context menu
-closeContextMenu()
-
-

Notification Panel methods

-
// Opens the notification panel
-openNotificationPanel()
-
-// Closes the notification panel
-closeNotificationPanel()
-
-// Either opens or closes the notifictaion panel based on its current status
-toggleNotificationPanel()
-
-

Right Flyout methods

-
// Returns a boolean to indicate if the right flyout is open or not
-isRightFlyoutOpen()
-
-

Top panel methods

-
// Returns a boolean to indicate if the top pnel is open or not
-isTopPanelOpen()
-
-

Bottom panel methods

-
// Returns a boolean to indicate if the bottom panel is open or not
-isBottomPanelOpen()
-
-// Sets the height of the bottom panel in pixels. This can be called
-// immediately after the CanvasController has been created, if the bottom
-// panel should be displayed at a specific height when it first opens.
-setBottomPanelHeight(height)
-
-

Canvas/pipeline navigation methods

-
// Displays a pipeline (identified by the pipelineId passed in). This must be
-// one of the pipelines referenced by the current set of breadcrumbs. It
-// cannot be used to open a new pipeline outside the current set of breadcruumbs.
-displaySubPipeline(pipelineId)
-
-// Displays a pipeline for a supernode (identifid by the supernodeId
-// parameter) in a parent pipeline (identifid by the pipelineId parameter).
-// This parent pipeline should be the last of the current set of breadcumbs.
-// That is, the pipeline currently shown "full page" in the canvas.
-displaySubPipelineForSupernode(supernodeId, pipelineId)
-
-// Displays full-page the previous pipeline from the one currently being displayed
-displayPreviousPipeline()
-
-

Command Stack interaction methods

-
// Adds the command object to the command stack which will cause the
-// do() method of the command to be called.
-do(command)
-
-// Calls the undo() method of the next available command on the command
-// stack that can be undone, if one is available.
-undo()
-
-// Undoes a number of commands on the command stack as indicated by the
-// 'count' parameter. If 'count' is bigger than the number of undoable commands
-// on the stack, all undoable commands currently on the command stack
-// will be undone. Uses the editActionHandler method which will cause
-// the app's editActionHandler to be called.
-undoMulti(count)
-
-// Calls the redo() method of the next available command on the command
-// stack that can be redone, if one is available.
-redo()
-
-// Redoes a number of commands on the command stack as indicated by the
-// 'count' parameter. If 'count' is bigger than the number of redoable commands
-// on the stack, all redoable commands currently on the command stack
-// will be redone. Uses the editActionHandler method which will cause
-// the app's editActionHandler to be called.
-redoMulti(count)
-
-// Returns true if there is a command on the command stack
-// available to be undone.
-canUndo()
-
-// Returns true if there is a command on the command stack
-// available to be redone.
-canRedo()
-
-// Returns a string which is the label that descibes the next undoable
-// command.
-getUndoLabel()
-
-// Returns a string which is the label that descibes the next redoable
-// command.
-getRedoLabel()
-
-// Returns an array of all undoable commands currently on the command stack.
-getAllUndoCommands()
-
-// Returns an array of all redoable commands currently on the command stack.
-getAllRedoCommands()
-
-// Clears the command stack of all currently stored commands.
-clearCommandStack()
-
-

Zoom methods

-
// Centers the canvas contents and zooms in
-zoomIn()
-
-// Centers the canvas contents and zooms out
-zoomOut()
-
-// Zooms the canvas contents to fit within the viewport
-zoomToFit()
-
-// Changes the zoom amounts for the canvas. This method does not alter the
-// pipelineFlow document. zoomObject is an object with three fields:
-// x: Is the horizontal translate amount which is a number indicating the
-//    pixel amount to move. Negative left and positive right
-// y: Is the vertical translate amount which is a number indicating the
-//    pixel amount to move. Negative up and positive down.
-// k: is the scale amount which is a number greater than 0 where 1 is the
-//    default scale size.
-zoomTo(zoomObject)
-
-// Increments the translation of the canvas by the x and y increment
-// amounts. The optional animateTime parameter can be provided to animate the
-// movement of the canvas. It is a time for the animation in milliseconds.
-// If omitted the movement happens immediately.
-translateBy(x, y, animateTime)
-
-// Returns the current zoom object for the currently displayed canvas or null
-// if the canvas is not yet rendered for the first time.
-getZoom()
-
-// Returns a zoom object required to pan the objects (nodes and/or comments
-// and/or links) identified by the objectIds array to 'reveal' the objects
-// in the viewport. Returns null if no nodes, comments or links can be found
-// using the IDs passed in. Note: node, comment and link IDs must be unique.
-// The zoom object returned can be provided to the CanvasController.zoomTo()
-// method to perform the zoom/pan action.
-// If the xPos and yPos parameters are provided it will return a zoom object
-// to pan the center of the objects specified, to a location where, xPos
-// is the percentage of the viewport width and yPos is the percentage of the
-// viewport height. So if you want the center of the objects specified to be
-// in the center of the viewport set xPos to 50 and yPos to 50.
-// If the xPos and yPos parameters are undefined (omitted) and all the
-// objects are currently fully within the canvas viewport, this method will
-// return null. This can be used to detect whether the objects are fully
-// visible or not.
-// If the xPos and yPos parameters are undefined and the objects are outside
-// the viewport, a zoom object will be returned that can be used to zoom them
-// so they appear at the nearest side of the viewport to where they are
-// currently positioned.
-// The zoom object returned has three fields:
-// x: Is the horizontal translate amount which is a number indicating the
-//    pixel amount to move. Negative left and positive right
-// y: Is the vertical translate amount which is a number indicating the
-//    pixel amount to move. Negative up and positive down.
-// k: is the scale amount which is a number greater than 0 where 1 is the
-//    default scale size.
-// Parameters:
-// objectIds - An array of nodes and/or comment IDs.
-// xPos - Optional. Can be set to percentage offset of the viewport width.
-// yPos - Optional. Can be set to percentage offset of the viewport height.
-getZoomToReveal(objectIds, xPos, yPos)
-
-// Clears any saved zoom values stored in local storage. This means
-// newly opened flows will appear with the default zoom. This method
-// is only applicable when the `enableSaveZoom` config parameter is
-// set to "LocalStorage".
-clearSavedZoomValues()
-
- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/03.04.01-decorations/index.html b/v13/03.04.01-decorations/index.html deleted file mode 100644 index 90f3cf72bf..0000000000 --- a/v13/03.04.01-decorations/index.html +++ /dev/null @@ -1,2822 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Decorations - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

Decorations

-

Your application can add Decorations – additional icons, text labels, shapes or JSX objects – to nodes or links in the canvas to indicate special status or attributes of the node or link. Decorations can be static (for display only) or interactive (a hotspot) so the user can click them to initiate some action.

-

Adding Decorations

-

Decorations can be added to the nodes and/or links in four different ways:

-
    -
  1. -

    By using the following CanvasController methods: -

    setNodeDecorations(nodeId, newDecorations, pipelineId)
    -setNodesMultiDecorations(pipelineNodeDecorations)
    -setLinkDecorations(linkId, newDecorations, pipelineId)
    -setLinksMultiDecorations(pipelineLinkDecorations)
    -
    - and can be retrieved using these CanvasController methods: -
    getNodeDecorations(nodeId, pipelineId)
    -getLinkDecorations(linkId, pipelineId)
    -
    - See the CanvasController API documentation for more details.

    -
  2. -
  3. -

    Node decorations can be specified in the nodeLayout object in the canvas config. Decorations specified in this way are applied to all nodes on the canvas.

    -
  4. -
  5. -

    Decorations can be applied to, and retrieved from, nodes or links in the pipelineFlow in the app_data.ui_data section for the node or link. (Note: JSX objects are not supported in the pipelineFlow document).

    -
  6. -
  7. -

    Decorations can be returned in the layout information returned from the layoutHandler CommonCanvas callback method.

    -
  8. -
-

Specification

-

The decoration specification used by these methods and the pipelineFlow is a JavaScript object with these possible properties:

-

These properties are applicable to an image decoration: -

     {
-       id: <decoration_id>,
-       image: <image_url>,
-       position: <position>,
-       distance: <number>
-       x_pos: <number>,
-       y_pos: <number>,
-       width: <number>,
-       height: <number>,
-       hotspot: <boolean>,
-       class_name: <class_name>,
-       outline: <boolean>,
-       tooltip: <string>,
-       temporary: <boolean>
-     }
-
-These properties are applicable to a label decoration: -
     {
-       id: <decoration_id>,
-       label: <string>,
-       label_editable: <boolean>,
-       label_align: <enum>,
-       label_single_line: <boolean>,
-       label_max_characters: <number>,
-       label_allow_return_key: <boolean>,
-       position: <position>,
-       distance: <number>
-       x_pos: <number>,
-       y_pos: <number>,
-       width: <number>,
-       height: <number>,
-       hotspot: <boolean>,
-       class_name: <class_name>,
-       tooltip: <string>,
-       temporary: <boolean>
-     }
-
-These properties are applicable to a shape decoration: -
     {
-       id: <decoration_id>,
-       path: <string>,
-       position: <position>,
-       distance: <number>
-       x_pos: <number>,
-       y_pos: <number>,
-       width: <number>,
-       height: <number>,
-       hotspot: <boolean>,
-       class_name: <class_name>,
-       tooltip: <string>,
-       temporary: <boolean>
-     }
-
-These properties are applicable to a JSX decoration: -
     {
-       id: <decoration_id>,
-       jsx: <JSX Object>,
-       position: <position>,
-       distance: <number>
-       x_pos: <number>,
-       y_pos: <number>,
-       width: <number>,
-       height: <number>,
-       hotspot: <boolean>,
-       class_name: <class_name>,
-       tooltip: <string>,
-     }
-

-

where:

-

id

-

A unique ID for the decoration within the context of the node or link to which the decorator is attached.

-

image

-

A reference to an image to display for the decoration. If an image is specified the image is displayed within an outline rectangle unless outline is set to false. The image should be a reference to your image like: “/images/decorations/zoom-in_32.svg”. Do not set label or path or jsx when this field is set.

-

path

-

An SVG shape that is displayed using this string as it’s SVG path. eg. “M 0 0 L 10 10 -10 10 Z” could be specified to draw a triangle. Do not set image or label or jsx when this field is set.

-

jsx

-

A JSX object that is is displayed at the specified decoration location. Do not set image or path or label when this field is set. Note JSX decorations are not supported in the pipelineFlow document.

-

label

-

A text string that is displayed at the specified decoration location. Do not set image or path or jsx when this field is set.

-

label_editable

-

A boolean that defaults to false. When set to true, if the mouse pointer is hovered over the label an edit icon is displayed next to the label which, when clicked, opens the label for editing. The label can also for double clicked to go to edit mode.

-

When editing is completed (by clicking outside the text area) an editDecorationLabel action is executed which results in calls to first the beforeEditActionHandler and then the editActionHandler callbacks.

-

label_align

-

Can be either “center” or “left”. When set to center the label will be centered on the point defined by the position, distance, x_pos and y_pos properties.

-

label_single_line

-

A boolean that defaults to false. When set to true the label is displayed on a single line and is truncated at the width of the label (specified in the width property for the decoration) and does not word wrap. If it is truncated an ellipsis (…) is displayed at the end of the truncated text.

-

If this property is set to false, long label text is displayed over a number of lines with word wrapping being controlled by the width set for the decoration. If the text extends beyond a second line an ellipsis (..) is displayed at the end of the second line. This is controlled by the -webkit-line-clamp: 2; CSS property. You can override this if you want the ellipsis to be displayed on a different line.

-

Note: For both single and multi-line labels you may need to set the height property for the decoration to show the text fully.

-

label_max_characters

-

A number or null. Defaults to null. If set to a number the label will be restricted to that number of characters. If the label in the pipeline flow document is longer than the max number it will be displayed but when it is edited the user will not be able to do anything except delete characters until the label is shorter than the max number. If this property is set to null or omitted an unlimited number of characters may be entered by the user.

-

label_allow_return_key

-

A boolean that defaults to false. When false, if the user presses the return key nothing will happen. This means multi-line labels will only word-wrap at the width of the decorator. Preventing newline insertion is useful if the label text appears elsewhere in the UI which is not able to show text with newline characters. When set to "save", if the user presses the return key, the editing will be completed and the label saved – this is the equivalent of clicking on the canvas background to complete the edit. If set to true, a new line character will be inserted in the label when the user presses return.

-

position

-

This is the anchor point to which the decoration is attached. For a node, this can be one of these 9 enumerated values: -

   "topLeft", "topCenter", "topRight",
-   "middleLeft", "middleCenter", "middleRight",
-   "bottomLeft", "bottomCenter", "bottomRight".
-
-If omitted it will default to “topLeft”.

-

For a link, this can be one of these 3 enumerated values: -

   "source"
-   "middle"
-   "target"
-
-source will position the decoration at the start point of the line and target will position it at the end point of the line. If omitted it will default to middle.

-

distance

-

A number of pixels. This is only applicable when the decoration is for a link line and then, only with straight connecting lines. That is, for node to node connections when the config property enableLinkType is set to "straight". When specified, it will move the anchor point for the decoration to a new position along the connecting line relative to the initial position specified in the decoration’s position property. A positive number moves the decoration along the line from the starting position towards the target of the link and a negative number backwards towards the source of the link. For example, if a straight link decoration has position of source and a distance of 20 the decoration’s anchor point will be 20 pixels along the link line from the source (start) point of the line. After the distance value has been applied to the anchor point of the decoration, any x_pos and y_pos adjustment will be applied to fine tune the decoration’s final position.

-

x_pos

-

This is the number of pixels horizontally from the anchor point that the decoration is positioned. It can be positive or negative. If omitted it takes a default value from the node layout fields. x_pos is not applicable if you specify an SVG path using the path field, because the SVG path can be used to position the shape.

-

y_pos

-

This is the number of pixels vertically from the anchor point that the decoration is positioned. It can be positive or negative. If omitted it takes a default value from the node layout fields. y_pos is not applicable if you specify an SVG path using the path field, because the SVG path can be used to position the shape.

-

width

-

This is the width for the decorator in pixels. For an image decorator, it is the width of the rectangle surrounding the image. For a label decorator it is the width allowed for display of the label text. If omitted it takes a default value from the node layout fields for Node decorations and from the canvas layout properties for Link properties.

-

height

-

This is the height for the decorator in pixels. For an image decorator, it is the height of the rectangle surrounding the image. For a label decorator it is the height allowed for display of the label text. If omitted it takes a default value from the node layout fields for Node decorations and from the canvas layout properties for Link properties.

-

hotspot

-

A Boolean. It defaults to false. When set to true the decoration becomes clickable and when it is clicked the decorationCallbackHandler is called with the ID of the decoration passed as a parameter.

-

class_name

-

An optional class that will be applied to the decoration. You can add a style rule that references that class in your CSS to style the decoration and override the default styles.

-

outline

-

A Boolean. It defaults to true. When a decoration is specified with an image field the image is typically displayed with a outline rectangle around it and with an offset within the rectangle to improve presentation. If outline is set to false the outline rectangle is not displayed and the image is displayed without any offset from its specified x_pos and y_pos.

-

tooltip

-

A String. When specified, the string will be shown in a tooltip when the pointer is hovered over the decoration. No tip will be displayed if the tooltip property is omitted. Note: for decoration tooltips to be displayed on the canvas, the decorations property of the tipConfig object in the canvas config must be set to true (which is its default setting).

-

temporary

-

A Boolean. It defaults to false. When set to true the decoration object will not be saved in the pipelineFlow document returned by the CanvasController.getPipelineFlow() method. Typically, this should be set to true when adding decorations programmatically to the nodes and links on the canvas.

-

Notes:

-
    -
  1. Using x_pos and y_pos, decorations can be displayed outside the node boundary.
  2. -
  3. If no image or label or path is provided, the default decoration is a rectangle displayed with the class_name provided.
  4. -
  5. You can specify as many decorations as you want by providing extra entries in the decorations array.
  6. -
  7. Images and labels are positioned differently. For images, the position defined for the decoration is the top left corner of the image. For labels it is anchor point for the label which is the base line of the string in the vertical direction and is dependent on the text-anchor CSS property applied to the text. So if you apply the text-anchor: middle CSS property to the label in the style related to class_name the label will be centered on the point calculated for the position of the decoration.
  8. -
- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/03.04.02-api-object-structure/index.html b/v13/03.04.02-api-object-structure/index.html deleted file mode 100644 index 42ebbd30d7..0000000000 --- a/v13/03.04.02-api-object-structure/index.html +++ /dev/null @@ -1,2719 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Object Structure - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

API differences with schema

-

Because historically Common Canvas has had to deal with different external flow definitions, there are some differences between the nodes, comments and links that the canvas-controller API handles internally and those specified in the pipelineFlow schema. As follows:

-

Object structure

-

For the API methods that involve nodes, comments and links, those objects are passed in and out by the API in their internal formats rather than the formats defined in the schema files.

-

The internal structure is a somewhat flattened version of that in the schema definition. That means, properties that are in <object>.app_data.ui_data are flattened out and appear as properties in the <object> itself. So for example a node that conforms to the schema might look like this: -

    {
-      id: "1234",
-      op: "select",
-      ...
-      app_data : {
-        ui_data: {
-          label: "Selection node",
-          image: "/images/select.svg",
-          description: "A node for selection"
-          ...
-        },
-        other_data: {
-          prop1: "Something interesting"
-        }
-      }
-    }
-
-whereas when it is passed through the API it looks like this: -
    {
-      id: "1234",
-      op: "select",
-      label: "Selection node",
-      image: "/images/select.svg",
-      description: "A node for selection"
-      ...
-      app_data : {
-        other_data: {
-          prop1: "Something interesting"
-        }
-      }
-    }
-
-Note that, any properties in app_data, other than ui_data, are preserved in the internal format. So in the example, app_data.other_data in the schema format is preserved in the internal format.

- -

The other difference between the API and the schema formats is with links.

-

In the pipeline flow schema, links are typically defined as properties within another object, for example, a node to node link is defined within a links array inside the inputs field of the target node and contains references to the node id and port of the source node. Also, links from comments to nodes are stored as an array in the comment object.

-

However, in the API and internally in Common Canvas, links are treated as a top level object; that is, there is an array of links stored internally which can be manipulated using the API methods. Each link has a unique ID. Consequently, links can be retrieved from the API by their ID field and properties of the links can be updated again by identifying the links using their ID. If you do not specify an ID for links in your pipelineFlow document a unique global ID will be generated for each link when the pipeline flow is loaded.

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/03.04.03-creating-new-canvas-nodes/index.html b/v13/03.04.03-creating-new-canvas-nodes/index.html deleted file mode 100644 index 6bdccfdb7a..0000000000 --- a/v13/03.04.03-creating-new-canvas-nodes/index.html +++ /dev/null @@ -1,2768 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Creating New Canvas Nodes - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - - - - - -
-
- - - - - - - - - - - - -

Creating New Canvas Nodes

- -

Introduction

-

The host application code can programmatically create nodes on the canvas in two ways:

-
    -
  • -

    By calling CanvasController API methods to create and add the node to the canvas.

    -
  • -
  • -

    Creating and adding a node to the Pipeline Flow document

    -
  • -
-

Creating and adding a node to the Canvas Controller API

-

The following code will programmatically add a node to the canvas. These commands will update the common-canvas object model directly and will not be added to the command stack so the user will not be able to undo / redo these actions. Also, the beforeEditActionHandler and editActionHandler callbacks will not be called for these actions.

-

First you can get a node template from the canvas by calling -

    const template = canvasController.getPaletteNode("sort");
-
-where the parameter is the operation (op field) for the palette node. Alternatively, you can retrieve a node template using this method: -
    const template = canvasController.getPaletteNodeById(nodeId)
-
-which returns the node template based on the node ID. This can be useful if you have supernodes in your palette because supernodes do not have an op field. After creating the node template your code can alter fields (for example, the label) within the template. If you do change any fields be careful because Common Canvas doesn’t do any error checking on your fields.

-

Next you create the node: -

    const newNode = canvasController.createNode({
-            nodeTemplate: template,
-            offsetX: 200,
-            offsetY: 400
-});
-
-This will work correctly for regular nodes, and also supernodes, that have been pulled from the palette.

-

Next you add the node object to the canvas. -

    canvasController.addNode(newNode);
-
-The node will appear at the offsetX, offseY position within the coordinate system for the canvas.

-

If command stack is needed

-

This method allows the host application to create a node, or supernode, from a palette template object by creating and executing a command which will be added to the command stack (so the user can undo / redo it) and will also cause the beforeEditActionHandler and editActionHandler callbacks to be called.

-

First your code retrieves a node template from the palette as described above and then calls this method: -

    const data = {
-        nodeTemplate: template,
-        offsetX: 200,
-        offsetY: 400
-    };
-
-    canvasController.createNodeCommand(data, pipelineId)
-

-

Note: If pipelineId is omitted the node will be created in the current “top-level” pipeline.

-

Creating and adding a node using Pipeline Flow document

-

This approach works by your code adding one or more JSON objects directly to the pipeline flow object, either before the pipeline flow document is loaded into Common Canvas using CanvasController.setPipelineFlow(pFlow), or afterwards by retrieving the pipeline flow object from Common Canvas using CanvasController.getPipelineFlow() and then updating the nodes array of whichever pipeline you want to modify. This would require your code to navigate to the pipeline object (that you want to update) in the pipelines array of the pipeline flow and then add the node object to the nodes array in the pipeline object.

-

After updating the pipeline flow object your code would need to reload it into Common Canvas using CanvasController.setPipelineFlow(pFlow).

-

To use this approach you would need a good understanding of the pipeline flow schema and pipeline flow UI schema.

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/03.04.05-notification-messages/index.html b/v13/03.04.05-notification-messages/index.html deleted file mode 100644 index 1d9637b7c0..0000000000 --- a/v13/03.04.05-notification-messages/index.html +++ /dev/null @@ -1,2692 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Notification Messages - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

Notification Messages

- -

Notification Message structure.

-

Notification messages are displayed in the notification panel which the user can access by clicking the Notifications button in the toolbar. The application specifies an array of messages using the notification methods in the canvas controller. The appearance of the panel is customized in the Notification Config.

-

The application passes to Common Canvas an array of messages each described by a simple JavaScript object like this: -

 {
-    id: <string>,
-    type: <string>,
-    title: <string or JSX object>,
-    content: <string or JSX object>,
-    timestamp: <string>,
-    callback: <function>,
-    closeMessage: <string or JSX object>
-}
-
-where:

-
    -
  • -

    id (string, required): this is a unique ID assigned to the notification message. This is passed as a parameter in the callback (see below) and is used to reference messages when deleting them through the CanvasController API.

    -
  • -
  • -

    type (string, required): this must be one of four values: “info”, “success”, “warning”, or “error”. If type is null, empty string, or undefined, the message type will be “unspecified”.

    -
  • -
  • -

    title (string or JSX object): the title of the notification message.

    -
  • -
  • -

    content (string or JSX object): the body of the notification message.

    -
  • -
  • -

    callback (function): an optional callback function that will be called when the notification message is clicked. Callback function is called with one parameter, id

    -
  • -
  • -

    timestamp (string or JSX object): an optional timestamp that will be rendered in a separate section with different formatting, if passed in

    -
  • -
  • -

    closeMessage (string or React object): an optional message that, if passed in, will display as clickable. Clicking on this will delete this individual message. If none is passed in, no delete option will be shown.

    -
  • -
- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/03.04.06-styling-objects/index.html b/v13/03.04.06-styling-objects/index.html deleted file mode 100644 index 1a9e8d136b..0000000000 --- a/v13/03.04.06-styling-objects/index.html +++ /dev/null @@ -1,2659 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Styling Canvas Objects - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

Styling Canvas Objects

-

There are multiple was to specify the styles for the objects Common Canvas displays:

-
    -
  • A class name can be provided for nodes either within the pipelineFlow document or
  • -
  • The common-canvas default styes can be overriden within your CSS or SCSS file
  • -
-

For more precise styling of objects the style specification object can be used to provide a number of styles to Common Canvas to set the inline styles on numerous elements of an object. For example, a node is made up of: a selection outline; a node body (rectangle); an image, a label etc.

-

Style specifications may be applied to common-canvas objects using the following Canvas Controller methods: -

setObjectsStyle()
-setObjectsMultiStyle()
-setLinksStyle()
-setLinksMultiStyle()
-setSubdueStyle()
-
-and may be retrieved for objects using: -
getNodeStyle()
-getCommentStyle()
-getLinkStyle()
-

-

The style spec for a node can set the styles for all these elements in one shot. Here is a template of a style spec for a node: -

{
-    body: { default: <css_snippet>, hover: <css_snippet> },
-    image: { default: <css_snippet> },
-    label: { default: <css_snippet> },
-    selection_outline: { default: <css_snippet> }
-}
- ```
-And here is a real example:
-```js
-{
-    body: {
-        default: "fill: coral; stroke: red;",
-        hover: "fill: cornflowerblue; stroke: blue;"
-    }
-};
-

-

Here is a template for styling a comment:

-
{
-    body: { default: <css_snippet>, hover: <css_snippet> },
-    text: { default: <css_snippet> },
-    selection_outline: { default: <css_snippet> },
-}
-
-

And here is a template for styling a link: -

{
-    line: { default: <css_snippet> , hover: <css_snippet>  }
-}
-

-
    -
  • <css_snippet> - is a string containing any CSS code that can be added inline to an SVG object. That means, for example, you need to use fill and stroke for colors etc It is recommended NOT to change the sizes of text fonts.
  • -
-

The CSS will be applied to the element of the object specified, either as the default inline style or as the style when the pointer hovers over the object.

-

When a hover style is applied to a graphical element it is applied in addition to the default style so there is no need to repeat styles in the hover <css_snippet> because they will augment the default style.

-

Because styles are applied as in-line styles they will override any styles provided in your application’s CSS and specified to Common Canvas through the class_name field of canvas objects.

-

If the <css_snippet> is specified as null the current style will be removed from the specified element of the object.

-

Finally, styles can be applied to your nodes, comments and links as either temporary or permanent styles by specifying the temporary boolean in the API methods. A temporary style is just applied for the duration of the session and are not persisted. You should use temporary=true styles that represent transient attributes of an object that should not be persisted in the pipelineFlow document. Use temporary=false styles for styles that you want to persist in the pipelineFlow document.

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/03.05-keyboard-support/index.html b/v13/03.05-keyboard-support/index.html deleted file mode 100644 index 4fcebc9d83..0000000000 --- a/v13/03.05-keyboard-support/index.html +++ /dev/null @@ -1,2872 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Keyboard Support - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - - - - - -
-
- - - - - - - - - - - - -

Keyboard Support

- -

Keyboard support

-

Common Canvas supports a number of keyboard interactions as follows:

-

When focus is in the flow editor

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Keyboard ShortcutActionDescription
Ctrl/Cmnd + aselectAllSelect All objects
deletedeleteSelectedObjectsDelete currently selected objects
Ctrl/Cmnd + xcutCut selected objects to the clipboard
Ctrl/Cmnd + ccopyCopy selected objects to the clipboard
Ctrl/Cmnd + vpastePaste objects from the clipboard. If the mouse cursor is over
the canvas, objects will be pasted at the cursor position or,
if not, at a default position
Ctrl/Cmnd + zundoUndo last command
Ctrl/Cmnd + Shift + zredoRedo last undone command
Ctrl/Cmnd + yredoRedo last undone command
-

Your application can disable any or all of these actions by providing the keyboard config object to the CommonCanvas React component.

-

When any of the shortcut keys are pressed the common-canvas object model will be updated and then the editActionHandler callback will be called with the data.editType parameter set to the action above and the data.editSource parameter set to “keyboard”.

-

When focus is on a palette node

- - - - - - - - - - - - - - - -
Keyboard ShortcutActionDescription
space barcreateNodeAttachLinksAdds the node to the canvas and links it to existing node on canvas. Same as double clicking the node.
-

When focus is on the toolbar

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Keyboard ShortcutDescription
right arrowMove focus to the button to the right of current focus position
left arrowMove focus to the button to the left of current focus position
down arrowOpen sub-area (either a sub-menu or sub-panel) below button, if one is available
space barActivate the button
escClose any open associated sub-area (either a sub-menu or sub-panel)
-

When focus is on the toolbar overflow menu or sub-area (either a sub-menu or sub-panel)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Keyboard ShortcutDescription
down arrowMove focus to next menu item below current focus position
up arrowMove focus to next menu item above current focus position
right arrowOpens cascade sub-area, if there is one, for the currenty focused item
space barActivate the current menu item
escClose the sub-area
- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/03.06.01-node-customization/index.html b/v13/03.06.01-node-customization/index.html deleted file mode 100644 index 672f3bc8fb..0000000000 --- a/v13/03.06.01-node-customization/index.html +++ /dev/null @@ -1,3416 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Node Customization - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - - - - - -
-
- - - - - - - - - - - - -

Node Customization

-

Node appearance and behavior can be customized using:

- -

Customizing Layout fields

-

Node layout fields

-

Node layout properties define how all the elements of a node are displayed such as: the position and size of the icon image; the position of the main label; even the shape of the node itself.

-

There are two possible sets of node layout properties provided by Common Canvas, these are controlled by the enableNodeFormatType canvas configuration property which can be set to either “Horizontal” or “Vertical”.

-

-

Default values for node layout properties

-

The possible node layout properties are shown below with the values they have when enableNodeFormatType = "Horizontal". You can see the values for both sets of properties by looking at the layout-dimensions.js program

-
-Default node layout fields for Horizontal node format -
// Default node sizes. These dimensions might be overridden for nodes that have
-// more ports than will fit in the default size if inputPortAutoPosition is.
-// set to true and outputPortAutoPosition is set to true. (See below).
-defaultNodeWidth: 160,
-defaultNodeHeight: 40,
-
-// A space separated list of classes that will be added to the group <g>
-// DOM element for the node.
-className: "",
-
-// Displays the node outline shape underneath the image and label.
-nodeShapeDisplay: true,
-
-// Default node shape. Can be "rectangle" or "port-arcs". Used when nodeOutlineDisplay is true.
-nodeShape: "port-arcs",
-
-// An SVG path or a function that returns an SVG path. The paths define the node
-// shape and its selection highlighting respectively. If set to null, the paths
-// will be set by default based on the nodeShape setting.
-// If these fields are set to functions they will be called in real-time as the node
-// is being sized (provided enableResizableNodes config field is set to true).
-bodyPath: null,
-selectionPath: null,
-
-// Displays the external object specified, as the body of the node
-nodeExternalObject: false,
-
-// Display image
-imageDisplay: true,
-
-// Image dimensions
-imageWidth: 26,
-imageHeight: 26,
-
-// Image position
-imagePosition: "topLeft",
-imagePosX: 6,
-imagePosY: 7,
-
-// Display label
-labelDisplay: true,
-
-// Label dimensions
-labelWidth: 112,
-labelHeight: 19,
-
-// Label position
-labelPosition: "topLeft",
-labelPosX: 36,
-labelPosY: 12,
-
-// Label appearance
-labelEditable: false,
-labelAlign: "left", // can be "left" or "center"
-labelSingleLine: true, // false allow multi-line labels
-labelOutline: false,
-labelMaxCharacters: null, // null allows unlimited characters
-labelAllowReturnKey: false, // true allows line feed to be inserted into label, "save" to make the return key save the label.
-
-// An array of decorations to be applied to the node. For details see:
-// https://elyra-ai.github.io/canvas/03.04.01-decorations/
-// These are added to the node at run time and will not be saved into
-// the pipeline flow.
-decorations: [],
-
-// Positions and dimensions for 9 enumerated default decorator positions.
-// decoratorWidth and decoratorHeight are the dimensions of the outline
-// rectangle and decoratorPadding is the padding for the image within the
-// outline rectangle.
-decoratorTopY: 2,
-decoratorMiddleY: -8,
-decoratorBottomY: -18,
-
-decoratorLeftX: 2,
-decoratorCenterX: -8,
-decoratorRightX: -30,
-
-// Width, height and padding for image decorators
-decoratorWidth: 16,
-decoratorHeight: 16,
-decoratorPadding: 2,
-
-// Width and height for label decorators
-decoratorLabelWidth: 80,
-decoratorLabelHeight: 30,
-
-// Display drop shadow under and round the nodes
-dropShadow: true,
-
-// The gap between a node and its selection highlight rectangle
-nodeHighlightGap: 1,
-
-// The size of the node sizing area that extends around the node, over
-// which the mouse pointer will change to the sizing arrows.
-nodeSizingArea: 10,
-
-// Error indicator dimensions
-errorPosition: "topLeft",
-errorXPos: 24,
-errorYPos: 5,
-errorWidth: 10.5,
-errorHeight: 10.5,
-
-// When sizing a supernode this decides the size of the corner area for
-// diagonal sizing.
-nodeCornerResizeArea: 10,
-
-// What point to draw the data links from and to when enableLinkType is set
-// to "Straight" and enableLinkMethod is set to "Freeform".
-// Possible values are "image_center" or "node_center".
-drawNodeLinkLineFromTo: "node_center",
-
-// What point to draw the comment to node link line to. Possible values
-// are "image_center" or "node_center".
-drawCommentLinkLineTo: "node_center",
-
-// This is the size of the horizontal line protruding from the
-// port on the source node when drawing an elbow or straight connection line.
-minInitialLine: 30,
-
-// For the elbow connection type with nodes with multiple output ports,
-// this is used to increment the minInitialLine so that connection lines
-// do not overlap each other when they turn up or down after the elbow.
-minInitialLineIncrement: 8,
-
-// This is the minimum size of the horizontal line entering the
-// target port on the target node when drawing an Elbow connection line.
-minFinalLine: 30,
-
-// Display input ports.
-inputPortDisplay: true,
-
-// Object for input port can be "circle" or "image".
-inputPortObject: "circle",
-
-// If input port object is "image" use this image.
-inputPortImage: "",
-
-// If input port dimensions for "image".
-inputPortWidth: 12,
-inputPortHeight: 12,
-
-// Indicates whether multiple input ports should be automatically
-// positioned (true) or positioned based on the contents of
-// inputPortPositions array (false).
-inputPortAutoPosition: true,
-
-// An array of input port positions. Each element is structured like
-// this: { x_pos: 5, y_pos: 10, pos: "topLeft" }. x_pos and y_pos are
-// offsets from the pos point on the node.
-// The order of the elements corresponds to the order of ports in the
-// inputs array for the node.
-inputPortPositions: [
-    { x_pos: 0, y_pos: 20, pos: "topLeft" }
-],
-
-// The 'guide' is the object drawn at the mouse position as a new line
-// is being dragged outwards.
-// Object for input port guide can be "circle" or "image".
-inputPortGuideObject: "circle",
-
-// If input port guide object is "image" use this image.
-inputPortGuideImage: "",
-
-// Display output ports.
-outputPortDisplay: true,
-
-// Object for output port can be "circle" or "image".
-outputPortObject: "circle",
-
-// If output port object is "image" use this image.
-outputPortImage: "",
-
-// Output port dimensions for "image".
-outputPortWidth: 12,
-outputPortHeight: 12,
-
-// Indicates whether multiple output ports should be automatically
-// positioned (true) or positioned based on the contents of
-// outputPortPositions array (false).
-outputPortAutoPosition: true,
-
-// An array of output port positions. Each element is structured like
-// this: { x_pos: 5, y_pos: 10, pos: "topRight" }. x_pos and y_pos are
-// offsets from the pos point on the node.
-// The order of the elements corresponds to the order of ports in the
-// outputs array for the node.
-outputPortPositions: [
-    { x_pos: 0, y_pos: 20, pos: "topRight" }
-],
-
-// The 'guide' is the object drawn at the mouse position as a new line
-// is being dragged outwards.
-// Object for output port guide can be "circle" or "image".
-outputPortGuideObject: "circle",
-
-// If output port guide object is "image" use this image.
-outputPortGuideImage: "",
-
-// Automatically increases the node size to accommodate its ports so both
-// input and output ports can be shown within the dimensions of
-// the node.
-autoSizeNode: true,
-
-// Radius of the either the input or output ports when they are set to "circle"
-portRadius: 3,
-
-// Size of an offset above and below the set of port arcs.
-portArcOffset: 3,
-
-// Radius of an imaginary circle around the port. This controls the
-// spacing of ports and the size of port arcs when nodeShape is set to
-// port-arcs.
-portArcRadius: 6,
-
-// Spacing between the port arcs around the ports.
-portArcSpacing: 3,
-
-// Position of the context toolbar realtive to the node. Some adjustment
-// will be made to account for the width of the toolbar.
-contextToolbarPosition: "topRight",
-
-// Display of vertical ellipsis to show context menu
-ellipsisDisplay: true,
-ellipsisPosition: "topLeft",
-ellipsisWidth: 10,
-ellipsisHeight: 22,
-ellipsisPosX: 145,
-ellipsisPosY: 9,
-ellipsisHoverAreaPadding: 2
-
-
-

Node Element positioning

-

Node elements are positioned on the node as an x/y offset from one of nine positions:

-

-

The default for most elements is topLeft. The position is useful when nodes are resizable because, as a node is resized, the element will remain tied to its position. So if, for example, an element is tied to topRight and the node is resized to be wider the element will move to remain at the same offset from the topRight position.

-

The PosX and PosY properties for each element is an offset from the associated anchor position where PosX is the number of pixels to the right of the anchor position and PosY is a number of pixels down from the anchor position. Negative values can be provided to specify an offset to the left and up from the anchor position.

-

For example, these settings: -

    {
-        imagePosition: "middleCenter",
-        imagePosX: -10,
-        imagePosY: -10,
-        imageWidth: 20,
-        imageHeight: 20
-    }
-};
-
-would position the image 10 pixels left and 10 pixels above the very center of the node. Since the image is 20 x 20 pixels this would position the center of the image at the center of the node. If you have enabled re-sizeable nodes, this would keep the image centrally positioned while the node is being resized by the user. Like this:

-

-

Overriding the node layout properties for all nodes

-

If you want to change the appearance of all nodes on your canvas you can specify the enableNodeLayout configuration parameter in the canvas configuration object. The properties from this object will replace any properties in the default set, which was chosen based on the settings of enableNodeFormatType. So you don’t need to provide all of the properties; just the ones you want to replace.

-

Let’s say you want your nodes to be displayed as ellipses. You could provide the following settings in enableNodeLayout in the canvas config: -

const canvasConfig = {
-    enableNodeLayout: {
-        bodyPath: "     M  0 30 Q  0  0 60  0 Q 120  0 120 30 Q 120 60 60 60 Q  0 60  0 30 Z",
-        selectionPath: "M -5 30 Q -5 -5 60 -5 Q 125 -5 125 30 Q 125 65 60 65 Q -5 65 -5 30 Z",
-        defaultNodeWidth: 120,
-        defaultNodeHeight: 60,
-        imageWidth: 30,
-        imageHeight: 30,
-        imagePosX: 20,
-        imagePosY: 10,
-        labelEditable: true,
-        labelPosX: 60,
-        labelPosY: 37,
-        labelWidth: 90,
-        labelHeight: 17, // Should match the font size specified in CSS + padding
-        ellipsisDisplay: true,
-        ellipsisPosX: 100,
-        ellipsisPosY: 20,
-        portPosY: 30
-    }
-};
-

-

Overriding the node layout fields for individual nodes or groups of nodes

-

If you want each node, or category of nodes, to have a different layout based on some criteria you can use the layoutHandler callback method. When you specify this callback method to Common Canvas, it will be called for each node on the canvas, during initialization and, occasionally, at other times.

-

The method should return a simple JavaScript object that contains any node layout properties you want to override from the defaults and the ones specified in the enableNodeLayout field in the canvas config.

-
-

Info

-

There are three levels of properties provided where each overrides the previous set:

-
    -
  1. First Common Canvas takes the full default set of node layout fields based on the value for enableNodeFormatType.
  2. -
  3. Next Common Canvas overrides these with the fields from the enableNodeLayout object in the canvas config, if any are provided.
  4. -
  5. Finally, Common Canvas overrides the combined set with any fields from the object returned from the layoutHandler method if one is specified, for the node in question.
  6. -
-
-

The callback is provided with a data parameter which is the node object from the pipelineFlow so your code can examine the node object and return node layout properties as appropriate.

-
-

Tip

-

The layoutHandler callback is called while the canvas is being displayed, therefore it must return very quickly each time it is called otherwise your canvas display speed will be slowed down.

-
-

Here is a simple example of a layoutHandler callback method which will override the width of the node based on the width of the main label for any node where the node’s op field is set to Sort: -

layoutHandler(data) {
-    let customNodeLayout = {};
-    if (data.op === "Sort") {
-        const labLen = data.label ? data.label.length : 0;
-        const width = (labLen * 9) + 30; // Allow 9 pixels for each character and a bit extra for padding
-        customNodeLayout = {
-            defaultNodeWidth: width // Override default width with calculated width
-        };
-    }
-    return customNodeLayout;
-

- -

The four options for enableLinkDirection in the canvas config are “LeftRight”, “RightLeft”, “TopBottom” and “BottomTop”. These will control the default position of the input and output ports at the boundaries of the nodes as follows:

-
    -
  • For “LeftRight” input ports will be on the left of the node and output ports will be on the right of the node
  • -
  • For “RightLeft” input ports will be on the right of the node and output ports will be on the left of the node
  • -
  • For “TopBottom” input ports will be on the top of the node and output ports will be on the bottom of the node
  • -
  • For “BottomTop” input ports will be on the bottom of the node and output ports will be on the top of the node
  • -
-

The application can customize these port default positions using the enableNodeLayout object in the canvas config. This object has these fields for port placement customization:

-
    -
  • inputPortAutoPosition and inputPortPositions to customize input ports and
  • -
  • outputPortAutoPosition and outputPortPositions to customize output ports.
  • -
-

So for example, the following settings:

-
    const config = {
-        enableNodeLayout: {
-            inputPortAutoPosition: false,
-            inputPortPositions: [
-                { x_pos: 0, y_pos: 5, pos: "topLeft" },
-                { x_pos: 0, y_pos: -5, pos: "bottomLeft" }
-            ]
-        }
-    };
-
-

will position the input ports like this:

-

-

If nodes are set to be resizeable (enableResizableNodes set to true) and the nodes is resized it will look like this, because the second port is tied to the “bottomLeft” position:

-

-

When ports are positioned on the node, regardless of whether they are positioned by default or have customized positions, they are assigned one of four ‘directions’ that links will be drawn to/from. These directions are dependent on the diagonal quadrant of the node the port is positioned within.

-

As an extreme example, if these fields are used to customize a node with four input ports (black circles) and four output ports (blue arrows) like this:

-

-

Common Canvas will assign a direction to the input and output ports are follows:

-

-

If the config field enableLinkMethod is set to “Ports”, and enableLinkType is set to “Curve”, the links will be drawn as follows:

-

-

This means an application like the one shown below can be built, where the links exit from the left of the ‘Inp_1’ node and point to the ‘Stage Variables’ node below it. Meanwhile, other links exist the ‘Inp_1’ node on its right and point to the ‘Out_2’ node. This is achieved by positioning some (invisible) output nodes on the left of ‘Inp_1’ and some on the right of ‘Inp_1’. Common Canvas takes care of drawing the links in the appropriate direction based on the port positions.

-

-

Node Images

-

For most flows, nodes are defined with an image (icon) that conveys the purpose of the node. They are displayed for the nodes in the flow and the palette. The nodes image can be provided as a URL or JSX object. Images can also be customized using node layout fields.

-

Node image layout fields

-

The following fields can be set in the node layout to customize images within a node: -

    // Display image
-    imageDisplay: true,
-
-    // Image dimensions
-    imageWidth: 26,
-    imageHeight: 26,
-
-    // Image position
-    imagePosition: "topLeft",
-    imagePosX: 6,
-    imagePosY: 7,
-

-

Node image as a URL

-

Typically, the image field of a node object in the pipeline flow (or palette) is a URL that references an image file on the server. This can be any type of image that can be displayed in an <image> tag however, if the file is recognized as an SVG file by having the .svg extension, the contents of the file will be loaded as inline SVG in the DOM. This allows more image customization using CSS.

-

The loading and management of images can be controlled using the enableImageDisplay canvas config field.

-
-

Data URLs

-

Data URLs can be used to embed an image file within the pipeline flow JSON however, this is not recommended for production use since it leads to bloated pipeline flow files because of the amount of data stored for each image and the repetition of images across multiple nodes of the same type.

-
-
-

Alternative palette image

-

The node definition contains a palette image field which, if specified, will be displayed as the node’s image only on the palette.

-
-

Node image as JSX

-

Images can also be provided to Common Canvas as JSX objects. This means, for example, that the application can provide Carbon icons as node images in the palette and on the canvas. Since JSX objects cannot be stringified, the application must programmatically set the node image field to reference the appropriate JSX object.

-

Also, when data is retrieved from Common Canvas using either canvasController.getPipelineFlow() or canvasController.getPaletteData(), the returned node object will not contain any image information.

-

The node image can be set something like this (where “123” is the node Id):

-

    import { JoinInner } from “@carbon/react/icons:
-    ...
-    ...
-    canvasController.setNodeProperties("123", { image: (<JoinInner size={20} />) });
-
-Alternatively, JSX images can be injected directly into the pipeline flow object or palette object before it is provided to Common Canvas.

-
-

Size prop

-

Note, the size prop is used when the icon is displayed in the palette however for a node in the flow the icon will be sized based on the imageHeight and imageWidth fields in the nodeLayout object specified in the enableNodeLayout field of the canvas config object.

-
-

Also, when nodes are pasted into the canvas the application will need to ensure the image fields of those nodes are set appropriately.

-

A new sample application called ‘JSX Icons’ has been added to the test harness to show Carbon icons being used as node images.

-

-

Customizing node colors and styles with CSS

-

Node DOM Construction

-

Node elements are drawn as SVG elements in the SVG area provided by the Flow Editor and are grouped together using a group <g> element.

-

-

The DOM elements that make up a node can be customized using CSS styles. This is done by either overriding the common-canvas CSS directly or, if customization is needed on a node-by-node basis, by assigning a class name to the group <g> element that is the container for all the node elements. The class can be applied to the group object in a number of different ways:

-
    -
  1. By specifying it in the app_data.ui_data.class_name field of the node in the pipeline flow document that is provided to Common Canvas using CanvasController.setPipelineFlow(pFlow)
  2. -
  3. By specifying it using the following API methods:
      -
    • CanvasController.setNodeProperties(nodeId, properties, pipelineId)
    • -
    • CanvasController.setNodesClassName(nodeIds, newClassName, pipelineId)
    • -
    -
  4. -
  5. By specifying a class name in the className field of the node layout properties in the canvas config. Like this -
    const canvasConfig = {
    -    enableNodeLayout: {
    -        className: "my-node-class"
    -    }
    -};
    -
  6. -
  7. By specifying a class name in the className field of the node layout properties returned from the layoutHandler.
  8. -
-

You can see the svg-canvas-d3.scss file for full details about what elements in the node can be styled but here are a list of some basic parts of the node:

-

Classes

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PurposeDOM tagClassesNotes
Groupgd3-node-groupClasses specified for the node in the class_name field of the node object will be added here.
⮕ Selection areapathd3-node-selection-highlight
⮕ Outline shapepathd3-node-body-outline
⮕ Imagesvgd3-node-image
⮕ LabelforeignObjectd3-foreign-object-node-labelWill contain a div that contains the label text
⮕ Input portgd3-node-port-input
⮕ Output portgd3-node-port-output
⮕ Decorationsgd3-node-decorations-groupWill contain decoration elements, for example, image, path etc
-

So for example if you want the node body (the rectangle) to be colored orange you would provide a class name to the group element using one of the techniques mentioned above and then put this in you CSS:

-

.my-node-class .d3-node-body-outline {
-   fill: orange;
-}
-
-Note: You can use the enableParentClass canvas config field to make you CSS rulesets specific so your styles are picked up in preference to the common-canvas default styles.

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/03.06.02-comment-customization/index.html b/v13/03.06.02-comment-customization/index.html deleted file mode 100644 index aba977a48e..0000000000 --- a/v13/03.06.02-comment-customization/index.html +++ /dev/null @@ -1,2775 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Comment Customization - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

Comment Customization

-

Comments can be customized by the application in the following ways:

-
    -
  • Setting the enableMarkdownInComments field in the canvas configuration.
  • -
  • Customizing comment appearance with CSS (see below).
  • -
-

Customizing comment appearance with CSS

-

Comment DOM Construction

-

Comment elements are drawn as SVG elements in the SVG area provided by the Flow Editor and are grouped together using a group <g> element.

-

-

The DOM elements that make up a comment can be customized using CSS styles. This is done by either overriding the common-canvas CSS directly or, if customization is needed on a comment-by-comment basis, by assigning a class name to the group <g> element that is the container for all the comment elements. The class can be applied to the group object in a number of different ways:

-
    -
  1. By specifying it in the app_data.ui_data.class_name field of the comment in the pipeline flow document that is provided to Common Canvas using CanvasController.setPipelineFlow(pFlow)
  2. -
  3. By specifying it using the following API methods:
      -
    • CanvasController.setCommentProperties(commentId, properties, pipelineId)
    • -
    • CanvasController.setCommentsClassName(commentIds, newClassName, pipelineId)
    • -
    -
  4. -
-

You can see the svg-canvas-d3.scss file for full details about what elements in the comment can be styled but here are a list of some basic parts of the comment:

-

Classes

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PurposeDOM tagClassesNotes
Groupgd3-comment-groupClasses specified for the comment in the class_name field of the node object will be added here.
⮕ Sizing areapathd3-comment-sizing
⮕ Selection areapathd3-comment-selection-highlight
⮕ Backgroundpathd3-comment-rect
⮕ TextforeignObjectd3-foreign-object-comment-textWill contain a div that contains the comment text
⮕ Decorationsgd3-comment-decorations-groupWill contain decoration elements, for example, image, path etc
-

Note: You can use the enableParentClass canvas config field to make you CSS rulesets specific so your styles are picked up in preference to the common-canvas default styles.

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/03.06.03-link-customization/index.html b/v13/03.06.03-link-customization/index.html deleted file mode 100644 index 8fbfc32b52..0000000000 --- a/v13/03.06.03-link-customization/index.html +++ /dev/null @@ -1,2905 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Link Customization - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - - - - - -
-
- - - - - - - - - - - - -

Link Customization

-

Common Canvas provides a number of ways the links can be displayed. Links can be customized by the application in the following ways:

-
    -
  • Setting the link fields in the canvas configuration.
  • -
  • Customizing comment appearance with CSS (see below).
  • -
- -

The two major config fields to customize link display are:

-
    -
  • enableLinkType that can be set to “Curve”, “Elbow”, “Parallax” or “Straight”
  • -
  • enableLinkMethod that can be set to “Ports” or “Freeform”.
  • -
- -

When enableLinkMethod is set to “Ports”, the positions of ports on nodes affect the direction that links are drawn to/fom the ports. See this overriding port positions section in the node customization page for more details.

-

Customizing comment appearance with CSS

- -

Links are drawn on the canvas using SVG elements in the DOM. Each link has a top level group <g> element and inside it some SVG paths. The first displayed path is the selection area. This is invisible but provides a selection/hover area for mouse interactions on the link. The second is a path to represent the link itself which is drawn over the top of the selection area path:

-

-

The DOM elements that make up a link can be customized using CSS styles. This is done by either overriding the common-canvas CSS directly or, if customization is needed on a link-by-link basis, by assigning a class name to the group <g> element that is the container for all the link elements. The class can be applied to the group object in a number of different ways:

-
    -
  1. By specifying it in the app_data.ui_data.class_name field of the link in the pipeline flow document that is provided to Common Canvas using CanvasController.setPipelineFlow(pFlow)
  2. -
  3. By specifying it using the following API methods:
      -
    • CanvasController.setLinkProperties(linkId, properties, pipelineId)
    • -
    • CanvasController.setLinksClassName(linkIds, newClassName, pipelineId)
    • -
    -
  4. -
-

You can see the svg-canvas-d3.scss file for full details about what elements in the comment can be styled but here are a list of some basic parts of the comment:

-

Classes

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PurposeDOM tagClassesNotes
Groupgd3-link-groupClasses specified for the link in the class_name field of the link object will be added here.
⮕ Selection areapathd3-link-selection-area
⮕ Link linepathd3-link-line
⮕ Arrow headpathd3-link-line-arrow-headOnly when enableLinkType is set to “Straight”
⮕ Decorationsgd3-link-decorations-groupWill contain decoration elements, for example, image, path etc
-

Note: The main link group will also have one of these classes: d3-node-link (for data links), d3-object-link (for association links) or d3-comment-link (for comment links).

-

Note: You can use the enableParentClass canvas config field to make you CSS rulesets specific so your styles are picked up in preference to the common-canvas default styles.

- -

If a data link is retrieved from the canvas controller API it will have the following important fields:

-
    -
  • id - the unique identifier for the link.
  • -
  • type - set to “nodeLink”.
  • -
  • srcNodeId - the ID of the node the link is connected from.
  • -
  • srcNodePortId - the ID of the output port on the source node the link is connected from. Note: If this is undefined it indicates the node is connected to the first output port of the source node.
  • -
  • trgNodeId - the ID of the node the link is connected to.
  • -
  • trgNodePortId - the ID of the input port on the target node the link is connected to. Note: If this is undefined it indicates the node is connected to the first input port of the target node.
  • -
  • decorations - an array of decorations specified for the link.
  • -
  • app_data - any application specific data that was previously specified for the link in the pipeline flow or through the canvas controller API.
  • -
-

Note: Typically data links must be drawn between nodes however, if the config field enableLinkSelectionType is set to Detachable, the links are allowed to be drawn to and/or from arbitrary points on the canvas. If a link is drawn either semi-detached (from one node) or fully-detached (from both nodes) the following fields will be in the link object:

-
    -
  • srcPos - this is an object with two fields x_pos and y_pos. These provide the coordinates of the point on the canvas that the link is drawn from. If this exist then srcNodeId and srnNodePortId are not specified in the link object.
  • -
  • trgPos - this is an object with two fields x_pos and y_pos. These provide the coordinates of the point on the canvas that the link is drawn to. If this exist then srcNodeId and srnNodePortId are not specified in the link object.
  • -
- -

(Note : internally, association links do have a srcNodeId and trgNodeId but that is just to keep the field names consistent with the data links.) Association links do not reference ports.

-

If an association link is retrieved from the canvas controller API it will have the following important fields:

-
    -
  • id - the unique identifier for the link.
  • -
  • type - set to “associationLink”.
  • -
  • srcNodeId - the ID of one of the nodes in the association.
  • -
  • trgNodeId - the ID of the other node in the association.
  • -
  • decorations - an array of decorations specified for the link.
  • -
  • app_data - any application specific data that was previously specified for the link in the pipeline flow or through the canvas controller API.
  • -
- -

If a comment link is retrieved from the canvas controller API it will have the following important fields:

-
    -
  • id - the unique identifier for the link
  • -
  • type - set to “commentLink”
  • -
  • srcNodeId - the ID of comment.
  • -
  • trgNodeId - the ID of the node the comment is connected to.
  • -
  • app_data - any application specific data that was previously specified for the link in the pipeline flow or through the canvas controller API.
  • -
- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/03.07-external-objects/index.html b/v13/03.07-external-objects/index.html deleted file mode 100644 index 316185d433..0000000000 --- a/v13/03.07-external-objects/index.html +++ /dev/null @@ -1,2740 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Node Creation from External Object - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
- -
- - - -
-
- - - - - - - - - - - - -

Node Creation from External Object

- -

Dragging object from within the browser

-

Common Canvas supports the ability for an object from the your browser page to be dragged onto the canvas to initiate the creation of a node on the canvas. To do this you need to set the object you want to drag into the canvas to be draggable:

-

    <div
-      draggable="true"
-      onDragStart={this.onDragStart}
-      onDragOver={this.onDragOver}>
-      ....
-      ....
-    </div>
-
-and then specify the on drag behavior like this -
    onDragStart(ev) {
-       const evData = {
-          operation: "addToCanvas",
-          data: {
-             editType: "createExternalNode",
-             field1: "field_val_1",
-             field2: "field_val_2"
-             ....
-             ....
-          }
-       };
-       ev.dataTransfer.setData("text", JSON.stringify(evData));
-    }
-
-where

-
    -
  • operation - is always set to “addToCanvas”
  • -
  • data - is the object that will be passed to the editActionHandler callback
  • -
  • editType - this is the type of editing operation. You can set it to anything except any of the reserved settings which are: ‘createNode’, ‘createNodeOnLink’, ‘createAutoNode’ and ‘createFromExternalObject’.
  • -
  • fields - an optional number of fields can be provided that describe the object you are dragging onto the canvas. For example, if it is a data object the fields might describe the data source details.
  • -
-

After the object has been dropped on the canvas your editActionHandler() callback method will be called with a parameter data object that contains the fields you specified in data in the drag data along with three additional fields, called pipelineId, offsetX and offsetY, containing the x,y co-ordinates of where the drop occurred. In your editActionHandler() method you can use the CanvasController API to add a node to the pipeline flow and get Common Canvas to display it.

-

Dragging object from the desktop or another application

-

If an object from the desktop or another application is dropped on the canvas your editActionHandler(data) method will be called with the data parameter set to an object like this: -

    {
-       dataTransfer: <The event data from the drag operation>,
-       editType: "createFromExternalObject",
-       editSource: "canvas",
-       offsetX: 200,
-       offsetY: 100,
-       pipelineId: "1234-5678"
-    }
-
-Your code can examine the dataTransfer object to see what object was dragged onto the canvas and then take appropriate action.

-

If you want a new node to appear on the canvas as a result of the object being dropped your code will need to create that node at the point where the drop occurred, using the Canvas Controller API. Here is some sample code that will

-
    -
  • create a new node template based on the “variablefile” node in the palette data
  • -
  • set the label of the node to be created to the name of the file being dropped
  • -
  • create a new node on the canvas at the offsetX, offsetY position
  • -
  • the command will be added to the command-stack so the user can click undo to undo the addition of the node
  • -
-

data is the parameter passed into your editActionHandler method. -

    if (data.editType === "createFromExternalObject") {
-        const nodeTemplate = canvasController.getPaletteNode("variablefile");
-        if (nodeTemplate) {
-            const convertedTemplate = canvasController.convertNodeTemplate(nodeTemplate);
-            convertedTemplate.label = data.dataTransfer.files[0].name;
-            const action = {
-                editType: "createNode",
-                nodeTemplate: convertedTemplate,
-                pipelineId: data.pipelineId,
-                offsetX: data.offsetX,
-                offsetY: data.offsetY
-            };
-            canvasController.editActionHandler(action);
-    }
-

-

Tip: You can optionally instruct Common Canvas to display a graphic over the canvas as the external object is being dragged over it. To do this you need to specify the enableDropZoneOnExternalDrag configuration parameter.

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/03.08-external-pipeline-flows/index.html b/v13/03.08-external-pipeline-flows/index.html deleted file mode 100644 index bf05d648fd..0000000000 --- a/v13/03.08-external-pipeline-flows/index.html +++ /dev/null @@ -1,2857 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - External Pipeline Flows - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - - - - - -
-
- - - - - - - - - - - - -

External Pipeline Flows

-

Introduction

-

The pipeline flow schema describes two ways of storing a sub-flow pipelines for a supernode: local or external. Local sub-flows are stored within the pipeline flow document whereas external pipelines are stored in a separate pipeline flow document (usually as the primary pipeline in that pipeline flow). The supernode that references an external pipeline contains a url property (in <node>.subflow_ref.url) and a pipeline ID property (in <node>.subflow_ref.pipeline_id_ref) to identify the external pipeline flow and the pipeline within it.

-

Common Canvas supports external pipelines but the host application UI code needs to manage the storage and retrieval of any external pipeline flows. To do this the app UI code needs to:

-
    -
  • Manage the storage of newly created external pipeline flows.
  • -
  • Respond to calls from Common Canvas to provide the external pipeline flow(s) when requested.
  • -
  • Respond to call from Common Canvas when a local pipeline is changed to external or an external is changed to local.
  • -
-

Common Canvas supports lazy loading of external pipeline flows so they will only be requested from your code when the user performs some gesture that requires the pipeline (from within the external pipeline flow) to be displayed.

-

Creating an external sub-flow

-

When the common-canvas config property enableExternalPipelineFlows is set to true (the default) and, when a set of objects are selected from which a super node can be created, the default common-canvas context menu will include a Create External Supernode option.

-

When the Create External Supernode option is clicked the createSuperNodeExternal action is executed.

-

If your application doesn’t use the default context menu you can define your own context menu (returned from contextMenuHandler) to contain an option which maps to the createSuperNodeExternal action. See the section on the contextMenuHandler for details on how to do this.

-

When the createSuperNodeExternal action is executed, the beforeEditActionHandler callback is called before the external sub-flow is created. The beforeEditActionHandler is called where the first parameter data has two properties externalUrl and externalPipelineFlowId which will both be set to empty string. Your code must set these to whatever values you want for the url and pipeline flow ID. The url will be assigned to the subflow_ref.url property of the supernode that is being created. The pipeline flow ID will be assigned to the newly created pipeline flow.

-

Your code must return the data parameter from the beforeEditActionHandler callback if you want the action to proceed and create the sub-flow. If you need to do any asynchronous activity at this point see the documentation on the beforeEditActionHanlder for details on how to do that.

-

When the sub-flow has been created, Common Canvas will call the editActionHandler callback with the createSuperNodeExternal action. In this callback you can, if you wish, retrieve the pipeline flow document that has been created internally in Common Canvas using CanvasController.getExternalPipelineFlow(url). Your code can then save it to your repository. Alternatively, you can wait until some later time, like perhaps during an auto-save, to retrieve and store the pipeline flow externally in your repository.

-

Loading an external sub-flow

-

When the main pipeline flow, displayed by Common Canvas, contains a super node that references an external sub-flow it will need to be loaded whenever the user performs a gesture that causes it to be displayed or processed in some way - for example displaying it ‘in-place’ or converting it from an external to a local supernode. An external sub-flow will also need to be loaded if the top-level pipeline being displayed has a supernode, that refers to an external pipeline, that is already expanded in-place in the saved pipeline flow JSON document being displayed. So, actions that can cause the external pipeline to be loaded are:

-
    -
  • loadPipelineFlow
  • -
  • expandSuperNodeInPlace
  • -
  • displaySubPipeline
  • -
  • convertSuperNodeExternalToLocal
  • -
  • deconstructSuperNode
  • -
-

When any of these actions are performed Common Canvas will call the beforeEditActionHandler callback with the data parameter as the first parameter. The data object will have the following properties:

-
    -
  • editType - The name of the action being performed.
  • -
  • externalPipelineFlowLoad - This is a boolean which indicates whether the pipeline flow needs to be provided by your code.
  • -
  • externalUrl - This is the string which identifies the external pipeline flow document.
  • -
  • externalPipelineId - This is the ID of the pipeline being loaded
  • -
  • externalPipelineFlow - If externalPipelineFlowLoad if true this will be undefined. Otherwise it will be contain the previously loaded external pipeline flow.
  • -
-

You need to implement the beforeEditActionHandler so that:

-
    -
  • when the actions above are being performed and externalPipelineFlowLoad is true, you retrieve the external pipeline flow from your repository
  • -
  • you then assign it to the externalPipelineFlow property of the data object
  • -
  • you then return the data object from the callback.
  • -
-

Your code must return the data parameter from the beforeEditActionHandler callback if you want the action to proceed and load the external pipeline flow. If you need to do any asynchronous activity at this point see the documentation on the beforeEditActionHanlder for details on how to do that.

-

Converting a local supernode to an external supernode

-

When the common-canvas config property enableExternalPipelineFlows is set to true, and a local supernode’s is right clicked, the default common-canvas context menu will include a Convert local to external option. This will execute the convertSuperNodeLocalToExternal action.

-

The convertSuperNodeLocalToExternal action is similar to the createSuperNodeExternal action in that a new external pipeline flow is being created. Consequently, you can follow the instructions in the Creating an external sub-flow section for providing the appropriate properties of the data object in the beforeEditActionHandler and editActionHandler callbacks.

-

Converting an external supernode to a local supernode

-

When the common-canvas config property enableExternalPipelineFlows is set to true, and an external supernode’s is right clicked, the default common-canvas context menu will include a Convert external to local option. This will execute the convertSuperNodeExternalToLocal action.

-

The convertSuperNodeExternalToLocal action is similar to the expandSuperNodeInPlace action in that an external pipeline flow may need to be retrieved from your repository. Consequently, you can follow the instructions in the Loading an external sub-flow section for providing the appropriate properties of the data object in the beforeEditActionHandler callback.

-

Deleting an external supernode/sub-flow

-

When the user deletes an external supernode/sub-flow the supernode will be removed from the canvas. You code does not need to do anything unless you want to also remove the external pipeline flow from your repository.

-

Clipboard support

-

When a supernode, that refers to an external pipeline, is cut/copied and pasted, the pasted supernode refers to the same external pipeline as the supernode that was cut or copied. This means that if an external supernode is copied to the clipboard and then pasted into the same canvas the result will be two supernodes that refer to the same external pipeline.  

-

The same situation can occur if a supernode, that refers to an external pipeline, is in the palette and that node is dragged multiple times from the palette onto the canvas.

-

Manipulating objects in external pipelines using the Canvas Controller API

-

Objects (nodes, links comments, etc.) in an external pipeline can be updated by the host application calling the CanvasController API. However, such changes are only effective within Common Canvas. It is the host application’s responsibility to make sure these changes are persisted in the external pipeline flow document (if that is the behavior that is required). This can be done by the host application calling CanvasController.getExternalPipelineFlow(url) and then saving the returned document to the appropriate repository.

-

External pipelines in the Elyra Canvas Test Harness

-

The Test Harness supports external pipeline flows but will only persist any saved flows for the current session. (It just stores them in memory). You can examine the beforeEditActionHandler and editActionHandler in App.js in the test harness to see how it handles the different actions for managing external pipeline flows.

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/03.09-read-only-or-locked-flows/index.html b/v13/03.09-read-only-or-locked-flows/index.html deleted file mode 100644 index fba7f27003..0000000000 --- a/v13/03.09-read-only-or-locked-flows/index.html +++ /dev/null @@ -1,2826 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Read Only or Locked Flows - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

Read Only or Locked Flows

-

Some host applications need to display flows that cannot be edited by the user. This might be because the flow artifact is currently being edited by another user (locked) or because the user does not have authority to edit the flow (read-only) or some other reason. We’ll use the term ‘read-only’ below to refer to both locked and read-only canvases.

-

There are many aspects of common-canvas components that need to be considered for a read-only canvas. Since Common Canvas is highly customizable it is not possible for the common-canvas code to manage components of the canvas that have been customized by the host application. For example, if the host app code added tools to the toolbar, Common Canvas does not know whether those tools should be disabled when displaying a read-only canvas or not. So the host application code will need to manage that. Let’s look at each element of Common Canvas and see what needs to be done.

-

General Config

-

There is one main canvas configuration property that will change the common-canvas behavior to implement a read-only canvas. This is enableEditingActions which defaults to true and needs to be set to false for read-only canvases. The sections below will cover what effect this will have on the different components of Common Canvas and what you need to do for any customizations you have made.

-

Canvas

-

Setting enableEditingActions to false will prevent nodes and comments (and detachable links) from being moved relative to one another. It will also prevent new links from being created and prevent text (like comments or node labels) from being edited.

-

With enableEditingActions set to false, the canvas can still be panned (left/right and up/down) and also zoomed in and out. Nodes, comments and links can still be clicked (to select) and right clicked (to display a context menu) and double clicked (usually to show properties). If you implemented any behavior for these interactions, using the clickActionHandler, you’ll need to review what your code is doing and make sure it is appropriate when a read-only canvas is being displayed.

-

Common Canvas allows objects from outside the canvas to be dropped onto the canvas to create a new node. For example, a file can be dragged from the operating system desktop onto the canvas to create a data node. With enableEditingActions set to false, the drag/drop gesture (which Common Canvas cannot prevent) will prevent a new node from being created. It is recommended you switch the enableDropZoneOnExternalDrag config property to false when displaying a read-only canvas. This will prevent a ‘drop zone’ graphic from appearing over the canvas when the object is dragged over the top of the canvas.

-

Some applications need to show a tag (called a ‘state tag’) over the canvas to emphasize the ‘read-only’ or ‘locked’ state of the canvas. This can be displayed using the enableStateTag canvas config property. The tooltip of the ‘state tag’ can be provided by implementing the tipHandler callback function.

-

Since there are numerous possible styles for nodes and links when displaying a read-only canvas, it isn’t possible for Common Canvas to style the canvas objects appropriately for all different designs. You will need to override any styles for nodes and links to fit your design. To help with this, Common Canvas sets a class called config-edit-actions-false on the top-level div that contains the common-canvas components. You can use this to build specific selectors in your CSS/SCSS that will override the styles applied to nodes and links by default. For example, to override node icon and label colors you could specify the following in your SCSS file: -

    .editing-actions-false {
-        .d3-node-group {
-        & .d3-node-label,
-            & svg path {
-                color: $disabled-02;
-                stroke: $disabled-02;
-                fill: $disabled-03;
-            }
-        }
-    }
-

-

Context menu

-

Setting enableEditingActions to false will prevent any options, that would edit the canvas objects, from being displayed in the common-canvas default context menu. For example, Delete will not show up in the context menu. See the enableEditingActions documentation for a list of options that are disabled.

-

Your application code can add your own options to the context menu by implementing the contextMenuHandler callback function. If you have added your own options, you should review your code and ensure options that might change the canvas objects are not added to the context menu when you are displaying a read-only canvas.

-

Note: The common-canvas default menu, passed as the second parameter to the contextMenuHandler callback, will still contain editing options. This means, if your code relies on them for some reason, (for example for calculating the position of your added options) your application code will still work OK. The editing options will be removed after your code returns the array of items that describe the desired menu from the contextMenuHandler callback.

-

Toolbar

-

The toolbar can display buttons for standard common-canvas actions and also buttons for any application-specific actions added by your code. Setting enableEditingActions to false will cause buttons for any standard common-canvas actions, that edit the canvas objects, to be disabled regardless of the setting for the enable property for each action. See the enableEditingActions documentation for a list of actions that are disabled.

-

You should review any application-specific action buttons you have added to the toolbar and decide if they need to be disabled or removed from the toolbar when displaying a read-only canvas.

-

If you decide you want to hide the toolbar, this can be achieved using the enableToolbarLayout canvas config field.

-

Keyboard

-

Common Canvas supports a number of keyboard shortcuts. Setting enableEditingActions to false, disables any keyboard shortcuts that edit the canvas objects (such as Delete). See the enableEditingActions documentation for a list of keyboard shortcuts that are disabled.

-

Palette

-

Setting enableEditingActions to false:

-
    -
  • prevents node templates from being dragged from the palette and
  • -
  • disables the double-click action on node templates which automatically adds a node to the canvas.
  • -
-

You should decide if your application should display the palette when displaying a read-only canvas or not. The palette can be hidden by setting the canvas config property enablePaletteLayout to “None”.

-

State Tag

-

Common Canvas allows the application to display a state tag, which is a label displayed directly on top of the canvas to allow the application to indicate what state (read-only or locked) the flow is in. The state tag can be switched on using the enableStateTag canvas configuration field.

-

Test Harness: Sample Read-Only application

-

The test harness contains a sample application called “Read-Only” which shows how a read-only canvas can be built using the enableEditingActions config option. In the application there are three toolbar buttons which can be used to navigate between Editable state, Read-Only state and Locked state. You can review the .jsx and .scss files in the application code to see how the application is implemented and styled.

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/03.10-command-stack/index.html b/v13/03.10-command-stack/index.html deleted file mode 100644 index 7b53f43455..0000000000 --- a/v13/03.10-command-stack/index.html +++ /dev/null @@ -1,2765 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Command Stack - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - - - - - -
-
- - - - - - - - - - - - -

The Command Stack

-

The Command Stack is built into Common Canvas and automatically provides functionality to support do/undo/redo of commands performed in the flow editor. In addition, if needed, applications can add their own commands to the command stack.

-

The Command Stack maintains an internal stack of commands with a cursor that moves up and down when commands are undone or redone. Commands are JavaScript classes that implement a simple interface.

-

The canvas controller automatically creates an instance of the command stack. Common Canvas provides command objects for each of the commands that are performed by the user, such as: create node, delete comment, link nodes together, etc. which it adds to the command stack.

-

To allow the user to activate the undo and redo actions, Common Canvas provides: -* undo/redo buttons on the default toolbar and -* undo/redo options in its default context menu for the flow editor background, -* keyboard shortcuts: ctrl+z (undo) and ctrl+shift+z (redo) when keyboard focus is on the canvas.

-

If the applicaiton specifies its own canvas toolbar or its own context menu/toolbar for the flow editor canvas and it must include defintions for the undo and redo internal actions.

-

API control of the command stack (optional)

-

You can implement your own undo and redo UI, if required, using the canvas controller API.

-

The canvas controller has a number of methods that allows the application to interact with the command stack if necessary.

-

Building a command (optional)

-

Each command that is added to the command stack is a JavaScript class that needs to implement these methods:

-
   constructor()
-   do()
-   undo()
-   redo()
-   getLabel()
-
-

constructor() - Initial setup

-

do() - Performs all actions necessary to execute the command

-

undo() - Performs all actions necessary to reverse the actions performed in do()

-

redo() - Performs all actions necessary to re-execute the command. For some commands this is the same as do() but for others it is different.

-

getLabel() - Returns a label that descibes the action.

-

Here is some sample code that shows how a ‘create node’ command might be written:

-

   export default class CreateNodeAction extends Action {
-
-        constructor(data, canvasController) {
-            super(data);
-            this.canvasController = canvasController;
-            this.newNode = createNode(data);
-         }
-
-         do() {
-            this.canvasController.addNode(this.newNode);
-         }
-
-         undo() {
-            this.canvasController.deleteNode(this.newNode.id);
-         }
-
-         redo() {
-            this.canvasController.addNode(this.newNode);
-         }
-
-         getLabel() {
-            return "Add 1 node"
-         }
-   }
-
- Note that the command has to keep a reference to the new node to allow the node to be added back - to the canvas in redo() even though it was deleted in undo().

-

Here is an example showing how to create a command action and push it on the stack using the canvas-conttoller:

-
   const command = new CreateNodeAction(data, this.canvasController);
-   this.canvasController.do(command);
-
-

Exported common-canvas action classes

-

Some of the internal action classes have been exported from Common Canvas and can be extended with additional -functionality, if necessaey. The classes that are exported are:

-
    -
  • CreateAutoNodeAction
  • -
  • CreateNodeAction
  • -
  • CreateNodeLinkAction
  • -
  • DeleteObjectsAction
  • -
  • DisconnectObjectsAction
  • -
  • PasteAction
  • -
-

The constructors for these classes all take the same two parameters. The data object that descrbes the command -and a reference to the canvas controller.

-

Applications can extend these classes to augment their basic behavior with application specific behavior. It is the application’s responsibility to add the extended object to the command stack when the user performs the corresponding action.

-

Although there are no plans to alter the internal workings of these six command action classes, there is always the chance that a change in the future might alter a field name or two. If you extend these classes, it is therefore recommended that you have sufficient regression tests for your extensions that would highlight such a problem, should it occur.

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/03.11-internal-actions/index.html b/v13/03.11-internal-actions/index.html deleted file mode 100644 index 06a38f3e64..0000000000 --- a/v13/03.11-internal-actions/index.html +++ /dev/null @@ -1,3111 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Internal Actions - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

Internal common-canvas actions

-

Internal actions can be generated by the user either:

-
    -
  • Clicking a toolbar button or
  • -
  • Clicking an option in a context menu or context toobar or
  • -
  • Pressing a keyboard shortcut key(s) or
  • -
  • Doing some direct manipulation like dragging one or more objects
  • -
-

Some actions can be generated from different sources. For example, the deleteSelectedObjects action can be generated by the user:

-
    -
  • Clicking the trash can icon in the toolbar or
  • -
  • Pressing the Delete key or
  • -
  • Clicking the Delete option in a context menu.
  • -
-

In each case, the action generates calls to the beforeEditActionHandler callback and then the editActionHandler callback. For each callback, the editType field of the first parameter will be set to one of the actions listed below.

-

These are the intenal actions:

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Action NameNotes
Nodes
createNodeCreate a new node on the canvas at a location identifed by the user
createNodeOnLinkCreates a new node and inserts it into a link the palette node was dropped on
createNodeAttachLinksCreates a new node and attaches it to the detached link the palette node was dropped on
createAutoNodeCreates a node at an appropriate position and, if possible, make a connection to an adjacent node
insertNodeIntoLinkInserts a node from the canvas into the link it was dropped on
attachNodeToLinksAttaches a node to one or more detached links it was dropped on
setNodeLabelSets the node label
setNodeLabelEditingModePuts a node label into eiting mode
disconnectNodeRemoves all links to the selected node
Supernodes
createSuperNodeCreates an internal supernode
createSuperNodeExternalCreates an external supernode
deconstructSuperNodeRemoves a supernode and puts its contents into the canvas in its place
expandSuperNodeInPlaceExpands a supernode to view the sub-flow in-place
collapseSuperNodeInPlaceCollapses an in-place supernode to a regular node size
convertSuperNodeExternalToLocalConverts an external supernode to an internal one
convertSuperNodeLocalToExternalConverts an internal supernode to an external one
displaySubPipelineDisplays a sub-flow in full-page mode so it fills the viewport
displayPreviousPipelineDisplays the parent flow from the one currently being viewed
loadPipelineFlowLoads a pipeline from an external source
Comments
createCommentCreates a new comment on the canvas at a location identifed by the user
createAutoCommentCreates a node at an appropriate position on the canvas
commentsToggleToggles the comments between hide and show
commentsHideHides all comments on the canvas
commentsShowShows all comments on the canvas
setCommentEditingModePuts a comment into eiting mode
Canvas Objects
moveObjectsMoves one or more selected objects to a new position on the canvas
resizeObjectsResizes a node or comment
setObjectsStyleSets the style property of one or more nodes/comments
colorSelectedObjectsColors the background of the selected objects
deleteSelectedObjectsDeletes the selected objects
selectAllSelects all canvas objects
Links
updateLinkUpdates the link info for detached links
editCommentChanges the comment text, position and dimension info
linkNodesCreates a link between two nodes
linkNodesAndReplaceCreates a link between two nodes and relaces any exiting link to the target node
linkCommentCreates a link from a comment to a node
createDetachedLinkCreate a link from a node to a point on the canvas
setLinksStyleSets the style property of one or more links
deleteLinkDeletes a link
Decorations
editDecorationLabelPuts a label decoration into edit mode
Arrange nodes
arrangeHorizontallyArranges the nodes across the page from left to right
arrangeVerticallyArranges the nodes down the page from top to bottom
Palette
paletteToggleToggles the palette between opened and closed
paletteOpenOpens the palette (left flyout)
paletteCloseCloses the palette (left flyout)
saveToPaletteSaves the selected object into the palette
Notifications
toggleNotificationPanelToggles the notification panel between opened and closed
openNotificationPanelOpens the notification panel
closeNotificationPanelCloses the notification panel
Clipboard
cutCuts the selected canvas objects onto the clipboard
copyCopies the selected canvas objects onto the clipboard
pastePates the contents of the clipboard onto the canvas
Command Stack
undoUndoes the previous command on the command stack
redoRedoes the next comment on the command stack
Highlighting
highlightBranchHighlights all upstream and downstream nodes from the one selected
highlightDownstreamHighlights all upstream and downstream nodes from the one selected
highlightUpstreamHighlights all upstream and downstream nodes from the one selected
unhighlightUnhighlights all previously highlighted nodes
Zoom
zoomInZooms the canvas in by one step
zoomOutZooms the canvas out by one step
zoomToFitZooms so all the canvas objects are visible in the viewport
setZoomSets the zoom based on the enableSaveZoom config setting
-

Action names with built in icons

-

If you use any of the following action names, Common Canvas will automatically display an appropriate Carbon icon for that action either if it appears as a button in the toolbar or if it appears in the overflow menu.

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ActionCarbon Icon
stopStopFilledAlt
runPlay
undoUndo
redoRedo
cutCut
copyCopy
pastePaste
clipboardResult
createCommentAddComment
createAutoCommentAddComment
setCommentEditingModeEdit
setNodeLabelEditingModeEdit
commentsShowChat
commentsHideChatOff
colorBackgroundColorPalette
deleteLinkTrashCan
deleteSelectedObjectsTrashCan
zoomInZoomIn
zoomOutZoomOut
zoomToFitCenterToFit
arrangeHorizontallyArrangeHorizont
arrangeVerticallyArrangeVertical
toggleNotificationPanelNotificationCounter
paletteOpenOpenPanelFilledLeft
paletteCloseOpenPanelFilledLeft
paletteToggleOpenPanelFilledLeft
expandSuperNodeInPlaceMaximize
collapseSuperNodeInPlaceMinimize
displaySubPipelineLaunch
- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/03.30.01-context-menu-wrapper/index.html b/v13/03.30.01-context-menu-wrapper/index.html deleted file mode 100644 index a429e5331a..0000000000 --- a/v13/03.30.01-context-menu-wrapper/index.html +++ /dev/null @@ -1,2718 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Context Menu Wrapper - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

Context Menu Wrapper

-

This function is deprectated and will be removed in future release

-

Carbon 11 has a context menu component if your applications needs a context menu.

-

The context menu in Common Canvas can be used in your application by importing the ContextMenuWrapper React component. Aside from providing a standard context menu to allow users to select different actions, this context menu also allows for configuration of submenus as a menu item, as well as a visual dividers.

-

Getting started with Context Menu

-

Step 1: Import Context Menu Wrapper

-

To use Context Menu Wrapper in your React application you need to import the ContextMenuWrapper React component from the common-canvas library. It’s recommended to use All Components if Common Canvas is also being imported, otherwise use ContextMenuWrapper only option.

-

All Components -

    import {ContextMenuWrapper} from "@elyra/canvas";
-

-

ContextMenuWrapper only -

    import ContextMenuWrapper from "@elyra/canvas/dist/lib/context-menu";
-

-

Step 2: Pass in the correct props

-
    -
  • contextMenuDef array (required): an array of menu item objects consisting of action and label. You can also pass in a divider item.
  • -
-
    const menuDef = [
-        { action: ACTION.BUILD, label: "Build" },
-    { action: ACTION.EXTEND, label: "Extend" },
-    { action: ACTION.CLEAR, label: "Clear" },
-    { divider: true },
-    { action: ACTION.SCORE, label: "Score" },
-    ];
-
-
    -
  • containingDivId string (required): the id of the element that the context menu will be absolutely positioned inside. typically, the page element is used.
  • -
  • -

    contextMenuPos object (required): the position of the context menu within the containing div. -

        const menuPos = { x: 500  , y: 300  };
    -

    -
  • -
  • -

    contextMenuActionHandler func (required): this handler is where context menu actions are defined. -

        contextMenuActionHandler(action) {
    -        switch (action) {
    -            case "BUILD":
    -            break;
    -        case "EXTEND":
    -            break;
    -        default:
    -        }
    -    }
    -

    -
  • -
  • closeContextMenu func (required): this handler will be called when the context menu is closed.
  • -
  • stopPropagation bool (optional): this is optional and only for very specific, uncommon use cases. When this flag is set, if a user clicks outside the context menu, the event will not bubble to parent elements, preventing parent event handlers from being called.
  • -
-

Example

-
    const contextMenuWrapper = (
-        <ContextMenuWrapper
-            contextMenuDef={menuDef}
-            containingDivId="main-page"
-            contextMenuPos={menuPos}
-            contextMenuActionHandler={this.contextMenuActionHandler}
-            closeContextMenu={this.props.closeContextMenu}
-        />
-    );
-
- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/03.30.02-flow-validation/index.html b/v13/03.30.02-flow-validation/index.html deleted file mode 100644 index 83a460d2d6..0000000000 --- a/v13/03.30.02-flow-validation/index.html +++ /dev/null @@ -1,2710 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Flow Validation - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

Flow Validation API

-

This function is deprectated and will be removed in future release

-

The Flow Validation API allows application code to programmatically validate the nodes in the flow against it’s property values. The API can be invoked after setting the Canvas Controller pipeline flow, when opening a new flow, or associated with a canvas context menu item. To use the Flow Validation API import the FlowValidation object from Common Canvas: -

import { FlowValidation } from "@elyra/canvas";
-
-then call the API on the object, for example: -
FlowValidation.validateFlow( ... );
-

-

The Flow Validation object provides the following API:

-

validateFlow(canvasController, parameterDataCallback, setNodeMessagesCallback, includeMsgTypes)
-    canvasController - an instance of the canvas controller
-    parameterDataCallback – function to get the parameter data or form data for a node
-    setNodeMessagesCallback – function to set the validation messages for a node. (optional)
-    includeMsgTypes - array[strings] Return invalid only if messages are found of types contained
-                      in the array. If not specified then any message type causes invalid return. (optional)
-    return - boolean If flow is valid returns true, otherwise returns false.
-
-where the two callbacks are defined as follows: -
parameterDataCallback(nodeId)
-    nodeId – string node Id.
-    function must return this object:
-    {
-        type: “parameterDef” | “form”,
-        data: Json_object
-    }
-
-/* The setNodeMessagesCallback is optional and only useful if not using internal object model.
-setNodeMessagesCallback(nodeId, messages)
-    nodeId – string node Id.
-    an array of message objects generated from the validation of the node.
-

-

The validateFlow() API will traverse the current flow and for each node invoke the parameterDataCallback() to get with a form data JSON or a parameterDef JSON. It will validate the JSON for the node and store any messages in the node objects within the model. The setNodeMessagesCallback() function will be called with all the messages generated for the node. This is only useful if the application is not using the internal object model. -The format of the message object is described in Pipeline Flow UI schema

-

Here is an example of using the FlowValidation API to validate a flow on opening:

-
import { CanvasController, FlowValidation } from "@elyra/canvas";
-
-getNodeForm(nodeId) {
-    const parameterDef = getParameterDefJSON(nodeId);
-    return { type: "parameterDef", data: parameterDef };
-}
-
-setNodeMessages(nodeId, messages) {
-    // code to persist messages in a store in addition to the internal model.
-}
-
-openCanvas(canvasJson) {
-    const canvasController = new CanvasController();
-    canvasController.setPipelineFlow(canvasJson);
-    FlowValidation.validateFlow(canvasController, this.getNodeForm, this.setNodeMessages);
-}
-
- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/04-common-properties/index.html b/v13/04-common-properties/index.html deleted file mode 100644 index 9ee1201ce7..0000000000 --- a/v13/04-common-properties/index.html +++ /dev/null @@ -1,2883 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Getting started - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - - - - - -
-
- - - - - - - - - - - - -

Getting started with Common Properties

-

Introduction

-

Common Properties is directed by a JavaScript object called the Parameter Definition. The ‘paramDef’ object describes the properties to be displayed as controls in the <CommonProperties> React object.

-

You can look at the harness/src/client/App.js file to see examples of code that uses the common-properties component.

-

Building a properties panel in a React application

-

To use Common Properties in your React application complete the following steps:

-

Step 1 : Setup

-

Complete the setup steps documented in the Initial Setup page.

-

Step 2 : Import Common Properties

-

Import the Common Properties React component from the Elyra Canvas library. Elyra Canvas produces both esm and cjs outputs. By default esm will be used when webpack is used to build the application.

-

    import { CommonProperties } from "@elyra/canvas";
-
-Properties Only

-

To import only Common Properties functionality in cjs format use:

-
    import { CommonProperties } from "@elyra/canvas/dist/lib/properties";
-
-

Step 2 : Create the propertiesInfo object

-

Next, you’ll need to populate propertiesInfo, which is a required prop, with:

-

this.propertiesInfo = {
-  parameterDef: this.parameterDef,          // Required - Parameter definitions/hints/conditions
-  appData: "{user-defined}",                // Optional - User data returned in applyPropertyChanges
-  additionalComponents: "{components}",     // Optional - Additional component(s) to display
-  messages: "[node_messages]",              // Optional - Node messages array
-  expressionInfo: this.expressionInfo,      // Optional - Information for expression builde
-  initialEditorSize: "{size}",              // Optional - This value will override the value of
-                                            // editor_size in uiHints. This can have a value of
-                                            // "small", "medium", "large", or null
-  id: "{id}"                                // Optional - Unique parameter definition ID
-}
-
-See the Common Properties Parameter Definition page for more details about ‘paramDef’.

-

The expressionInfo object must conform to the expressionInfo schema

-

The optional messages attribute can be used to set validation messages associated with a node. The format of the message objects is defined in Pipeline Flow UI schema

-

Step 3 : Display the Common Properties object

-

Finally, you’ll need to display the Common Properties object. Inside your render code, add the following:

-
return (
-  <IntlProvider>
-    <CommonProperties
-      ref={(instance) => {
-        this.CommonProperties = instance;
-      }}
-      propertiesInfo={this.propertiesInfo}                  // Required
-      callbacks={this.callbacks}                            // Required
-      propertiesConfig={this.propertiesConfig}              // Optional
-      customPanels={[CustomSliderPanel, CustomTogglePanel]} // Optional
-      customControls={[CustomSliderControl]}                // Optional
-      customConditionOps={[CustomConditionOps]}             // Optional
-      light                                                 // Optional
-    />
-  </IntlProvider>
-);
-
-

See the Localization section of the Initial Setup page to see how <IntlProvider> can be configured.

-

Props

-
    -
  • propertiesInfo object: See above
  • -
  • callbacks object - See the Callbacks page
  • -
  • propertiesConfig object - See the Properties Config page
  • -
  • customPanels array: An array of custom panels. See Custom Panels section of the Common Properties Custom Components page.
  • -
  • customControls array: An array of custom controls. See Custom Controls section of the Common Properties Custom Components page..
  • -
  • customConditionOps array: An array of custom condition operators. See Custom Condition Operators section of the Custom Components page.
  • -
  • light boolean: Carbon controls in Common Properties will use light mode. When the light option is disabled, the background color will be the same as the Carbon theme background. When the light option is enabled, the background color is set to $ui-01. Defaults to true
  • -
-

Reference methods

-

The <CommonProperties> React object provides one reference method that can be called on a ref of the common-properties instance. -

/*
-* @closeEditor (boolean) - determines if closePropertiesDialog is called or not
-*/
-applyPropertiesEditing(closeEditor)
-

-

Using CommonProperties in CommonCanvas right-flyout panel

-

Common Canvas has a right-flyout panel that can render a React object. It can be used to render Common Properties in the right-flyout as follows:

-

Create a <CommonProperties> object with containerType set to "Custom" and rightFlyout set to true. -

    const rightFlyoutContent = (
-        <CommonProperties
-            propertiesInfo={this.propertiesInfo}
-            propertiesConfig={{ containerType: "Custom", rightFlyout: true }}
-            callbacks={this.callbacks}
-        />
-    );
-

-

Pass the <CommonProperties> object into the rightFlyoutContent prop of Common Canvas. Also, set the showRightFlyout boolean to tell Common Canvas the rightFlyout should be displayed (true) or hidden (false). -

    <CommonCanvas
-        canvasController={canvasController}
-        rightFlyoutContent={rightFlyoutContent}
-        showRightFlyout={showRightFlyout}
-    />
-

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/04.01-parameter-definition/index.html b/v13/04.01-parameter-definition/index.html deleted file mode 100644 index 236686010a..0000000000 --- a/v13/04.01-parameter-definition/index.html +++ /dev/null @@ -1,3059 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Parameter Definition - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - - - - - -
-
- - - - - - - - - - - - -

Parameter Definition

-

The parameter definition object provides input for controlling the common-properties dialog. It consists of information that is available in the operator object combined with UI hints, information on data sets, and resources.

-

The parameter definition has a defined schema and set of examples located here: -schema and examples

-

The parameter definition consists of the following sections:

-

Title Definition

-

The title of the properties editor. If editable is set to true (default), the title can be edited. If set to false, the title will be readonly.

-
"titleDefinition": {
-    "title": "Properties Title",
-    "editable": true
-  }
-
-

Current Parameters

-

A list of input parameters and initial values upon input. The list is a set of key/value pairs with the key being the field name and the value is the initial value.

-

Example -

"current_parameters": {
-    "targetField": [],
-    "inputFieldList": [],
-    "elasticNetParam": 0.0,
-    "fitIntercept": false,
-    "maxIter": 75,
-    "regParam": 0.1,
-    "standardization": true,
-    "threshold": 0.5,
-    "tol": 0.0000010
-  }
-

-

Parameter Definitions

-

The list of parameters definitions for this property dialog. The list contains the name of the parameter, the data type of the parameter, the role and the default value. The information provided is as needed by the backend engine, i.e. the parameter name should be the name of the parameter that is expected for the backend engine.

-

The list of parameter definitions has the following attributes:

-
    -
  • id (string) Required Parameter identifier as consumed by the backend engine.
  • -
  • default (any) The default value of the parameter.
  • -
  • enum (array[string]) A restricted list of string values that are valid for the field.
  • -
  • type (string) Parameter type as consumed by the backend engine.
  • -
  • role (string) Parameter role, which is an optional specialization of the type.
  • -
  • required (boolean) Indication whether parameter is required or optional.
  • -
-

Parameter types have one of a fixed set of basic types. These are:

-
    -
  • integer
  • -
  • double
  • -
  • string
  • -
  • date
  • -
  • time
  • -
  • timestamp
  • -
  • custom
  • -
-

These can be used as maps or arrays e.g.:

-
array[<value-type>]: a sequence or list of values
-
- -

Parameter roles defined by the role attribute can be one of:

-
    -
  • expression: an expression assumed to be in the expression language for the run time
  • -
  • column: value represents one or more columns from the data model visible to this operator
  • -
  • new_column: value represents the name of a new column to be added to the data model and must therefore not match an existing column and conform to existing syntactic restrictions.
  • -
-

Example -

"parameters": [
-    {
-      "id":"targetField",
-      "type":"string",
-      "default":"",
-      "role":"column"
-    },
-    {
-      "id":"inputFieldList",
-      "type":"array[string]",
-      "default":[],
-      "role":"column"
-    },
-    {
-      "id": "impurity",
-      "enum": [
-        "gini",
-        "entropy"
-      ],
-      "default": "gini"
-    },
-    {
-      "id":"elasticNetParam",
-      "type":"double",
-      "default":0.0
-    }
-]
-

-

UI-only Parameters

-

A list of input parameters and initial values upon input. This set of parameters are separated from the backend parameters (current parameters). The idea is that these parameters are not passed into the backend engine by the common-properties consumer.

-

Example -

"current_ui_parameters": {
-    "databaseResource": true,
-    "tol": 0.0000010
-  }
-

-

UI-only parameters require information about the parameters same as the parameter definition information used for the backend parameters. The UI-only parameter definition information is stored in the UI-hints section in the sub-section named ui_parameters. A description of the UI hints specifications can be found on the UI Hints page.

-

UI-only properties are returned to the consuming application via a separate parameter on the applyPropertiesChanges callback. See the Callbacks page.

-

Complex Types

-

The complex types section is an array of

-

The complex types have the following attributes:

-
    -
  • id (string) Required Identifier of complex type, can be referenced in other places.
  • -
  • type (string) If object is specified, Common Properties will return the values as an array of objects consisting of key value pairs. This defaults to array.
  • -
  • key_definition (object) A parameter definition attribute on the key parameter field.
  • -
  • parameters (object) Required List of parameters fields. Each parameter can be defined as a parameter definition attribute or a complex type attribute.
  • -
-

Example of complex types -

"complex_types": [
-    {
-      "id": "SortEntry",
-      "type": "object",
-      "key_definition": {
-        "id": "field",
-        "type": "string",
-        "role": "column",
-        "default": ""
-      },
-      "parameters": [
-        {
-          "id": "sort_order",
-          "enum": [
-            "Ascending",
-            "Descending"
-          ],
-          "default": "Ascending"
-        }
-      ]
-    }
-  ]
-

-

A Note on Parameters and Complex Types:

-

Note that both parameter and complex type definitions are in the exact same format as defined in the operator schema. Therefore the contents of operator JSON files can be used for these two sections.

-

UI Hints

-

A set of specifications for controlling the layout and flow of Common Properties. A description of the UI hints specifications can be found on the UI Hints page.

-

Conditions

-

A set of specifications for controlling validation checking of parameters during the common-properties dialog. A description of the Conditions specifications can be found here on the Conditions page.

-

Data Set Metadata

-

The data set metadata is an array of datarecord-metadata objects as defined in the datarecord-metadata JSON schema. Each datarecord-metadata object contains and array of fields that provide column information on the input data set. schema and examples

-

The fields have the following attributes:

-
    -
  • name (string) Required Field name. Must be unique within the dataset.
  • -
  • type (string) Required Field type. Can be a primitive type (string, integer, double, date, time, timestamp), or a vector, map, or struct containing those types. Required.
  • -
  • nullable (boolean) Indicates whether or not one can place null values into the field. Default: False.
  • -
  • metadata (object) A set of additional metadata attributes.
  • -
-

The additional metadata attributes are as follows:

-
    -
  • description (string) A description of the field.
  • -
  • measure (string) The field measurement type. The value can be one of the following. range, discrete, flag, set, ordered-set, typeless, collection, geospatial, default
  • -
  • role (string) Field role for modeling. The value can be one of the following. -input, -target, -both, -none, -partition, -split, -frequency, -record-id
  • -
  • max_string_length (number) Maximum character length for string fields. Length is unlimited when not present.
  • -
  • values (array[string]) Array of unique categorical values for the column.
  • -
  • ranges (object) Minimum and maximum discovered values for scalar data.
  • -
-

Example -

"dataset_metadata": [
-  {
-    "name": "Schema-1",
-    "fields": [
-      {
-        "name": "Age",
-        "type": "integer",
-        "metadata": {
-          "description": "",
-          "measure": "range",
-          "role": "input"
-        }
-      },
-      {
-        "name": "Sex",
-        "type": "string",
-        "metadata": {
-          "description": "",
-          "measure": "discrete",
-          "role": "input"
-        }
-      },
-      {
-        "name": "BP",
-        "type": "string",
-        "metadata": {
-          "description": "",
-          "measure": "discrete",
-          "role": "input"
-        }
-      }
-    ]
-  },
-  {
-    "name": "Schema-2",
-    "fields": [
-      {
-        "name": "Birthdate",
-        "type": "date",
-        "metadata": {
-          "description": "Date of birth",
-          "measure": "range",
-          "role": "input"
-        }
-      }
-    ]
-  }
-]
-

-

Resources

-

This is a map of string resources.

-

Example: -

"resources":{
-  "org.apache.spark.ml.classification.DecisionTreeClassifier.label":"Random Forest Classifier",
-  "org.apache.spark.ml.classification.DecisionTreeClassifier.desc":"Fitted Random Forest Classification Model",
-  "inputFieldList.label":"Input columns",
-  "inputFieldList.desc":"Select one or more input columns",
-  "targetField.label":"Target column",
-  "targetField.desc":"Select a target column",
-  "max_depth_not_valid":"The max depth parameter must be greater than or equal to zero",
-  "max_iter_not_valid": "The max iterations parameter must be greater than or equal to zero",
-  "min_instances_per_node_not_valid": "The minimum instances per node value must be >= 1",
-  "subsampling_rate_not_valid": "The subsampling rate value must be > 0 and <= 1"
-}
-

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/04.02-callbacks/index.html b/v13/04.02-callbacks/index.html deleted file mode 100644 index d3317b583d..0000000000 --- a/v13/04.02-callbacks/index.html +++ /dev/null @@ -1,3016 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Callbacks - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - - - - - -
-
- - - - - - - - - - - - -

Callbacks

-

Common Properties provides the following callbacks. These are specified to Common Properties using an object like this:

-
  const callbacks = {
-      applyPropertyChanges: this.applyPropertyChanges,
-      closePropertiesDialog: this.closePropertiesEditorDialog,
-      propertyListener: this.propertyListener,
-      controllerHandler: this.propertiesControllerHandler,
-      actionHandler: this.propertyActionHandler,
-      buttonHandler: this.buttonHandler,
-      buttonIconHandler: this.buttonIconHandler,
-      helpClickHandler: this.helpClickHandler,
-      titleChangeHandler: this.titleChangeHandler,
-      propertiesActionLabelHandler: this.propertiesActionLabelHandler,
-      tooltipLinkHandler: this.tooltipLinkHandler
-  };
-
-

applyPropertyChanges(propertySet, appData, additionalInfo, undoInfo, uiProperties)

-

Executes when the user clicks OK in the property dialog. This callback allows users to save the current property values.

-
    -
  • propertySet: The set of current property values
  • -
  • appData: (optional) application data that was passed in to propertiesInfo
  • -
  • additionalInfo: Object with additional information returned:
      -
    • messages: (optional) An array of messages associated with the nodes current property values.
    • -
    • title: The title of the properties editor
    • -
    -
  • -
  • undoInfo: Object with information needed to undo this apply:
      -
    • properties: Set of property values;
    • -
    • messages: (optional) An array of messages associated with the nodes property values.
    • -
    • uiProperties: (optional) Set of UI only properties values
    • -
    -
  • -
  • uiProperties: The set of UI only property values (optional)
  • -
-
applyPropertyChanges(propertySet, appData, additionalInfo, undoInfo, uiProperties) {
-  var data = {
-    propertySet: propertySet,
-    appData: appData,
-    additionalInfo: {
-        messages: messages,
-        title: title
-    }
-  };
-}
-
-

closePropertiesDialog(closeSource)

-

Executes when user clicks Save or Cancel in the property editor dialog. This callback is used to control the visibility of the property editor dialog. closeSource identifies where this call was initiated from. It will equal “apply” if the user clicked on “Save” when no changes were made, or “cancel” if the user clicked on “Cancel”

-
closePropertiesDialog() {
-  this.setState({ showPropertiesDialog: false, propertiesInfo: {} });
-}
-
-

propertyListener()

-

Executes when a user property values are updated.

-
propertyListener(data) {
-
-}
-
-

controllerHandler()

-

Executes when the property controller is created. Returns the property controller. See the Properties Controller page for APIs.

-
controllerHandler(propertyController) {
-
-}
-
-

actionHandler()

-

Called whenever an action is ran. id and data come from uihints and appData is passed in with propertiesInfo.

-
actionHandler(id, appData, data) {
-
-}
-
-

buttonHandler()

-

Called when the edit button is clicked on in a readonlyTable control, or if a custom table button is clicked. The callback provides the following data:

-
    -
  • data: an object that consists of
      -
    • type: of button the click was invoked from.
        -
      • edit is returned from the edit button click of a readonlyTable control.
      • -
      • custom_button is returned from the custom button click of a complex type control.
      • -
      -
    • -
    • propertyId: of the control that was clicked.
    • -
    • buttonId: of the button that was clicked from a custom table button.
    • -
    -
  • -
-
buttonHandler(data) {
-
-}
-
-

buttonIconHandler()

-

Called when there is a buttons uihints set in the complex_type_info section of the parameter definition. This buttonIconHandler expects a Carbon Icon jsx object as the return value from the callback. This is used to display the Carbon icon in the custom table button. The buttonIconHandler provides the following data:

-
    -
  • data: an object that consists of
      -
    • type: customButtonIcon
    • -
    • propertyId: of the control that was clicked.
    • -
    • buttonId: of the button that was clicked from a custom table button.
    • -
    • carbonIcon: The name of the Carbon icon specified in the uihints. The corresponding jsx object is expected to be returned in the callback.
    • -
    -
  • -
-
buttonIconHandler(data, callbackIcon) {
-  if (data.type === "customButtonIcon" && data.carbonIcon === "Edit32") {
-    callbackIcon(<Edit32 />);
-  }
-}
-
-

propertyIconHandler()

-

Called when a user wants to pass in a specific object to a dropdown menu. The propertyIconHandler expects a jsx object as the return value from the callback. This is used to display the jsx object in the dropdown menu. The propertyIconHandler provides the following data:

-

-data: an object that consists of - - propertyId: of the dropdown that was selected - - enumValue: of the dropdown that was selected

-
propertyIconHandler(data, callbackIcon) {
-    const { iconSwitch } = this.state;
-    if (iconSwitch === true && data.propertyId.name === "oneofselect" && data.enumValue === "red") {
-        callbackIcon(<Icon />);
-    }
-}
-
-

helpClickHandler()

-

Executes when user clicks the help icon in the property editor dialog. The callback provides the following data:

-
    -
  • nodeTypeId: in case of parameterDef, id property of uihints;
  • -
  • helpData: Optional helpData specified in paramDef (see below).
  • -
  • appData: Optional application data that was passed in to propertiesInfo -
    helpClickHandler(nodeTypeId, helpData, appData) {
    -
    -}
    -
    -To control whether a node shows the help icon in the right flyout, a help object with optional helpData needs to be provided in the paramDef:
  • -
  • paramDef: Provide help object in operator’s uihints. If help object exists, the icon will be shown. Optionally, provide a helpData object within the help object, which will be passed in the helpClickHandler callback. - https://github.com/elyra-ai/pipeline-schemas/blob/master/common-pipeline/operators/uihints-v3-schema.json#L64
  • -
-

If no help object is found, no help link will be shown.

-

titleChangeHandler()

-

Called on properties title change. This callback can be used to validate the new title and return warning or error message if the new title is invalid. This callback is optional.

-

In case of error or warning, titleChangeHandler should call callbackFunction with an object having type and message. If the new title is valid, no need to call the callbackFunction. -

titleChangeHandler(title, callbackFunction) {
-  // If Title is valid. No need to send anything in callbackFunction
-  if (title.length > 15) {
-    callbackFunction({
-      type: "error",
-      message: "Only 15 characters are allowed in title."
-    });
-  }
-}
-
-where:

-
    -
  • type (string, required): This must be one of two values: “warning” or “error”.
  • -
  • message(string, required): Error or warning message. There is no restriction on length of the message.
  • -
-

propertiesActionLabelHandler()

-

propertiesActionLabelHandler()
-
-This is an optional handler you don’t need to implement anything for it unless you want to. This callback allows your code to override the default tooltip text for the Undo and Redo buttons. -The propertiesActionLabelHandler callback, when provided, is called for the save properties action that is performed in Common Properties. This callback should return a string or null. If a string is returned it will be shown in the tooltip for the Undo button in the toolbar preceded by “Undo:” and the string will also appear in the tooltip for the Redo button (when appropriate) preceded by “Redo:”. If null is returned, Common Properties will display the default text Save {node_name} node properties for the Undo and Redo buttons.

-

tooltipLinkHandler()

-

Optional callback used for adding a link in properties tooltips. link object must be defined under description in uiHints parameter info. Common Properties internally pass the link object to tooltipLinkHandler callback. -This callback must return an object having url and label.

-
tooltipLinkHandler(link) {
-    return { url: "https://www.google.com/", label: "More info" };
-}
-
- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/04.03-ui-hints/index.html b/v13/04.03-ui-hints/index.html deleted file mode 100644 index d4ad2cdbdc..0000000000 --- a/v13/04.03-ui-hints/index.html +++ /dev/null @@ -1,3171 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - UI Hints - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
- -
- - - -
-
- - - - - - - - - - - - -

UI Hints

-

UI hints is a section of the property definition JSON. It contains specifications to assist in the presentation and flow of the property dialog. The specifications indicate which controls to use to display and gather input on the fields. -UI hints schema

-

The UI Hints section consists a set of simple and complex attributes.

-

The simple attributes are:

-
    -
  • id (string) Dialog id.
  • -
  • label (object) External name of dialog. -
  • -
  • description (object) Description of dialog. -
  • -
  • editor_size (string) The width of the properties editor panel. This can have a value of "small", "medium", "large" or "max". The default is "small".
      -
    • When "small" is specified the properties panel is displayed with a default width of 320px and with a resize button that allows the panel to be increased in size up to the "medium" size which is 480px.
    • -
    • When "medium" is specified the properties panel has a width of 480px and with a resize button that allows the panel to be increased in size up to the "large" size which is 640px.
    • -
    • When "large" is specified the properties panel has a width of 640px and with a resize button that allows the panel to be increased in size up to the "max" size which is 900px.
    • -
    • When "max" is specified the properties panel has a width of 900px and no resize button is displayed.
    • -
    -
  • -
  • pixel_width (object) This optional property gives finer control over the minimum and maximum sizes of the properties editor panel. If this is omitted the properties editor width is controlled by the editor_size property. pixel_width is an object with two properties min and max which are both numbers.
      -
    • If min is specified it overrides the default size of the shrunken panel and max is based on the editor_size value.
    • -
    • If max is specified it overrides the default size of the expanded panel and min is based on the editor_size value.
    • -
    • If editor_size is set to "large" only the max value will be used to specify the size of the panel and no resize button will be displayed.
    • -
    -
  • -
-

A warning will be displayed in the console if you specify an invalid value for either min or max such as making min greater than max.

-

Example of the simple attributes: -

"uihints": {
-  "id":"org.apache.spark.ml.ibm.transformers.Distinct",
-  "icon": "images/transformationspark.svg",
-  "label": {
-    "default": "Distinct"
-  },
-  "editor_size": "medium",
-  "pixel_width": {
-    "min": 400,
-    "max": 800
-  },
-  "description": {
-    "default": "Remove rows to leave only rows with distinct combinations of rows"
-}
-

-

The complex attributes of the UI hints section are:

-

Group-info

-

Group info attributes.

-
    -
  • id (string) Required Panel id
  • -
  • type (string) The group type to be displayed. See the Group/Panel Controls section of the Controls page.
  • -
  • depends_on_ref (string) Property name this group depends upon. Valid for panelSelector groups only.
  • -
  • label (object) Group label. -
  • -
  • description (object) Group description. Only used with textPanel and actionPanel. -
  • -
  • parameter_refs (array[string]) List of parameter to be displayed.
  • -
  • action_refs (array[string]) List of action to be displayed. Used with actionPanel only.
  • -
  • group_info (object) List of additional group information.
  • -
  • data (any) Returned in custom panel constructor without any changes.
  • -
  • insert_panels (boolean) Indicates whether panels, contained with a panelSelector, should be inserted between the radio buttons of a radio button set indicated by the depends_on_ref parameter.
  • -
  • nested_panel (boolean) Indicate whether panel should be nested. Nested panels are indented by 16px from the left and display left border. Default is false.
  • -
  • class_name (string) Optional classname for this group
  • -
  • open (boolean) Optional used to determine if a panel should be open or not by default. Used with twistyPanel only. Default is false.
  • -
-

Example group info section: -

"group_info": [
-      {
-        "id": "settings",
-        "label": {
-          "default": "Settings"
-        },
-        "type": "columnSelection",
-        "parameter_refs": [
-          "keys"
-        ]
-      }
-    ]
-

-

UI-only Parameters

-

UI-only parameters require information about the parameters same as the parameter definition information used for the backend parameters. The UI-only parameter definition information is stored in the UI-hints section in the sub-section named ui_parameters. The format of the information in the ui_parameters sub-section is documented in the Parameter Definition section of Parameter Definitions page.

-

Example -

"ui_parameters": [
-    {
-      "id":"databaseResource",
-      "type":"boolean",
-      "default":true
-    },
-    {
-      "id":"toi",
-      "type":"double",
-      "default":0.0
-    }
-]
-

-

The UI-only parameters need to be added to other UI Hints sections (for example Group Info and canbe refered to by the parameter_ref field just like backend parameters.

-

Parameter Info

-

The parameter info section contains the list of parameters to gather values on through the property dialogs and UI hints about each parameter. The UI hints provide information to facilitate the UI controls used to display the parameter in the property dialogs.

-

Parameter info attributes.

-
    -
  • parameter_ref (string) Required Parameter name.
  • -
  • label (object) External name for parameter. -
  • -
  • label_visible (boolean) Determines whether to display the label for a control.
  • -
  • description (object) Description of parameter with optional placement context.
      -
    • See Resource Definition
    • -
    • placement (string) Placement context for the text. Valid values are as_tooltip, on_panel.
    • -
    • link (object) Optional link in the description. tooltipLinkHandler callback must be defined whenever link object is added in uiHints..
        -
      • id (string) Required unique link id.
      • -
      • data (object) Data passed to the tooltipLinkHandler callback.
      • -
      -
    • -
    -
  • -
  • control (string) Which control to use. See Parameter Controls section of the Controls page.
  • -
  • increment (number) Determines the increment/decrement value for the spinner control only. The default value is 1.
  • -
  • orientation (string) Determines how the control is displayed. Valid values are vertical, horizontal.
  • -
  • width (number) Column width for tables. The widths provided for table columns are used to calculate relative widths for each table column. So for example a 3 column table with widths of 20, 30, and 50 would use 20%, 30%, and 50% of the overall table width, respectively.
  • -
  • char_limit (number) Limits the number of characters a user can enter into the control for string parameters only.
  • -
  • display_chars (number) This has been deprecated and is subject to removal. Limits the number of characters displayed for a text field in a column in a table. The text will have an ellipsis appended at this limit. Defaults to 64 characters.
  • -
  • separator (string) Determines where to put a separator relative to the current control. Valid values are after, before.
  • -
  • visible (boolean) Determines whether to display control in a table cell. Used in complex types only.
  • -
  • read_only (boolean) Determines whether the control should be immutable or can be edited.
  • -
  • place_holder_text (object) Text hint for the user displayed input controls. -
  • -
  • helper_text (object) Additional text to be displayed below the control often used to explain the correct data format. -
  • -
  • resource_key (string) Used as a key for enum value labels in the resources section of property definition.
  • -
  • edit_style (string) Editing style of elements in a table. Valid values are subpanel, inline, on_panel.
  • -
  • value_icons (array[string]) For enumerated types, this defines the set of icons for the valid values. The ordering must be consistent with the order in the parameter enum attribute.
  • -
  • filterable (boolean) Determines if this column values can be filtered so that only rows that match the filter in column values are shown in the table. Applies to complex parameters only.
  • -
  • sortable (boolean) Determines if this column values can be sorted into ascending/descending order in a table. Applies to complex parameters only.
  • -
  • number_generator (object) Describes a number generator button beside numeric control. The ‘label’ element is a standard resource item, and the ‘range’ element contains ‘min’ and ‘max’ attributes to constrain the range of generated numbers.
  • -
  • dm_default (string) Data record metadata field to be used for default values in table cell columns. Typically this is used with parameters in complex structures in which the key field is a column name. Valid values are type, description, measure, and modeling_role.
  • -
  • dm_image (string) This can be set to display an icon of the corresponding dm type in the role:column field of a table. Valid values are measure, type, none
  • -
  • summary (boolean) Determines if parameter should be shown in the summary when using a summaryPanel.
  • -
  • text_before (object) Text to be displayed before the control -
  • -
  • text_after (object) Text to be displayed after the control -
  • -
  • custom_control_id (string) Id that is used to determine which custom control to use when control=custom
  • -
  • data (any) Returned in custom control constructor without any changes.
  • -
  • rows (integer) Number of rows to show in a table before scrolling starts. If one table in a panel is set to -1, that table will use the remaining available vertical space, down to a minimum of 2 rows. Used in expression and code controls to determine the number of rows to show for those controls.
  • -
  • moveable_rows (boolean) Determines if rows can be moved up or down in a table or array of strings.
  • -
  • action_ref (string) An action to be displayed.
  • -
  • date_format (string) A format string such as YYYY-MM-DD which describes the display and entry format for a date field.
  • -
  • time_format (string) A format string such as HH:mm:ss which describes the display and entry format for a time field.
  • -
  • custom_value_allowed (boolean) Determines if a dropdown, outside of a table, can allow a custom value to be entered.
  • -
  • class_name (string) Optional classname for this parameter
  • -
  • resizable (boolean) Determines if this column can be resized in a table. When a column is resized, width of all the columns to the right of resized column is adjusted. Applies to structure parameters only. Default is false.
  • -
-

Example parameter info section: -

    "parameter_info": [
-      {
-        "parameter_ref": "keys",
-        "label": {
-          "resource_key": "sort.keys.label"
-        },
-        "description": {
-          "resource_key": "sort.keys.desc",
-          "placement": "on_panel"
-        },
-        "rows": -1
-      }
-    ]
-

-

Complex Type Info

-

The complex_type_info section defines complex data types. This section is needed if in the parameters section of the parameter definition, one of the parameters has a type that is not the base type (i.e. an array or map of base types). The type of control used for this definition depends on the group info type value.

-

Complex Type info attributes.

-
    -
  • complex_type_ref (string) Required Name of complex type, can be referenced in other places.
  • -
  • key_definition (string) A set of parameter info attributes about the key parameter.
  • -
  • label (object) External name of subpanel. -
  • -
  • parameters (object) Required List of parameters that are part of this complex parameter. This parameter can either have a set of parameter_info attributes or other nested complex_type_info attributes.
  • -
  • header (boolean) If true then the table has a header row with column names. Defaults to true.
  • -
  • add_remove_rows (boolean) If true then the table can have rows added and removed. Defaults to true.
  • -
  • include_all_fields (boolean) When true and add_remove_rows is false, ensures that all fields are included in the control at all times.
  • -
  • row_selection (string enum) How many rows in a table can be selected at a time.
      -
    • single: only one row at a time is able to be selected.
    • -
    • multiple: multiple rows at a time are able to be selected.
    • -
    • multiple-edit: select multiple rows and allow the editing of column values of all selected rows. Clicking on “Edit” button in table toolbar, opens a subpanel which shows editable columns. All columns which have edit_style: "inline" or undefined are shown in the subpabel. Changing a column value in the subpanel, changes the value in all selected rows.
    • -
    -
  • -
  • buttons (array) An array of objects that define custom buttons to be displayed in this complex structure, overriding any default buttons. Each button object contains the following properties:
      -
    • id (string) Required: Unique identifier used to identify the button in the callback function.
    • -
    • label (object): Button label to display. If an icon is specified as well, the icon will be shown to the right of the label. -
    • -
    • description (object): Tooltip text to display when the button is hovered. -
    • -
    • icon (string): URL to .svg image to display.
    • -
    • carbon_icon (string): Host provided name of Carbon icon to display. A callback function is required for the host application to return the jsx icon object imported from @carbon/icons-react library.
    • -
    • enabled (boolean): Button will be enabled if true, disabled if false.
    • -
    • divider (string enum): Display a divider before or after this button. Defaults to after
        -
      • before Display divider before this button
      • -
      • after Display divider after this button
      • -
      -
    • -
    -
  • -
-

Example complex_type_info section: -

 "complex_type_info": [
-    {
-        "complex_type_ref": "SortEntry",
-        "row_selection": "multiple",
-        "moveable_rows": true,
-        "add_remove_rows": false,
-        "include_all_fields": true,
-        "key_definition": {
-          "parameter_ref": "field",
-          "width": 28,
-          "label": {
-            "resource_key": "SortEntry.field.label"
-          }
-        },
-        "parameters": [
-          {
-            "parameter_ref": "sort_order",
-            "width": 16,
-            "resource_key": "SortEntry.sort_order",
-            "label": {
-              "resource_key": "SortEntry.sort_order.label"
-            },
-            "control": "toggletext",
-            "value_icons": [
-              "/images/up-triangle.svg",
-              "/images/down-triangle.svg"
-            ]
-          }
-        ]
-      },
-      {
-        "complex_type_ref": "FieldStorageEntry",
-        "key_definition": {
-          "parameter_ref": "field",
-          "label": {
-            "default": "",
-            "resource_key": "FieldStorageEntry.field"
-          },
-          "width": 26,
-          "sortable": true,
-          "filterable": true
-        },
-        "parameters": [
-          {
-            "parameter_ref": "override",
-            "label": {
-              "default": "",
-              "resource_key": "FieldStorageEntry.override"
-            },
-            "width": 16,
-            "edit_style": "inline",
-            "sortable": true
-          },
-          {
-            "parameter_ref": "storage",
-            "label": {
-              "default": "",
-              "resource_key": "FieldStorageEntry.storage"
-            },
-            "width": 26,
-            "edit_style": "inline",
-            "dm_default": "type"
-          }
-        ],
-        "buttons": [
-          {
-            "id": "icon_button_1",
-            "carbon_icon": "Edit32",
-            "label": {
-              "resource_key": "table.somekey.label"
-            },
-            "description": {
-              "default": "This renders a button that has a label and Carbon icon to the right of the label.
-            },
-            "enabled": true
-          }
-       ]
-    }
- ]
-

-

Title-info

-

The title_info sections defines what will be displayed in the title section alongside the titleDefinition.

-

Title info attributes.

-
    -
  • action_refs (array[string]) List of action to be displayed in the title section. Each action_ref must have a corresponding action defined in the action_info section.
  • -
-

Example title info section: -

"title_info": {
-   "action_refs": [
-      "increment"
-   ]
-}
-

-

Action Info

-

The action_info section defines an action. Actions are used to callback to the application to perform an operation.

-

Action info attributes.

-
    -
  • id (string) Required Id of the action.
  • -
  • label (object) Required External name of action. -
  • -
  • control (string) Required The type of action. Currently button and image are supported.
  • -
  • class_name (string) Optional classname for this action
  • -
  • image (object) Properties associate with an image action.
      -
    • url (string) Location of the image to display.
    • -
    • placement (string) Placement of image relative to a property. Values are right or left.
    • -
    • size (object) Pixel size of the image.
        -
      • height (number) Image height in pixels.
      • -
      • width (number) Image width in pixels.
      • -
      -
    • -
    • tooltip_direction (string) Set tooltip direction for action image. Values are right, left, top, or bottom. Default is bottom.
    • -
    -
  • -
  • button (object) Properties associated with action button.
      -
    • kind (string) Button kind. Values are same as carbon button kind values. Default is tertiary.
    • -
    • size (string) Button size. Values are sm, md, lg, xl. Default is sm.
    • -
    -
  • -
  • data (any) Returned back in action callback.
  • -
-
{
-  "id": "increment",
-  "label": {
-    "default": "Increment"
-  },
-  "control": "button",
-  "data": {
-    "parameter_ref": "number"
-  }
-}
-
-

Resource Definition

-

Used for user facing text. Allows for default values if no translations are provided.

-
    -
  • default (string) Default value if resource_key not defined.
  • -
  • resource_key (string) Used as a key for enum value labels in the resources section of property definition.
  • -
-

Dynamic text expressions

-

Used to dynamically set text based on a parameter value change. If parameter id is used then then current value for that parameter will be passed into the function.

-
    -
  • percent(<number or parameter id>, <integer>) Return the percent of the 1st parameter. The optional 2nd parameter determines the number of decimal places.
  • -
  • sum(<number or parameter id>, <number or parameter id>, ...) Returns the sum of all parameters
  • -
-
{
-  "parameter_ref": "numberfield",
-  "label": {
-    "default": "Number"
-  },
-  "text_after": {
-    "default": "Sum: ${sum(numberfield, 2)} with (numberfield, 2, numberfield). Percent: ${percent(numberfield,2)}"
-  }
-}
-
- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/04.04-controls/index.html b/v13/04.04-controls/index.html deleted file mode 100644 index afcd33995e..0000000000 --- a/v13/04.04-controls/index.html +++ /dev/null @@ -1,2917 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Controls - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

Controls

-

Common Properties Element Types

-

The editor determines the most appropriate control and panel type for each parameter based on the context (parameter type, role, group type, etc.). Although an author can specify a desired control for a given parameter via its uihints, this should be used sparingly and carefully - specifying an inappropriate control for a parameter will lead to undefined behavior.

-

Documentation containing examples of the following group/panels and control types is available at:

-

https://elyra-canvas-test-harness.u20youmx4sm.us-south.codeengine.appdomain.cloud/#/properties

-

Group/Panel Controls

-

Controls are grouped and arranged on panels and sub-panels within the “group_info” section of operator uihints. Some panels appear as tab controls, others are for managing shared dataset metadata, while still others contain nested sub-panels.

-

Group Types

-
    -
  • controls A general panel type containing parameter controls.
  • -
  • tabs A tabbed control, each tab containing sub-panels and controls.
  • -
  • subTabs A horizontal sub-tabbed control, each tab containing sub-panels and controls. If displayed within a Tearsheet container, subtabs will be displayed vertically.
  • -
  • panels A panel type that contains sub-panels.
  • -
  • panelSelector A panel containing sub-panels that are shown or hidden based upon a controlling radio selection.
  • -
  • columnSelection A panel type containing field-selection controls that share a common set of fields.
  • -
  • customPanel A custom panel for displaying user defined control. See Custom Panels section of the Custom Components page for more details.
  • -
  • summaryPanel A panel used in the flyout editor that will provide a link to open a wide flyout that can contain panels and parameter.
  • -
  • actionPanel A panel used for containing action controls.
  • -
  • textPanel A panel used to display static label and/or description.
  • -
  • twistyPanel A panel used to display a panel title that expands to the panel content when clicked.
  • -
  • columnPanel A panel used to display children side by side.
  • -
  • tearsheetPanel A tearsheet panel. The panel can be opened/closed using the propertyController methods setActiveTearsheet(groupId) and clearActiveTearsheet()
  • -
-

Parameter Controls

-

The following controls are supported in the Common Properties editor. Control types are intended for use with particular parameter types:

-

Control Types

-
    -
  • readonly A read only text field. Used for fields users shouldn’t edit.
  • -
  • hidden A control that has no UI to display.
  • -
  • textfield A single line editable text field.
  • -
  • passwordfield A masked single line text field with tooltip. The tooltip text can be customized by setting [parameter_id].passwordHide.tooltip and [parameter_id].passwordShow.tooltip in resources section.
  • -
  • textarea A multi-line text area.
  • -
  • list A single column table for editing a list of values.
  • -
  • expression An expression editing field that provides language specific syntax highlighting and text auto complete. An expression builder addon is available with the expression control. You must provide the expressionInfo field for the propertiesInfo config. See Common Properties Documentation for more details. To maximize in a tearsheet add this attribute and define a tearsheetPanel in group_info. -
    "data": {
    -  "tearsheet_ref": "<tearsheet groupId>"
    -}
    -
  • -
  • code An code editing field that provides language specific syntax highlighting and text auto complete. To maximize in a tearsheet add this attribute and define a tearsheetPanel in group_info. -
    "data": {
    -  "tearsheet_ref": "<tearsheet groupId>"
    -}
    -
  • -
  • numberfield A numeric text field. Number fields can also optionally display a random number generator button beside the control. See the uihints schema for details.
  • -
  • datefield A date input control whose date format tokens follow date-fns. Defaults to yyyy-mm-dd
  • -
  • timefield A time input control whose time format tokens follow date-fns. Defautls to H:m:s
  • -
  • datepicker A date input control with calendar picker whose date format tokens follow Flatpickr. Defaults to Y-m-d. Helper text can be included by adding [parameter_id].helper in the resources section.
  • -
  • datepickerRange A date input control with calendar picker for a range of dates. This follow the same rules as the datepicker control. Start and end labels defaults to Start and End respectively. Start, end, and helper labels can be customized by adding the following in the resources section: -
    "resources": {
    -  [parameter_id].range.start.label: "Custom start label",
    -  [parameter_id].range.start.desc: "Custom start description that will appear as tooltip next to the label",
    -  [parameter_id].range.start.helper: "Custom start helper that will appear as text below the input",
    -  [parameter_id].range.end.label: "Custom end label",
    -  [parameter_id].range.end.desc: "Custom end description that will appear as tooltip next to the label",
    -  [parameter_id].range.end.helper: "Custom end helper that will appear as text below the input"`
    -}
    -
  • -
  • spinner A standard spinner control to increment/decrement the number value.
  • -
  • checkbox A standard checkbox control.
  • -
  • radioset A radio set where a parameter value is selected from a small range of options. See the Conditions page for special radio button disabling options.
  • -
  • checkboxset A checkbox set for list type parameters with enumerated options where the count is less than 5.
  • -
  • oneofselect A standard dropdown list control.
  • -
  • multiselect A standard dropdown list control that allows for multiple selection.
  • -
  • someofselect A multi-selection control for enumerated list parameters where the count is greater than 4.
  • -
  • selectcolumn A dropdown list control that selects from available column names. When dropdown list is empty, selectcolumn control will display default placeholder text "...". This placeholder text can be customized by setting [parameter_id].emptyList.placeholder in resources section. When custom empty list placeholder text is provided, Common Properties will disable the empty list control.
  • -
  • selectcolumns A multi-select control for column selections.
  • -
  • selectschema A dropdown control that contains the available schemas in dataset_metadata. The name of the schema will be displayed if provided. If name is not provided, the index (zero-based) of the schema will be used instead. When dropdown list is empty, selectschema control will display default placeholder text "...". This placeholder text can be customized by setting [parameter_id].emptyList.placeholder in resources section. When custom empty list placeholder text is provided, Common Properties will disable the empty list control.
  • -
  • toggle A standard toggle control with default On/Off states. This text can be customized by setting [parameter_id].toggle.on.label and [parameter_id].toggle.off.label in resources section.
  • -
  • toggletext A two-state control with optional icons that can exist on its own or within table cells.
  • -
  • structuretable Table control for editing lists or maps of complex types that have field names in the first column.
  • -
  • structurelisteditor For lists or maps of complex types that are not field-oriented parameters.
  • -
  • structureeditor Allows one to define a structure and use it directly on a panel. Each structure member is surfaced as an individual control. Supports a layout setting that allows one to position structureeditor controls in a grid (see below).
  • -
  • readonlyTable A read only table. Used for tables to display fields that users shouldn’t edit.
  • -
  • custom A custom control for displaying a user defined control. See Custom Controls section of the Common Properties Custom Components page for more details.
  • -
  • slider A standard slider which allows to enter a numeric value within the slider range and also allows to drag and adjust the slider track to a specific value within the range. The slider labels for minimum and maximum values can be customized by setting them as [parameter_id].min.label for minimum value label and [parameter_id].max.label for maximum value label in resources section.
  • -
-

A Note on Field Name Storage

-

When a given node can accept more than a single datarecord-metadata object as input, it becomes necessary to store the schema name (a.k.a. ‘link_name’) along with each field name that is stored in parameter sets. In those cases, instead of using strings to store field names, they are represented in parameter sets as compound objects containing both ‘link_ref’ and ‘field_name’ elements:

-
"current_parameters": {
-  "field": { "link_ref": "Schema-1", "field_name": "Age" },
-  ...
-
- -

In order to indicate that a given node can potentially accept multiple input data links and would thus require compound field name storage, all parameter definitions within the node that contain "role": "column", whether located at the top level or within complex types, should declare their data types as “object” instead of “string”:

-
"parameters": [
-  {
-    "id": "fields",
-    "type": "array[object]",
-    "role": "column",
-    "required": true
-  },
-  ...
-
- -

edit_style

-

When editing complex type values in tables one can either edit cell values inline or in a sub panel:

-
    -
  • subpanel A small sub-dialog is launched to edit cell values.
  • -
  • inline Controls appear inline within table cells for editing values.
  • -
  • on_panel Control appears below the table when the row is selected.
  • -
-

Miscellaneous

-
    -
  • moveable_rows boolean A value that appears in “complex_type_definition” sections. If set to true allows rows in the table to be moved up and down for reordering.
  • -
  • row_selection enum [“single”, “multiple”] Determines how many rows can be selected in a table at one time. Defaults to multiple.
  • -
  • sortable boolean Both sortable and filterable apply to table columns. When set within the “key_definition” or the “parameters” sections of a structure definition, those columns are sortable and/or can be filtered upon.
  • -
  • filterable boolean (see sortable above)
  • -
  • language enum [“CLEM”, “text/x-hive”] The language for the expression control syntax highlight and text auto complete feature. If not specified, the expression control does not have syntax highlighting or text auto complete.
  • -
  • layout A two-dimensional string array value that appears in “complex_type_definition” sections and allows one to layout structureeditor controls in a two dimensional grid.
  • -
- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/04.05-conditions/index.html b/v13/04.05-conditions/index.html deleted file mode 100644 index 3689eb1b35..0000000000 --- a/v13/04.05-conditions/index.html +++ /dev/null @@ -1,3148 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Conditions - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - - - - - -
-
- - - - - - - - - - - - -

Conditions

-

Conditions define a set of specifications for evaluating parameter values. The specifications support complex interdependency checking such as relationships between multiple parameters (i.e. Valid values for parameter one depend upon the value of parameter two). Here is the -Conditions Schema

-

Documentation containing examples of the following conditions for the different supported controls are available at: -https://elyra-canvas-test-harness.u20youmx4sm.us-south.codeengine.appdomain.cloud/#/conditions

-

A conditions file contains an array of conditions. Each condition takes one of the following forms:

-

Validation definition

-

A single validation. The fail_message is displayed upon validation failure.

-

The attributes for the validation definition are:

-
    -
  • id (string) A unique identifier for the validation. This is required if multiple validations have the same focus_parameter_ref value.
  • -
  • -

    fail_message (object) Required The message to display if the validation fails. Each fail_message consist of the following attributes

    -
      -
    • message (object) Required The message to display. -
    • -
    • focus_parameter_ref (string) Required The parameter control to get focus after displaying the error/warning. If the validation refers to a table cell, then control must have the column indicator. For example if the validation is for MyTable cell column 2 then MyTable[2].
    • -
    • type (string) Type of messages. Valid values are error, warning, info.
    • -
    -
  • -
  • -

    evaluate (object) Specification for how to evaluate the validity of the parameter. The evaluate attribute can be one of the following structures.

    -
      -
    • condition (object) This is a single condition that evaluates to true or false.
        -
      • op (string) Required A single operator for the properties of the condition. Valid values are: -isEmpty, -isNotEmpty, -greaterThan, -lessThan, -equals, -notEquals, -matches, -notMatches, -contains, -notContains, -colNotExists, -isDateTime, -dmTypeEquals, -dmTypeNotEquals, -dmMeasurementEquals, -dmMeasurementNotEquals, -dmRoleEquals, -dmRoleNotEquals -lengthEquals, -lengthGreaterThan, -lengthLessThan.
      • -
      -
    • -
    • parameter_ref (string) Required The primary parameter.
    • -
    • parameter_2_ref (string) Second parameter for multi-parameter validation.
    • -
    • value (string, boolean, number) Value against which to compare the primary parameter value.
    • -
    • values (array[string]) Values against which to compare the primary parameter value is in. Used only in filter conditions.
    • -
    -
  • -
  • or (object) This is a container of ‘or’ conditions. Evaluates to true if ANY sub-condition evaluates to true. Can nest any number of additional conditional types.
  • -
  • and (object) This is a container of ‘and’ conditions. Evaluates to true if ALL sub-condition evaluates to true. Can nest any number of additional conditional types.
  • -
-

Enabled definition

-

Enablement test. Disables controls if evaluate is false.

-

The attributes for the enabled definition are:

-
    -
  • parameter_refs (array[string]) Array of parameter names affected by this operation. If evaluate is false, then the controls associated with these parameters are disabled. Note that individual radio buttons can be disabled by using the radio button value name instead of the overall property name in the parameter_refs array.
  • -
  • action_refs (array[string]) Array of action names affected by this operation. If evaluate is false, then the action button or image associated with these action names are disabled.
  • -
  • evaluate (object) see the evaluate attribute in validation definition.
  • -
-

Visible definition

-

Visibility test. Hides controls if evaluate is false.

-

The attributes for the visible definition are:

-
    -
  • parameter_refs (array[string]) Array of parameter names affected by this operation. If evaluate is false, then hide the controls associated with these parameters.
  • -
  • action_refs (array[string]) Array of action names affected by this operation. If evaluate is false, then the action button or image associated with these action names are disabled.
  • -
  • evaluate (object) see the evaluate attribute in validation definition.
  • -
-

Filter definition

-

Filter test. The filter will determine which data record fields to include in a control.

-

The attributes for the filter definition are:

-
    -
  • parameter_ref (string) Parameter id affected by this operation. This must be a parameter that operates upon datarecord-metadata columns.
  • -
  • parameter_refs (string) Exclusive with parameter_ref and used with dmSharedFields. Parameter ids affected by this operation. They must be parameters that operate upon datarecord-metadata columns.
  • -
  • evaluate (object) see the evaluate attribute in validation definition.
  • -
-

Supported operations (op):

-
    -
  • dmType - filters type value from schema.
  • -
  • dmMeasurement - filters measurement value from schema.
  • -
  • dmModelingRole - filters modeling_role value from schema.
  • -
  • dmSharedFields - shares source fields with all field chooser property names found in the parameter_refs array.
  • -
-

Examples: -

{
-  "filter": {
-    "parameter_ref": "fields_filter_measurement",
-    "evaluate": {
-      "condition": {
-        "op": "dmMeasurement",
-        "value": "discrete"
-      }
-    }
-  }
-}
-
-
{
-  "filter": {
-    "parameter_ref": "fields_filter_type",
-    "evaluate": {
-      "condition": {
-        "op": "dmType",
-        "values": ["integer", "double"]
-      }
-    }
-  }
-}
-
-
{
-  "filter": {
-    "parameter_refs": [
-       "fields_filter_type",
-       "multi_field_chooser_table",
-       "field_chooser_in_another_panel"
-    ],
-    "evaluate": {
-      "condition": {
-        "op": "dmSharedFields"
-      }
-    }
-  }
-}
-

-

Enum Filter definition

-

Filters the available options for enumeration parameters. Reduces the available enumeration items if evaluate is true.

-

The attributes for the enum_filter definition are:

-
    -
  • target (object) Contains a target parameter_ref reference and a replacement values array.
  • -
  • evaluate (object) see the evaluate attribute in validation definition.
  • -
-

Example: -

{
-  "enum_filter": {
-    "target": {
-      "parameter_ref": "radioset_filtered",
-      "values": [
-        "red",
-        "yellow",
-        "green"
-      ]
-    },
-    "evaluate": {
-      "condition": {
-        "parameter_ref": "filter_radios",
-        "op": "equals",
-        "value": true
-    }
-  }
-}
-

-

Allow Change definition

-

Allow change validates that a change is allowed on a property. If it evaluates to true then the value for the property is changed. This is typically used to restrict values that are invalid in one property based on the value in another property. For example, if the property represents a storage type with a value of string, then a property that represents a measurement type should not be allowed to be set to continuous.

-

The attributes for the allow_change definition are:

-
    -
  • parameter_refs (array[string]) Array of parameter names affected by this operation.
  • -
  • evaluate (object) see the evaluate attribute in validation definition.
  • -
-

Example: -

{
-      "allow_change": {
-        "parameter_refs": [
-          "ST_mse_table[2]"
-        ],
-        "evaluate": {
-          "or": [
-            {
-              "condition": {
-                "parameter_ref": "ST_mse_table[2]",
-                "op": "notEquals",
-                "value": "Football"
-              }
-            },
-            {
-              "condition": {
-                "parameter_ref": "ST_mse_table[5]",
-                "op": "notEquals",
-                "value": "European"
-              }
-            }
-          ]
-        }
-      }
-    }
-

-

Default value definition

-

Sets the default value on the parameter_ref property if condition evaluates to true. If multiple conditions evaluate to true only the first condition is used. Default value condition is evaluated only once when loading properties. If user updates the value of parameter_ref, default value will be overwritten by the new value.

-

The attributes for the default_value definition are:

-
    -
  • parameter_ref (string) Parameter whose default value is to be set.
  • -
  • value (string, boolean, number, object, array) This will be the default value of parameter_ref if condition evaluates to true.
  • -
  • evaluate (object) see the evaluate attribute in validation definition.
  • -
-

Example: -

{
-  "default_value": {
-    "parameter_ref": "conditional_default",
-    "value": "Value defined in default_value condition. You will see this sentence when default value of mode equals Include.",
-    "evaluate": {
-      "condition": {
-        "parameter_ref": "mode",
-        "op": "equals",
-        "value": "Include"
-      }
-    }
-  }
-},
-{
-  "default_value": {
-    "parameter_ref": "conditional_default",
-    "value": ["This is a second condition for conditional_default. You should never see this value."],
-    "evaluate": {
-      "condition": {
-        "parameter_ref": "mode",
-        "op": "equals",
-        "value": "Include"
-      }
-    }
-  }
-}
-

-

A note on table cell conditions

-

Support for table cell conditions is achieved via the use of the array subscript operator, []. When evaluating table cells, one uses the table identifier with an array subscript indicating the zero-based table column being operated upon (which also corresponds to the sub-control index as defined in complex_types).

-

So for example if one has a StructureTable property named myTable, column conditions on that table are referred to using myTable[1], myTable[3], etc.

-

Example

-

Example of a condition section. -

  "conditions": [
-      {
-        "validation": {
-          "fail_message": {
-            "type": "error",
-            "focus_parameter_ref": "inputFieldList",
-            "message": {
-              "resource_key": "input_field_list_not_empty"
-            }
-          },
-          "evaluate": {
-            "condition": {
-              "parameter_ref": "inputFieldList",
-              "op": "isNotEmpty"
-            }
-          }
-        }
-      },
-      {
-    "visible": {
-      "parameter_refs": [
-         "oneofselectPets"
-      ],
-      "evaluate": {
-         "condition": {
-            "parameter_ref": "oneofselectAnimals",
-        "op": "notContains",
-        "value": "lion"
-          }
-      }
-    }
-      },
-     {
-    "visible": {
-      "action_refs": [
-         "action_button"
-      ],
-      "evaluate": {
-         "condition": {
-            "parameter_ref": "button_hide_checkbox",
-        "op": "equals",
-        "value": false
-          }
-      }
-    }
-      },
-      {
-    "enabled": {
-      "parameter_refs": [
-        "radiosetColor"
-      ],
-      "evaluate": {
-        "condition": {
-          "parameter_ref": "checkboxEnable",
-          "op": "checked"
-            }
-      }
-    }
-      },
-      {
-    "validation": {
-      "fail_message": {
-        "type": "error",
-        "focus_parameter_ref": "subsamplingRate",
-        "message": {
-          "resource_key": "subsampling_rate_not_valid"
-        }
-      },
-      "evaluate": {
-        "and": [
-          {
-            "condition": {
-              "parameter_ref": "subsamplingRate",
-              "op": "greaterThan",
-              "value": 0
-            }
-          },
-          {
-            "or": [
-              {
-                "condition": {
-                  "parameter_ref": "subsamplingRate",
-                  "op": "lessThan",
-                  "value": 1
-                }
-              },
-              {
-                "condition": {
-                  "parameter_ref": "subsamplingRate",
-                  "op": "equals",
-                  "value": 1
-                }
-              }
-            ]
-          }
-        ]
-      }
-    }
-      },
-      {
-    "enabled": {
-      "parameter_refs": [
-        "field_types[2]"
-      ],
-      "evaluate": {
-        "condition": {
-          "parameter_ref": "field_types[1]",
-          "op": "checked"
-        }
-      }
-    }
-      }
-    }
-  ]
-

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/04.06-custom-components/index.html b/v13/04.06-custom-components/index.html deleted file mode 100644 index 1e99c16da0..0000000000 --- a/v13/04.06-custom-components/index.html +++ /dev/null @@ -1,3038 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Custom Components - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - - - - - -
-
- - - - - - - - - - - - -

Custom Components Overview

-

Custom components allows applications to use custom code to drive different parts of the common-properties user interface. For some panels and controls it might be necessary to listen to different types of redux state changes to cause the panel/control to rerender. -Here is an example of a textfield listening to three state changes: -

import { connect } from "react-redux";
-
-// ... application code
-
-render() {
-  const value = this.props.value; // value passed by redux as a property
-
-  // ... rest of component render code
-
-}
-
-TextfieldControl.propTypes = {
-  // ... application props
-  state: PropTypes.string, // pass in by redux
-  value: PropTypes.string, // pass in by redux
-  messageInfo: PropTypes.object // pass in by redux
-};
-
-const mapStateToProps = (state, ownProps) => ({
-  value: ownProps.controller.getPropertyValue(ownProps.propertyId),
-  state: ownProps.controller.getControlState(ownProps.propertyId),
-  messageInfo: ownProps.controller.getErrorMessage(ownProps.propertyId)
-});
-export default connect(mapStateToProps, null)(TextfieldControl);
-

-

Custom Panels

-

Custom panels allow applications to create their own panels and controls that can live in the same dialogs as common-property panels and controls.

-

Custom panel interface

-
// Returns the 'id' for the group defined in uihints
-static id()
-
-constructor(parameters, controller, data)
-
-// Returns the content users want to display
-renderPanel()
-
-
    -
  • parameters - String array of parameters set under the customPanel group in uihints
  • -
  • controller - See here for API information.
  • -
  • data - Optional parameter. Returns values stored in data attribute of a group customPanel.
  • -
  • renderPanel() - Called on all Redux store changes: -
  • -
-

Custom React components

-

Example -

renderPanel() {
-    const controlId = this.parameters[0];
-    return (
-        <CustomCtrlToggle
-            key={controlId}
-            propertyId={name: controlId}
-            controller={this.controller}
-        />
-    );
-}
-

-

Examples

-

https://github.com/elyra-ai/canvas/tree/master/canvas_modules/harness/src/client/components/custom-panels

-

Custom Controls

-

Custom controls allow applications to create their own controls that can live in the same dialogs as common-property panels and controls.

-

Custom control interface

-
// Returns the 'custom_control_id' for the parameter defined in uihints
-static id()
-
-constructor(propertyId, controller, data, tableInfo)
-
-// Returns the content users want to display
-renderControl()
-
-
    -
  • propertyId - See propertyId for definition.
  • -
  • controller - See here for API information.
  • -
  • data - Returns values stored in data attribute of a parameter in uihints.
  • -
  • tableInfo - Set when custom control is a cell in a table.
      -
    • table (boolean) Set to true when in a table cell
    • -
    • editStyle (string) Valid values are “summary” and “inline”. “summary” is set when the control will display either below the table (“on_panel”) or in a “subpanel”. This allows the custom control to display a summary value in the cell and something else for the custom control.
    • -
    -
  • -
  • renderControl() - Called on all Redux store changes: -
  • -
-

Custom React components

-

Example -

renderControl() {
-    return (
-        <CustomCtrlToggle
-            key={controlId}
-            propertyId={this.propertyId}
-            controller={this.controller}
-        />
-    );
-}
-

-

Examples

-

https://github.com/elyra-ai/canvas/tree/master/canvas_modules/harness/src/client/components/custom-controls

-

Custom Condition Operators

-

Custom condition operators allow users to create their own operators that can then be used for enablement, visibility, validation, and enum filtering. The condition operators should always return a boolean value.

-

Custom operator interface

-
/**
-* This is the key used to determine if the operator should be ran.  Maps to the `op` defined in the
-* `condition` in uihints
-* @return string
-*/
-function op()
-
-/**
-* @param see below
-* @return boolean
-*/
-function evaluate(paramInfo, param2Info, value, controller)
-
-
    -
  • paramInfo (object) - parameter_ref set in the condition in uihints
      -
    • control (object) - contains information about the control.
    • -
    • value (any) - current property value
    • -
    -
  • -
  • param2Info (object) - parameter_2_ref set in the condition in uihints. See paramInfo for object info
  • -
  • value - value set in the condition in uihints. If no value specific this will be undefined
  • -
  • controller - See here for API information.
  • -
-

Example -

function op() {
-  return "customMax";
-}
-
-function evaluate(paramInfo, param2Info, value, controller) {
-  const supportedControls = ["numberfield"];
-  if (supportedControls.indexOf(paramInfo.control.controlType) >= 0) {
-    return paramInfo.value < value;
-  }
-  return true;
-}
-
-module.exports.op = op;
-module.exports.evaluate = evaluate;
-
-
{
-    "evaluate": {
-        "condition": {
-            "parameter_ref": "custom_op_num",
-            "op": "customMax",
-            "value": 100
-        }
-    }
-}
-

-

Examples

-

https://github.com/elyra-ai/canvas/tree/master/canvas_modules/harness/src/client/custom/condition-ops -https://github.com/elyra-ai/canvas/tree/master/canvas_modules/common-canvas/src/common-properties/ui-conditions/condition-ops

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/04.07-properties-controller/index.html b/v13/04.07-properties-controller/index.html deleted file mode 100644 index 48eaec500c..0000000000 --- a/v13/04.07-properties-controller/index.html +++ /dev/null @@ -1,3284 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Properties Controller - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - - - - - -
-
- - - - - - - - - - - - -

Properties Controller

- -

Common Properties Controller API

-

propertyId -

const propertyId = {
-  name: {parameter name defined in operator definition},
-  row: {row in table/array}, // optional when col not set
-  col: {col in table}, // optional
-  propertyId: {propertyId of the nested structure} // optional
-}
-

-

Property methods

-
/*
- * options - optional object of config options where:
- *   setDefaultValues (boolean): when set to true, set default values from parameter definition
- */
-setPropertyValues(values, options)
-updatePropertyValue(propertyId, value)
-
-/*
- * options - optional object of config options where:
- *   filterHiddenDisabled (boolean): when set to true, filter out data values with a state of disabled or hidden
- *   filterHiddenControls (boolean): when set to true, filter out data values having control type hidden
- *   applyProperties (boolean): when set to true, will return data values in the format expected by the `applyPropertyChanges` callback. If unset or false, will return the internal format used by Common Properties.
- */
-getPropertyValue(propertyId, options)
-
-/*
- * options - optional object of config options where:
- *   filterHiddenDisabled (boolean): when set to true, filter out data values with a state of disabled or hidden
- *   filterHiddenControls (boolean): when set to true, filter out data values having control type hidden
- *   applyProperties (boolean): when set to true, will return data values in the format expected by the `applyPropertyChanges` callback. If unset or false, will return the internal format used by Common Properties.
- */
-getPropertyValues(options)
-
-

Message methods

-
/*
- * Returns current list of error messages
- * @filteredPipeline (boolean) optional
- * @filterHiddenDisable (boolean) optional. If true, will not return error messages from controls that are hidden or disabled
- * @filterDisplayError (boolean) optional. If true, will not return error messages that are not displayed in the editor
- * when filteredPipeline=true returns enabled/visible control messages and only 1 per control.
- */
-getAllErrorMessages()
-getErrorMessages(filteredPipeline, filterHiddenDisable, filterSuccess, filterDisplayError = true)
-getErrorMessage(propertyId, filterHiddenDisable = false, filterSuccess = false, filterDisplayError = true)
-getRequiredErrorMessages()
-setErrorMessages(messages)
-updateErrorMessage(propertyId, message)
-
-

State methods (disable/enabled & hidden/visible)

-
getControlState(propertyId)
-getControlStates()
-setControlStates(states)
-
-/*
- * @propertyId - see above
- * @state - valid values are "enabled", "disabled", "visible", "hidden"
- */
-updateControlState(propertyId, state)
-
-

DatasetMetadata methods

-
getDatasetMetadata()
-
-/*
- * @datasetMetadata - see [schema](https://github.com/elyra-ai/pipeline-schemas/blob/master/common-pipeline/datarecord-metadata/datarecord-metadata-v1-schema.json)
- */
-setDatasetMetadata(datasetMetadata)
-
-

Row selection methods

-
/*
- * Returns table row selection indices as an array of integers.
- * @propertyId - see above
- */
-getSelectedRows(propertyId)
-
-/*
- * Updates table row selections for the given table control.
- * @propertyId - see above
- * @selection - A zero-based array of integer selection indices
- */
-updateSelectedRows(propertyId, selection)
-
-/*
- * Clears selected table rows for the given table.
- * @propertyId - see above
- * If the propertyId is omitted all table row selections are cleared
- */
-clearSelectedRows(propertyId)
-
-/*
- * Adds a row selection listener for a table or list.
- * @propertyId - see above
- * @listener - callback function for when a selection is made in the table or list
- */
-addRowSelectionListener(propertyId, listener)
-
-/*
- * Removes the row selection listener from a table or list.
- * @propertyId - see above
- */
-removeRowSelectionListener(propertyId)
-
-

Validation methods

-
/*
- * Runs validation conditions on all controls
- */
-validatePropertiesValues()
-
-/*
- * Validates a specific propertyId
- * @propertyId - see above
- */
-validateInput(propertyId)
-
-

Control methods

-
/*
- * Update the enum values for a given control.  Used when enum values aren't static
- * @propertyId - see above
- * @valuesObj (array) [{ value: <string, number, boolean> , label: "<string>" }]
- */
-updateControlEnumValues(propertyId, valuesObj)
-
-

General methods

-
/*
- * Returns the current size of the RHS flyout.
- */
-getEditorSize()
-
-/*
- * Sets default property values from parameter definition in the propertiesController.
- * Note - These values won't be displayed on the UI. Host applications can call getPropertyValues() to retrieve the values.
- * @paramDef - Follows the format of https://github.com/elyra-ai/pipeline-schemas/blob/master/common-canvas/parameter-defs/parameter-defs-v3-schema.json
- */
-setParamDef(paramDef)
-
-/*
- * Returns the id of top-level active tab or accordion
- */
-getTopLevelActiveGroupId()
-
-/*
- * Makes the passed in groupId active.  Only works for top-level groups
- */
-setTopLevelActiveGroupId(groupId)
-
-

Disable move row buttons methods

-
/*
- * Disable table row move buttons for all propertyIds in given array
- * @param propertyIds Array of propertyIds
- *
- */
-setDisableRowMoveButtons(propertyIds)
-
-/*
- * Returns array of propertyIds for which row move buttons will be disabled
- *  @return Array of propertyIds
- */
-getDisableRowMoveButtons()
-
-/*
- * Check if row move buttons should be disabled for given propertyId
- * @param propertyId  The unique property identifier
- * @return boolean
- */
-isDisableRowMoveButtons(propertyId)
-
-

Custom panel and control methods

-
/*
- * Only used in custom panel to allow for custom property summary values to be displayed
- * Displays the value set in propertiesReducer for that parameter
- * @propertyId - see above
- * @label (string)
- * @inSummary (boolean)
- */
-setControlInSummary(propertyId, label, inSummary)
-
-/*
- * Sets the content to be displayed in the summaryPanel for a customPanel property.
- * The summary panel will directly display the content.
- * @propertyId - see above
- * @content = { value: <object> , label: "<value>" }
- */
-updateCustPropSumPanelValue(propertyId, content)
-
-/*
- * Returns a standard control that can then be used in a customPanel.
- * @propertyId - See above
- * @paramDef - Follows the format of https://github.com/elyra-ai/pipeline-schemas/blob/master/common-canvas/parameter-defs/parameter-defs-v1-schema.json).  titleDefinition, current_parameters, conditions, dataset_metadata are ignored and are optional.
- * @parameter - This is the parameter from the paramDef to create the control for.
- */
-createControl(propertyId, paramDef, parameter)
-
-/*
- * Returns the translated text for a control given a resource key.
- * Users should be able to use the values from resources that has been uploaded as part of paramDef.
- * @key - Resource key
- * @value - Default value returned when no resource or key has been found.
- */
-getResource(key, value)
-
-

maxLength for single-line and multi-line control methods

-
/*
- * Returns the maximum characters allowed for multi-line string controls
- * Default value is 1024
- */
-getMaxLengthForMultiLineControls()
-
-/*
- * Returns the maximum characters allowed for single-line string controls
- * Default value is 128
- */
-getMaxLengthForSingleLineControls()
-
-

Enabling/disabling addRemoveRows methods

-
/*
- * Set the addRemoveRows attribute to 'enabled' for the given propertyId
- * @param propertyId The unique property identifier
- * @param enabled boolean value to enable or disable addRemoveRows
- */
-setAddRemoveRows(propertyId, enabled)
-
-/*
- * Returns the true if addRemoveRows is enabled for the given propertyID
- * @param propertyId The unique property identifier
- * @return boolean
- */
-getAddRemoveRows(propertyId)
-
-

Enabling/disabling properties editor “save” button methods

-
/*
- * Set the main "save" button to disabled(true) or enabled(false)
- * @param saveDisable (boolean)
- */
-setSaveButtonDisable(saveDisable)
-
-/*
- * Returns the true if the main "save" button is disabled, false otherwise
- * @return boolean
- */
-getSaveButtonDisable()
-
-

Add static rows for table controls which will disable the re-ordering of the rows that are set as static for the given propertyId

-
/*
- * Set static rows for the given propertyId
- * @param propertyId The unique property identifier
- * @param staticRowsArr Array of first n row indexes or last n row indexes
- */
-updateStaticRows(propertyId, staticRowsArr)
-
-/*
- * Returns the static rows set for the given propertyId
- * @param propertyId The unique property identifier
- */
-getStaticRows(propertyId)
-
-/*
- * Removes the static rows set for the given propertyId
- * @param propertyId The unique property identifier
- */
-clearStaticRows(propertyId)
-
-

Enabling/disabling custom table buttons

-
/*
- * Set the table button to 'enabled' for the given propertyId
- * @param propertyId The unique property identifier
- * @param buttonId The unique button identifier
- * @param enabled boolean value to enable or disable the button
- */
-setTableButtonEnabled(propertyId, buttonId, enabled)
-
-/*
- * Returns the table button states for the given propertyID
- * @param propertyId The unique property identifier
- * @return object An object of buttonIds mapped to their enabled state
- */
-getTableButtons(propertyId)
-
-/*
- * Returns the true if the table button is enabled for the given propertyID and buttonId
- * @param propertyId The unique property identifier
- * @param buttonId The unique button identifier
- * @return boolean
- */
-getTableButtonEnabled(propertyId, buttonId)
-
-

Column visibility methods

-
/*
- * Check if given column is visible in the table
- * @param propertyId The unique property identifier
- * @param columnIndex Column index in the table
- */
-getColumnVisibility(propertyId, columnIndex)
-
-/*
- * Set column visibility
- * @param propertyId The unique property identifier
- * @param columnIndex Column index in the table
- * @param value Boolean value to set column visible/invisible
- */
-toggleColumnVisibility(propertyId, columnIndex, value)
-
-

Enabling/disabling wide flyout “OK” button methods

-
/*
- * Set the "OK" button in Wide Flyout to disabled(true) or enabled(false) for given summary panel
- * @param panelId {name: panel.id}
- * @param wideFlyoutPrimaryButtonDisable boolean
- */
-setWideFlyoutPrimaryButtonDisabled(panelId, wideFlyoutPrimaryButtonDisable)
-
-/*
- * @param panelId {name: panel.id}
- */
-getWideFlyoutPrimaryButtonDisabled(panelId)
-
- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/04.08-properties-config/index.html b/v13/04.08-properties-config/index.html deleted file mode 100644 index c2ceb5aca9..0000000000 --- a/v13/04.08-properties-config/index.html +++ /dev/null @@ -1,2663 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Properties Config - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

Properties Config

-

The Properties Config is an object passed as an optional prop to the <CommonProperties< React object containing the following fields:

-
    -
  • -

    containerType string: type of container to display the properties, can be “Modal”, “Tearsheet”, or “Custom”. default: "Custom"

    -
  • -
  • -

    rightFlyout boolean: If set to true, groups will be displayed as an accordion. If false, groups are displayed as tabs. default: false

    -
  • -
  • -

    applyOnBlur boolean: calls applyPropertyChanges when focus leave Common Properties. default: false

    -
  • -
  • -

    disableSaveOnRequiredErrors boolean: Disable the properties editor “save” button if there are required errors

    -
  • -
  • -

    enableResize boolean: adds a button that allows the right-side fly-out editor to expand/collapse between small and medium sizes. default: true

    -
  • -
  • -

    conditionReturnValueHandling string: used to determine how hidden or disabled control values are returned in applyPropertyChanges callback. Current options are “value” or “null”. default: "value"

    -
  • -
  • -

    buttonLabels object:

    -
      -
    • primary string: Label to use for the primary button of the properties dialog
    • -
    • secondary string: Label to use for the secondary button of the properties dialog
    • -
    -
  • -
  • -

    heading boolean: show heading and heading icon in right-side fly-out panels. default: false

    -
  • -
  • -

    schemaValidation boolean: If set to true, schema validation will be enabled when a parameter definition has been set in CommonProperties. Any errors found will be reported on the browser dev console. It is recommended you run with schema validation switched on while in development mode.

    -
  • -
  • -

    applyPropertiesWithoutEdit boolean: When true, will always call applyPropertyChanges even if no changes were made. default: false

    -
  • -
  • -

    maxLengthForMultiLineControls number - maximum characters allowed for multi-line string controls like textarea. default: 1024

    -
  • -
  • -

    maxLengthForSingleLineControls number - maximum characters allowed for single-line string controls like textfield. default: 128

    -
  • -
  • -

    convertValueDataTypes boolean - Default false. If set to true, currentParameter values whose data type does not match what is defined in the parameter definitions will be converted to the specified data type.

    -
  • -
  • -

    trimSpaces boolean - Default true. If set to false, condition ops(isEmpty, isNotEmpty) and required fields are allowed to only contain spaces without triggering condition errors.

    -
  • -
  • -

    showRequiredIndicator boolean - Default true to show (required) indicator. If set to false, show (optional) indicator next to properties label.

    -
  • -
  • -

    showAlertsTab boolean - Default true to show “Alerts” tab whenever there are error or warning messages. If set to false, Alerts tab won’t be displayed.

    -
  • -
  • -

    returnValueFiltering array - Default []. When set this will filter out any values in the array in the parameters returned when applyPropertyChanges is call. Only primitive data types are currently supported.

    -
  • -
  • -

    categoryView string - View categories in right-flyout. Can be "accordions" or "tabs". default: "accordions".

    -
  • -
- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/05-faq/index.html b/v13/05-faq/index.html deleted file mode 100644 index 334628db6a..0000000000 --- a/v13/05-faq/index.html +++ /dev/null @@ -1,2776 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Frequently asked questions - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

Frequently asked questions

-

History

-
-What is the relationship between Elyra Canvas and the Elyra AI Toolkit? -

Elyra Canvas is a repo inside the Elyra AI Toolkit. The Elyra repo in the toolkit is dependent on Elyra Canvas but Elyra Canvas is not dependent on it or any repo in the toolkit other than the Elyra Pipeline Schemas repo.

-
-

Common Canvas

-

Questions about Nodes

-
-With resizeable nodes (enableResizableNodes: true) why don’t the shapes defined by bodyPath and selectionPath change when resizing a node? -

The bodyPath and selectionPath ‘shapes’ do not automatically redraw when the user resizes the node. However, a function that returns a path can be provided for those fields instead of a string, so the application can return whatever shape it prefers as the resizing progresses. Obviously, these functions are called in real-time so they needs to return very quickly.

-
-
-Can React objects specified in nodeExternalObject display supernodes and, if so, how is the sub-flow rendered? -

Yes, ’nodeExternalObject` is supported for supernodes. The way it works is:

-
    -
  • If the supernode is collapsed (that is, it looks like a regular node) then the React node is used in the same way as for a regular node
  • -
  • If the supernode it expanded in-place, then the React object is still used in the same way and the <svg> area that displays the sub-flow is displayed by Common Canvas over the top of the node body.
  • -
  • If the user is viewing the supernode ‘full-page’ then the sub-flow is rendered in the usual way since the parent supernode is not visible at that point.
  • -
-

There is an example of this in the ‘React Nodes - Carbon Charts’ sample application in the test harness.

-

-
-
-When displaying React nodes using nodeExternalObject field, how can the application pass in its own props to the component? -

The application can add whatever it wants to pass in as a field in either the nodeData object or the Canvas Controller — making sure not to over write any of the existing fields that are there by default of course. So if you wanted to pass in your own data on a node-by-node basis you could set a field in the app_data field of each node. Something like:

-
    const nodeId = "123";
-
-    const mydtaa = {
-        field1: val1
-        field2: val2
-    }
-
-    canvasController.setNodeProperties(
-        nodeId,
-        { app_data: mydata }
-    );
-
-

Then in the React object just reference the fields like: -

    const f1 = this.props.nodeData.app_data.field1;
-

-
-

Questions about Comments

-
-With markdown enabled in comments, why isn’t the whitespace preserved when the user leaves edit mode? -

That’s the way markdown works. It removes white space in the entered text. For example, if you enter similar text into a comment in a GitHub issue and look at the preview you’ll see the whitespace is removed.

-

Common Canvas is using a third party library to convert what the user enters to the HTML that is displayed so the removal of whitespace is not under its control.

-

However, Comments support the ability to enter HTML directly into the markdown text. HTML can be used to preserve whitespace and do many other styling and customizations to the text.

-
-
-Are there any plans to support different fonts in comments? -

In Elyra Canvas v13.0.0, there is now a feature that allows the user to enter HTML in to the markdown text. This allows fonts and many other customizations of the text — although the user does need to know what they are doing with HTML.

-
- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/06-contributing/index.html b/v13/06-contributing/index.html deleted file mode 100644 index d9209d97d6..0000000000 --- a/v13/06-contributing/index.html +++ /dev/null @@ -1,2607 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Guidelines for Development - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

Guidelines for Development

-

Some guidelines for contributing to Elyra Canvas are included in this section including:

- - - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/06.01-style-guidelines/index.html b/v13/06.01-style-guidelines/index.html deleted file mode 100644 index 66c98e1419..0000000000 --- a/v13/06.01-style-guidelines/index.html +++ /dev/null @@ -1,2668 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - Style Guidelines for Development - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

Style Guidelines for Development

-

Elyra Canvas styling guidelines

-
    -
  • Used the data-id attribute on inputs to be used for automated tests. Format for Common Properties should be properties-
  • -
  • className format format for Common Properties should be properties-
  • -
  • Limit the use of html(DOM) ids
  • -
  • Minimum inline styling. This allows for consumers to easily override styling.
  • -
  • scss/sass styling should be added to the component’s folder
  • -
  • No important! in styling
  • -
  • Use variables for all colors(preferably from carbon)
  • -
- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/06.02-testing-guidelines/index.html b/v13/06.02-testing-guidelines/index.html deleted file mode 100644 index 7462346c2c..0000000000 --- a/v13/06.02-testing-guidelines/index.html +++ /dev/null @@ -1,2782 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - Testing Guidelines for Development - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - Skip to content - - -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- - - - - - - - - - - - -

Testing Guidelines for Development

-

Unit Testing

-

The Canvas unit tests are automated with the primary purpose of providing rapid feedback to the developers. The test cases are run during every development build. Unit test cases are written using Jest Jest Tutorial. The test cases should be written and delivered at the time that a feature or enhancement is delivered.

-

Unit test cases should focus on good coverage of a function/service. We are current investigating code coverage analysis tools and will update this doc when it is implemented.

-

Unit test case coverage should focus on these areas:

-
    -
  • All APIs and all UI elements.
  • -
  • All component properties.
  • -
  • A variety of input data.
  • -
-

Here is a good blog on JavaScript Unit Testing

-

Functional Testing

-

The Canvas Functional Test cases will be automated and run during code delivery. The function test case will be automated and written using Cypress.

-

Functional Testing coverage includes the following types of tests.

-
    -
  • Core functionality
  • -
  • Inter-operate with other Canvas elements.
  • -
  • Need to test both forward and backwards compatibility
  • -
  • Negative / bounds
  • -
  • Globalization / Localization
      -
    • Handling of all strings using UTF-8
    • -
    • Verifying non-English unicode data is handled appropriately
    • -
    • Externalizing all strings that may be presented for the user (e.g., error messages, UI labels, etc.)
    • -
    -
  • -
  • Access control security (roles / permissions / tenant management)
  • -
  • Malicious and security (code scans such as AppScan, ethical hacking)
  • -
  • Accessibility for UI
  • -
-

Debugging Tests

-

Jest tests (unit)

-

https://facebook.github.io/jest/docs/troubleshooting.html

-

With node 8 or newer

-
    -
  • Add debugger; statement to your Jest test suite program where you want to stop and begin debugging.
  • -
  • -

    If you want to run just a single test within your test program (rather than all of them) temporarily change the it() method for the test to be it.only(). For example, change:

    -

    it("should add a node", () => { ... })

    -

    to be:

    -

    it.only("should add a node", () => { ... })

    -
  • -
  • -

    In the console enter: npm run debug or npm run debug <test suite name>

    -
  • -
  • Open Chrome debugging tools by pasting this into the Chrome address field: chrome://inspect/
  • -
  • You should see a ‘remote’ target for node_modules/.bin/jest. Click on the inspect link below it.
  • -
  • Click on sources and then click the play button (right pointing blue triangle icon).
  • -
  • The code should run to the point where your debugger statement was added.
  • -
-

Testing Troubleshooting

-

When testing your application with Jest, this error might show up: crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported for details.

-

To fix, added this to your jest setup file: -

const cryptoJest = require("crypto");
-Object.defineProperty(global.self, "crypto", {
-    value: {
-        getRandomValues: (arr) => cryptoJest.randomBytes(arr.length)
-    }
-});
-

- - - - - - - - - - - - - -
-
- - - -
- -
- - - -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/404.html b/v13/404.html deleted file mode 100644 index 2a145b41a0..0000000000 --- a/v13/404.html +++ /dev/null @@ -1,2513 +0,0 @@ - - - - - - - - - - - - - - - - - - - Elyra Canvas - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- -
-
- -
- - - - - - -
- - -
- -
- - - - - - - - - -
-
- - - -
-
-
- - - - - - - -
-
-
- - - -
-
-
- - - -
-
-
- - - -
-
- -

404 - Not found

- -
-
- - - -
- -
- -
- - - - -
- -
-
-
-
- - - - - - - - - - - - \ No newline at end of file diff --git a/v13/assets/FlowIcon.png b/v13/assets/FlowIcon.png deleted file mode 100644 index 4bb30ae3deb866b678527df688e5cb77f70f40e1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4764 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 diff --git a/v13/assets/cc-app-tiny.png b/v13/assets/cc-app-tiny.png deleted file mode 100644 index 35a3644a1647846e01af13d4ff952088b3050170..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 200567 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 Z$ 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

eM_sLt%K);7jKvMIj2TNWzf->j>F9Kc`=R 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πr6%W4-8PnY7?_*~Z!0awN*=MwEbBIp-*moT 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 C!=Nev diff --git a/v13/assets/cc-comment-color.gif b/v13/assets/cc-comment-color.gif deleted file mode 100644 index e6a6161c4a0ae40f429c131069ca6983ee5cb0f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68746 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

8&^ie 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

>MbVmKcMA)Ir&EP70szy>gC(tz^e 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 diff --git a/v13/assets/cc-comment-link.gif b/v13/assets/cc-comment-link.gif deleted file mode 100644 index 2aedaaf014d6052b98773facc6f3f0d1fd8ffbfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50450 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 Vvb~XX;-As?|L+R!|I;5-{9h2zukHW< diff --git a/v13/assets/cc-comment-markdown-edit.png b/v13/assets/cc-comment-markdown-edit.png deleted file mode 100644 index 1cde89be11cb107659566dbb50b4d97060d779d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79971 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