@elixir-cloud/trs-filer 2.0.0-alpha.4 → 2.0.0-alpha.41

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 (35) hide show
  1. package/dist/chunks/chunk.3S22ENXV.js +252 -0
  2. package/dist/chunks/{chunk.JMC4ZIIA.js → chunk.DJ2LLCQL.js} +6 -5
  3. package/dist/chunks/{chunk.X4SIVSZN.js → chunk.DTNNXROY.js} +1 -1
  4. package/dist/chunks/{chunk.4N7ZYKCA.js → chunk.JW7KBVNO.js} +694 -659
  5. package/dist/chunks/chunk.S3NI7NKU.js +30 -0
  6. package/dist/chunks/chunk.TEZHVCRK.js +1 -0
  7. package/dist/chunks/{chunk.Q5GOJN3Z.js → chunk.WG3VQJ2S.js} +172 -30
  8. package/dist/components/index.js +5 -3
  9. package/dist/components/tool-create/index.js +5 -3
  10. package/dist/components/tool-create/tool-create.d.ts +66 -12
  11. package/dist/components/tool-create/tool-create.js +4 -2
  12. package/dist/components/tool-create/tw-styles.js +2 -1
  13. package/dist/custom-elements.json +289 -58
  14. package/dist/events/ecc-tool-create-failed.d.ts +6 -0
  15. package/dist/events/ecc-tool-create-input-changed.d.ts +6 -0
  16. package/dist/events/ecc-tool-create-validation-failed.d.ts +6 -0
  17. package/dist/events/{ecc-tool-create-success.d.ts → ecc-tool-created.d.ts} +2 -2
  18. package/dist/events/ecc-tools-changed.d.ts +6 -0
  19. package/dist/events/ecc-tools-selected.d.ts +6 -0
  20. package/dist/events/index.d.ts +6 -5
  21. package/dist/index.js +5 -3
  22. package/dist/providers/index.js +3 -0
  23. package/dist/providers/rest-trs-filer-provider.js +2 -0
  24. package/dist/providers/trs-filer-provider.d.ts +3 -3
  25. package/dist/providers/trs-filer-provider.js +1 -0
  26. package/dist/react/ecc-client-elixir-trs-tool-create/index.d.ts +48 -12
  27. package/dist/react/ecc-client-elixir-trs-tool-create/index.js +5 -3
  28. package/dist/react/index.js +5 -3
  29. package/dist/vscode.html-custom-data.json +1 -1
  30. package/dist/web-types.json +154 -73
  31. package/package.json +4 -4
  32. package/dist/events/ecc-tool-create-error.d.ts +0 -6
  33. package/dist/events/ecc-tool-create-validation-error.d.ts +0 -6
  34. package/dist/events/ecc-tools-change.d.ts +0 -6
  35. package/dist/events/ecc-tools-click.d.ts +0 -6
@@ -1,6 +1,9 @@
1
- import { ComponentStyles, __decorateClass, __spreadProps, __spreadValues } from './chunk.Q5GOJN3Z.js';
1
+ import { ComponentStyles } from './chunk.WG3VQJ2S.js';
2
+ import { RestTrsFilerProvider } from './chunk.3S22ENXV.js';
3
+ import { __decorateClass, __spreadProps, __spreadValues } from './chunk.S3NI7NKU.js';
2
4
  import { css, LitElement, html } from 'lit';
3
5
  import { property, state } from 'lit/decorators.js';
6
+ import JSZip from '@progress/jszip-esm';
4
7
  import '@elixir-cloud/design/components/button/index.js';
5
8
  import '@elixir-cloud/design/components/input/index.js';
6
9
  import '@elixir-cloud/design/components/select/index.js';
@@ -13,7 +16,6 @@ import '@elixir-cloud/design/components/tabs/index.js';
13
16
  import '@elixir-cloud/design/components/separator/index.js';
14
17
  import '@elixir-cloud/design/components/checkbox/index.js';
15
18
  import '@elixir-cloud/design/components/collapsible/index.js';
16
- import JSZip from '@progress/jszip-esm';
17
19
 
18
20
  var GlobalStyles = css`
19
21
  :host {
@@ -107,253 +109,26 @@ var GlobalStyles = css`
107
109
  --sidebar-ring: var(--ecc-sidebar-ring, oklch(0.439 0 0));
108
110
  }
