diff --git a/package-lock.json b/package-lock.json
index ea97f8f1..1c3f9e55 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -19,6 +19,7 @@
"@open-wc/eslint-config": "^12.0.3",
"@open-wc/testing": "^4.0.0",
"@turbo/gen": "^1.9.8",
+ "@types/mocha": "^10.0.9",
"@web/dev-server": "^0.4.1",
"@web/dev-server-esbuild": "^1.0.2",
"@web/test-runner-playwright": "^0.11.0",
@@ -6224,6 +6225,13 @@
"integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==",
"dev": true
},
+ "node_modules/@types/mocha": {
+ "version": "10.0.9",
+ "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.9.tgz",
+ "integrity": "sha512-sicdRoWtYevwxjOHNMPTl3vSfJM6oyW8o1wXeI7uww6b6xHg8eBznQDNSGBCDJmsE8UMxP05JgZRtsKbTqt//Q==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@types/ms": {
"version": "0.7.34",
"resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz",
@@ -26662,7 +26670,7 @@
"version": "0.1.0",
"license": "Apache-2.0",
"dependencies": {
- "@elixir-cloud/design": "^0.1.1",
+ "@elixir-cloud/design": "^1.0.0",
"lit": "^3.2.0"
},
"devDependencies": {
@@ -27075,7 +27083,7 @@
},
"packages/ecc-client-ga4gh-tes": {
"name": "@elixir-cloud/tes",
- "version": "0.1.1",
+ "version": "1.0.0",
"license": "Apache-2.0",
"dependencies": {
"@elixir-cloud/design": "*",
@@ -28005,7 +28013,7 @@
},
"packages/ecc-client-ga4gh-wes": {
"name": "@elixir-cloud/wes",
- "version": "0.1.1",
+ "version": "1.0.0",
"license": "Apache-2.0",
"dependencies": {
"@elixir-cloud/design": "*",
@@ -28882,7 +28890,7 @@
},
"packages/ecc-utils-design": {
"name": "@elixir-cloud/design",
- "version": "0.1.1",
+ "version": "1.0.0",
"license": "Apache-2.0",
"dependencies": {
"@anurag_gupta/tus-js-client": "^4.2.10",
diff --git a/package.json b/package.json
index 2594c06f..6fe05592 100644
--- a/package.json
+++ b/package.json
@@ -35,6 +35,7 @@
"@open-wc/eslint-config": "^12.0.3",
"@open-wc/testing": "^4.0.0",
"@turbo/gen": "^1.9.8",
+ "@types/mocha": "^10.0.9",
"@web/dev-server": "^0.4.1",
"@web/dev-server-esbuild": "^1.0.2",
"@web/test-runner-playwright": "^0.11.0",
diff --git a/packages/ecc-utils-design/src/components/form/form.ts b/packages/ecc-utils-design/src/components/form/form.ts
index 15c3dfe7..922443b9 100644
--- a/packages/ecc-utils-design/src/components/form/form.ts
+++ b/packages/ecc-utils-design/src/components/form/form.ts
@@ -9,7 +9,7 @@ import "@shoelace-style/shoelace/dist/components/details/details.js";
import "@shoelace-style/shoelace/dist/components/tooltip/tooltip.js";
import "@shoelace-style/shoelace/dist/components/select/select.js";
import "@shoelace-style/shoelace/dist/components/option/option.js";
-import _ from "lodash-es";
+import * as _ from "lodash-es";
import { hostStyles } from "../../styles/host.styles.js";
import formStyles from "./form.styles.js";
import { primitiveStylesheet } from "../../styles/primitive.styles.js";
@@ -120,20 +120,20 @@ export default class EccUtilsDesignForm extends LitElement {
}
return html`
-
+
${field.fieldOptions?.tooltip && field.fieldOptions.tooltip !== ""
? html`
-
`
: html`
-
`}
@@ -141,7 +141,7 @@ export default class EccUtilsDesignForm extends LitElement {
size="small"
class="switch"
data-label=${field.label}
- data-testid="form-switch"
+ data-testid="switch"
label=${field.label}
?required=${field.fieldOptions?.required}
?checked=${_.get(this.form, path)}
@@ -162,12 +162,12 @@ export default class EccUtilsDesignForm extends LitElement {
private handleTusFileUpload = async (
e: Event,
field: Field
- ): Promise
=> {
+ ): Promise | null> => {
const file = (e.target as HTMLInputElement).files?.[0];
if (!file) {
console.error("No file selected for upload.");
- return;
+ return null;
}
try {
@@ -192,11 +192,20 @@ export default class EccUtilsDesignForm extends LitElement {
this.requestUpdate();
},
onSuccess: () => {
+ const data: any = {
+ url: upload.url,
+ file,
+ name: "",
+ };
+
if ("name" in upload.file) {
console.log("Download %s from %s", upload.file.name, upload.url);
+ data.name = upload.file.name;
} else {
console.log("Download file from %s", upload.url);
}
+
+ return data;
},
});
@@ -209,6 +218,8 @@ export default class EccUtilsDesignForm extends LitElement {
} catch (error) {
console.error("An error occurred while initializing the upload:", error);
}
+
+ return null;
};
renderInputTemplate(field: Field, path: string): TemplateResult {
@@ -221,61 +232,82 @@ export default class EccUtilsDesignForm extends LitElement {
if (field.type === "file") {
return html`
-
+
${field.fieldOptions?.tooltip && field.fieldOptions.tooltip !== ""
? html`
-
`
: html`
-
+
${field.label} ${field.fieldOptions?.required ? "*" : ""}
`}
- ${field.fileOptions?.protocol === "tus" &&
- html`
- {
- await this.handleTusFileUpload(e, field);
- }}
- />
-
-
- ${this.uploadPercentage.toFixed(2)}%
-
- `}
- ${(!field.fileOptions?.protocol ||
- field.fileOptions?.protocol === "native") &&
- html`
- {
- const { files } = e.target as HTMLInputElement;
- _.set(this.form, path, files);
- this.requestUpdate();
- }}
- />
- `}
+ ${field.fileOptions?.protocol === "tus"
+ ? html`
+ {
+ if (!field.fileOptions?.tusOptions?.endpoint) return;
+
+ const data = await this.handleTusFileUpload(e, field);
+
+ if (data) {
+ _.set(this.form, path, data);
+ this.alertFieldChange(field.key, data);
+ }
+ }}
+ />
+
+
+ ${this.uploadPercentage.toFixed(2)}%
+
+ `
+ : ""}
+ ${!field.fileOptions?.protocol ||
+ field.fileOptions?.protocol === "native"
+ ? html`
+ {
+ const { files } = e.target as HTMLInputElement;
+ _.set(this.form, path, files);
+ this.alertFieldChange(field.key, files);
+ this.requestUpdate();
+ }}
+ />
+ `
+ : ""}
`;
}
@@ -285,26 +317,27 @@ export default class EccUtilsDesignForm extends LitElement {
if (field.fieldOptions?.default && !this.hasUpdated) {
_.set(this.form, path, field.fieldOptions.default);
} else if (field.fieldOptions?.returnIfEmpty) {
- _.set(this.form, path, "");
+ _.set(this.form, path, null);
}
}
if (field.type === "select") {
return html`
-
+
${field.fieldOptions?.tooltip && field.fieldOptions.tooltip !== ""
? html`
-
+
${field.label} ${field.fieldOptions?.required ? "*" : ""}
`
: html`
-
+
${field.label} ${field.fieldOptions?.required ? "*" : ""}
`}
@@ -312,10 +345,11 @@ export default class EccUtilsDesignForm extends LitElement {
class="select"
?required=${field.fieldOptions?.required}
value=${_.get(this.form, path)?.label || ""}
+ data-testid="select"
+ data-label=${field.label}
@sl-change=${(e: Event) => {
- const selectElement = e.target as HTMLSelectElement;
- const label =
- selectElement.selectedOptions[0].textContent?.trim();
+ const label = (e.target as HTMLSelectElement).value;
+
_.set(this.form, path, label);
this.requestUpdate();
this.alertFieldChange(field.key, label);
@@ -323,7 +357,13 @@ export default class EccUtilsDesignForm extends LitElement {
>
${field.selectOptions?.map(
(option) => html`
- ${option.label}
+
+ ${option.label}
+
`
)}
@@ -335,7 +375,7 @@ export default class EccUtilsDesignForm extends LitElement {
${field.fieldOptions?.tooltip && field.fieldOptions.tooltip !== ""
? html`
-
- ${field.label}
+
+ ${field.label}
`
- : html`
${field.label} `}
+ : html`
${field.label} `}
`;
}
private renderArrayTemplate(field: Field, path: string): TemplateResult {
+ if (!field.children?.length) return html``;
+
const { arrayOptions } = field;
if (!_.get(this.form, path)) {
@@ -392,28 +435,33 @@ export default class EccUtilsDesignForm extends LitElement {
};
return html`
-
+
${_.get(this.form, path)?.map(
(_item: any, index: number) => html`
-
+
{
if (resolveDeleteButtonIsActive()) {
@@ -486,21 +539,22 @@ export default class EccUtilsDesignForm extends LitElement {
}
private renderGroupTemplate(field: Field, path: string): TemplateResult {
- if (!field.children) return html``;
+ if (!field.children?.length) return html``;
const renderChildren = () =>
html`
-
+
${field.children?.map((child) =>
this.renderTemplate(child, `${path}`)
)}
`;
- return html`
+ return html`
${field.groupOptions?.collapsible
? html` `
: html`
-