Skip to content

Commit 0466141

Browse files
committed
Added task version update sandbox page
1 parent 2061ef6 commit 0466141

File tree

4 files changed

+262
-3
lines changed

4 files changed

+262
-3
lines changed

src/hooks.server.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ export async function handle({ event, resolve }) {
6161
const isPublicPage =
6262
event.url.pathname == '/' ||
6363
event.url.pathname.startsWith('/auth') ||
64-
event.url.pathname.startsWith('/sandbox/jsonschema');
64+
event.url.pathname.startsWith('/sandbox');
6565

6666
if (isPublicPage) {
6767
logger.debug('Public page - No auth required');

src/routes/+layout.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
(!isSubPage($page.url.pathname, apiVersion) ||
2020
$page.url.pathname === '/v2/admin/jobs' ||
2121
$page.url.pathname === '/v1/admin/jobs') &&
22-
!$page.url.pathname.startsWith('/sandbox/jsonschema') &&
22+
!$page.url.pathname.startsWith('/sandbox') &&
2323
selectedSection !== 'home';
2424
2525
/**

src/routes/sandbox/+layout.server.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ const logger = getLogger('sandbox');
55

66
export async function load() {
77
if (import.meta.env.MODE !== 'development') {
8-
logger.warn('Sandbox page is disabled when mode is not development');
8+
logger.warn('Sandbox pages are disabled when mode is not development');
99
throw redirect(307, '/');
1010
}
1111
}
Lines changed: 259 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,259 @@
1+
<script>
2+
import { deepCopy } from '$lib/common/component_utilities';
3+
import { displayStandardErrorAlert } from '$lib/common/errors';
4+
import { stripNullAndEmptyObjectsAndArrays } from '$lib/components/common/jschema/schema_management';
5+
import JSchema from '$lib/components/v2/workflow/JSchema.svelte';
6+
import VersionUpdateFixArgs from '$lib/components/v2/workflow/VersionUpdateFixArgs.svelte';
7+
import { tick } from 'svelte';
8+
9+
let oldSchema = undefined;
10+
let oldSchemaData = {};
11+
12+
let oldJsonSchemaString = '';
13+
let oldJsonDataString = '{}';
14+
15+
let oldJsonSchemaError = '';
16+
let oldDataError = '';
17+
18+
let legacy = false;
19+
20+
/** @type {JSchema|undefined} */
21+
let oldJschemaComponent = undefined;
22+
23+
let newSchema = undefined;
24+
25+
let newJsonSchemaString = '';
26+
let newJsonSchemaError = '';
27+
28+
let dummyWorkflowTask = undefined;
29+
let dummyUpdateCandidate = undefined;
30+
31+
/** @type {VersionUpdateFixArgs} */
32+
let fixArgsComponent;
33+
34+
async function handleOldJsonSchemaStringChanged() {
35+
oldJsonSchemaError = '';
36+
if (oldJsonSchemaString === '') {
37+
oldSchema = undefined;
38+
return;
39+
}
40+
try {
41+
oldSchema = JSON.parse(oldJsonSchemaString);
42+
handleOldDataChanged();
43+
} catch (err) {
44+
oldSchema = undefined;
45+
oldJsonSchemaError = 'Invalid JSON';
46+
}
47+
}
48+
49+
function handleOldDataStringChanged() {
50+
oldDataError = '';
51+
oldDataError = '';
52+
try {
53+
oldSchemaData = JSON.parse(oldJsonDataString);
54+
} catch (err) {
55+
oldSchemaData = {};
56+
oldDataError = 'Invalid JSON';
57+
}
58+
}
59+
60+
function forceRedrawOld() {
61+
handleOldJsonSchemaStringChanged();
62+
handleOldDataStringChanged();
63+
}
64+
65+
function handleNewJsonSchemaStringChanged() {
66+
dummyWorkflowTask = undefined;
67+
dummyUpdateCandidate = undefined;
68+
newJsonSchemaError = '';
69+
if (newJsonSchemaString === '') {
70+
newSchema = undefined;
71+
return;
72+
}
73+
try {
74+
newSchema = JSON.parse(newJsonSchemaString);
75+
} catch (err) {
76+
newSchema = undefined;
77+
newJsonSchemaError = 'Invalid JSON';
78+
}
79+
}
80+
81+
/** @type {import('$lib/components/common/StandardErrorAlert.svelte').default|undefined} */
82+
let errorAlertOld;
83+
let oldValid = false;
84+
85+
async function validate() {
86+
try {
87+
errorAlertOld?.hide();
88+
oldValid = false;
89+
oldSchemaData = JSON.parse(oldJsonDataString);
90+
await tick();
91+
oldJschemaComponent?.validateArguments();
92+
oldValid = true;
93+
} catch (err) {
94+
errorAlertOld = displayStandardErrorAlert(err, `errorAlert-form-old`);
95+
dummyWorkflowTask = undefined;
96+
dummyUpdateCandidate = undefined;
97+
}
98+
}
99+
100+
async function handleOldDataChanged() {
101+
await tick();
102+
if (!oldJschemaComponent) {
103+
return;
104+
}
105+
const deepCopyArgs = deepCopy(oldJschemaComponent.getArguments());
106+
const updatedOldData = JSON.stringify(stripNullAndEmptyObjectsAndArrays(deepCopyArgs), null, 2);
107+
// Update the data only if something is changed, to avoid triggering uneccessary events
108+
if (updatedOldData !== oldJsonDataString) {
109+
oldJsonDataString = updatedOldData;
110+
}
111+
}
112+
113+
let displayTextarea = false;
114+
115+
async function tryVersionUpdate() {
116+
displayTextarea = false;
117+
if (!oldValid) {
118+
await validate();
119+
}
120+
if (!oldValid) {
121+
return;
122+
}
123+
createDummyObjects();
124+
await tick();
125+
displayTextarea = fixArgsComponent.checkArgumentsWithNewSchema();
126+
}
127+
128+
function check() {
129+
fixArgsComponent.check();
130+
}
131+
132+
function createDummyObjects() {
133+
dummyWorkflowTask = {
134+
id: 1,
135+
args_parallel: deepCopy(oldSchemaData),
136+
task_type: 'parallel',
137+
is_legacy_task: legacy
138+
};
139+
140+
dummyUpdateCandidate = {
141+
args_schema_parallel: newSchema
142+
};
143+
}
144+
</script>
145+
146+
<h1 class="fw-light">Sandbox page for task version update</h1>
147+
<p>This is a test page for the task version update</p>
148+
149+
<h2>Old schema</h2>
150+
151+
<div class="row">
152+
<div class="col-lg-6 mt-3">
153+
<div class="row">
154+
<div class="col">
155+
<div class="form-check form-switch">
156+
<input
157+
class="form-check-input"
158+
type="checkbox"
159+
role="switch"
160+
id="legacy"
161+
bind:checked={legacy}
162+
on:change={forceRedrawOld}
163+
/>
164+
<label class="form-check-label" for="legacy"> Legacy</label>
165+
</div>
166+
<div class="form-text">Changes the set of ignored properties (v1 or v2)</div>
167+
</div>
168+
</div>
169+
<div class="row has-validation mt-3 mb-2">
170+
<div class="col">
171+
<label for="jschema-old">JSON Schema</label>
172+
<textarea
173+
id="jschema-old"
174+
class="form-control"
175+
bind:value={oldJsonSchemaString}
176+
on:input={handleOldJsonSchemaStringChanged}
177+
class:is-invalid={oldJsonSchemaError}
178+
rows="10"
179+
/>
180+
<span class="invalid-feedback">{oldJsonSchemaError}</span>
181+
</div>
182+
</div>
183+
<div class="row has-validation mt-3 mb-2">
184+
<div class="col">
185+
<label for="jdata-old">Initial JSON data</label>
186+
<textarea
187+
id="jdata-old"
188+
class="form-control"
189+
bind:value={oldJsonDataString}
190+
on:input={handleOldDataStringChanged}
191+
class:is-invalid={oldDataError}
192+
rows="10"
193+
/>
194+
<span class="invalid-feedback">{oldDataError}</span>
195+
</div>
196+
</div>
197+
<div class="row mt-3 mb-2">
198+
<div class="col">
199+
<div id="errorAlert-form-old" />
200+
{#if oldValid}
201+
<div class="alert alert-success">Data is valid</div>
202+
{/if}
203+
<button class="btn btn-primary" on:click={validate}>Validate</button>
204+
</div>
205+
</div>
206+
</div>
207+
<div class="col-lg-6 mt-3">
208+
{#if oldSchema}
209+
<JSchema
210+
schema={oldSchema}
211+
schemaData={oldSchemaData}
212+
{legacy}
213+
bind:this={oldJschemaComponent}
214+
on:change={handleOldDataChanged}
215+
/>
216+
{/if}
217+
</div>
218+
</div>
219+
220+
<hr />
221+
222+
<h2 class="mt-2">New schema</h2>
223+
224+
<div class="row">
225+
<div class="col-lg-6 mt-3">
226+
<div class="row has-validation mb-2">
227+
<div class="col">
228+
<label for="jschema-new">JSON Schema</label>
229+
<textarea
230+
id="jschema-new"
231+
class="form-control"
232+
bind:value={newJsonSchemaString}
233+
on:input={handleNewJsonSchemaStringChanged}
234+
class:is-invalid={newJsonSchemaError}
235+
rows="10"
236+
/>
237+
<span class="invalid-feedback">{newJsonSchemaError}</span>
238+
</div>
239+
</div>
240+
</div>
241+
<div class="col-lg-6">
242+
{#if newSchema}
243+
<button class="btn btn-primary mt-4 mb-2" on:click={tryVersionUpdate}>
244+
Try version update
245+
</button>
246+
{#if dummyWorkflowTask && dummyUpdateCandidate}
247+
<VersionUpdateFixArgs
248+
workflowTask={dummyWorkflowTask}
249+
updateCandidate={dummyUpdateCandidate}
250+
parallel={true}
251+
bind:this={fixArgsComponent}
252+
/>
253+
{#if displayTextarea}
254+
<button type="button" class="btn btn-warning mt-3" on:click={check}> Check </button>
255+
{/if}
256+
{/if}
257+
{/if}
258+
</div>
259+
</div>

0 commit comments

Comments
 (0)