109
111
  `;
110
-
111
- // src/providers/rest-trs-filer-provider.ts
112
- var RestTrsFilerProvider = class {
113
- constructor(baseUrl) {
114
- this.baseUrl = baseUrl;
115
- }
116
- async getToolClasses() {
117
- const url = `${this.baseUrl}/toolClasses`;
118
- const response = await fetch(url);
119
- if (!response.ok) {
120
- throw new Error(`Failed to fetch tool classes: ${response.statusText}`);
121
- }
122
- return response.json();
123
- }
124
- async getToolsList(limit, offset, filters, query) {
125
- let url = `${this.baseUrl}/tools?${limit ? `limit=${limit}&` : ""}${offset ? `offset=${offset}&` : ""}`;
126
- if (query && query.length > 0) {
127
- url += `&name=${encodeURIComponent(query)}`;
128
- }
129
- Object.entries(filters).forEach(([key, value]) => {
130
- if (value !== "" && value !== void 0 && key !== "offset") {
131
- url += `&${key}=${encodeURIComponent(String(value))}`;
132
- }
133
- });
134
- const response = await fetch(url);
135
- if (!response.ok) {
136
- throw new Error(`Failed to fetch tools: ${response.statusText}`);
137
- }
138
- return response.json();
139
- }
140
- async getTool(url, id) {
141
- const encodedToolId = encodeURIComponent(id);
142
- const response = await fetch(`${this.baseUrl}/tools/${encodedToolId}`);
143
- if (!response.ok) {
144
- throw new Error(`Failed to fetch tool: ${response.statusText}`);
145
- }
146
- return response.json();
147
- }
148
- async getToolVersions(url, id) {
149
- const encodedToolId = encodeURIComponent(id);
150
- const response = await fetch(
151
- `${this.baseUrl}/tools/${encodedToolId}/versions`
152
- );
153
- if (!response.ok) {
154
- throw new Error(`Failed to fetch tool versions: ${response.statusText}`);
155
- }
156
- return response.json();
157
- }
158
- async getToolVersion(url, id, versionId) {
159
- const encodedToolId = encodeURIComponent(id);
160
- const version = versionId.split(":")[1] ? versionId.split(":")[1] : versionId;
161
- const encodedVersionId = encodeURIComponent(version);
162
- const response = await fetch(
163
- `${this.baseUrl}/tools/${encodedToolId}/versions/${encodedVersionId}`
164
- );
165
- if (!response.ok) {
166
- throw new Error(`Failed to fetch tool version: ${response.statusText}`);
167
- }
168
- return response.json();
169
- }
170
- async getToolFiles(url, id, version, descriptorType, format) {
171
- const encodedToolId = encodeURIComponent(id);
172
- const versionPart = version.split(":")[1] ? version.split(":")[1] : version;
173
- const encodedVersionId = encodeURIComponent(versionPart);
174
- const encodedType = encodeURIComponent(descriptorType);
175
- let requestUrl = `${this.baseUrl}/tools/${encodedToolId}/versions/${encodedVersionId}/${encodedType}/files`;
176
- if (format) {
177
- requestUrl += `?format=${format}`;
178
- }
179
- const response = await fetch(requestUrl);
180
- if (!response.ok) {
181
- throw new Error(`Failed to fetch tool files: ${response.statusText}`);
182
- }
183
- return response.json();
184
- }
185
- async getToolDescriptor(url, id, version, descriptorType) {
186
- const encodedToolId = encodeURIComponent(id);
187
- const versionPart = version.split(":")[1] ? version.split(":")[1] : version;
188
- const encodedVersionId = encodeURIComponent(versionPart);
189
- const encodedType = encodeURIComponent(descriptorType);
190
- const response = await fetch(
191
- `${this.baseUrl}/tools/${encodedToolId}/versions/${encodedVersionId}/${encodedType}/descriptor`
192
- );
193
- if (!response.ok) {
194
- throw new Error(
195
- `Failed to fetch tool descriptor: ${response.statusText}`
196
- );
197
- }
198
- return response.json();
199
- }
200
- async getToolDescriptorByPath(url, id, version, descriptorType, path) {
201
- const encodedToolId = encodeURIComponent(id);
202
- const versionPart = version.split(":")[1] ? version.split(":")[1] : version;
203
- const encodedVersionId = encodeURIComponent(versionPart);
204
- const encodedType = encodeURIComponent(descriptorType);
205
- try {
206
- const response = await fetch(
207
- `${this.baseUrl}/tools/${encodedToolId}/versions/${encodedVersionId}/${encodedType}/descriptor/${path}`
208
- );
209
- if (response.ok) {
210
- return response.json();
211
- }
212
- const encodedPath = encodeURIComponent(path);
213
- const encodedResponse = await fetch(
214
- `${this.baseUrl}/tools/${encodedToolId}/versions/${encodedVersionId}/${encodedType}/descriptor/${encodedPath}`
215
- );
216
- if (encodedResponse.ok) {
217
- return encodedResponse.json();
218
- }
219
- throw new Error(
220
- `Failed to fetch tool descriptor by path: ${encodedResponse.statusText}`
221
- );
222
- } catch (error) {
223
- const encodedPath = encodeURIComponent(path);
224
- try {
225
- const encodedResponse = await fetch(
226
- `${this.baseUrl}/tools/${encodedToolId}/versions/${encodedVersionId}/${encodedType}/descriptor/${encodedPath}`
227
- );
228
- if (encodedResponse.ok) {
229
- return encodedResponse.json();
230
- }
231
- throw new Error(
232
- `Failed to fetch tool descriptor by path: ${encodedResponse.statusText}`
233
- );
234
- } catch (encodedError) {
235
- throw error;
236
- }
237
- }
238
- }
239
- async getContainerfile(url, id, version) {
240
- const encodedToolId = encodeURIComponent(id);
241
- const versionPart = version.split(":")[1] ? version.split(":")[1] : version;
242
- const encodedVersionId = encodeURIComponent(versionPart);
243
- const response = await fetch(
244
- `${this.baseUrl}/tools/${encodedToolId}/versions/${encodedVersionId}/containerfile`
245
- );
246
- if (!response.ok) {
247
- throw new Error(`Failed to fetch containerfile: ${response.statusText}`);
248
- }
249
- return response.json();
250
- }
251
- async getToolTests(url, id, version, descriptorType) {
252
- const encodedToolId = encodeURIComponent(id);
253
- const versionPart = version.split(":")[1] ? version.split(":")[1] : version;
254
- const encodedVersionId = encodeURIComponent(versionPart);
255
- const encodedType = encodeURIComponent(descriptorType);
256
- const response = await fetch(
257
- `${this.baseUrl}/tools/${encodedToolId}/versions/${encodedVersionId}/${encodedType}/tests`
258
- );
259
- if (!response.ok) {
260
- throw new Error(`Failed to fetch tool tests: ${response.statusText}`);
261
- }
262
- return response.json();
263
- }
264
- // Creation methods (TRS-Filer specific functionality)
265
- async createTool(tool) {
266
- console.log("Creating tool:", tool);
267
- const response = await fetch(`${this.baseUrl}/tools`, {
268
- method: "POST",
269
- headers: {
270
- "Content-Type": "application/json"
271
- },
272
- body: JSON.stringify(tool)
273
- });
274
- if (!response.ok) {
275
- throw new Error(`Failed to create tool: ${response.statusText}`);
276
- }
277
- return response.text();
278
- }
279
- async createToolWithId(id, tool) {
280
- const encodedToolId = encodeURIComponent(id);
281
- const response = await fetch(`${this.baseUrl}/tools/${encodedToolId}`, {
282
- method: "PUT",
283
- headers: {
284
- "Content-Type": "application/json"
285
- },
286
- body: JSON.stringify(tool)
287
- });
288
- if (!response.ok) {
289
- throw new Error(`Failed to create/update tool: ${response.statusText}`);
290
- }
291
- return response.text();
292
- }
293
- async createToolVersion(toolId, version) {
294
- const encodedToolId = encodeURIComponent(toolId);
295
- const response = await fetch(`${this.baseUrl}/tools/${encodedToolId}/versions`, {
296
- method: "POST",
297
- headers: {
298
- "Content-Type": "application/json"
299
- },
300
- body: JSON.stringify(version)
301
- });
302
- if (!response.ok) {
303
- throw new Error(`Failed to create tool version: ${response.statusText}`);
304
- }
305
- return response.text();
306
- }
307
- async createToolVersionWithId(toolId, versionId, version) {
308
- const encodedToolId = encodeURIComponent(toolId);
309
- const encodedVersionId = encodeURIComponent(versionId);
310
- const response = await fetch(
311
- `${this.baseUrl}/tools/${encodedToolId}/versions/${encodedVersionId}`,
312
- {
313
- method: "PUT",
314
- headers: {
315
- "Content-Type": "application/json"
316
- },
317
- body: JSON.stringify(version)
318
- }
319
- );
320
- if (!response.ok) {
321
- throw new Error(`Failed to create/update tool version: ${response.statusText}`);
322
- }
323
- return response.text();
324
- }
325
- async createToolClass(toolClass) {
326
- const response = await fetch(`${this.baseUrl}/toolClasses`, {
327
- method: "POST",
328
- headers: {
329
- "Content-Type": "application/json"
330
- },
331
- body: JSON.stringify(toolClass)
332
- });
333
- if (!response.ok) {
334
- throw new Error(`Failed to create tool class: ${response.statusText}`);
335
- }
336
- return response.text();
337
- }
338
- async createToolClassWithId(id, toolClass) {
339
- const encodedId = encodeURIComponent(id);
340
- const response = await fetch(`${this.baseUrl}/toolClasses/${encodedId}`, {
341
- method: "PUT",
342
- headers: {
343
- "Content-Type": "application/json"
344
- },
345
- body: JSON.stringify(toolClass)
346
- });
347
- if (!response.ok) {
348
- throw new Error(`Failed to create/update tool class: ${response.statusText}`);
349
- }
350
- return response.text();
351
- }
352
- };
353
- var ECCClientElixirTrsToolCreate = class extends LitElement {
112
+ var _ECCClientElixirTrsToolCreate = class _ECCClientElixirTrsToolCreate extends LitElement {
354
113
  constructor() {
355
114
  super(...arguments);
356
115
  this.baseUrl = "";
116
+ this.defaultName = "";
117
+ this.defaultOrganization = "";
118
+ this.defaultDescription = "";
119
+ this.defaultToolClassId = "";
120
+ this.defaultAliases = "";
121
+ this.defaultCheckerUrl = "";
122
+ this.defaultCustomToolId = "";
123
+ this.defaultVersionName = "";
124
+ this.defaultVersionAuthor = "";
125
+ this.defaultIsProduction = false;
126
+ this.defaultSigned = false;
127
+ this.defaultVerified = false;
128
+ this.defaultVerifiedSource = "";
129
+ this.defaultIncludedApps = "";
130
+ this.defaultCustomVersionId = "";
131
+ this.supportedDescriptorTypes = [];
357
132
  this.toolClasses = [];
358
133
  this.loading = false;
359
134
  this.error = null;
@@ -390,9 +165,10 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
390
165
  this.activeDescriptorType = {};
391
166
  }
392
167
  async firstUpdated() {
168
+ this.initializeFormWithDefaults();
393
169
  if (!this.baseUrl && !this.provider) {
394
170
  this.dispatchEvent(
395
- new CustomEvent("ecc-tool-create-validation-error", {
171
+ new CustomEvent("ecc-tool-create-validation-failed", {
396
172
  detail: {
397
173
  error: "Please provide either a base URL for the TRS API or a custom provider."
398
174
  },
@@ -413,21 +189,66 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
413
189
  await this.loadToolClasses();
414
190
  }
415
191
  }
192
+ initializeFormWithDefaults() {
193
+ this.formData = {
194
+ name: this.defaultName,
195
+ organization: this.defaultOrganization,
196
+ description: this.defaultDescription,
197
+ toolClassId: this.defaultToolClassId,
198
+ aliases: this.defaultAliases ? this.defaultAliases.split(",").map((s) => s.trim()).filter(Boolean) : [],
199
+ checkerUrl: this.defaultCheckerUrl,
200
+ hasChecker: Boolean(this.defaultCheckerUrl),
201
+ customToolId: this.defaultCustomToolId,
202
+ useCustomId: Boolean(this.defaultCustomToolId)
203
+ };
204
+ if (this.versions.length > 0) {
205
+ this.versions[0] = __spreadProps(__spreadValues({}, this.versions[0]), {
206
+ name: this.defaultVersionName,
207
+ author: this.defaultVersionAuthor ? this.defaultVersionAuthor.split(",").map((s) => s.trim()).filter(Boolean) : [],
208
+ isProduction: this.defaultIsProduction,
209
+ signed: this.defaultSigned,
210
+ verified: this.defaultVerified,
211
+ verifiedSource: this.defaultVerifiedSource ? this.defaultVerifiedSource.split(",").map((s) => s.trim()).filter(Boolean) : [],
212
+ includedApps: this.defaultIncludedApps ? this.defaultIncludedApps.split(",").map((s) => s.trim()).filter(Boolean) : [],
213
+ customVersionId: this.defaultCustomVersionId,
214
+ useCustomVersionId: Boolean(this.defaultCustomVersionId)
215
+ });
216
+ }
217
+ }
416
218
  updated(changedProperties) {
219
+ const defaultProps = [
220
+ "defaultName",
221
+ "defaultOrganization",
222
+ "defaultDescription",
223
+ "defaultToolClassId",
224
+ "defaultAliases",
225
+ "defaultCheckerUrl",
226
+ "defaultCustomToolId",
227
+ "defaultVersionName",
228
+ "defaultVersionAuthor",
229
+ "defaultIsProduction",
230
+ "defaultSigned",
231
+ "defaultVerified",
232
+ "defaultVerifiedSource",
233
+ "defaultIncludedApps",
234
+ "defaultCustomVersionId"
235
+ ];
236
+ if (defaultProps.some((prop) => changedProperties.has(prop))) {
237
+ this.initializeFormWithDefaults();
238
+ }
417
239
  if (changedProperties.has("baseUrl") && this.baseUrl) {
418
240
  this._provider = new RestTrsFilerProvider(this.baseUrl);
419
241
  this.loadToolClasses();
420
242
  }
421
243
  }
422
244
  async loadToolClasses() {
423
- if (!this._provider)
424
- return;
245
+ if (!this._provider) return;
425
246
  try {
426
247
  this.toolClasses = await this._provider.getToolClasses();
427
248
  } catch (error) {
428
249
  console.error("Failed to load tool classes:", error);
429
250
  this.dispatchEvent(
430
- new CustomEvent("ecc-tool-create-error", {
251
+ new CustomEvent("ecc-tool-create-failed", {
431
252
  detail: { error: "Failed to load tool classes" },
432
253
  bubbles: true,
433
254
  composed: true
@@ -454,18 +275,18 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
454
275
  this.versions = [
455
276
  ...this.versions,
456
277
  {
457
- name: "",
458
- author: [],
278
+ name: this.defaultVersionName,
279
+ author: this.defaultVersionAuthor ? this.defaultVersionAuthor.split(",").map((s) => s.trim()).filter(Boolean) : [],
459
280
  descriptorTypes: [],
460
- isProduction: false,
461
- signed: false,
462
- verified: false,
463
- verifiedSource: [],
464
- includedApps: [],
281
+ isProduction: this.defaultIsProduction,
282
+ signed: this.defaultSigned,
283
+ verified: this.defaultVerified,
284
+ verifiedSource: this.defaultVerifiedSource ? this.defaultVerifiedSource.split(",").map((s) => s.trim()).filter(Boolean) : [],
285
+ includedApps: this.defaultIncludedApps ? this.defaultIncludedApps.split(",").map((s) => s.trim()).filter(Boolean) : [],
465
286
  files: [],
466
287
  images: [],
467
- customVersionId: "",
468
- useCustomVersionId: false
288
+ customVersionId: this.defaultCustomVersionId,
289
+ useCustomVersionId: Boolean(this.defaultCustomVersionId)
469
290
  }
470
291
  ];
471
292
  }
@@ -479,8 +300,10 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
479
300
  const activeDescriptorType = this.activeDescriptorType[versionIndex] || (version.descriptorTypes.length > 0 ? version.descriptorTypes[0] : null);
480
301
  if (!activeDescriptorType) {
481
302
  this.dispatchEvent(
482
- new CustomEvent("ecc-tool-create-validation-error", {
483
- detail: { error: "Please select a descriptor type before adding files." },
303
+ new CustomEvent("ecc-tool-create-validation-failed", {
304
+ detail: {
305
+ error: "Please select a descriptor type before adding files."
306
+ },
484
307
  bubbles: true,
485
308
  composed: true
486
309
  })
@@ -489,9 +312,16 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
489
312
  }
490
313
  const updatedVersions = [...this.versions];
491
314
  const descriptorType = activeDescriptorType;
315
+ let fileType = "PRIMARY_DESCRIPTOR";
316
+ if (updatedVersions[versionIndex].files.find(
317
+ (file) => file.fileType === "PRIMARY_DESCRIPTOR"
318
+ )) {
319
+ fileType = "SECONDARY_DESCRIPTOR";
320
+ }
492
321
  updatedVersions[versionIndex].files.push({
493
322
  path: "",
494
- fileType: "PRIMARY_DESCRIPTOR",
323
+ fileType,
324
+ uiFileType: fileType,
495
325
  content: "",
496
326
  checksumType: "sha256",
497
327
  checksumValue: "",
@@ -524,14 +354,16 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
524
354
  }
525
355
  handleBulkFileUpload(versionIndex, event) {
526
356
  const input = event.target;
527
- const files = input.files;
357
+ const { files } = input;
528
358
  if (files && files.length > 0) {
529
359
  const version = this.versions[versionIndex];
530
360
  const activeDescriptorType = this.activeDescriptorType[versionIndex] || (version.descriptorTypes.length > 0 ? version.descriptorTypes[0] : null);
531
361
  if (!activeDescriptorType) {
532
362
  this.dispatchEvent(
533
- new CustomEvent("ecc-tool-create-validation-error", {
534
- detail: { error: "Please select a descriptor type before uploading files." },
363
+ new CustomEvent("ecc-tool-create-validation-failed", {
364
+ detail: {
365
+ error: "Please select a descriptor type before uploading files."
366
+ },
535
367
  bubbles: true,
536
368
  composed: true
537
369
  })
@@ -541,15 +373,25 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
541
373
  }
542
374
  const updatedVersions = [...this.versions];
543
375
  const descriptorType = activeDescriptorType;
544
- Array.from(files).forEach((file, index) => {
376
+ Array.from(files).forEach((file) => {
377
+ const defaultFileType = _ECCClientElixirTrsToolCreate.getDefaultFileType(
378
+ file.name
379
+ );
380
+ const uiFileType = _ECCClientElixirTrsToolCreate.getUIFileType(
381
+ file.name,
382
+ defaultFileType
383
+ );
384
+ const containerImageType = defaultFileType === "CONTAINERFILE" ? _ECCClientElixirTrsToolCreate.getContainerImageType(file.name) : void 0;
545
385
  const fileData = {
546
386
  path: file.name,
547
- fileType: this.getDefaultFileType(file.name),
387
+ fileType: defaultFileType,
388
+ uiFileType,
548
389
  content: "",
549
390
  file,
550
391
  checksumType: "sha256",
551
392
  checksumValue: "",
552
- descriptorType
393
+ descriptorType,
394
+ containerImageType
553
395
  };
554
396
  updatedVersions[versionIndex].files.push(fileData);
555
397
  const reader = new FileReader();
@@ -576,7 +418,7 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
576
418
  const file = (_a = input.files) == null ? void 0 : _a[0];
577
419
  if (!file || !file.name.toLowerCase().endsWith(".zip")) {
578
420
  this.dispatchEvent(
579
- new CustomEvent("ecc-tool-create-validation-error", {
421
+ new CustomEvent("ecc-tool-create-validation-failed", {
580
422
  detail: { error: "Please select a valid ZIP file" },
581
423
  bubbles: true,
582
424
  composed: true
@@ -588,8 +430,10 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
588
430
  const activeDescriptorType = this.activeDescriptorType[versionIndex] || (version.descriptorTypes.length > 0 ? version.descriptorTypes[0] : null);
589
431
  if (!activeDescriptorType) {
590
432
  this.dispatchEvent(
591
- new CustomEvent("ecc-tool-create-validation-error", {
592
- detail: { error: "Please select a descriptor type before uploading ZIP files." },
433
+ new CustomEvent("ecc-tool-create-validation-failed", {
434
+ detail: {
435
+ error: "Please select a descriptor type before uploading ZIP files."
436
+ },
593
437
  bubbles: true,
594
438
  composed: true
595
439
  })
@@ -603,17 +447,16 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
603
447
  const zipContent = await zip.loadAsync(file);
604
448
  const updatedVersions = [...this.versions];
605
449
  const filePromises = [];
606
- let extractedCount = 0;
607
450
  const descriptorType = activeDescriptorType;
608
451
  zipContent.forEach((relativePath, zipEntry) => {
609
- if (zipEntry.dir)
610
- return;
611
- const promise = this.extractFileFromZip(zipEntry, relativePath).then((fileData) => {
452
+ if (zipEntry.dir) return;
453
+ const promise = _ECCClientElixirTrsToolCreate.extractFileFromZip(
454
+ zipEntry,
455
+ relativePath
456
+ ).then((fileData) => {
612
457
  if (fileData) {
613
- fileData.descriptorType = descriptorType;
614
- updatedVersions[versionIndex].files.push(fileData);
615
- extractedCount++;
616
- } else {
458
+ const fileDataWithDescriptor = __spreadProps(__spreadValues({}, fileData), { descriptorType });
459
+ updatedVersions[versionIndex].files.push(fileDataWithDescriptor);
617
460
  }
618
461
  }).catch((error) => {
619
462
  console.error(`Failed to extract file ${relativePath}:`, error);
@@ -635,7 +478,7 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
635
478
  error instanceof Error ? error.stack : "No stack trace"
636
479
  );
637
480
  this.dispatchEvent(
638
- new CustomEvent("ecc-tool-create-error", {
481
+ new CustomEvent("ecc-tool-create-failed", {
639
482
  detail: {
640
483
  error: `Failed to extract ZIP file: ${error instanceof Error ? error.message : "Unknown error"}. Please ensure it's a valid ZIP archive.`
