pyegeria 5.3.3.12__py3-none-any.whl → 5.3.3.13__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. pyegeria/__init__.py +2 -1
  2. pyegeria/commands/tech/list_information_supply_chains.py +10 -7
  3. pyegeria/commands/tech/work/mermaid_graphs/Clinical Trial Subject Onboarding.html +135 -0
  4. pyegeria/commands/tech/work/mermaid_graphs/{Clinical Trial Treatment Validation.mmd → Clinical Trial Treatment Validation.html } +127 -41
  5. pyegeria/commands/tech/work/mermaid_graphs/Employee Expense Payment.html +126 -0
  6. pyegeria/commands/tech/work/mermaid_graphs/New Drug Product Information Distribution.html +141 -0
  7. pyegeria/commands/tech/work/mermaid_graphs/New Employee Onboarding.html +138 -0
  8. pyegeria/commands/tech/work/mermaid_graphs/Personalized Treatment Ordering.html +143 -0
  9. pyegeria/commands/tech/work/mermaid_graphs/{Physical Inventory Tracking.mmd → Physical Inventory Tracking.html } +114 -28
  10. pyegeria/commands/tech/work/mermaid_graphs/{Sustainability Reporting.mmd → Sustainability Reporting.html } +112 -26
  11. pyegeria/commands/tech/work/mermaid_graphs/{{displayName}}.html +115 -0
  12. pyegeria/mermaid_utilities.py +277 -72
  13. {pyegeria-5.3.3.12.dist-info → pyegeria-5.3.3.13.dist-info}/METADATA +1 -1
  14. {pyegeria-5.3.3.12.dist-info → pyegeria-5.3.3.13.dist-info}/RECORD +19 -94
  15. pyegeria/.DS_Store +0 -0
  16. pyegeria/commands/.DS_Store +0 -0
  17. pyegeria/commands/__pycache__/__init__.cpython-312.pyc +0 -0
  18. pyegeria/commands/__pycache__/server_status_widget.cpython-312-pytest-7.4.4.pyc +0 -0
  19. pyegeria/commands/cat/__pycache__/__init__.cpython-312.pyc +0 -0
  20. pyegeria/commands/cat/__pycache__/get_asset_graph.cpython-312.pyc +0 -0
  21. pyegeria/commands/cat/__pycache__/get_collection.cpython-312.pyc +0 -0
  22. pyegeria/commands/cat/__pycache__/get_project_dependencies.cpython-312.pyc +0 -0
  23. pyegeria/commands/cat/__pycache__/get_project_structure.cpython-312.pyc +0 -0
  24. pyegeria/commands/cat/__pycache__/get_tech_type_elements.cpython-312.pyc +0 -0
  25. pyegeria/commands/cat/__pycache__/glossary_actions.cpython-312.pyc +0 -0
  26. pyegeria/commands/cat/__pycache__/list_assets.cpython-312.pyc +0 -0
  27. pyegeria/commands/cat/__pycache__/list_cert_types.cpython-312.pyc +0 -0
  28. pyegeria/commands/cat/__pycache__/list_collections.cpython-312.pyc +0 -0
  29. pyegeria/commands/cat/__pycache__/list_deployed_catalogs.cpython-312.pyc +0 -0
  30. pyegeria/commands/cat/__pycache__/list_deployed_database_schemas.cpython-312.pyc +0 -0
  31. pyegeria/commands/cat/__pycache__/list_deployed_databases.cpython-312.pyc +0 -0
  32. pyegeria/commands/cat/__pycache__/list_glossaries.cpython-312.pyc +0 -0
  33. pyegeria/commands/cat/__pycache__/list_projects.cpython-312.pyc +0 -0
  34. pyegeria/commands/cat/__pycache__/list_servers_deployed_imp.cpython-312.pyc +0 -0
  35. pyegeria/commands/cat/__pycache__/list_tech_type_elements.cpython-312.pyc +0 -0
  36. pyegeria/commands/cat/__pycache__/list_tech_types.cpython-312.pyc +0 -0
  37. pyegeria/commands/cat/__pycache__/list_terms.cpython-312.pyc +0 -0
  38. pyegeria/commands/cat/__pycache__/list_todos.cpython-312.pyc +0 -0
  39. pyegeria/commands/cat/__pycache__/list_user_ids.cpython-312.pyc +0 -0
  40. pyegeria/commands/cli/__pycache__/__init__.cpython-312.pyc +0 -0
  41. pyegeria/commands/cli/__pycache__/egeria_login_tui.cpython-312.pyc +0 -0
  42. pyegeria/commands/cli/__pycache__/egeria_ops.cpython-312.pyc +0 -0
  43. pyegeria/commands/cli/__pycache__/ops_config.cpython-312.pyc +0 -0
  44. pyegeria/commands/doc/.DS_Store +0 -0
  45. pyegeria/commands/doc/Visual Command Reference/.DS_Store +0 -0
  46. pyegeria/commands/doc/Visual Command Reference/cat/.DS_Store +0 -0
  47. pyegeria/commands/doc/Visual Command Reference/cat/show/.DS_Store +0 -0
  48. pyegeria/commands/doc/Visual Command Reference/cat/show/deployed-data/.DS_Store +0 -0
  49. pyegeria/commands/doc/glossary/.DS_Store +0 -0
  50. pyegeria/commands/doc/glossary/images/.DS_Store +0 -0
  51. pyegeria/commands/doc/hey_egeria: a pyegeria command line interface/.DS_Store +0 -0
  52. pyegeria/commands/doc/hey_egeria: a pyegeria command line interface/images/.DS_Store +0 -0
  53. pyegeria/commands/my/__pycache__/__init__.cpython-312.pyc +0 -0
  54. pyegeria/commands/my/__pycache__/list_my_profile.cpython-312.pyc +0 -0
  55. pyegeria/commands/my/__pycache__/list_my_roles.cpython-312.pyc +0 -0
  56. pyegeria/commands/my/__pycache__/monitor_my_todos.cpython-312.pyc +0 -0
  57. pyegeria/commands/my/__pycache__/monitor_open_todos.cpython-312.pyc +0 -0
  58. pyegeria/commands/my/__pycache__/todo_actions.cpython-312.pyc +0 -0
  59. pyegeria/commands/ops/__pycache__/__init__.cpython-312.pyc +0 -0
  60. pyegeria/commands/ops/__pycache__/gov_server_actions.cpython-312.pyc +0 -0
  61. pyegeria/commands/ops/__pycache__/list_archives.cpython-312.pyc +0 -0
  62. pyegeria/commands/ops/__pycache__/list_catalog_targets.cpython-312.pyc +0 -0
  63. pyegeria/commands/ops/__pycache__/load_archive.cpython-312.pyc +0 -0
  64. pyegeria/commands/ops/__pycache__/monitor_engine_activity.cpython-312.pyc +0 -0
  65. pyegeria/commands/ops/__pycache__/monitor_engine_activity_c.cpython-312.pyc +0 -0
  66. pyegeria/commands/ops/__pycache__/monitor_gov_eng_status.cpython-312.pyc +0 -0
  67. pyegeria/commands/ops/__pycache__/monitor_integ_daemon_status.cpython-312.pyc +0 -0
  68. pyegeria/commands/ops/__pycache__/monitor_platform_status.cpython-312.pyc +0 -0
  69. pyegeria/commands/ops/__pycache__/monitor_server_startup.cpython-312.pyc +0 -0
  70. pyegeria/commands/ops/__pycache__/monitor_server_status.cpython-312.pyc +0 -0
  71. pyegeria/commands/ops/__pycache__/refresh_integration_daemon.cpython-312.pyc +0 -0
  72. pyegeria/commands/ops/__pycache__/restart_integration_daemon.cpython-312.pyc +0 -0
  73. pyegeria/commands/ops/__pycache__/table_integ_daemon_status.cpython-312.pyc +0 -0
  74. pyegeria/commands/tech/__pycache__/__init__.cpython-312.pyc +0 -0
  75. pyegeria/commands/tech/__pycache__/get_element_info.cpython-312.pyc +0 -0
  76. pyegeria/commands/tech/__pycache__/get_guid_info.cpython-312.pyc +0 -0
  77. pyegeria/commands/tech/__pycache__/get_tech_details.cpython-312.pyc +0 -0
  78. pyegeria/commands/tech/__pycache__/get_tech_type_template.cpython-312.pyc +0 -0
  79. pyegeria/commands/tech/__pycache__/list_anchored_elements.cpython-312.pyc +0 -0
  80. pyegeria/commands/tech/__pycache__/list_asset_types.cpython-312.pyc +0 -0
  81. pyegeria/commands/tech/__pycache__/list_elements_by_property_value.cpython-312.pyc +0 -0
  82. pyegeria/commands/tech/__pycache__/list_elements_for_classification.cpython-312.pyc +0 -0
  83. pyegeria/commands/tech/__pycache__/list_gov_action_processes.cpython-312.pyc +0 -0
  84. pyegeria/commands/tech/__pycache__/list_registered_services.cpython-312.pyc +0 -0
  85. pyegeria/commands/tech/__pycache__/list_related_specification.cpython-312.pyc +0 -0
  86. pyegeria/commands/tech/__pycache__/list_relationship_types.cpython-312.pyc +0 -0
  87. pyegeria/commands/tech/__pycache__/list_relationships.cpython-312.pyc +0 -0
  88. pyegeria/commands/tech/__pycache__/list_tech_templates.cpython-312.pyc +0 -0
  89. pyegeria/commands/tech/__pycache__/list_valid_metadata_values.cpython-312.pyc +0 -0
  90. pyegeria/commands/tech/work/mermaid_graphs/Clinical Trial Subject Onboarding.mmd +0 -49
  91. pyegeria/commands/tech/work/mermaid_graphs/Employee Expense Payment.mmd +0 -40
  92. pyegeria/commands/tech/work/mermaid_graphs/New Drug Product Information Distribution.mmd +0 -55
  93. pyegeria/commands/tech/work/mermaid_graphs/New Employee Onboarding.mmd +0 -52
  94. pyegeria/commands/tech/work/mermaid_graphs/Personalized Treatment Ordering.mmd +0 -57
  95. pyegeria/commands/tech/work/mermaid_graphs/{{displayName}}.mmd +0 -29
  96. /pyegeria/commands/tech/{list_isolution_blueprints.py → list_solution_blueprints.py} +0 -0
  97. /pyegeria/commands/tech/{list_isolution_blueprints2.py → list_solution_blueprints2.py} +0 -0
  98. {pyegeria-5.3.3.12.dist-info → pyegeria-5.3.3.13.dist-info}/LICENSE +0 -0
  99. {pyegeria-5.3.3.12.dist-info → pyegeria-5.3.3.13.dist-info}/WHEEL +0 -0
  100. {pyegeria-5.3.3.12.dist-info → pyegeria-5.3.3.13.dist-info}/entry_points.txt +0 -0
