ultravisor 1.0.0 → 1.0.2

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 (96) hide show
  1. package/.babelrc +6 -0
  2. package/.browserslistrc +1 -0
  3. package/.browserslistrc-BACKUP +1 -0
  4. package/.gulpfile-quackage-config.json +7 -0
  5. package/.gulpfile-quackage.js +2 -0
  6. package/CONTRIBUTING.md +50 -0
  7. package/README.md +34 -0
  8. package/debug/Harness.js +2 -1
  9. package/docs/.nojekyll +0 -0
  10. package/docs/_sidebar.md +18 -0
  11. package/docs/_topbar.md +7 -0
  12. package/docs/architecture.md +103 -0
  13. package/docs/cover.md +15 -0
  14. package/docs/features/api.md +230 -0
  15. package/docs/features/cli.md +182 -0
  16. package/docs/features/configuration.md +245 -0
  17. package/docs/features/manifests.md +177 -0
  18. package/docs/features/operations.md +292 -0
  19. package/docs/features/scheduling.md +179 -0
  20. package/docs/features/tasks.md +1857 -0
  21. package/docs/index.html +39 -0
  22. package/docs/overview.md +75 -0
  23. package/docs/quickstart.md +167 -0
  24. package/docs/retold-catalog.json +24 -0
  25. package/docs/retold-keyword-index.json +19 -0
  26. package/package.json +5 -2
  27. package/source/Ultravisor.cjs +2 -2
  28. package/source/cli/Ultravisor-CLIProgram.cjs +38 -0
  29. package/source/cli/commands/Ultravisor-Command-ScheduleOperation.cjs +26 -2
  30. package/source/cli/commands/Ultravisor-Command-ScheduleTask.cjs +26 -2
  31. package/source/cli/commands/Ultravisor-Command-ScheduleView.cjs +22 -0
  32. package/source/cli/commands/Ultravisor-Command-SingleOperation.cjs +49 -1
  33. package/source/cli/commands/Ultravisor-Command-SingleTask.cjs +51 -1
  34. package/source/cli/commands/Ultravisor-Command-Stop.cjs +4 -0
  35. package/source/cli/commands/Ultravisor-Command-UpdateTask.cjs +91 -0
  36. package/source/config/Ultravisor-Default-Command-Configuration.cjs +6 -1
  37. package/source/services/Ultravisor-Hypervisor-Event-Base.cjs +18 -1
  38. package/source/services/Ultravisor-Hypervisor-State.cjs +213 -0
  39. package/source/services/Ultravisor-Hypervisor.cjs +225 -1
  40. package/source/services/Ultravisor-Operation-Manifest.cjs +150 -1
  41. package/source/services/Ultravisor-Operation.cjs +190 -1
  42. package/source/services/Ultravisor-Task.cjs +339 -1
  43. package/source/services/events/Ultravisor-Hypervisor-Event-Cron.cjs +71 -1
  44. package/source/services/tasks/Ultravisor-Task-Base.cjs +264 -0
  45. package/source/services/tasks/Ultravisor-Task-CollectValues.cjs +188 -0
  46. package/source/services/tasks/Ultravisor-Task-Command.cjs +65 -0
  47. package/source/services/tasks/Ultravisor-Task-CommandEach.cjs +190 -0
  48. package/source/services/tasks/Ultravisor-Task-Conditional.cjs +104 -0
  49. package/source/services/tasks/Ultravisor-Task-DateWindow.cjs +72 -0
  50. package/source/services/tasks/Ultravisor-Task-GeneratePagedOperation.cjs +336 -0
  51. package/source/services/tasks/Ultravisor-Task-LaunchOperation.cjs +143 -0
  52. package/source/services/tasks/Ultravisor-Task-LaunchTask.cjs +146 -0
  53. package/source/services/tasks/Ultravisor-Task-LineMatch.cjs +158 -0
  54. package/source/services/tasks/Ultravisor-Task-Request.cjs +56 -0
  55. package/source/services/tasks/Ultravisor-Task-Solver.cjs +89 -0
  56. package/source/services/tasks/Ultravisor-Task-TemplateString.cjs +93 -0
  57. package/source/services/tasks/rest/Ultravisor-Task-GetBinary.cjs +127 -0
  58. package/source/services/tasks/rest/Ultravisor-Task-GetJSON.cjs +119 -0
  59. package/source/services/tasks/rest/Ultravisor-Task-GetText.cjs +109 -0
  60. package/source/services/tasks/rest/Ultravisor-Task-GetXML.cjs +112 -0
  61. package/source/services/tasks/rest/Ultravisor-Task-RestRequest.cjs +499 -0
  62. package/source/services/tasks/rest/Ultravisor-Task-SendJSON.cjs +150 -0
  63. package/source/services/tasks/stagingfiles/Ultravisor-Task-CopyFile.cjs +110 -0
  64. package/source/services/tasks/stagingfiles/Ultravisor-Task-ListFiles.cjs +89 -0
  65. package/source/services/tasks/stagingfiles/Ultravisor-Task-ReadBinary.cjs +87 -0
  66. package/source/services/tasks/stagingfiles/Ultravisor-Task-ReadJSON.cjs +67 -0
  67. package/source/services/tasks/stagingfiles/Ultravisor-Task-ReadText.cjs +66 -0
  68. package/source/services/tasks/stagingfiles/Ultravisor-Task-ReadXML.cjs +69 -0
  69. package/source/services/tasks/stagingfiles/Ultravisor-Task-WriteBinary.cjs +95 -0
  70. package/source/services/tasks/stagingfiles/Ultravisor-Task-WriteJSON.cjs +96 -0
  71. package/source/services/tasks/stagingfiles/Ultravisor-Task-WriteText.cjs +99 -0
  72. package/source/services/tasks/stagingfiles/Ultravisor-Task-WriteXML.cjs +102 -0
  73. package/source/web_server/Ultravisor-API-Server.cjs +463 -3
  74. package/test/Ultravisor_tests.js +6097 -1
  75. package/webinterface/.babelrc +6 -0
  76. package/webinterface/.browserslistrc +1 -0
  77. package/webinterface/.browserslistrc-BACKUP +1 -0
  78. package/webinterface/.gulpfile-quackage-config.json +7 -0
  79. package/webinterface/.gulpfile-quackage.js +2 -0
  80. package/webinterface/css/ultravisor.css +121 -0
  81. package/webinterface/html/index.html +32 -0
  82. package/webinterface/package.json +39 -0
  83. package/webinterface/source/Pict-Application-Ultravisor-Configuration.json +15 -0
  84. package/webinterface/source/Pict-Application-Ultravisor.js +414 -0
  85. package/webinterface/source/providers/PictRouter-Ultravisor-Configuration.json +42 -0
  86. package/webinterface/source/views/PictView-Ultravisor-BottomBar.js +65 -0
  87. package/webinterface/source/views/PictView-Ultravisor-Dashboard.js +236 -0
  88. package/webinterface/source/views/PictView-Ultravisor-Layout.js +83 -0
  89. package/webinterface/source/views/PictView-Ultravisor-ManifestList.js +273 -0
  90. package/webinterface/source/views/PictView-Ultravisor-OperationEdit.js +243 -0
  91. package/webinterface/source/views/PictView-Ultravisor-OperationList.js +141 -0
  92. package/webinterface/source/views/PictView-Ultravisor-Schedule.js +280 -0
  93. package/webinterface/source/views/PictView-Ultravisor-TaskEdit.js +220 -0
  94. package/webinterface/source/views/PictView-Ultravisor-TaskList.js +248 -0
  95. package/webinterface/source/views/PictView-Ultravisor-TimingView.js +420 -0
  96. package/webinterface/source/views/PictView-Ultravisor-TopBar.js +147 -0