641
484
  },
@@ -647,9 +490,9 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
647
490
  this.loading = false;
648
491
  }
649
492
  }
650
- async extractFileFromZip(zipEntry, relativePath) {
493
+ static async extractFileFromZip(zipEntry, relativePath) {
651
494
  try {
652
- const isTextFile = this.isTextFile(relativePath);
495
+ const isTextFile = _ECCClientElixirTrsToolCreate.isTextFile(relativePath);
653
496
  let content;
654
497
  if (isTextFile) {
655
498
  content = await zipEntry.async("text");
@@ -658,16 +501,24 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
658
501
  const uint8Array = new Uint8Array(arrayBuffer);
659
502
  content = btoa(String.fromCharCode(...uint8Array));
660
503
  }
504
+ const defaultFileType = _ECCClientElixirTrsToolCreate.getDefaultFileType(relativePath);
505
+ const uiFileType = _ECCClientElixirTrsToolCreate.getUIFileType(
506
+ relativePath,
507
+ defaultFileType
508
+ );
509
+ const containerImageType = defaultFileType === "CONTAINERFILE" ? _ECCClientElixirTrsToolCreate.getContainerImageType(relativePath) : void 0;
661
510
  const fileData = {
662
511
  path: relativePath,
663
- fileType: this.getDefaultFileType(relativePath),
512
+ fileType: defaultFileType,
513
+ uiFileType,
664
514
  content,
665
515
  file: void 0,
666
516
  // No actual File object for extracted files
667
517
  checksumType: "sha256",
668
518
  checksumValue: "",
669
- descriptorType: void 0
519
+ descriptorType: void 0,
670
520
  // Will be set by the calling method
521
+ containerImageType
671
522
  };
672
523
  return fileData;
673
524
  } catch (error) {
@@ -679,7 +530,7 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
679
530
  return null;
680
531
  }
681
532
  }
682
- isTextFile(filename) {
533
+ static isTextFile(filename) {
683
534
  var _a;
684
535
  const textExtensions = [
685
536
  "txt",
@@ -715,7 +566,7 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
715
566
  const extension = (_a = filename.split(".").pop()) == null ? void 0 : _a.toLowerCase();
716
567
  return textExtensions.includes(extension || "") || filename.toLowerCase().includes("readme") || filename.toLowerCase().includes("license") || filename.toLowerCase().includes("changelog");
717
568
  }
718
- getDefaultFileType(filename) {
569
+ static getDefaultFileType(filename) {
719
570
  var _a;
720
571
  const extension = (_a = filename.split(".").pop()) == null ? void 0 : _a.toLowerCase();
721
572
  const basename = filename.toLowerCase();
@@ -733,10 +584,7 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
733
584
  }
734
585
  return "OTHER";
735
586
  }
736
- getDefaultDescriptorType(filename) {
737
- return void 0;
738
- }
739
- getContainerImageType(filename) {
587
+ static getContainerImageType(filename) {
740
588
  var _a;
741
589
  const basename = filename.toLowerCase();
742
590
  const extension = (_a = filename.split(".").pop()) == null ? void 0 : _a.toLowerCase();
@@ -748,7 +596,7 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
748
596
  }
749
597
  return "Docker";
750
598
  }
751
- getFileExtension(filename) {
599
+ static getFileExtension(filename) {
752
600
  var _a;
753
601
  return ((_a = filename.split(".").pop()) == null ? void 0 : _a.toLowerCase()) || "txt";
754
602
  }
@@ -775,11 +623,12 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
775
623
  this.versions = updatedVersions;
776
624
  }
777
625
  async handleSubmit() {
778
- console.log("handleSubmit");
779
626
  if (!this._provider || !this._provider.createTool) {
780
627
  this.dispatchEvent(
781
- new CustomEvent("ecc-tool-create-error", {
782
- detail: { error: "Tool creation is not supported by the current provider" },
628
+ new CustomEvent("ecc-tool-create-failed", {
629
+ detail: {
630
+ error: "Tool creation is not supported by the current provider"
631
+ },
783
632
  bubbles: true,
784
633
  composed: true
785
634
  })
@@ -829,7 +678,9 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
829
678
  }
830
679
  ] : void 0
831
680
  },
832
- type: file.fileType === "CONTAINERFILE" ? this.getContainerImageType(file.path) : file.descriptorType || version.descriptorTypes[0] || "CWL"
681
+ type: file.fileType === "CONTAINERFILE" ? file.containerImageType || _ECCClientElixirTrsToolCreate.getContainerImageType(
682
+ file.path
683
+ ) : file.descriptorType || version.descriptorTypes[0] || "CWL"
833
684
  // Use file's descriptor type or first version descriptor type as default
834
685
  })) : void 0,
835
686
  images: version.images.length > 0 ? version.images : void 0
@@ -846,7 +697,7 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
846
697
  }
847
698
  const successMessage = `Tool created successfully with ID: ${toolId}`;
848
699
  this.dispatchEvent(
849
- new CustomEvent("ecc-tool-create-success", {
700
+ new CustomEvent("ecc-tool-created", {
850
701
  detail: { toolId, toolData, message: successMessage },
851
702
  bubbles: true,
852
703
  composed: true
@@ -856,7 +707,7 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
856
707
  } catch (err) {
857
708
  const errorMessage = err instanceof Error ? err.message : "Failed to create tool";
858
709
  this.dispatchEvent(
859
- new CustomEvent("ecc-tool-create-error", {
710
+ new CustomEvent("ecc-tool-create-failed", {
860
711
  detail: { error: errorMessage },
861
712
  bubbles: true,
862
713
  composed: true
@@ -867,40 +718,20 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
867
718
  }
868
719
  }
869
720
  resetForm() {
870
- this.formData = {
871
- name: "",
872
- organization: "",
873
- description: "",
874
- toolClassId: "",
875
- aliases: [],
876
- checkerUrl: "",
877
- hasChecker: false,
878
- customToolId: "",
879
- useCustomId: false
880
- };
881
- this.versions = [
882
- {
883
- name: "",
884
- author: [],
885
- descriptorTypes: [],
886
- isProduction: false,
887
- signed: false,
888
- verified: false,
889
- verifiedSource: [],
890
- includedApps: [],
891
- files: [],
892
- images: [],
893
- customVersionId: "",
894
- useCustomVersionId: false
895
- }
896
- ];
721
+ this.initializeFormWithDefaults();
722
+ this.error = null;
723
+ this.success = null;
724
+ this.activeFileIndex = {};
725
+ this.activeDescriptorType = {};
897
726
  }
898
727
  renderBasicFields() {
899
728
  return html`
900
- <div class="grid gap-4">
901
- <!-- Tool Name, Organization, Tool Class in same row on desktop -->
902
- <div class="grid grid-cols-1 md:grid-cols-3 gap-4">
903
- <div class="grid gap-2">
729
+ <div class="grid gap-4">
730
+ <!-- Tool Name, Organization, Tool Class in same row on desktop -->
731
+ <div class="flex md:flex-row flex-col">
732
+ <!-- Tool Name Field -->
733
+ <slot name="tool-name">
734
+ <div class="flex-1 pr-4">
904
735
  <ecc-utils-design-label
905
736
  for="tool-name"
906
737
  class="text-sm font-medium"
@@ -910,13 +741,16 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
910
741
  <ecc-utils-design-input
911
742
  id="tool-name"
912
743
  .value=${this.formData.name}
913
- @ecc-utils-change=${(e) => this.handleInputChange("name", e.detail.value)}
744
+ @ecc-input-changed=${(e) => this.handleInputChange("name", e.detail.value)}
914
745
  placeholder="Enter a descriptive name for your tool"
915
746
  class="h-10"
916
747
  ></ecc-utils-design-input>
917
748
  </div>
749
+ </slot>
918
750
 
919
- <div class="grid gap-2">
751
+ <!-- Organization Field -->
752
+ <slot name="organization">
753
+ <div class="flex-1 pr-4">
920
754
  <ecc-utils-design-label
921
755
  for="organization"
922
756
  class="text-sm font-medium"
@@ -926,14 +760,17 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
926
760
  <ecc-utils-design-input
927
761
  id="organization"
928
762
  .value=${this.formData.organization}
929
- @ecc-utils-change=${(e) => this.handleInputChange("organization", e.detail.value)}
763
+ @ecc-input-changed=${(e) => this.handleInputChange("organization", e.detail.value)}
930
764
  placeholder="Enter your organization name"
931
765
  required
932
766
  class="h-10"
933
767
  ></ecc-utils-design-input>
934
768
  </div>
769
+ </slot>
935
770
 
936
- <div class="grid gap-1">
771
+ <!-- Tool Class Field -->
772
+ <slot name="tool-class">
773
+ <div class="flex-1">
937
774
  <ecc-utils-design-label
938
775
  for="tool-class"
939
776
  class="text-sm font-medium"
@@ -943,7 +780,7 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
943
780
  <ecc-utils-design-select
944
781
  id="tool-class-select"
945
782
  .value=${this.formData.toolClassId}
946
- @ecc-utils-change=${(e) => {
783
+ @ecc-input-changed=${(e) => {
947
784
  this.handleInputChange("toolClassId", e.detail.value);
948
785
  }}
949
786
  required
@@ -970,9 +807,11 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
970
807
  </ecc-utils-design-select-content>
971
808
  </ecc-utils-design-select>
972
809
  </div>
973
- </div>
810
+ </slot>
811
+ </div>
974
812
 
975
- <!-- Description spans full width -->
813
+ <!-- Description spans full width -->
814
+ <slot name="description">
976
815
  <div class="grid gap-2">
977
816
  <ecc-utils-design-label
978
817
  for="description"
@@ -983,14 +822,17 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
983
822
  <ecc-utils-design-textarea
984
823
  id="description"
985
824
  .value=${this.formData.description}
986
- @ecc-utils-change=${(e) => this.handleInputChange("description", e.detail.value)}
825
+ @ecc-input-changed=${(e) => this.handleInputChange("description", e.detail.value)}
987
826
  placeholder="Provide a detailed description of what your tool does"
988
827
  rows="4"
989
828
  class="resize-none"
990
829
  ></ecc-utils-design-textarea>
991
830
  </div>
992
- ${this.renderAdvancedFields()}
993
- </div>
831
+ </slot>
832
+
833
+ <!-- Advanced Fields -->
834
+ <slot name="advanced-fields"> ${this.renderAdvancedFields()} </slot>
835
+ </div>
994
836
  `;
995
837
  }
996
838
  renderAdvancedFields() {
@@ -1027,67 +869,73 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
1027
869
  <!-- Tool Configuration in grid layout -->
1028
870
  <div class="grid grid-cols-1 md:grid-cols-3 gap-4">
1029
871
  <!-- Custom Tool ID Section -->
1030
- <div class="grid gap-2">
1031
- <ecc-utils-design-label
1032
- for="custom-tool-id"
1033
- class="text-sm font-medium h-6"
1034
- >
1035
- Custom Tool ID
1036
- </ecc-utils-design-label>
1037
- <ecc-utils-design-input
1038
- id="custom-tool-id"
1039
- .value=${this.formData.customToolId}
1040
- @ecc-utils-change=${(e) => {
872
+ <slot name="custom-tool-id">
873
+ <div class="grid gap-2">
874
+ <ecc-utils-design-label
875
+ for="custom-tool-id"
876
+ class="text-sm font-medium h-6"
877
+ >
878
+ Custom Tool ID
879
+ </ecc-utils-design-label>
880
+ <ecc-utils-design-input
881
+ id="custom-tool-id"
882
+ .value=${this.formData.customToolId}
883
+ @ecc-input-changed=${(e) => {
1041
884
  this.handleInputChange("customToolId", e.detail.value);
1042
885
  this.handleInputChange(
1043
886
  "useCustomId",
1044
887
  Boolean(e.detail.value)
1045
888
  );
1046
889
  }}
1047
- placeholder="my-org/my-tool (optional)"
1048
- class="h-10"
1049
- ></ecc-utils-design-input>
1050
- </div>
890
+ placeholder="my-org/my-tool (optional)"
891
+ class="h-10"
892
+ ></ecc-utils-design-input>
893
+ </div>
894
+ </slot>
1051
895
 
1052
896
  <!-- Aliases Section -->
1053
- <div class="grid gap-2">
1054
- <ecc-utils-design-label
1055
- for="aliases"
1056
- class="text-sm font-medium h-6"
1057
- >
1058
- Aliases
1059
- </ecc-utils-design-label>
1060
- <ecc-utils-design-input
1061
- id="aliases"
1062
- .value=${this.formData.aliases.join(", ")}
1063
- @ecc-utils-change=${(e) => this.handleArrayInputChange("aliases", e.detail.value)}
1064
- placeholder="alias1, alias2, alias3"
1065
- class="h-10"
1066
- ></ecc-utils-design-input>
1067
- </div>
897
+ <slot name="aliases">
898
+ <div class="grid gap-2">
899
+ <ecc-utils-design-label
900
+ for="aliases"
901
+ class="text-sm font-medium h-6"
902
+ >
903
+ Aliases
904
+ </ecc-utils-design-label>
905
+ <ecc-utils-design-input
906
+ id="aliases"
907
+ .value=${this.formData.aliases.join(", ")}
908
+ @ecc-input-changed=${(e) => this.handleArrayInputChange("aliases", e.detail.value)}
909
+ placeholder="alias1, alias2, alias3"
910
+ class="h-10"
911
+ ></ecc-utils-design-input>
912
+ </div>
913
+ </slot>
1068
914
 
1069
915
  <!-- Checker Tool Section -->
1070
- <div class="grid gap-2">
1071
- <ecc-utils-design-label
1072
- for="checker-url"
1073
- class="text-sm font-medium h-6"
1074
- >
1075
- Checker Tool URL
1076
- </ecc-utils-design-label>
1077
- <ecc-utils-design-input
1078
- id="checker-url"
1079
- .value=${this.formData.checkerUrl}
1080
- @ecc-utils-change=${(e) => {
916
+ <slot name="checker-url">
917
+ <div class="grid gap-2">
918
+ <ecc-utils-design-label
919
+ for="checker-url"
920
+ class="text-sm font-medium h-6"
921
+ >
922
+ Checker Tool URL
923
+ </ecc-utils-design-label>
924
+ <ecc-utils-design-input
925
+ id="checker-url"
926
+ .value=${this.formData.checkerUrl}
927
+ @ecc-input-changed=${(e) => {
1081
928
  this.handleInputChange("checkerUrl", e.detail.value);
1082
929
  this.handleInputChange(
1083
930
  "hasChecker",
1084
931
  Boolean(e.detail.value)
1085
932
  );
1086
933
  }}
1087
- placeholder="https://example.com/checker-tool (optional)"
1088
- class="h-10"
1089
- ></ecc-utils-design-input>
1090
- </div>
934
+ placeholder="https://example.com/checker-tool (optional)"
935
+ class="h-10"
936
+ ></ecc-utils-design-input>
937
+ </div>
938
+ </slot>
1091
939
  </div>
1092
940
  </div>
1093
941
  </ecc-utils-design-collapsible-content>
@@ -1183,43 +1031,58 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
1183
1031
  return html`
1184
1032
  <div class="flex flex-col gap-4 pt-4">
1185
1033
  <!-- Basic Version Information -->
1186
- <div class="grid grid-cols-1 md:grid-cols-3 gap-4">
1187
- <div class="grid gap-2">
1188
- <ecc-utils-design-label class="text-sm font-medium h-6"
1189
- >Version Name</ecc-utils-design-label
1190
- >
1191
- <ecc-utils-design-input
1192
- .value=${version.name}
1193
- @ecc-utils-change=${(e) => this.handleVersionChange(index, "name", e.detail.value)}
1194
- placeholder="e.g., v1.0.0"
1195
- class="h-10"
1196
- ></ecc-utils-design-input>
1197
- </div>
1034
+ <div class="flex md:flex-row flex-col">
1035
+ <!-- Version Name Field -->
1036
+ <slot name="version-${index}-name">
1037
+ <div class="flex-1 pr-4">
1038
+ <ecc-utils-design-label class="text-sm font-medium h-6"
1039
+ >Version Name</ecc-utils-design-label
1040
+ >
1041
+ <ecc-utils-design-input
1042
+ .value=${version.name}
1043
+ @ecc-input-changed=${(e) => this.handleVersionChange(index, "name", e.detail.value)}
1044
+ placeholder="e.g., v1.0.0"
1045
+ class="h-10"
1046
+ ></ecc-utils-design-input>
1047
+ </div>
1048
+ </slot>
1198
1049
 
1199
- <div class="grid gap-2">
1200
- <ecc-utils-design-label class="text-sm font-medium h-6">
1201
- Authors (comma-separated)
1202
- </ecc-utils-design-label>
1203
- <ecc-utils-design-input
1204
- .value=${version.author.join(", ")}
1205
- @ecc-utils-change=${(e) => {
1050
+ <!-- Version Author Field -->
1051
+ <slot name="version-${index}-author">
1052
+ <div class="flex-1 pr-4">
1053
+ <ecc-utils-design-label class="text-sm font-medium h-6">
1054
+ Authors (comma-separated)
1055
+ </ecc-utils-design-label>
1056
+ <ecc-utils-design-input
1057
+ .value=${version.author.join(", ")}
1058
+ @ecc-input-changed=${(e) => {
1206
1059
  const authors = e.detail.value.split(",").map((a) => a.trim()).filter((a) => a);
1207
1060
  this.handleVersionChange(index, "author", authors);
1208
1061
  }}
1209
- placeholder="author1, author2"
1210
- class="h-10"
1211
- ></ecc-utils-design-input>
1212
- </div>
1062
+ placeholder="author1, author2"
1063
+ class="h-10"
1064
+ ></ecc-utils-design-input>
1065
+ </div>
1066
+ </slot>
1213
1067
 
1214
1068
  <!-- Descriptor Types Selection -->
1215
- <div class="grid">
1069
+ <div class="flex-1">
1216
1070
  <ecc-utils-design-label class="text-sm font-medium"
1217
- >Supported Languages</ecc-utils-design-label
1071
+ >Languages</ecc-utils-design-label
1218
1072
  >
1219
1073
  <ecc-utils-design-multi-select
1220
1074
  .value=${version.descriptorTypes}
1221
- placeholder="Select supported languages..."
1222
- @ecc-utils-change=${(e) => {
1075
+ placeholder="Select languages..."
1076
+ @ecc-input-changed=${(e) => {
1077
+ this.dispatchEvent(
1078
+ new CustomEvent("ecc-tool-create-input-changed", {
1079
+ detail: {
1080
+ value: e.detail.value,
1081
+ versionIndex: index,
1082
+ type: "version-descriptor-types"
1083
+ }
1084
+ })
1085
+ );
1223
1086
  const updatedVersions = [...this.versions];
1224
1087
  const oldDescriptorTypes = updatedVersions[index].descriptorTypes;
1225
1088
  const newDescriptorTypes = e.detail.value;
@@ -1233,7 +1096,9 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
1233
1096
  );
1234
1097
  }
1235
1098
  const currentActiveDescriptor = this.activeDescriptorType[index];
1236
- if (currentActiveDescriptor && removedDescriptorTypes.includes(currentActiveDescriptor)) {
1099
+ if (currentActiveDescriptor && removedDescriptorTypes.includes(
1100
+ currentActiveDescriptor
1101
+ )) {
1237
1102
  this.activeDescriptorType = __spreadProps(__spreadValues({}, this.activeDescriptorType), {
1238
1103
  [index]: newDescriptorTypes.length > 0 ? newDescriptorTypes[0] : void 0
1239
1104
  });
@@ -1249,168 +1114,184 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
1249
1114
  </ecc-utils-design-multi-select-trigger>
1250
1115
 
1251
1116
  <ecc-utils-design-multi-select-content>
1252
- <ecc-utils-design-multi-select-item value="CWL">
1253
- CWL (Common Workflow Language)
1254
- </ecc-utils-design-multi-select-item>
1255
- <ecc-utils-design-multi-select-item value="WDL">
1256
- WDL (Workflow Description Language)
1257
- </ecc-utils-design-multi-select-item>
1258
- <ecc-utils-design-multi-select-item value="NFL">
1259
- Nextflow
1260
- </ecc-utils-design-multi-select-item>
1261
- <ecc-utils-design-multi-select-item value="GALAXY">
1262
- Galaxy
1263
- </ecc-utils-design-multi-select-item>
1264
- <ecc-utils-design-multi-select-item value="SMK">
1265
- Snakemake
1266
- </ecc-utils-design-multi-select-item>
1117
+ ${this.renderDescriptorTypeOptions()}
1267
1118
  </ecc-utils-design-multi-select-content>
1268
1119
  </ecc-utils-design-multi-select>
1269
1120
  </div>
1270
1121
  </div>
1271
1122
 
1272
1123
  <!-- Advanced Version Options -->
1273
- <div class="">
1274
- <ecc-utils-design-collapsible>
1275
- <ecc-utils-design-collapsible-trigger>
1276
- <div
1277
- class="flex items-center justify-between w-full py-2 text-left hover:bg-muted/50 focus:outline-none focus:ring-1 focus:ring-ring rounded cursor-pointer transition-colors px-2"
1278
- >
1279
- <h4 class="text-sm font-medium text-muted-foreground">
1280
- Advance Version Configuration
1281
- </h4>
1282
- <svg
1283
- class="w-4 h-4 text-muted-foreground/60 transition-transform duration-200 shrink-0"
1284
- fill="none"
1285
- stroke="currentColor"
1286
- viewBox="0 0 24 24"
1124
+ <slot name="version-${index}-advanced-options">
1125
+ <div class="">
1126
+ <ecc-utils-design-collapsible>
1127
+ <ecc-utils-design-collapsible-trigger>
1128
+ <div
1129
+ class="flex items-center justify-between w-full py-2 text-left hover:bg-muted/50 focus:outline-none focus:ring-1 focus:ring-ring rounded cursor-pointer transition-colors px-2"
1287
1130
  >
1288
- <path
1289
- stroke-linecap="round"
1290
- stroke-linejoin="round"
1291
- stroke-width="2"
1292
- d="M19 9l-7 7-7-7"
1293
- ></path>
1294
- </svg>
1295
- </div>
1296
- </ecc-utils-design-collapsible-trigger>
1131
+ <h4 class="text-sm font-medium text-muted-foreground">
1132
+ Advance Version Configuration
1133
+ </h4>
1134
+ <svg
1135
+ class="w-4 h-4 text-muted-foreground/60 transition-transform duration-200 shrink-0"
1136
+ fill="none"
1137
+ stroke="currentColor"
1138
+ viewBox="0 0 24 24"
1139
+ >
1140
+ <path
1141
+ stroke-linecap="round"
1142
+ stroke-linejoin="round"
1143
+ stroke-width="2"
1144
+ d="M19 9l-7 7-7-7"
1145
+ ></path>
1146
+ </svg>
1147
+ </div>
1148
+ </ecc-utils-design-collapsible-trigger>
1297
1149
 
1298
- <ecc-utils-design-collapsible-content>
1299
- <div class="pt-4 space-y-4 border-t border-border/50">
1300
- <!-- Tags and Custom Version ID in same row -->
1301
- <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
1302
- <div class="grid gap-1">
1303
- <ecc-utils-design-label class="text-sm font-medium h-6">
1304
- Tags
1305
- </ecc-utils-design-label>
1306
- <ecc-utils-design-multi-select
1307
- .value=${this.getVersionTags(version)}
1308
- placeholder="Select tags..."
1309
- @ecc-utils-change=${(e) => {
1150
+ <ecc-utils-design-collapsible-content>
1151
+ <div class="pt-4 space-y-4 border-t border-border/50">
1152
+ <!-- Tags and Custom Version ID in same row -->
1153
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-4">
1154
+ <div class="grid gap-1">
1155
+ <ecc-utils-design-label class="text-sm font-medium h-6">
1156
+ Tags
1157
+ </ecc-utils-design-label>
1158
+ <ecc-utils-design-multi-select
1159
+ .value=${_ECCClientElixirTrsToolCreate.getVersionTags(
1160
+ version
1161
+ )}
1162
+ placeholder="Select tags..."
1163
+ @ecc-input-changed=${(e) => {
1310
1164
  this.handleVersionTagsChange(index, e.detail.value);
1311
1165
  }}
1312
- >
1313
- <ecc-utils-design-multi-select-trigger>
1314
- </ecc-utils-design-multi-select-trigger>
1166
+ >
1167
+ <ecc-utils-design-multi-select-trigger>
1168
+ </ecc-utils-design-multi-select-trigger>
1315
1169
 
1316
- <ecc-utils-design-multi-select-content>
1317
- <ecc-utils-design-multi-select-item value="prod">
1318
- Production
1319
- </ecc-utils-design-multi-select-item>
1320
- <ecc-utils-design-multi-select-item value="verified">
1321
- Verified
1322
- </ecc-utils-design-multi-select-item>
1323
- <ecc-utils-design-multi-select-item value="signed">
1324
- Signed
1325
- </ecc-utils-design-multi-select-item>
1326
- </ecc-utils-design-multi-select-content>
1327
- </ecc-utils-design-multi-select>
1328
- </div>
1170
+ <ecc-utils-design-multi-select-content>
1171
+ <ecc-utils-design-multi-select-item value="prod">
1172
+ Production
1173
+ </ecc-utils-design-multi-select-item>
1174
+ <ecc-utils-design-multi-select-item value="verified">
1175
+ Verified
1176
+ </ecc-utils-design-multi-select-item>
1177
+ <ecc-utils-design-multi-select-item value="signed">
1178
+ Signed
1179
+ </ecc-utils-design-multi-select-item>
1180
+ </ecc-utils-design-multi-select-content>
1181
+ </ecc-utils-design-multi-select>
1182
+ </div>
1329
1183
 
1330
- <div class="grid gap-2">
1331
- <ecc-utils-design-label class="text-sm font-medium h-6">
1332
- Custom Version ID
1333
- </ecc-utils-design-label>
1334
- <ecc-utils-design-input
1335
- .value=${version.customVersionId}
1336
- @ecc-utils-change=${(e) => this.handleVersionChange(
1184
+ <div class="grid gap-2">
1185
+ <ecc-utils-design-label class="text-sm font-medium h-6">
1186
+ Custom Version ID
1187
+ </ecc-utils-design-label>
1188
+ <ecc-utils-design-input
1189
+ .value=${version.customVersionId}
1190
+ @ecc-input-changed=${(e) => this.handleVersionChange(
1337
1191
  index,
1338
1192
  "customVersionId",
1339
1193
  e.detail.value
1340
1194
  )}
1341
- placeholder="Enter custom version ID (optional)"
1342
- class="h-10"
1343
- ></ecc-utils-design-input>
1195
+ placeholder="Enter custom version ID (optional)"
1196
+ class="h-10"
1197
+ ></ecc-utils-design-input>
1198
+ </div>
1344
1199
  </div>
1345
1200
  </div>
1346
- </div>
1347
- </ecc-utils-design-collapsible-content>
1348
- </ecc-utils-design-collapsible>
1349
- </div>
1201
+ </ecc-utils-design-collapsible-content>
1202
+ </ecc-utils-design-collapsible>
1203
+ </div>
1204
+ </slot>
1350
1205
 
1351
1206
  <!-- Files Section -->
1352
- <div class="space-y-2">
1353
- <div class="flex justify-between items-center">
1354
- <h4 class="text-base font-semibold">Files</h4>
1355
- <div class="flex gap-2">
1356
- <div class="relative">
1357
- <input
1358
- type="file"
1359
- multiple
1360
- @change=${(e) => this.handleBulkFileUpload(index, e)}
1361
- class="absolute inset-0 w-full h-full opacity-0 cursor-pointer"
1362
- id="bulk-upload-${index}"
1363
- ?disabled=${version.descriptorTypes.length === 0}
1364
- />
1365
- <ecc-utils-design-button
1366
- variant="outline"
1367
- size="sm"
1368
- as="label"
1369
- for="bulk-upload-${index}"
1370
- .disabled=${version.descriptorTypes.length === 0}
1371
- >
1372
- Upload Files
1373
- </ecc-utils-design-button>
1374
- </div>
1375
- <div class="relative">
1376
- <input
1377
- type="file"
1378
- accept=".zip"
1379
- @change=${(e) => this.handleZipFileUpload(index, e)}
1380
- class="absolute inset-0 w-full h-full opacity-0 cursor-pointer"
1381
- id="zip-upload-${index}"
1382
- ?disabled=${version.descriptorTypes.length === 0}
1383
- />
1207
+ <slot
1208
+ name="version-${index}-files-section"
1209
+ version-index=${index}
1210
+ .version=${version}
1211
+ .files=${version.files}
1212
+ .descriptorTypes=${version.descriptorTypes}
1213
+ .activeDescriptorType=${this.activeDescriptorType[index]}
1214
+ .activeFileIndex=${this.activeFileIndex[index]}
1215
+ .onBulkFileUpload=${(e) => this.handleBulkFileUpload(index, e)}
1216
+ .onZipFileUpload=${(e) => this.handleZipFileUpload(index, e)}
1217
+ .onAddFile=${() => this.addFileToVersion(index)}
1218
+ .onRemoveFile=${(fileIndex) => this.removeFileFromVersion(index, fileIndex)}
1219
+ .onDescriptorTypeChange=${(descriptorType) => {
1220
+ this.activeDescriptorType = __spreadProps(__spreadValues({}, this.activeDescriptorType), {
1221
+ [index]: descriptorType
1222
+ });
1223
+ this.requestUpdate();
1224
+ }}
1225
+ .onFileSelect=${(fileIndex) => {
1226
+ this.activeFileIndex = __spreadProps(__spreadValues({}, this.activeFileIndex), {
1227
+ [index]: fileIndex
1228
+ });
1229
+ this.requestUpdate();
1230
+ }}
1231
+ .onFileFieldChange=${(fileIndex, field, value) => this.handleFileFieldChange(index, fileIndex, field, value)}
1232
+ >
1233
+ <div class="space-y-2">
1234
+ <div class="flex justify-between items-center">
1235
+ <h4 class="text-base font-semibold">Files</h4>
1236
+ <div class="flex gap-2">
1237
+ <div class="relative">
1238
+ <input
1239
+ type="file"
1240
+ multiple
1241
+ @change=${(e) => this.handleBulkFileUpload(index, e)}
1242
+ class="absolute inset-0 w-full h-full opacity-0 cursor-pointer"
1243
+ id="bulk-upload-${index}"
1244
+ ?disabled=${version.descriptorTypes.length === 0}
1245
+ />
1246
+ <ecc-utils-design-button
1247
+ variant="outline"
1248
+ size="sm"
1249
+ as="label"
1250
+ for="bulk-upload-${index}"
1251
+ .disabled=${version.descriptorTypes.length === 0}
1252
+ >
1253
+ Upload Files
1254
+ </ecc-utils-design-button>
1255
+ </div>
1256
+ <div class="relative">
1257
+ <input
1258
+ type="file"
1259
+ accept=".zip"
1260
+ @change=${(e) => this.handleZipFileUpload(index, e)}
1261
+ class="absolute inset-0 w-full h-full opacity-0 cursor-pointer"
1262
+ id="zip-upload-${index}"
1263
+ ?disabled=${version.descriptorTypes.length === 0}
1264
+ />
1265
+ <ecc-utils-design-button
1266
+ variant="outline"
1267
+ size="sm"
1268
+ as="label"
1269
+ for="zip-upload-${index}"
1270
+ .disabled=${version.descriptorTypes.length === 0}
1271
+ >
1272
+ Upload ZIP
1273
+ </ecc-utils-design-button>
1274
+ </div>
1384
1275
  <ecc-utils-design-button
1276
+ @click=${() => this.addFileToVersion(index)}
1385
1277
  variant="outline"
1386
1278
  size="sm"
1387
- as="label"
1388
- for="zip-upload-${index}"
1389
1279
  .disabled=${version.descriptorTypes.length === 0}
1390
1280
  >
1391
- Upload ZIP
1281
+ Add File Manually
1392
1282
  </ecc-utils-design-button>
1393
- </div>
1394
- <ecc-utils-design-button
1395
- @click=${() => this.addFileToVersion(index)}
1396
- variant="outline"
1397
- size="sm"
1398
- .disabled=${version.descriptorTypes.length === 0}
1399
- >
1400
- Add File Manually
1401
- </ecc-utils-design-button>
1402
- ${version.descriptorTypes.length > 0 ? html`
1403
- <div
1404
- class="flex items-center gap-2 text-sm text-muted-foreground"
1405
- >
1406
- <span
1407
- class="text-sm text-muted-foreground"
1408
- style="font-style: italic;"
1409
- >for:</span
1283
+ ${version.descriptorTypes.length > 0 ? html`
1284
+ <div
1285
+ class="flex items-center gap-2 text-sm text-muted-foreground"
1410
1286
  >
1411
- <ecc-utils-design-select
1412
- .value=${this.activeDescriptorType[index] || version.descriptorTypes[0]}
1413
- @ecc-utils-change=${(e) => {
1287
+ <span
1288
+ class="text-sm text-muted-foreground"
1289
+ style="font-style: italic;"
1290
+ >for:</span
1291
+ >
1292
+ <ecc-utils-design-select
1293
+ .value=${this.activeDescriptorType[index] || version.descriptorTypes[0]}
1294
+ @ecc-input-changed=${(e) => {
1414
1295
  this.activeDescriptorType = __spreadProps(__spreadValues({}, this.activeDescriptorType), {
1415
1296
  [index]: e.detail.value
1416
1297
  });
@@ -1437,39 +1318,40 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
1437
1318
  }
1438
1319
  this.requestUpdate();
1439
1320
  }}
1440
- class="w-24"
1441
- >
1442
- <ecc-utils-design-select-trigger
1443
- class="part:text-sm part:h-8 part:w-24"
1444
- >
1445
- <ecc-utils-design-select-value></ecc-utils-design-select-value>
1446
- </ecc-utils-design-select-trigger>
1447
- <ecc-utils-design-select-content
1448
- class="part:text-sm part:w-24 part:min-w-24"
1321
+ class="w-24"
1449
1322
  >
1450
- ${version.descriptorTypes.map(
1323
+ <ecc-utils-design-select-trigger
1324
+ class="part:text-sm part:h-8 part:w-24"
1325
+ >
1326
+ <ecc-utils-design-select-value></ecc-utils-design-select-value>
1327
+ </ecc-utils-design-select-trigger>
1328
+ <ecc-utils-design-select-content
1329
+ class="part:text-sm part:w-24 part:min-w-24"
1330
+ >
1331
+ ${version.descriptorTypes.map(
1451
1332
  (descriptorType) => html`
1452
- <ecc-utils-design-select-item
1453
- value=${descriptorType}
1454
- class="part:text-sm"
1455
- >
1456
- ${descriptorType}
1457
- </ecc-utils-design-select-item>
1458
- `
1333
+ <ecc-utils-design-select-item
1334
+ value=${descriptorType}
1335
+ class="part:text-sm"
1336
+ >
1337
+ ${descriptorType}
1338
+ </ecc-utils-design-select-item>
1339
+ `
1459
1340
  )}
1460
- </ecc-utils-design-select-content>
1461
- </ecc-utils-design-select>
1462
- </div>
1463
- ` : ``}
1341
+ </ecc-utils-design-select-content>
1342
+ </ecc-utils-design-select>
1343
+ </div>
1344
+ ` : ``}
1345
+ </div>
1464
1346
  </div>
1465
- </div>
1466
1347
 
1467
- <!-- Language Filter Section -->
1348
+ <!-- Language Filter Section -->
1468
1349
 
1469
- ${version.files.length === 0 ? html`<p class="text-gray-500 text-sm">
1470
- ${version.descriptorTypes.length > 0 ? "No files added yet. Upload files or add them manually." : "Select a language this version supports to upload and manage files."}
1471
- </p>` : this.renderFilesLayout(index, version.files)}
1472
- </div>
1350
+ ${version.files.length === 0 ? html`<p class="text-gray-500 text-sm">
1351
+ ${version.descriptorTypes.length > 0 ? "No files added yet. Upload files or add them manually." : "Select a language this version supports to upload and manage files."}
1352
+ </p>` : this.renderFilesLayout(index, version.files)}
1353
+ </div>
1354
+ </slot>
1473
1355
  </div>
1474
1356
  `;
1475
1357
  }
@@ -1490,62 +1372,79 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
1490
1372
  (file) => file.descriptorType === activeDescriptor
1491
1373
  );
1492
1374
  return html`
1493
- <div class="grid grid-cols-5 gap-4">
1494
- <!-- Files List Section - 1/5 of screen -->
1495
- <div class="col-span-5 md:col-span-1">
1496
- <div class="space-y-1 max-h-[400px] overflow-y-auto">
1497
- ${filteredFiles.map((file, fileIndex) => {
1375
+ <!-- Descriptor-specific files slot -->
1376
+ <slot
1377
+ name="version-${versionIndex}-${activeDescriptor}-files"
1378
+ version-index=${versionIndex}
1379
+ descriptor-type=${activeDescriptor}
1380
+ .filteredFiles=${filteredFiles}
1381
+ .activeFileIndex=${this.activeFileIndex[versionIndex]}
1382
+ .onFileSelect=${(fileIndex) => {
1383
+ this.activeFileIndex = __spreadProps(__spreadValues({}, this.activeFileIndex), {
1384
+ [versionIndex]: fileIndex
1385
+ });
1386
+ this.requestUpdate();
1387
+ }}
1388
+ .onRemoveFile=${(originalIndex) => this.removeFileFromVersion(versionIndex, originalIndex)}
1389
+ .onFileFieldChange=${(fileIndex, field, value) => this.handleFileFieldChange(versionIndex, fileIndex, field, value)}
1390
+ >
1391
+ <div class="grid grid-cols-5 gap-4">
1392
+ <!-- Files List Section - 1/5 of screen -->
1393
+ <div class="col-span-5 md:col-span-1">
1394
+ <div class="space-y-1 max-h-[400px] overflow-y-auto">
1395
+ ${filteredFiles.map((file) => {
1498
1396
  const originalIndex = files.indexOf(file);
1499
1397
  return html`
1500
- <ecc-utils-design-button
1501
- variant="ghost"
1502
- type="button"
1503
- class="part:h-8 part:w-full part:text-left part:px-3 part:py-1 part:rounded-md part:text-sm part:flex part:items-center part:justify-between ${this.activeFileIndex[versionIndex] === originalIndex ? "part:bg-primary/10" : "part:hover:bg-muted"}"
1504
- @click=${() => {
1398
+ <ecc-utils-design-button
1399
+ variant="ghost"
1400
+ type="button"
1401
+ class="part:h-8 part:w-full part:text-left part:px-3 part:py-1 part:rounded-md part:text-sm part:flex part:items-center part:justify-between ${this.activeFileIndex[versionIndex] === originalIndex ? "part:bg-primary/10" : "part:hover:bg-muted"}"
1402
+ @click=${() => {
1505
1403
  this.activeFileIndex = __spreadProps(__spreadValues({}, this.activeFileIndex), {
1506
1404
  [versionIndex]: originalIndex
1507
1405
  });
1508
1406
  this.requestUpdate();
1509
1407
  }}
1510
- >
1511
- <span class="truncate">
1512
- ${file.path || `File ${originalIndex + 1}`}
1513
- ${file.descriptorType ? html`<span class="text-xs text-muted-foreground ml-1"
1514
- >(${file.descriptorType})</span
1515
- >` : ""}
1516
- </span>
1517
- <ecc-utils-design-button
1518
- type="button"
1519
- variant="ghost"
1520
- class="part:h-8 part:w-8 part:text-left part:px-3 part:py-1 part:rounded-md part:text-sm part:flex part:items-center part:justify-between"
1521
- @click=${(e) => {
1408
+ >
1409
+ <span class="truncate">
1410
+ ${file.path || `File ${originalIndex + 1}`}
1411
+ ${file.uiFileType ? html`<span class="text-xs text-muted-foreground ml-1"
1412
+ >(${file.uiFileType})</span
1413
+ >` : ""}
1414
+ </span>
1415
+ <ecc-utils-design-button
1416
+ type="button"
1417
+ variant="ghost"
1418
+ class="part:h-8 part:w-8 part:text-left part:px-3 part:py-1 part:rounded-md part:text-sm part:flex part:items-center part:justify-between"
1419
+ @click=${(e) => {
1522
1420
  e.stopPropagation();
1523
1421
  this.removeFileFromVersion(versionIndex, originalIndex);
1524
1422
  }}
1525
- >
1526
- ×
1423
+ >
1424
+ ×
1425
+ </ecc-utils-design-button>
1527
1426
  </ecc-utils-design-button>
1528
- </ecc-utils-design-button>
1529
- `;
1427
+ `;
1530
1428
  })}
1429
+ </div>
1531
1430
  </div>
1532
- </div>
1533
1431
 
1534
- <!-- Mobile Separator -->
1535
- <div class="block md:hidden col-span-5">
1536
- <ecc-utils-design-separator
1537
- orientation="horizontal"
1538
- class="part:my-4"
1539
- ></ecc-utils-design-separator>
1540
- </div>
1432
+ <!-- Mobile Separator -->
1433
+ <div class="block md:hidden col-span-5">
1434
+ <ecc-utils-design-separator
1435
+ orientation="horizontal"
1436
+ class="part:my-4"
1437
+ ></ecc-utils-design-separator>
1438
+ </div>
1541
1439
 
1542
- <!-- File Content Section - 4/5 of screen -->
1543
- <div
1544
- class="col-span-5 md:col-span-4 md:border-l md:pl-4 md:border-muted w-full"
1545
- >
1546
- ${this.renderFileContentArea(versionIndex, files)}
1440
+ <!-- File Content Section - 4/5 of screen -->
1441
+ <div
1442
+ class="col-span-5 md:col-span-4 md:border-l md:pl-4 md:border-muted w-full"
1443
+ >
1444
+ ${this.renderFileContentArea(versionIndex, files)}
1445
+ </div>
1547
1446
  </div>
1548
- </div>
1447
+ </slot>
1549
1448
  `;
1550
1449
  }
1551
1450
  renderFileContentArea(versionIndex, files) {
@@ -1560,24 +1459,19 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
1560
1459
  </div>
1561
1460
  `;
1562
1461
  }
1563
- const fileTypes = [
1564
- { value: "PRIMARY_DESCRIPTOR", label: "Primary Descriptor" },
1565
- { value: "SECONDARY_DESCRIPTOR", label: "Secondary Descriptor" },
1566
- { value: "TEST_FILE", label: "Test File" },
1567
- { value: "CONTAINERFILE", label: "Container File" },
1568
- { value: "OTHER", label: "Other" }
1569
- ];
1462
+ const otherFileHasPrimaryDescriptor = files.some(
1463
+ (file, index) => index !== activeIndex && file.uiFileType === "PRIMARY_DESCRIPTOR" && file.descriptorType === activeFile.descriptorType
1464
+ );
1570
1465
  const checksumTypes = ["sha256", "sha1", "md5"];
1571
1466
  return html`
1572
1467
  <div class="space-y-4">
1573
-
1574
1468
  <!-- File Configuration -->
1575
1469
  <div class="grid grid-cols-1 md:grid-cols-4 gap-4">
1576
1470
  <div>
1577
1471
  <ecc-utils-design-label>File Path</ecc-utils-design-label>
1578
1472
  <ecc-utils-design-input
1579
1473
  .value=${activeFile.path}
1580
- @ecc-utils-change=${(e) => {
1474
+ @ecc-input-changed=${(e) => {
1581
1475
  this.handleFileFieldChange(
1582
1476
  versionIndex,
1583
1477
  activeIndex,
@@ -1592,27 +1486,87 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
1592
1486
  <div>
1593
1487
  <ecc-utils-design-label>File Type</ecc-utils-design-label>
1594
1488
  <ecc-utils-design-select
1595
- .value=${activeFile.fileType}
1596
- @ecc-utils-change=${(e) => {
1489
+ .value=${activeFile.uiFileType}
1490
+ @ecc-input-changed=${(e) => {
1491
+ const newUIFileType = e.detail.value;
1492
+ const newFileType = _ECCClientElixirTrsToolCreate.convertUIFileTypeToFileType(
1493
+ newUIFileType
1494
+ );
1495
+ const newContainerImageType = _ECCClientElixirTrsToolCreate.convertUIFileTypeToImageType(
1496
+ newUIFileType
1497
+ );
1498
+ this.handleFileFieldChange(
1499
+ versionIndex,
1500
+ activeIndex,
1501
+ "uiFileType",
1502
+ newUIFileType
1503
+ );
1597
1504
  this.handleFileFieldChange(
1598
1505
  versionIndex,
1599
1506
  activeIndex,
1600
1507
  "fileType",
1601
- e.detail.value
1508
+ newFileType
1602
1509
  );
1510
+ if (newContainerImageType) {
1511
+ this.handleFileFieldChange(
1512
+ versionIndex,
1513
+ activeIndex,
1514
+ "containerImageType",
1515
+ newContainerImageType
1516
+ );
1517
+ } else {
1518
+ this.handleFileFieldChange(
1519
+ versionIndex,
1520
+ activeIndex,
1521
+ "containerImageType",
1522
+ void 0
1523
+ );
1524
+ }
1603
1525
  }}
1604
1526
  >
1605
1527
  <ecc-utils-design-select-trigger>
1606
1528
  <ecc-utils-design-select-value></ecc-utils-design-select-value>
1607
1529
  </ecc-utils-design-select-trigger>
1608
1530
  <ecc-utils-design-select-content>
1609
- ${fileTypes.map(
1610
- (type) => html`
1611
- <ecc-utils-design-select-item value=${type.value}>
1612
- ${type.label}
1613
- </ecc-utils-design-select-item>
1614
- `
1615
- )}
1531
+ <!-- Source Files Group -->
1532
+ <ecc-utils-design-select-group>
1533
+ <ecc-utils-design-select-label
1534
+ >Source file</ecc-utils-design-select-label
1535
+ >
1536
+ <ecc-utils-design-select-item
1537
+ value="PRIMARY_DESCRIPTOR"
1538
+ .disabled=${otherFileHasPrimaryDescriptor && activeFile.uiFileType !== "PRIMARY_DESCRIPTOR"}
1539
+ >
1540
+ Primary Descriptor
1541
+ </ecc-utils-design-select-item>
1542
+ <ecc-utils-design-select-item value="SECONDARY_DESCRIPTOR">
1543
+ Secondary Descriptor
1544
+ </ecc-utils-design-select-item>
1545
+ <ecc-utils-design-select-item value="TEST_FILE">
1546
+ Test File
1547
+ </ecc-utils-design-select-item>
1548
+ <ecc-utils-design-select-item value="OTHER">
1549
+ Other
1550
+ </ecc-utils-design-select-item>
1551
+ </ecc-utils-design-select-group>
1552
+
1553
+ <ecc-utils-design-select-separator></ecc-utils-design-select-separator>
1554
+
1555
+ <!-- Image Files Group -->
1556
+ <ecc-utils-design-select-group>
1557
+ <ecc-utils-design-select-label
1558
+ >Image file</ecc-utils-design-select-label
1559
+ >
1560
+ <ecc-utils-design-select-item value="Docker">
1561
+ Docker
1562
+ </ecc-utils-design-select-item>
1563
+ <ecc-utils-design-select-item value="Singularity">
1564
+ Singularity
1565
+ </ecc-utils-design-select-item>
1566
+ <ecc-utils-design-select-item value="Conda">
1567
+ Conda
1568
+ </ecc-utils-design-select-item>
1569
+ </ecc-utils-design-select-group>
1616
1570
  </ecc-utils-design-select-content>
1617
1571
  </ecc-utils-design-select>
1618
1572
  </div>
@@ -1621,7 +1575,7 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
1621
1575
  <ecc-utils-design-label>Checksum Type</ecc-utils-design-label>
1622
1576
  <ecc-utils-design-select
1623
1577
  .value=${activeFile.checksumType}
1624
- @ecc-utils-change=${(e) => {
1578
+ @ecc-input-changed=${(e) => {
1625
1579
  this.handleFileFieldChange(
1626
1580
  versionIndex,
1627
1581
  activeIndex,
@@ -1651,7 +1605,7 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
1651
1605
  >
1652
1606
  <ecc-utils-design-input
1653
1607
  .value=${activeFile.checksumValue}
1654
- @ecc-utils-change=${(e) => {
1608
+ @ecc-input-changed=${(e) => {
1655
1609
  this.handleFileFieldChange(
1656
1610
  versionIndex,
1657
1611
  activeIndex,
@@ -1671,8 +1625,10 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
1671
1625
  ${activeFile.content !== void 0 ? html`
1672
1626
  <ecc-utils-design-code
1673
1627
  value=${activeFile.content}
1674
- extension=${this.getFileExtension(activeFile.path)}
1675
- @ecc-utils-change=${(e) => {
1628
+ extension=${_ECCClientElixirTrsToolCreate.getFileExtension(
1629
+ activeFile.path
1630
+ )}
1631
+ @ecc-input-changed=${(e) => {
1676
1632
  this.handleFileFieldChange(
1677
1633
  versionIndex,
1678
1634
  activeIndex,
@@ -1694,17 +1650,11 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
1694
1650
  </div>
1695
1651
  `;
1696
1652
  }
1697
- renderFileInput(versionIndex, fileIndex, file) {
1698
- return html``;
1699
- }
1700
- getVersionTags(version) {
1653
+ static getVersionTags(version) {
1701
1654
  const tags = [];
1702
- if (version.isProduction)
1703
- tags.push("prod");
1704
- if (version.verified)
1705
- tags.push("verified");
1706
- if (version.signed)
1707
- tags.push("signed");
1655
+ if (version.isProduction) tags.push("prod");
1656
+ if (version.verified) tags.push("verified");
1657
+ if (version.signed) tags.push("signed");
1708
1658
  return tags;
1709
1659
  }
1710
1660
  handleVersionTagsChange(index, tags) {
@@ -1716,6 +1666,24 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
1716
1666
  });
1717
1667
  this.versions = updatedVersions;
1718
1668
  }
1669
+ static getUIFileType(filename, fileType) {
1670
+ if (fileType === "CONTAINERFILE") {
1671
+ return _ECCClientElixirTrsToolCreate.getContainerImageType(filename);
1672
+ }
1673
+ return fileType;
1674
+ }
1675
+ static convertUIFileTypeToFileType(uiFileType) {
1676
+ if (uiFileType === "Docker" || uiFileType === "Singularity" || uiFileType === "Conda") {
1677
+ return "CONTAINERFILE";
1678
+ }
1679
+ return uiFileType;
1680
+ }
1681
+ static convertUIFileTypeToImageType(uiFileType) {
1682
+ if (uiFileType === "Docker" || uiFileType === "Singularity" || uiFileType === "Conda") {
1683
+ return uiFileType;
1684
+ }
1685
+ return void 0;
1686
+ }
1719
1687
  render() {
1720
1688
  return html`
1721
1689
  <div class="">
@@ -1726,8 +1694,7 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
1726
1694
  }}
1727
1695
  >
1728
1696
  <div class="space-y-4">
1729
- ${this.renderBasicFields()}
1730
- ${this.renderVersions()}
1697
+ ${this.renderBasicFields()} ${this.renderVersions()}
1731
1698
  </div>
1732
1699
 
1733
1700
  <div class="flex justify-between items-center mt-4">
@@ -1753,8 +1720,27 @@ var ECCClientElixirTrsToolCreate = class extends LitElement {
1753
1720
  </div>
1754
1721
  `;
1755
1722
  }
1723
+ renderDescriptorTypeOptions() {
1724
+ const allDescriptorTypes = [
1725
+ { value: "CWL", label: "CWL (Common Workflow Language)" },
1726
+ { value: "WDL", label: "WDL (Workflow Description Language)" },
1727
+ { value: "NFL", label: "Nextflow" },
1728
+ { value: "GALAXY", label: "Galaxy" },
1729
+ { value: "SMK", label: "Snakemake" }
1730
+ ];
1731
+ const availableTypes = this.supportedDescriptorTypes.length > 0 ? allDescriptorTypes.filter(
1732
+ (type) => this.supportedDescriptorTypes.includes(type.value)
1733
+ ) : allDescriptorTypes;
1734
+ return availableTypes.map(
1735
+ (type) => html`
1736
+ <ecc-utils-design-multi-select-item value=${type.value}>
1737
+ ${type.label}
1738
+ </ecc-utils-design-multi-select-item>
1739
+ `
1740
+ );
1741
+ }
1756
1742
  };
1757
- ECCClientElixirTrsToolCreate.styles = [
1743
+ _ECCClientElixirTrsToolCreate.styles = [
1758
1744
  ComponentStyles,
1759
1745
  GlobalStyles,
1760
1746
  css`
@@ -1775,34 +1761,83 @@ ECCClientElixirTrsToolCreate.styles = [
1775
1761
  ];
1776
1762
  __decorateClass([
1777
1763
  property({ type: String, reflect: true })
1778
- ], ECCClientElixirTrsToolCreate.prototype, "baseUrl", 2);
1764
+ ], _ECCClientElixirTrsToolCreate.prototype, "baseUrl", 2);
1779
1765
  __decorateClass([
1780
1766
  property({ attribute: false, reflect: true })
1781
- ], ECCClientElixirTrsToolCreate.prototype, "provider", 2);
1767
+ ], _ECCClientElixirTrsToolCreate.prototype, "provider", 2);
1768
+ __decorateClass([
1769
+ property({ type: String, attribute: "default-name" })
1770
+ ], _ECCClientElixirTrsToolCreate.prototype, "defaultName", 2);
1771
+ __decorateClass([
1772
+ property({ type: String, attribute: "default-organization" })
1773
+ ], _ECCClientElixirTrsToolCreate.prototype, "defaultOrganization", 2);
1774
+ __decorateClass([
1775
+ property({ type: String, attribute: "default-description" })
1776
+ ], _ECCClientElixirTrsToolCreate.prototype, "defaultDescription", 2);
1777
+ __decorateClass([
1778
+ property({ type: String, attribute: "default-tool-class-id" })
1779
+ ], _ECCClientElixirTrsToolCreate.prototype, "defaultToolClassId", 2);
1780
+ __decorateClass([
1781
+ property({ type: String, attribute: "default-aliases" })
1782
+ ], _ECCClientElixirTrsToolCreate.prototype, "defaultAliases", 2);
1783
+ __decorateClass([
1784
+ property({ type: String, attribute: "default-checker-url" })
1785
+ ], _ECCClientElixirTrsToolCreate.prototype, "defaultCheckerUrl", 2);
1786
+ __decorateClass([
1787
+ property({ type: String, attribute: "default-custom-tool-id" })
1788
+ ], _ECCClientElixirTrsToolCreate.prototype, "defaultCustomToolId", 2);
1789
+ __decorateClass([
1790
+ property({ type: String, attribute: "default-version-name" })
1791
+ ], _ECCClientElixirTrsToolCreate.prototype, "defaultVersionName", 2);
1792
+ __decorateClass([
1793
+ property({ type: String, attribute: "default-version-author" })
1794
+ ], _ECCClientElixirTrsToolCreate.prototype, "defaultVersionAuthor", 2);
1795
+ __decorateClass([
1796
+ property({ type: Boolean, attribute: "default-is-production" })
1797
+ ], _ECCClientElixirTrsToolCreate.prototype, "defaultIsProduction", 2);
1798
+ __decorateClass([
1799
+ property({ type: Boolean, attribute: "default-signed" })
1800
+ ], _ECCClientElixirTrsToolCreate.prototype, "defaultSigned", 2);
1801
+ __decorateClass([
1802
+ property({ type: Boolean, attribute: "default-verified" })
1803
+ ], _ECCClientElixirTrsToolCreate.prototype, "defaultVerified", 2);
1804
+ __decorateClass([
1805
+ property({ type: String, attribute: "default-verified-source" })
1806
+ ], _ECCClientElixirTrsToolCreate.prototype, "defaultVerifiedSource", 2);
1807
+ __decorateClass([
1808
+ property({ type: String, attribute: "default-included-apps" })
1809
+ ], _ECCClientElixirTrsToolCreate.prototype, "defaultIncludedApps", 2);
1810
+ __decorateClass([
1811
+ property({ type: String, attribute: "default-custom-version-id" })
1812
+ ], _ECCClientElixirTrsToolCreate.prototype, "defaultCustomVersionId", 2);
1813
+ __decorateClass([
1814
+ property({ type: Array, reflect: true })
1815
+ ], _ECCClientElixirTrsToolCreate.prototype, "supportedDescriptorTypes", 2);
1782
1816
  __decorateClass([
1783
1817
  state()
1784
- ], ECCClientElixirTrsToolCreate.prototype, "toolClasses", 2);
1818
+ ], _ECCClientElixirTrsToolCreate.prototype, "toolClasses", 2);
1785
1819
  __decorateClass([
1786
1820
  state()
1787
- ], ECCClientElixirTrsToolCreate.prototype, "loading", 2);
1821
+ ], _ECCClientElixirTrsToolCreate.prototype, "loading", 2);
1788
1822
  __decorateClass([
1789
1823
  state()
1790
- ], ECCClientElixirTrsToolCreate.prototype, "error", 2);
1824
+ ], _ECCClientElixirTrsToolCreate.prototype, "error", 2);
1791
1825
  __decorateClass([
1792
1826
  state()
1793
- ], ECCClientElixirTrsToolCreate.prototype, "success", 2);
1827
+ ], _ECCClientElixirTrsToolCreate.prototype, "success", 2);
1794
1828
  __decorateClass([
1795
1829
  state()
1796
- ], ECCClientElixirTrsToolCreate.prototype, "formData", 2);
1830
+ ], _ECCClientElixirTrsToolCreate.prototype, "formData", 2);
1797
1831
  __decorateClass([
1798
1832
  state()
1799
- ], ECCClientElixirTrsToolCreate.prototype, "versions", 2);
1833
+ ], _ECCClientElixirTrsToolCreate.prototype, "versions", 2);
1800
1834
  __decorateClass([
1801
1835
  state()
1802
- ], ECCClientElixirTrsToolCreate.prototype, "activeFileIndex", 2);
1836
+ ], _ECCClientElixirTrsToolCreate.prototype, "activeFileIndex", 2);
1803
1837
  __decorateClass([
1804
1838
  state()
1805
- ], ECCClientElixirTrsToolCreate.prototype, "activeDescriptorType", 2);
1839
+ ], _ECCClientElixirTrsToolCreate.prototype, "activeDescriptorType", 2);
1840
+ var ECCClientElixirTrsToolCreate = _ECCClientElixirTrsToolCreate;
1806
1841
  var tool_create_default = ECCClientElixirTrsToolCreate;
1807
1842
 
1808
1843
  export { ECCClientElixirTrsToolCreate, tool_create_default };