aboutsummaryrefslogtreecommitdiff
path: root/input/file.js
diff options
context:
space:
mode:
authorShulhan <ms@kilabit.info>2024-09-15 14:32:48 +0700
committerShulhan <ms@kilabit.info>2024-09-15 14:32:48 +0700
commitd1e96e09438b4a5c7580b86c469e817a61be991f (patch)
tree4d81fb2fd62207bbb9162b81083c721ec8fd8e29 /input/file.js
parent1cc9c9dd68a3a59c685505228336430624608852 (diff)
downloadpakakeh.ts-d1e96e09438b4a5c7580b86c469e817a61be991f.tar.xz
all: commit all generate JavaScript files
This is to simplify development on third party where they can clone and include the file directly without installing or running anything to build the files.
Diffstat (limited to 'input/file.js')
-rw-r--r--input/file.js104
1 files changed, 104 insertions, 0 deletions
diff --git a/input/file.js b/input/file.js
new file mode 100644
index 0000000..db33463
--- /dev/null
+++ b/input/file.js
@@ -0,0 +1,104 @@
+// SPDX-FileCopyrightText: 2024 M. Shulhan <ms@kilabit.info>
+// SPDX-License-Identifier: GPL-3.0-or-later
+export class WuiInputFile {
+ constructor() {
+ this.id = "";
+ this.class = "";
+ // Filter for files. For example "image/*" to allow selecting image files.
+ this.accept = "";
+ this.label = "";
+ this.hint = "";
+ this.classInput = ""; // Custom CSS class for input element.
+ this.classLabel = ""; // Custom CSS class for label.
+ this.classHint = ""; // Custom CSS class for hint text.
+ this.classHintToggle = ""; // Custom CSS class for hint toggler.
+ this.isDisabled = false;
+ this.isHintShowed = false;
+ this.elHint = document.createElement("div");
+ }
+ element() {
+ const el = document.createElement("div");
+ if (this.id) {
+ el.id = this.id;
+ }
+ el.classList.add("wui_input_file");
+ if (this.class) {
+ el.classList.add(this.class);
+ }
+ const wrapper = document.createElement("div");
+ this.generateLabel(wrapper);
+ this.generateInput(wrapper);
+ this.generateHintToggler(wrapper);
+ el.appendChild(wrapper);
+ this.generateHint(el);
+ return el;
+ }
+ generateLabel(wrapper) {
+ const elLabel = document.createElement("label");
+ elLabel.classList.add("wui_input_file_label");
+ if (this.classLabel) {
+ elLabel.classList.add(this.classLabel);
+ }
+ elLabel.innerHTML = `${this.label} `;
+ wrapper.appendChild(elLabel);
+ }
+ generateInput(wrapper) {
+ const elInput = document.createElement("input");
+ elInput.type = "file";
+ elInput.classList.add("wui_input_file_input");
+ if (this.classInput) {
+ elInput.classList.add(this.classInput);
+ }
+ if (this.accept) {
+ elInput.accept = this.accept;
+ }
+ if (this.isDisabled) {
+ elInput.disabled = true;
+ }
+ elInput.onchange = (event) => {
+ const file = event.target.files[0];
+ if (file && this.onChange) {
+ this.onChange(file);
+ }
+ };
+ wrapper.appendChild(elInput);
+ }
+ generateHintToggler(wrapper) {
+ const elHintToggler = document.createElement("span");
+ elHintToggler.classList.add("wui_input_file_hint_toggler");
+ if (this.classHintToggle) {
+ elHintToggler.classList.add(this.classHintToggle);
+ }
+ elHintToggler.innerHTML = " &#x2139;";
+ elHintToggler.onmouseover = () => {
+ elHintToggler.style.cursor = "pointer";
+ };
+ elHintToggler.onclick = () => {
+ if (this.elHint.style.display === "none") {
+ this.elHint.style.display = "block";
+ }
+ else {
+ this.elHint.style.display = "none";
+ }
+ };
+ wrapper.appendChild(elHintToggler);
+ }
+ generateHint(parent) {
+ this.elHint = document.createElement("div");
+ this.elHint.classList.add("wui_input_file_hint");
+ if (this.classHint) {
+ this.elHint.classList.add(this.classHint);
+ }
+ this.elHint.innerHTML = this.hint;
+ this.elHint.style.borderRadius = "2px";
+ this.elHint.style.padding = "4px";
+ this.elHint.style.marginTop = "2px";
+ if (this.isHintShowed) {
+ this.elHint.style.display = "block";
+ }
+ else {
+ this.elHint.style.display = "none";
+ }
+ parent.appendChild(this.elHint);
+ }
+}