@@ -0,0 +1,6 @@
1
+ {
2
+ "presets": [
3
+ "@babel/preset-env"
4
+ ],
5
+ "sourceMaps": "both"
6
+ }
@@ -0,0 +1 @@
1
+ > 0.01%
@@ -0,0 +1 @@
1
+ since 2018
@@ -0,0 +1,7 @@
1
+ {
2
+ "EntrypointInputSourceFile": "/Users/stevenvelozo/Code/retold/modules/utility/ultravisor/webinterface/source/Pict-Application-Ultravisor.js",
3
+ "LibraryObjectName": "UltravisorWebinterface",
4
+ "LibraryOutputFolder": "/Users/stevenvelozo/Code/retold/modules/utility/ultravisor/webinterface/dist/",
5
+ "LibraryUniminifiedFileName": "ultravisor-webinterface.compatible.js",
6
+ "LibraryMinifiedFileName": "ultravisor-webinterface.compatible.min.js"
7
+ }
@@ -0,0 +1,2 @@
1
+ require('/Users/stevenvelozo/Code/retold/modules/utility/ultravisor/webinterface/node_modules/quackage/gulp/Quackage-Gulpfile.js');
2
+ require('/Users/stevenvelozo/Code/retold/modules/utility/ultravisor/webinterface/node_modules/quackage/gulp/Quackage-Gulpfile.js');
@@ -0,0 +1,121 @@
1
+ /* ============================================================================
2
+ Ultravisor Web Interface - Base Styles
3
+ ============================================================================ */
4
+
5
+ /* Reset and base */
6
+ *, *::before, *::after {
7
+ box-sizing: border-box;
8
+ }
9
+
10
+ html, body {
11
+ margin: 0;
12
+ padding: 0;
13
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
14
+ font-size: 16px;
15
+ line-height: 1.5;
16
+ color: #e0e0e0;
17
+ background-color: #1a1a2e;
18
+ -webkit-font-smoothing: antialiased;
19
+ -moz-osx-font-smoothing: grayscale;
20
+ }
21
+
22
+ /* Typography */
23
+ h1, h2, h3, h4, h5, h6 {
24
+ margin-top: 0;
25
+ line-height: 1.3;
26
+ color: #f0f0f0;
27
+ }
28
+
29
+ a {
30
+ color: #4fc3f7;
31
+ text-decoration: none;
32
+ }
33
+
34
+ a:hover {
35
+ color: #81d4fa;
36
+ }
37
+
38
+ /* Form elements */
39
+ input, select, textarea {
40
+ font-family: inherit;
41
+ font-size: 0.9em;
42
+ padding: 0.5em 0.75em;
43
+ border: 1px solid #3a3a5c;
44
+ border-radius: 4px;
45
+ background-color: #16213e;
46
+ color: #e0e0e0;
47
+ outline: none;
48
+ transition: border-color 0.15s;
49
+ }
50
+
51
+ input:focus, select:focus, textarea:focus {
52
+ border-color: #4fc3f7;
53
+ }
54
+
55
+ textarea {
56
+ resize: vertical;
57
+ }
58
+
59
+ button {
60
+ font-family: inherit;
61
+ font-size: 0.85em;
62
+ padding: 0.5em 1em;
63
+ border: none;
64
+ border-radius: 4px;
65
+ cursor: pointer;
66
+ transition: background-color 0.15s, opacity 0.15s;
67
+ }
68
+
69
+ button:hover {
70
+ opacity: 0.9;
71
+ }
72
+
73
+ /* Tables */
74
+ table {
75
+ width: 100%;
76
+ border-collapse: collapse;
77
+ }
78
+
79
+ th, td {
80
+ text-align: left;
81
+ padding: 0.6em 0.75em;
82
+ border-bottom: 1px solid #2a2a4a;
83
+ }
84
+
85
+ th {
86
+ color: #9e9ec0;
87
+ font-weight: 600;
88
+ font-size: 0.8em;
89
+ text-transform: uppercase;
90
+ letter-spacing: 0.05em;
91
+ }
92
+
93
+ /* Application container */
94
+ #Ultravisor-Application-Container {
95
+ min-height: 100vh;
96
+ }
97
+
98
+ /* Utility: scrollbar styling */
99
+ ::-webkit-scrollbar {
100
+ width: 8px;
101
+ }
102
+
103
+ ::-webkit-scrollbar-track {
104
+ background: #16213e;
105
+ }
106
+
107
+ ::-webkit-scrollbar-thumb {
108
+ background: #3a3a5c;
109
+ border-radius: 4px;
110
+ }
111
+
112
+ ::-webkit-scrollbar-thumb:hover {
113
+ background: #4a4a6c;
114
+ }
115
+
116
+ /* Responsive adjustments */
117
+ @media (max-width: 768px) {
118
+ html {
119
+ font-size: 14px;
120
+ }
121
+ }
@@ -0,0 +1,32 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
6
+ <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
7
+ <meta name="description" content="Ultravisor Task Server Web Interface">
8
+
9
+ <title>Ultravisor</title>
10
+
11
+ <!-- Application Stylesheet -->
12
+ <link href="css/ultravisor.css" rel="stylesheet">
13
+ <!-- PICT Dynamic View CSS Container -->
14
+ <style id="PICT-CSS"></style>
15
+
16
+ <!-- Load the PICT library -->
17
+ <script src="./js/pict.min.js" type="text/javascript"></script>
18
+ <!-- Bootstrap the Application -->
19
+ <script type="text/javascript">
20
+ //<![CDATA[
21
+ Pict.safeOnDocumentReady(() => { Pict.safeLoadPictApplication(UltravisorWebinterface, 2)});
22
+ //]]>
23
+ </script>
24
+ </head>
25
+ <body>
26
+ <!-- The root container for the Pict application -->
27
+ <div id="Ultravisor-Application-Container"></div>
28
+
29
+ <!-- Load the Ultravisor Web Interface PICT Application Bundle -->
30
+ <script src="./ultravisor-webinterface.min.js" type="text/javascript"></script>
31
+ </body>
32
+ </html>
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "ultravisor-webinterface",
3
+ "version": "0.0.1",
4
+ "description": "Ultravisor Task Server Web Interface",
5
+ "main": "source/Pict-Application-Ultravisor.js",
6
+ "scripts": {
7
+ "start": "node source/Pict-Application-Ultravisor.js",
8
+ "build": "npx quack build && npx quack copy"
9
+ },
10
+ "author": "steven velozo <steven@velozo.com>",
11
+ "license": "MIT",
12
+ "dependencies": {
13
+ "pict": "^1.0.343",
14
+ "pict-application": "^1.0.28",
15
+ "pict-router": "^1.0.4",
16
+ "pict-view": "^1.0.64",
17
+ "pict-provider": "^1.0.3"
18
+ },
19
+ "devDependencies": {
20
+ "quackage": "^1.0.41"
21
+ },
22
+ "copyFilesSettings": {
23
+ "whenFileExists": "overwrite"
24
+ },
25
+ "copyFiles": [
26
+ {
27
+ "from": "./html/*",
28
+ "to": "./dist/"
29
+ },
30
+ {
31
+ "from": "./css/**",
32
+ "to": "./dist/css/"
33
+ },
34
+ {
35
+ "from": "./node_modules/pict/dist/*",
36
+ "to": "./dist/js/"
37
+ }
38
+ ]
39
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "Name": "Ultravisor Web Interface",
3
+ "Hash": "Ultravisor",
4
+
5
+ "MainViewportViewIdentifier": "Ultravisor-Layout",
6
+
7
+ "AutoSolveAfterInitialize": true,
8
+ "AutoRenderMainViewportViewAfterInitialize": false,
9
+ "AutoRenderViewsAfterInitialize": false,
10
+
11
+ "pict_configuration":
12
+ {
13
+ "Product": "Ultravisor-Pict-Application"
14
+ }
15
+ }
@@ -0,0 +1,414 @@
1
+ const libPictApplication = require('pict-application');
2
+ const libPictRouter = require('pict-router');
3
+
4
+ // Views
5
+ const libViewLayout = require('./views/PictView-Ultravisor-Layout.js');
6
+ const libViewTopBar = require('./views/PictView-Ultravisor-TopBar.js');
7
+ const libViewBottomBar = require('./views/PictView-Ultravisor-BottomBar.js');
8
+ const libViewDashboard = require('./views/PictView-Ultravisor-Dashboard.js');
9
+ const libViewTaskList = require('./views/PictView-Ultravisor-TaskList.js');
10
+ const libViewTaskEdit = require('./views/PictView-Ultravisor-TaskEdit.js');
11
+ const libViewOperationList = require('./views/PictView-Ultravisor-OperationList.js');
12
+ const libViewOperationEdit = require('./views/PictView-Ultravisor-OperationEdit.js');
13
+ const libViewSchedule = require('./views/PictView-Ultravisor-Schedule.js');
14
+ const libViewManifestList = require('./views/PictView-Ultravisor-ManifestList.js');
15
+ const libViewTimingView = require('./views/PictView-Ultravisor-TimingView.js');
16
+
17
+ class UltravisorApplication extends libPictApplication
18
+ {
19
+ constructor(pFable, pOptions, pServiceHash)
20
+ {
21
+ super(pFable, pOptions, pServiceHash);
22
+
23
+ // Add the router provider with routes
24
+ this.pict.addProvider('PictRouter', require('./providers/PictRouter-Ultravisor-Configuration.json'), libPictRouter);
25
+
26
+ // Add the layout view (the shell that contains top bar, workspace, bottom bar)
27
+ this.pict.addView('Ultravisor-Layout', libViewLayout.default_configuration, libViewLayout);
28
+
29
+ // Add the top bar and bottom bar views
30
+ this.pict.addView('Ultravisor-TopBar', libViewTopBar.default_configuration, libViewTopBar);
31
+ this.pict.addView('Ultravisor-BottomBar', libViewBottomBar.default_configuration, libViewBottomBar);
32
+
33
+ // Add content views
34
+ this.pict.addView('Ultravisor-Dashboard', libViewDashboard.default_configuration, libViewDashboard);
35
+ this.pict.addView('Ultravisor-TaskList', libViewTaskList.default_configuration, libViewTaskList);
36
+ this.pict.addView('Ultravisor-TaskEdit', libViewTaskEdit.default_configuration, libViewTaskEdit);
37
+ this.pict.addView('Ultravisor-OperationList', libViewOperationList.default_configuration, libViewOperationList);
38
+ this.pict.addView('Ultravisor-OperationEdit', libViewOperationEdit.default_configuration, libViewOperationEdit);
39
+ this.pict.addView('Ultravisor-Schedule', libViewSchedule.default_configuration, libViewSchedule);
40
+ this.pict.addView('Ultravisor-ManifestList', libViewManifestList.default_configuration, libViewManifestList);
41
+ this.pict.addView('Ultravisor-TimingView', libViewTimingView.default_configuration, libViewTimingView);
42
+ }
43
+
44
+ onAfterInitializeAsync(fCallback)
45
+ {
46
+ // Initialize application state
47
+ this.pict.AppData.Ultravisor =
48
+ {
49
+ APIBaseURL: '',
50
+ ServerStatus: { Status: 'Unknown', ScheduleEntries: 0, ScheduleRunning: false },
51
+ Tasks: {},
52
+ TaskList: [],
53
+ Operations: {},
54
+ OperationList: [],
55
+ Schedule: [],
56
+ Manifests: [],
57
+ CurrentEditTask: null,
58
+ CurrentEditOperation: null
59
+ };
60
+
61
+ // Render the layout shell first, then the initial content
62
+ this.pict.views['Ultravisor-Layout'].render();
63
+
64
+ return super.onAfterInitializeAsync(fCallback);
65
+ }
66
+
67
+ navigateTo(pRoute)
68
+ {
69
+ this.pict.providers.PictRouter.navigate(pRoute);
70
+ }
71
+
72
+ showView(pViewIdentifier)
73
+ {
74
+ if (pViewIdentifier in this.pict.views)
75
+ {
76
+ this.pict.views[pViewIdentifier].render();
77
+ }
78
+ else
79
+ {
80
+ this.pict.log.warn(`View [${pViewIdentifier}] not found; falling back to dashboard.`);
81
+ this.pict.views['Ultravisor-Dashboard'].render();
82
+ }
83
+ }
84
+
85
+ // --- API Helper ---
86
+ apiCall(pMethod, pPath, pBody, fCallback)
87
+ {
88
+ let tmpURL = `${this.pict.AppData.Ultravisor.APIBaseURL}${pPath}`;
89
+ let tmpOptions = { method: pMethod, headers: { 'Content-Type': 'application/json' } };
90
+
91
+ if (pBody)
92
+ {
93
+ tmpOptions.body = JSON.stringify(pBody);
94
+ }
95
+
96
+ fetch(tmpURL, tmpOptions)
97
+ .then(
98
+ function (pResponse)
99
+ {
100
+ return pResponse.json();
101
+ })
102
+ .then(
103
+ function (pData)
104
+ {
105
+ if (typeof fCallback === 'function')
106
+ {
107
+ fCallback(null, pData);
108
+ }
109
+ })
110
+ .catch(
111
+ function (pError)
112
+ {
113
+ this.pict.log.error(`API call failed: ${pMethod} ${pPath}`, pError);
114
+ if (typeof fCallback === 'function')
115
+ {
116
+ fCallback(pError);
117
+ }
118
+ }.bind(this));
119
+ }
120
+
121
+ // --- Status ---
122
+ loadStatus(fCallback)
123
+ {
124
+ this.apiCall('GET', '/status', null,
125
+ function (pError, pData)
126
+ {
127
+ if (!pError && pData)
128
+ {
129
+ this.pict.AppData.Ultravisor.ServerStatus = pData;
130
+ }
131
+ if (typeof fCallback === 'function')
132
+ {
133
+ fCallback(pError, pData);
134
+ }
135
+ }.bind(this));
136
+ }
137
+
138
+ // --- Tasks ---
139
+ loadTasks(fCallback)
140
+ {
141
+ this.apiCall('GET', '/Task', null,
142
+ function (pError, pData)
143
+ {
144
+ if (!pError && pData)
145
+ {
146
+ this.pict.AppData.Ultravisor.TaskList = Array.isArray(pData) ? pData : [];
147
+ // Also index by GUIDTask
148
+ let tmpTasks = {};
149
+ for (let i = 0; i < this.pict.AppData.Ultravisor.TaskList.length; i++)
150
+ {
151
+ let tmpTask = this.pict.AppData.Ultravisor.TaskList[i];
152
+ tmpTasks[tmpTask.GUIDTask] = tmpTask;
153
+ }
154
+ this.pict.AppData.Ultravisor.Tasks = tmpTasks;
155
+ }
156
+ if (typeof fCallback === 'function')
157
+ {
158
+ fCallback(pError, pData);
159
+ }
160
+ }.bind(this));
161
+ }
162
+
163
+ saveTask(pTaskData, fCallback)
164
+ {
165
+ this.apiCall('POST', '/Task', pTaskData,
166
+ function (pError, pData)
167
+ {
168
+ if (typeof fCallback === 'function')
169
+ {
170
+ fCallback(pError, pData);
171
+ }
172
+ }.bind(this));
173
+ }
174
+
175
+ deleteTask(pGUIDTask, fCallback)
176
+ {
177
+ this.apiCall('DELETE', `/Task/${encodeURIComponent(pGUIDTask)}`, null,
178
+ function (pError, pData)
179
+ {
180
+ if (typeof fCallback === 'function')
181
+ {
182
+ fCallback(pError, pData);
183
+ }
184
+ }.bind(this));
185
+ }
186
+
187
+ executeTask(pGUIDTask, fCallback)
188
+ {
189
+ this.apiCall('GET', `/Task/${encodeURIComponent(pGUIDTask)}/Execute`, null,
190
+ function (pError, pData)
191
+ {
192
+ if (typeof fCallback === 'function')
193
+ {
194
+ fCallback(pError, pData);
195
+ }
196
+ }.bind(this));
197
+ }
198
+
199
+ // --- Operations ---
200
+ loadOperations(fCallback)
201
+ {
202
+ this.apiCall('GET', '/Operation', null,
203
+ function (pError, pData)
204
+ {
205
+ if (!pError && pData)
206
+ {
207
+ this.pict.AppData.Ultravisor.OperationList = Array.isArray(pData) ? pData : [];
208
+ let tmpOperations = {};
209
+ for (let i = 0; i < this.pict.AppData.Ultravisor.OperationList.length; i++)
210
+ {
211
+ let tmpOp = this.pict.AppData.Ultravisor.OperationList[i];
212
+ tmpOperations[tmpOp.GUIDOperation] = tmpOp;
213
+ }
214
+ this.pict.AppData.Ultravisor.Operations = tmpOperations;
215
+ }
216
+ if (typeof fCallback === 'function')
217
+ {
218
+ fCallback(pError, pData);
219
+ }
220
+ }.bind(this));
221
+ }
222
+
223
+ saveOperation(pOperationData, fCallback)
224
+ {
225
+ this.apiCall('POST', '/Operation', pOperationData,
226
+ function (pError, pData)
227
+ {
228
+ if (typeof fCallback === 'function')
229
+ {
230
+ fCallback(pError, pData);
231
+ }
232
+ }.bind(this));
233
+ }
234
+
235
+ deleteOperation(pGUIDOperation, fCallback)
236
+ {
237
+ this.apiCall('DELETE', `/Operation/${encodeURIComponent(pGUIDOperation)}`, null,
238
+ function (pError, pData)
239
+ {
240
+ if (typeof fCallback === 'function')
241
+ {
242
+ fCallback(pError, pData);
243
+ }
244
+ }.bind(this));
245
+ }
246
+
247
+ executeOperation(pGUIDOperation, fCallback)
248
+ {
249
+ this.apiCall('GET', `/Operation/${encodeURIComponent(pGUIDOperation)}/Execute`, null,
250
+ function (pError, pData)
251
+ {
252
+ if (typeof fCallback === 'function')
253
+ {
254
+ fCallback(pError, pData);
255
+ }
256
+ }.bind(this));
257
+ }
258
+
259
+ // --- Schedule ---
260
+ loadSchedule(fCallback)
261
+ {
262
+ this.apiCall('GET', '/Schedule', null,
263
+ function (pError, pData)
264
+ {
265
+ if (!pError && pData)
266
+ {
267
+ this.pict.AppData.Ultravisor.Schedule = Array.isArray(pData) ? pData : [];
268
+ }
269
+ if (typeof fCallback === 'function')
270
+ {
271
+ fCallback(pError, pData);
272
+ }
273
+ }.bind(this));
274
+ }
275
+
276
+ scheduleTask(pGUIDTask, pScheduleType, pParameters, fCallback)
277
+ {
278
+ this.apiCall('POST', '/Schedule/Task',
279
+ { GUIDTask: pGUIDTask, ScheduleType: pScheduleType, Parameters: pParameters },
280
+ function (pError, pData)
281
+ {
282
+ if (typeof fCallback === 'function')
283
+ {
284
+ fCallback(pError, pData);
285
+ }
286
+ }.bind(this));
287
+ }
288
+
289
+ scheduleOperation(pGUIDOperation, pScheduleType, pParameters, fCallback)
290
+ {
291
+ this.apiCall('POST', '/Schedule/Operation',
292
+ { GUIDOperation: pGUIDOperation, ScheduleType: pScheduleType, Parameters: pParameters },
293
+ function (pError, pData)
294
+ {
295
+ if (typeof fCallback === 'function')
296
+ {
297
+ fCallback(pError, pData);
298
+ }
299
+ }.bind(this));
300
+ }
301
+
302
+ removeScheduleEntry(pGUID, fCallback)
303
+ {
304
+ this.apiCall('DELETE', `/Schedule/${encodeURIComponent(pGUID)}`, null,
305
+ function (pError, pData)
306
+ {
307
+ if (typeof fCallback === 'function')
308
+ {
309
+ fCallback(pError, pData);
310
+ }
311
+ }.bind(this));
312
+ }
313
+
314
+ startSchedule(fCallback)
315
+ {
316
+ this.apiCall('GET', '/Schedule/Start', null,
317
+ function (pError, pData)
318
+ {
319
+ if (typeof fCallback === 'function')
320
+ {
321
+ fCallback(pError, pData);
322
+ }
323
+ }.bind(this));
324
+ }
325
+
326
+ stopSchedule(fCallback)
327
+ {
328
+ this.apiCall('GET', '/Schedule/Stop', null,
329
+ function (pError, pData)
330
+ {
331
+ if (typeof fCallback === 'function')
332
+ {
333
+ fCallback(pError, pData);
334
+ }
335
+ }.bind(this));
336
+ }
337
+
338
+ // --- Manifests ---
339
+ loadManifests(fCallback)
340
+ {
341
+ this.apiCall('GET', '/Manifest', null,
342
+ function (pError, pData)
343
+ {
344
+ if (!pError && pData)
345
+ {
346
+ this.pict.AppData.Ultravisor.Manifests = Array.isArray(pData) ? pData : [];
347
+ }
348
+ if (typeof fCallback === 'function')
349
+ {
350
+ fCallback(pError, pData);
351
+ }
352
+ }.bind(this));
353
+ }
354
+
355
+ loadManifest(pGUIDRun, fCallback)
356
+ {
357
+ this.apiCall('GET', `/Manifest/${encodeURIComponent(pGUIDRun)}`, null,
358
+ function (pError, pData)
359
+ {
360
+ if (typeof fCallback === 'function')
361
+ {
362
+ fCallback(pError, pData);
363
+ }
364
+ }.bind(this));
365
+ }
366
+
367
+ // --- Edit helpers ---
368
+ editTask(pGUIDTask)
369
+ {
370
+ if (pGUIDTask && this.pict.AppData.Ultravisor.Tasks[pGUIDTask])
371
+ {
372
+ this.pict.AppData.Ultravisor.CurrentEditTask = JSON.parse(JSON.stringify(this.pict.AppData.Ultravisor.Tasks[pGUIDTask]));
373
+ }
374
+ else
375
+ {
376
+ this.pict.AppData.Ultravisor.CurrentEditTask =
377
+ {
378
+ GUIDTask: '',
379
+ Code: '',
380
+ Name: '',
381
+ Type: 'Command',
382
+ Command: '',
383
+ URL: '',
384
+ Method: 'GET',
385
+ Parameters: '',
386
+ Description: ''
387
+ };
388
+ }
389
+ this.navigateTo('/TaskEdit');
390
+ }
391
+
392
+ editOperation(pGUIDOperation)
393
+ {
394
+ if (pGUIDOperation && this.pict.AppData.Ultravisor.Operations[pGUIDOperation])
395
+ {
396
+ this.pict.AppData.Ultravisor.CurrentEditOperation = JSON.parse(JSON.stringify(this.pict.AppData.Ultravisor.Operations[pGUIDOperation]));
397
+ }
398
+ else
399
+ {
400
+ this.pict.AppData.Ultravisor.CurrentEditOperation =
401
+ {
402
+ GUIDOperation: '',
403
+ Name: '',
404
+ Description: '',
405
+ Tasks: []
406
+ };
407
+ }
408
+ this.navigateTo('/OperationEdit');
409
+ }
410
+ }
411
+
412
+ module.exports = UltravisorApplication;
413
+
414
+ module.exports.default_configuration = require('./Pict-Application-Ultravisor-Configuration.json');
@@ -0,0 +1,42 @@
1
+ {
2
+ "ProviderIdentifier": "Pict-Router",
3
+
4
+ "AutoInitialize": true,
5
+ "AutoInitializeOrdinal": 0,
6
+
7
+ "Routes":
8
+ [
9
+ {
10
+ "path": "/Home",
11
+ "template": "{~LV:Pict.PictApplication.showView(`Ultravisor-Dashboard`)~}"
12
+ },
13
+ {
14
+ "path": "/Tasks",
15
+ "template": "{~LV:Pict.PictApplication.showView(`Ultravisor-TaskList`)~}"
16
+ },
17
+ {
18
+ "path": "/TaskEdit",
19
+ "template": "{~LV:Pict.PictApplication.showView(`Ultravisor-TaskEdit`)~}"
20
+ },
21
+ {
22
+ "path": "/Operations",
23
+ "template": "{~LV:Pict.PictApplication.showView(`Ultravisor-OperationList`)~}"
24
+ },
25
+ {
26
+ "path": "/OperationEdit",
27
+ "template": "{~LV:Pict.PictApplication.showView(`Ultravisor-OperationEdit`)~}"
28
+ },
29
+ {
30
+ "path": "/Schedule",
31
+ "template": "{~LV:Pict.PictApplication.showView(`Ultravisor-Schedule`)~}"
32
+ },
33
+ {
34
+ "path": "/Manifests",
35
+ "template": "{~LV:Pict.PictApplication.showView(`Ultravisor-ManifestList`)~}"
36
+ },
37
+ {
38
+ "path": "/Timing",
39
+ "template": "{~LV:Pict.PictApplication.showView(`Ultravisor-TimingView`)~}"
40
+ }
41
+ ]
42
+ }