pyegeria/__init__.py CHANGED
@@ -68,7 +68,8 @@ from .create_tech_guid_lists import build_global_guid_lists
68
68
  from .classification_manager_omvs import ClassificationManager
69
69
  from .feedback_manager_omvs import FeedbackManager
70
70
  from .metadata_explorer_omvs import MetadataExplorer
71
- from .mermaid_utilities import load_mermaid, render_mermaid, generate_process_graph, save_mermaid_graph
71
+ from .mermaid_utilities import (load_mermaid, render_mermaid, generate_process_graph, save_mermaid_graph,
72
+ save_mermaid_html,construct_mermaid_html,parse_mermaid_code)
72
73
  from .egeria_my_client import EgeriaMy
73
74
 
74
75
  from .solution_architect_omvs import SolutionArchitect
@@ -21,10 +21,12 @@ from rich.text import Text
21
21
  from rich.tree import Tree
22
22
  from pyegeria.solution_architect_omvs import SolutionArchitect
23
23
  from pyegeria import (
24
- ProjectManager,
25
24
  UserNotAuthorizedException,
26
25
  PropertyServerException,
27
- InvalidParameterException, save_mermaid_graph,
26
+ InvalidParameterException,
27
+ save_mermaid_graph,
28
+ save_mermaid_html,
29
+
28
30
  )
29
31
 
30
32
  from pyegeria._exceptions import (
@@ -46,7 +48,7 @@ EGERIA_USER = os.environ.get("EGERIA_USER", "erinoverview")
46
48
  EGERIA_USER_PASSWORD = os.environ.get("EGERIA_USER_PASSWORD", "secret")
47
49
  EGERIA_JUPYTER = bool(os.environ.get("EGERIA_JUPYTER", "False"))
48
50
  EGERIA_WIDTH = int(os.environ.get("EGERIA_WIDTH", "150"))
49
- EGERIA_MERMAID_FOLDER = os.environ.get("EGERIA_MERMAID_FOLDER", "./work/mermaid_graphs")
51
+ EGERIA_MERMAID_FOLDER = os.environ.get("EGERIA_MERMAID_FOLDER", "work/mermaid_graphs")
50
52
 
51
53
  def supply_chain_viewer(
52
54
  search_string: str,
@@ -98,11 +100,12 @@ def supply_chain_viewer(
98
100
  sc_unique_name = f"{sc_qname}\n\n\t\t/\n\n{sc_guid}"
99
101
  sc_mermaid = sc.get("mermaidGraph",'---')
100
102
  if sc_mermaid != '---':
101
- link = save_mermaid_graph(sc_name, sc_mermaid, EGERIA_MERMAID_FOLDER )
102
- sc_mermaid_link = f"[link=file://:{link}]file://:{link}[/link])"
103
+ link = save_mermaid_html(sc_name, sc_mermaid, EGERIA_MERMAID_FOLDER )
104
+ sc_mermaid_link = f"file://:{link}"
105
+ # print("Visit my [link=https://www.willmcgugan.com]blog[/link]!")
103
106
  # sc_scope = Text(f"{sc_scope}\n\t\t/\n{sc_mermaid_link}")
104
- sc_scope = Text(f"{sc_scope}\n\t\t/\n{sc_mermaid_link}", style="underline")
105
- sc_scope.stylize("link " + sc_mermaid_link)
107
+ sc_scope = Text(f"{sc_scope}\n\t\t/\n[link={sc_mermaid_link}]{sc_mermaid_link}[/link]!", style="underline")
108
+ # sc_scope.stylize("link =" + sc_mermaid_link)
106
109
 
107
110
  table.add_row(sc_name, sc_unique_name, sc_purpose_str, sc_scope, sc_desc)
108
111
 
@@ -0,0 +1,135 @@
1
+
2
+ <html>
3
+ <head>
4
+ <style type="text/css">
5
+ #mySvgId {
6
+ width: 100%;
7
+ height: 100%;
8
+ overflow: hidden;
9
+ border: 1px solid #ccc;
10
+ position: relative;
11
+ margin-bottom: 10px;
12
+ }
13
+ svg {
14
+ cursor: grab;
15
+ }
16
+
17
+ </style>
18
+ </head>
19
+
20
+ <body>
21
+ <div id="graphDiv"></div>
22
+ <script src="https://bumbu.me/svg-pan-zoom/dist/svg-pan-zoom.min.js"></script>
23
+ <script type="module">
24
+ import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs';
25
+
26
+ mermaid.initialize({startOnLoad: false});
27
+ await mermaid.run({
28
+ querySelector: '.mermaid',
29
+ postRenderCallback: (id) => {
30
+ const container = document.getElementById("diagram-container");
31
+ const svgElement = container.querySelector("svg");
32
+
33
+ // Initialize Panzoom
34
+ const panzoomInstance = Panzoom(svgElement, {
35
+ maxScale: 5,
36
+ minScale: 0.5,
37
+ step: 0.1,
38
+ });
39
+
40
+ // Add mouse wheel zoom
41
+ container.addEventListener("wheel", (event) => {
42
+ panzoomInstance.zoomWithWheel(event);
43
+ });
44
+ }
45
+ });
46
+
47
+
48
+ const drawDiagram = async function () {
49
+ const element = document.querySelector('#graphDiv');
50
+ const graphDefinition = `
51
+ flowchart TD
52
+ %%{init: {"flowchart": {"htmlLabels": false}} }%%
53
+
54
+ 39a035f0-3b2b-45fe-adb8-ee8a19581f6a@{ shape: flip-tri, label: "*Information Supply Chain*
55
+ **Clinical Trial Subject Onboarding**"}
56
+ b5691fb0-7569-43c1-bd4c-11198a11e733@{ shape: text, label: "*Description*
57
+ **Delivering the data necessary to add a person as a subject in a clinical trial.**"}
58
+ 39a035f0-3b2b-45fe-adb8-ee8a19581f6a~~~b5691fb0-7569-43c1-bd4c-11198a11e733
59
+ 2338ad35-78eb-4920-8003-d522b3cecf6b@{ shape: text, label: "*Purpose*
60
+ **Ensure patient subject is aware of the process and potential risks in participation.**"}
61
+ b5691fb0-7569-43c1-bd4c-11198a11e733~~~2338ad35-78eb-4920-8003-d522b3cecf6b
62
+ 9f146a62-59f4-482b-8384-48b20ca76fa3@{ shape: text, label: "*Purpose*
63
+ **Ensure patient subject has given permission for Coco Pharmaceuticals to acquire, store and process their personal data needed for the clinical trial.**"}
64
+ 2338ad35-78eb-4920-8003-d522b3cecf6b~~~9f146a62-59f4-482b-8384-48b20ca76fa3
65
+ bd1d332d-6e86-4953-8f83-b0a03b5e738c@{ shape: text, label: "*Purpose*
66
+ **Ensure incoming data is validated and catalogued.**"}
67
+ 9f146a62-59f4-482b-8384-48b20ca76fa3~~~bd1d332d-6e86-4953-8f83-b0a03b5e738c
68
+ b58f5eba-9cf8-492d-bc86-966611bc7603@{ shape: text, label: "*Purpose*
69
+ **Ensure data and process owners are informed of key milestones and issues requiring attention.**"}
70
+ bd1d332d-6e86-4953-8f83-b0a03b5e738c~~~b58f5eba-9cf8-492d-bc86-966611bc7603
71
+ 1fd73811-9f3d-4599-9a22-1300e0931eff@{ shape: text, label: "*Purpose*
72
+ **Ensure the process of data capture and validation is transparent and auditable.**"}
73
+ b58f5eba-9cf8-492d-bc86-966611bc7603~~~1fd73811-9f3d-4599-9a22-1300e0931eff
74
+ style 39a035f0-3b2b-45fe-adb8-ee8a19581f6a color:#FFFFFF, fill:#004563, stroke:#b7c0c7
75
+ style 1fd73811-9f3d-4599-9a22-1300e0931eff color:#000000, fill:#F9F7ED, stroke:#b7c0c7
76
+ style b5691fb0-7569-43c1-bd4c-11198a11e733 color:#000000, fill:#F9F7ED, stroke:#b7c0c7
77
+ style 9f146a62-59f4-482b-8384-48b20ca76fa3 color:#000000, fill:#F9F7ED, stroke:#b7c0c7
78
+ style 2338ad35-78eb-4920-8003-d522b3cecf6b color:#000000, fill:#F9F7ED, stroke:#b7c0c7
79
+ style b58f5eba-9cf8-492d-bc86-966611bc7603 color:#000000, fill:#F9F7ED, stroke:#b7c0c7
80
+ style bd1d332d-6e86-4953-8f83-b0a03b5e738c color:#000000, fill:#F9F7ED, stroke:#b7c0c7`;
81
+ const {svg} = await mermaid.render('mySvgId', graphDefinition);
82
+ element.innerHTML = svg.replace(/( )*max-width:( 0-9\.)*px;/i, '');
83
+
84
+ var doPan = false;
85
+ var eventsHandler;
86
+ var panZoom;
87
+ var mousepos;
88
+
89
+ eventsHandler = {
90
+ haltEventListeners: ['mousedown', 'mousemove', 'mouseup']
91
+
92
+ , mouseDownHandler: function (ev) {
93
+ if (event.target.className == "[object SVGAnimatedString]") {
94
+ doPan = true;
95
+ mousepos = {x: ev.clientX, y: ev.clientY}
96
+ }
97
+ ;
98
+ }
99
+
100
+ , mouseMoveHandler: function (ev) {
101
+ if (doPan) {
102
+ panZoom.panBy({x: ev.clientX - mousepos.x, y: ev.clientY - mousepos.y});
103
+ mousepos = {x: ev.clientX, y: ev.clientY};
104
+ window.getSelection().removeAllRanges();
105
+ }
106
+ }
107
+
108
+ , mouseUpHandler: function (ev) {
109
+ doPan = false;
110
+ }
111
+
112
+ , init: function (options) {
113
+ options.svgElement.addEventListener('mousedown', this.mouseDownHandler, false);
114
+ options.svgElement.addEventListener('mousemove', this.mouseMoveHandler, false);
115
+ options.svgElement.addEventListener('mouseup', this.mouseUpHandler, false);
116
+ }
117
+
118
+ , destroy: function (options) {
119
+ options.svgElement.removeEventListener('mousedown', this.mouseDownHandler, false);
120
+ options.svgElement.removeEventListener('mousemove', this.mouseMoveHandler, false);
121
+ options.svgElement.removeEventListener('mouseup', this.mouseUpHandler, false);
122
+ }
123
+ }
124
+ panZoom = svgPanZoom('#mySvgId', {
125
+ zoomEnabled: true
126
+ , controlIconsEnabled: true
127
+ , fit: 1
128
+ , center: 1
129
+ , customEventsHandler: eventsHandler
130
+ })
131
+ };
132
+ await drawDiagram();
133
+ </script>
134
+ </body>
135
+
@@ -1,40 +1,79 @@
1
1
 
2
- <!DOCTYPE html>
3
- <html>
4
- <head>
5
- <script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script>
6
- </head>
7
- <body>
8
- <div class="mermaid">
9
- ---
10
- title: Information Supply Chain - Clinical Trial Treatment Validation [1f71e403-1187-4f03-a1dd-ae7dc105f06f]
11
- ---
12
- flowchart TD
2
+ <html>
3
+ <head>
4
+ <style type="text/css">
5
+ #mySvgId {
6
+ width: 100%;
7
+ height: 100%;
8
+ overflow: hidden;
9
+ border: 1px solid #ccc;
10
+ position: relative;
11
+ margin-bottom: 10px;
12
+ }
13
+ svg {
14
+ cursor: grab;
15
+ }
16
+
17
+ </style>
18
+ </head>
19
+
20
+ <body>
21
+ <div id="graphDiv"></div>
22
+ <script src="https://bumbu.me/svg-pan-zoom/dist/svg-pan-zoom.min.js"></script>
23
+ <script type="module">
24
+ import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs';
25
+
26
+ mermaid.initialize({startOnLoad: false});
27
+ await mermaid.run({
28
+ querySelector: '.mermaid',
29
+ postRenderCallback: (id) => {
30
+ const container = document.getElementById("diagram-container");
31
+ const svgElement = container.querySelector("svg");
32
+
33
+ // Initialize Panzoom
34
+ const panzoomInstance = Panzoom(svgElement, {
35
+ maxScale: 5,
36
+ minScale: 0.5,
37
+ step: 0.1,
38
+ });
39
+
40
+ // Add mouse wheel zoom
41
+ container.addEventListener("wheel", (event) => {
42
+ panzoomInstance.zoomWithWheel(event);
43
+ });
44
+ }
45
+ });
46
+
47
+
48
+ const drawDiagram = async function () {
49
+ const element = document.querySelector('#graphDiv');
50
+ const graphDefinition = `
51
+ flowchart TD
13
52
  %%{init: {"flowchart": {"htmlLabels": false}} }%%
14
53
 
15
54
  1f71e403-1187-4f03-a1dd-ae7dc105f06f@{ shape: flip-tri, label: "*Information Supply Chain*
16
55
  **Clinical Trial Treatment Validation**"}
17
- ca5c1980-a6e1-4c48-af90-d4aed6314aaf@{ shape: text, label: "*Description*
56
+ c5135483-a30c-4dfc-8729-54d306b0d2cc@{ shape: text, label: "*Description*
18
57
  **Delivering data relating to a clinical trial from the hospitals to the Coco Researchers so that they can then determine the efficacy of the treatment to report to the regulators.**"}
19
- 1f71e403-1187-4f03-a1dd-ae7dc105f06f~~~ca5c1980-a6e1-4c48-af90-d4aed6314aaf
20
- 278d35bd-0f2f-4f54-931f-6006d550360c@{ shape: text, label: "*Purpose*
58
+ 1f71e403-1187-4f03-a1dd-ae7dc105f06f~~~c5135483-a30c-4dfc-8729-54d306b0d2cc
59
+ 8033331a-7342-4a66-b85a-0aa1bd35b203@{ shape: text, label: "*Purpose*
21
60
  **Deliver patient measurement data from hospitals to data scientists in research.**"}
22
- ca5c1980-a6e1-4c48-af90-d4aed6314aaf~~~278d35bd-0f2f-4f54-931f-6006d550360c
23
- db603776-6152-49b0-9141-c16024c2268e@{ shape: text, label: "*Purpose*
61
+ c5135483-a30c-4dfc-8729-54d306b0d2cc~~~8033331a-7342-4a66-b85a-0aa1bd35b203
62
+ 25ca6519-ef83-4789-a8a9-ef08e8d195a0@{ shape: text, label: "*Purpose*
24
63
  **Ensure incoming data is only from certified hospitals.**"}
25
- 278d35bd-0f2f-4f54-931f-6006d550360c~~~db603776-6152-49b0-9141-c16024c2268e
26
- 0b74a538-54cd-4a20-9b6b-88d970361a69@{ shape: text, label: "*Purpose*
64
+ 8033331a-7342-4a66-b85a-0aa1bd35b203~~~25ca6519-ef83-4789-a8a9-ef08e8d195a0
65
+ 68c30b1a-d716-4a34-b656-7b53f21e0d38@{ shape: text, label: "*Purpose*
27
66
  **Ensure incoming data is validated and catalogued.**"}
28
- db603776-6152-49b0-9141-c16024c2268e~~~0b74a538-54cd-4a20-9b6b-88d970361a69
29
- f3d86b7b-0c4e-4f86-83f9-76680539091a@{ shape: text, label: "*Purpose*
67
+ 25ca6519-ef83-4789-a8a9-ef08e8d195a0~~~68c30b1a-d716-4a34-b656-7b53f21e0d38
68
+ 2e6b651b-1235-411d-87f7-5bbb25e91057@{ shape: text, label: "*Purpose*
30
69
  **Ensure data and process owners are informed of key milestones and issues requiring attention.**"}
31
- 0b74a538-54cd-4a20-9b6b-88d970361a69~~~f3d86b7b-0c4e-4f86-83f9-76680539091a
32
- 1a0c1a1c-c8e9-4556-9c47-537a07c230a6@{ shape: text, label: "*Purpose*
70
+ 68c30b1a-d716-4a34-b656-7b53f21e0d38~~~2e6b651b-1235-411d-87f7-5bbb25e91057
71
+ ded87798-758f-4cc2-895f-95467009fe41@{ shape: text, label: "*Purpose*
33
72
  **Ensure the process of data capture and treatment validation is transparent and auditable.**"}
34
- f3d86b7b-0c4e-4f86-83f9-76680539091a~~~1a0c1a1c-c8e9-4556-9c47-537a07c230a6
35
- 4b99798c-9918-47f0-9bad-3737cab1e07c@{ shape: text, label: "*Purpose*
73
+ 2e6b651b-1235-411d-87f7-5bbb25e91057~~~ded87798-758f-4cc2-895f-95467009fe41
74
+ baf2f019-afff-487d-9a40-4fcdce8f8b84@{ shape: text, label: "*Purpose*
36
75
  **Ensure the treatment validation report is complete and regulatory compliant.**"}
37
- 1a0c1a1c-c8e9-4556-9c47-537a07c230a6~~~4b99798c-9918-47f0-9bad-3737cab1e07c
76
+ ded87798-758f-4cc2-895f-95467009fe41~~~baf2f019-afff-487d-9a40-4fcdce8f8b84
38
77
  38635d38-f728-400d-a8ec-7c26e68b7c0f@{ shape: hex, label: "*Information Supply Chain Segment*
39
78
  **Weekly Measurements Onboarding**"}
40
79
  38635d38-f728-400d-a8ec-7c26e68b7c0f-->|"capture and catalog,
@@ -95,35 +134,82 @@ d48f579f-76d3-4c49-b1b4-575f5645a9d0-->|"retrieve patient data,
95
134
  **SolutionComponent:Treatment Assessment Report Validation and Delivery:V1.0**"}
96
135
  72a86eec-9734-4bc0-babb-4fec0aa7c9ff-->|"publish results,
97
136
  [Solution Linking Wire]"|0bf2547c-937c-41b6-814f-6284849271a1
98
- style 278d35bd-0f2f-4f54-931f-6006d550360c color:#000000, fill:#F9F7ED, stroke:#b7c0c7
99
137
  style 48bc201e-3d4e-4beb-bdb2-0fd9d134f6d5 color:#FFFFFF, fill:#838cc7, stroke:#3079ab
100
- style ca5c1980-a6e1-4c48-af90-d4aed6314aaf color:#000000, fill:#F9F7ED, stroke:#b7c0c7
101
- style f3d86b7b-0c4e-4f86-83f9-76680539091a color:#000000, fill:#F9F7ED, stroke:#b7c0c7
102
- style 0b74a538-54cd-4a20-9b6b-88d970361a69 color:#000000, fill:#F9F7ED, stroke:#b7c0c7
103
138
  style e4303326-e418-4f77-b8e7-fd5d34717594 color:#004563, fill:#b7c0c7, stroke:#004563
104
139
  style 4fc47e60-f1b5-469c-b666-e1f4570e749f color:#004563, fill:#b7c0c7, stroke:#004563
105
- style 1a0c1a1c-c8e9-4556-9c47-537a07c230a6 color:#000000, fill:#F9F7ED, stroke:#b7c0c7
140
+ style 2e6b651b-1235-411d-87f7-5bbb25e91057 color:#000000, fill:#F9F7ED, stroke:#b7c0c7
141
+ style ded87798-758f-4cc2-895f-95467009fe41 color:#000000, fill:#F9F7ED, stroke:#b7c0c7
106
142
  style 7f5dca65-50b4-4103-9ac7-3a406a09047a color:#FFFFFF, fill:#838cc7, stroke:#3079ab
107
143
  style ee2bb773-e630-4cf9-bdf1-7c2dd64fe4ec color:#FFFFFF, fill:#838cc7, stroke:#3079ab
144
+ style c5135483-a30c-4dfc-8729-54d306b0d2cc color:#000000, fill:#F9F7ED, stroke:#b7c0c7
108
145
  style a5d4d638-6836-47e5-99d0-fdcde637e13f color:#FFFFFF, fill:#838cc7, stroke:#3079ab
109
146
  style 72a86eec-9734-4bc0-babb-4fec0aa7c9ff color:#FFFFFF, fill:#838cc7, stroke:#3079ab
147
+ style baf2f019-afff-487d-9a40-4fcdce8f8b84 color:#000000, fill:#F9F7ED, stroke:#b7c0c7
110
148
  style 38635d38-f728-400d-a8ec-7c26e68b7c0f color:#004563, fill:#b7c0c7, stroke:#004563
111
149
  style 7edca02c-e726-4570-815c-280bdf5498b9 color:#004563, fill:#b7c0c7, stroke:#004563
112
150
  style b5c8da4c-f925-4cf1-8294-e43cd2c1a584 color:#FFFFFF, fill:#838cc7, stroke:#3079ab
113
151
  style 0bf2547c-937c-41b6-814f-6284849271a1 color:#FFFFFF, fill:#838cc7, stroke:#3079ab
114
152
  style d48f579f-76d3-4c49-b1b4-575f5645a9d0 color:#FFFFFF, fill:#838cc7, stroke:#3079ab
115
153
  style 1f71e403-1187-4f03-a1dd-ae7dc105f06f color:#FFFFFF, fill:#004563, stroke:#b7c0c7
116
- style db603776-6152-49b0-9141-c16024c2268e color:#000000, fill:#F9F7ED, stroke:#b7c0c7
154
+ style 25ca6519-ef83-4789-a8a9-ef08e8d195a0 color:#000000, fill:#F9F7ED, stroke:#b7c0c7
155
+ style 8033331a-7342-4a66-b85a-0aa1bd35b203 color:#000000, fill:#F9F7ED, stroke:#b7c0c7
117
156
  style 04ae768e-3816-47bc-bddb-c9ae25018684 color:#004563, fill:#b7c0c7, stroke:#004563
157
+ style 68c30b1a-d716-4a34-b656-7b53f21e0d38 color:#000000, fill:#F9F7ED, stroke:#b7c0c7
118
158
  style 26c07ca4-3b8e-484b-812b-36c1ace4b275 color:#FFFFFF, fill:#838cc7, stroke:#3079ab
119
- style 4b99798c-9918-47f0-9bad-3737cab1e07c color:#000000, fill:#F9F7ED, stroke:#b7c0c7
120
159
  style 1c150d6e-30cf-481c-9afb-3b06c9c9e78f color:#FFFFFF, fill:#838cc7, stroke:#3079ab
121
- style 07705e15-efff-4f80-8992-f04ac85e0ef1 color:#FFFFFF, fill:#838cc7, stroke:#3079ab
122
-
123
- </div>
124
-
125
- <script>
126
- mermaid.initialize({startOnLoad:true});
127
- </script>
128
- </body>
129
- </html>
160
+ style 07705e15-efff-4f80-8992-f04ac85e0ef1 color:#FFFFFF, fill:#838cc7, stroke:#3079ab`;
161
+ const {svg} = await mermaid.render('mySvgId', graphDefinition);
162
+ element.innerHTML = svg.replace(/( )*max-width:( 0-9\.)*px;/i, '');
163
+
164
+ var doPan = false;
165
+ var eventsHandler;
166
+ var panZoom;
167
+ var mousepos;
168
+
169
+ eventsHandler = {
170
+ haltEventListeners: ['mousedown', 'mousemove', 'mouseup']
171
+
172
+ , mouseDownHandler: function (ev) {
173
+ if (event.target.className == "[object SVGAnimatedString]") {
174
+ doPan = true;
175
+ mousepos = {x: ev.clientX, y: ev.clientY}
176
+ }
177
+ ;
178
+ }
179
+
180
+ , mouseMoveHandler: function (ev) {
181
+ if (doPan) {
182
+ panZoom.panBy({x: ev.clientX - mousepos.x, y: ev.clientY - mousepos.y});
183
+ mousepos = {x: ev.clientX, y: ev.clientY};
184
+ window.getSelection().removeAllRanges();
185
+ }
186
+ }
187
+
188
+ , mouseUpHandler: function (ev) {
189
+ doPan = false;
190
+ }
191
+
192
+ , init: function (options) {
193
+ options.svgElement.addEventListener('mousedown', this.mouseDownHandler, false);
194
+ options.svgElement.addEventListener('mousemove', this.mouseMoveHandler, false);
195
+ options.svgElement.addEventListener('mouseup', this.mouseUpHandler, false);
196
+ }
197
+
198
+ , destroy: function (options) {
199
+ options.svgElement.removeEventListener('mousedown', this.mouseDownHandler, false);
200
+ options.svgElement.removeEventListener('mousemove', this.mouseMoveHandler, false);
201
+ options.svgElement.removeEventListener('mouseup', this.mouseUpHandler, false);
202
+ }
203
+ }
204
+ panZoom = svgPanZoom('#mySvgId', {
205
+ zoomEnabled: true
206
+ , controlIconsEnabled: true
207
+ , fit: 1
208
+ , center: 1
209
+ , customEventsHandler: eventsHandler
210
+ })
211
+ };
212
+ await drawDiagram();
213
+ </script>
214
+ </body>
215
+
@@ -0,0 +1,126 @@
1
+
2
+ <html>
3
+ <head>
4
+ <style type="text/css">
5
+ #mySvgId {
6
+ width: 100%;
7
+ height: 100%;
8
+ overflow: hidden;
9
+ border: 1px solid #ccc;
10
+ position: relative;
11
+ margin-bottom: 10px;
12
+ }
13
+ svg {
14
+ cursor: grab;
15
+ }
16
+
17
+ </style>
18
+ </head>
19
+
20
+ <body>
21
+ <div id="graphDiv"></div>
22
+ <script src="https://bumbu.me/svg-pan-zoom/dist/svg-pan-zoom.min.js"></script>
23
+ <script type="module">
24
+ import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs';
25
+
26
+ mermaid.initialize({startOnLoad: false});
27
+ await mermaid.run({
28
+ querySelector: '.mermaid',
29
+ postRenderCallback: (id) => {
30
+ const container = document.getElementById("diagram-container");
31
+ const svgElement = container.querySelector("svg");
32
+
33
+ // Initialize Panzoom
34
+ const panzoomInstance = Panzoom(svgElement, {
35
+ maxScale: 5,
36
+ minScale: 0.5,
37
+ step: 0.1,
38
+ });
39
+
40
+ // Add mouse wheel zoom
41
+ container.addEventListener("wheel", (event) => {
42
+ panzoomInstance.zoomWithWheel(event);
43
+ });
44
+ }
45
+ });
46
+
47
+
48
+ const drawDiagram = async function () {
49
+ const element = document.querySelector('#graphDiv');
50
+ const graphDefinition = `
51
+ flowchart TD
52
+ %%{init: {"flowchart": {"htmlLabels": false}} }%%
53
+
54
+ 79d1d83f-6a37-4c32-bf3f-eb8b4358027c@{ shape: flip-tri, label: "*Information Supply Chain*
55
+ **Employee Expense Payment**"}
56
+ 36905eb3-ebc3-4f78-92bd-81ab7f04b0c8@{ shape: text, label: "*Description*
57
+ **Managing the collection of expense data, its approval and the subsequent payment authorization flows.**"}
58
+ 79d1d83f-6a37-4c32-bf3f-eb8b4358027c~~~36905eb3-ebc3-4f78-92bd-81ab7f04b0c8
59
+ 64023ff1-9b61-4655-aa0c-6310961f6d19@{ shape: text, label: "*Purpose*
60
+ **Ensure employees are reimbursed for their expenses in a timely manner.**"}
61
+ 36905eb3-ebc3-4f78-92bd-81ab7f04b0c8~~~64023ff1-9b61-4655-aa0c-6310961f6d19
62
+ 88c42780-6fb1-49e2-a584-8af90cdc7728@{ shape: rounded, label: "*Software Server*
63
+ **System:coco-hrim**"}
64
+ ad8eab54-c2f7-494d-82d0-bf5985e5a58d@{ shape: rounded, label: "*Software Server*
65
+ **System:coco-expenses**"}
66
+ 88c42780-6fb1-49e2-a584-8af90cdc7728-->|"payment authorization [Data Flow]"|ad8eab54-c2f7-494d-82d0-bf5985e5a58d
67
+ style ad8eab54-c2f7-494d-82d0-bf5985e5a58d color:#000000, fill:#e0ab18, stroke:#004563
68
+ style 79d1d83f-6a37-4c32-bf3f-eb8b4358027c color:#FFFFFF, fill:#004563, stroke:#b7c0c7
69
+ style 64023ff1-9b61-4655-aa0c-6310961f6d19 color:#000000, fill:#F9F7ED, stroke:#b7c0c7
70
+ style 88c42780-6fb1-49e2-a584-8af90cdc7728 color:#000000, fill:#e0ab18, stroke:#004563
71
+ style 36905eb3-ebc3-4f78-92bd-81ab7f04b0c8 color:#000000, fill:#F9F7ED, stroke:#b7c0c7`;
72
+ const {svg} = await mermaid.render('mySvgId', graphDefinition);
73
+ element.innerHTML = svg.replace(/( )*max-width:( 0-9\.)*px;/i, '');
74
+
75
+ var doPan = false;
76
+ var eventsHandler;
77
+ var panZoom;
78
+ var mousepos;
79
+
80
+ eventsHandler = {
81
+ haltEventListeners: ['mousedown', 'mousemove', 'mouseup']
82
+
83
+ , mouseDownHandler: function (ev) {
84
+ if (event.target.className == "[object SVGAnimatedString]") {
85
+ doPan = true;
86
+ mousepos = {x: ev.clientX, y: ev.clientY}
87
+ }
88
+ ;
89
+ }
90
+
91
+ , mouseMoveHandler: function (ev) {
92
+ if (doPan) {
93
+ panZoom.panBy({x: ev.clientX - mousepos.x, y: ev.clientY - mousepos.y});
94
+ mousepos = {x: ev.clientX, y: ev.clientY};
95
+ window.getSelection().removeAllRanges();
96
+ }
97
+ }
98
+
99
+ , mouseUpHandler: function (ev) {
100
+ doPan = false;
101
+ }
102
+
103
+ , init: function (options) {
104
+ options.svgElement.addEventListener('mousedown', this.mouseDownHandler, false);
105
+ options.svgElement.addEventListener('mousemove', this.mouseMoveHandler, false);
106
+ options.svgElement.addEventListener('mouseup', this.mouseUpHandler, false);
107
+ }
108
+
109
+ , destroy: function (options) {
110
+ options.svgElement.removeEventListener('mousedown', this.mouseDownHandler, false);
111
+ options.svgElement.removeEventListener('mousemove', this.mouseMoveHandler, false);
112
+ options.svgElement.removeEventListener('mouseup', this.mouseUpHandler, false);
113
+ }
114
+ }
115
+ panZoom = svgPanZoom('#mySvgId', {
116
+ zoomEnabled: true
117
+ , controlIconsEnabled: true
118
+ , fit: 1
119
+ , center: 1
120
+ , customEventsHandler: eventsHandler
121
+ })
122
+ };
123
+ await drawDiagram();
124
+ </script>
125
+ </body>
126
+
@@ -0,0 +1,141 @@
1
+
2
+ <html>
3
+ <head>
4
+ <style type="text/css">
5
+ #mySvgId {
6
+ width: 100%;
7
+ height: 100%;
8
+ overflow: hidden;
9
+ border: 1px solid #ccc;
10
+ position: relative;
11
+ margin-bottom: 10px;
12
+ }
13
+ svg {
14
+ cursor: grab;
15
+ }
16
+
17
+ </style>
18
+ </head>
19
+
20
+ <body>
21
+ <div id="graphDiv"></div>
22
+ <script src="https://bumbu.me/svg-pan-zoom/dist/svg-pan-zoom.min.js"></script>
23
+ <script type="module">
24
+ import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs';
25
+
26
+ mermaid.initialize({startOnLoad: false});
27
+ await mermaid.run({
28
+ querySelector: '.mermaid',
29
+ postRenderCallback: (id) => {
30
+ const container = document.getElementById("diagram-container");
31
+ const svgElement = container.querySelector("svg");
32
+
33
+ // Initialize Panzoom
34
+ const panzoomInstance = Panzoom(svgElement, {
35
+ maxScale: 5,
36
+ minScale: 0.5,
37
+ step: 0.1,
38
+ });
39
+
40
+ // Add mouse wheel zoom
41
+ container.addEventListener("wheel", (event) => {
42
+ panzoomInstance.zoomWithWheel(event);
43
+ });
44
+ }
45
+ });
46
+
47
+
48
+ const drawDiagram = async function () {
49
+ const element = document.querySelector('#graphDiv');
50
+ const graphDefinition = `
51
+ flowchart TD
52
+ %%{init: {"flowchart": {"htmlLabels": false}} }%%
53
+
54
+ b0491fd4-6324-4ed8-9a1c-7cbd9892e21b@{ shape: flip-tri, label: "*Information Supply Chain*
55
+ **New Drug Product Information Distribution**"}
56
+ 63306fd5-4973-4764-89be-ef4ca645d67b@{ shape: text, label: "*Description*
57
+ **Managing the distribution of information about a new product.**"}
58
+ b0491fd4-6324-4ed8-9a1c-7cbd9892e21b~~~63306fd5-4973-4764-89be-ef4ca645d67b
59
+ 961a3438-3969-468f-b0e9-055ea0405fd9@{ shape: text, label: "*Purpose*
60
+ **Ensuring information about a new product is distributed to all of the appropriate system so that it is visible for ordering, manufacturing and invoicing.**"}
61
+ 63306fd5-4973-4764-89be-ef4ca645d67b~~~961a3438-3969-468f-b0e9-055ea0405fd9
62
+ c24e9ea0-171a-46d8-a5d8-3fedcfe97aa4@{ shape: rounded, label: "*Software Server*
63
+ **System:MFCTRL9482**"}
64
+ 987df321-d940-4ce5-9ae1-8258736f0445@{ shape: rounded, label: "*Software Server*
65
+ **System:KCDEPOT01**"}
66
+ c24e9ea0-171a-46d8-a5d8-3fedcfe97aa4-->|"order ready [Data Flow]"|987df321-d940-4ce5-9ae1-8258736f0445
67
+ afefd870-5616-4f35-a557-774b88b96bef@{ shape: rounded, label: "*Software Server*
68
+ **System:EDDEPOT01**"}
69
+ c24e9ea0-171a-46d8-a5d8-3fedcfe97aa4-->|"order ready [Data Flow]"|afefd870-5616-4f35-a557-774b88b96bef
70
+ c7b1467a-dea2-4288-95e5-8e1bc3ab2ed3@{ shape: rounded, label: "*Software Server*
71
+ **System:WINCHDEPOT01**"}
72
+ c24e9ea0-171a-46d8-a5d8-3fedcfe97aa4-->|"order ready [Data Flow]"|c7b1467a-dea2-4288-95e5-8e1bc3ab2ed3
73
+ dd424526-24e9-4a10-a575-0700dfb8743a@{ shape: rounded, label: "*Software Server*
74
+ **System:cocoProducts**"}
75
+ a2e43afa-386a-4acd-ba1d-7773b368c34a@{ shape: rounded, label: "*Software Server*
76
+ **System:globalCRM**"}
77
+ dd424526-24e9-4a10-a575-0700dfb8743a-->|"new product offering [Data Flow]"|a2e43afa-386a-4acd-ba1d-7773b368c34a
78
+ style 63306fd5-4973-4764-89be-ef4ca645d67b color:#000000, fill:#F9F7ED, stroke:#b7c0c7
79
+ style b0491fd4-6324-4ed8-9a1c-7cbd9892e21b color:#FFFFFF, fill:#004563, stroke:#b7c0c7
80
+ style c24e9ea0-171a-46d8-a5d8-3fedcfe97aa4 color:#000000, fill:#e0ab18, stroke:#004563
81
+ style a2e43afa-386a-4acd-ba1d-7773b368c34a color:#000000, fill:#e0ab18, stroke:#004563
82
+ style 961a3438-3969-468f-b0e9-055ea0405fd9 color:#000000, fill:#F9F7ED, stroke:#b7c0c7
83
+ style 987df321-d940-4ce5-9ae1-8258736f0445 color:#000000, fill:#e0ab18, stroke:#004563
84
+ style c7b1467a-dea2-4288-95e5-8e1bc3ab2ed3 color:#000000, fill:#e0ab18, stroke:#004563
85
+ style dd424526-24e9-4a10-a575-0700dfb8743a color:#000000, fill:#e0ab18, stroke:#004563
86
+ style afefd870-5616-4f35-a557-774b88b96bef color:#000000, fill:#e0ab18, stroke:#004563`;
87
+ const {svg} = await mermaid.render('mySvgId', graphDefinition);
88
+ element.innerHTML = svg.replace(/( )*max-width:( 0-9\.)*px;/i, '');
89
+
90
+ var doPan = false;
91
+ var eventsHandler;
92
+ var panZoom;
93
+ var mousepos;
94
+
95
+ eventsHandler = {
96
+ haltEventListeners: ['mousedown', 'mousemove', 'mouseup']
97
+
98
+ , mouseDownHandler: function (ev) {
99
+ if (event.target.className == "[object SVGAnimatedString]") {
100
+ doPan = true;
101
+ mousepos = {x: ev.clientX, y: ev.clientY}
102
+ }
103
+ ;
104
+ }
105
+
106
+ , mouseMoveHandler: function (ev) {
107
+ if (doPan) {
108
+ panZoom.panBy({x: ev.clientX - mousepos.x, y: ev.clientY - mousepos.y});
109
+ mousepos = {x: ev.clientX, y: ev.clientY};
110
+ window.getSelection().removeAllRanges();
111
+ }
112
+ }
113
+
114
+ , mouseUpHandler: function (ev) {
115
+ doPan = false;
116
+ }
117
+
118
+ , init: function (options) {
119
+ options.svgElement.addEventListener('mousedown', this.mouseDownHandler, false);
120
+ options.svgElement.addEventListener('mousemove', this.mouseMoveHandler, false);
121
+ options.svgElement.addEventListener('mouseup', this.mouseUpHandler, false);
122
+ }
123
+
124
+ , destroy: function (options) {
125
+ options.svgElement.removeEventListener('mousedown', this.mouseDownHandler, false);
126
+ options.svgElement.removeEventListener('mousemove', this.mouseMoveHandler, false);
127
+ options.svgElement.removeEventListener('mouseup', this.mouseUpHandler, false);
128
+ }
129
+ }
130
+ panZoom = svgPanZoom('#mySvgId', {
131
+ zoomEnabled: true
132
+ , controlIconsEnabled: true
133
+ , fit: 1
134
+ , center: 1
135
+ , customEventsHandler: eventsHandler
136
+ })
137
+ };
138
+ await drawDiagram();
139
+ </script>
140
+ </body>
141
+