mirror of
https://github.com/maybe-finance/maybe.git
synced 2025-07-19 21:29:38 +02:00
119 lines
3.3 KiB
JavaScript
119 lines
3.3 KiB
JavaScript
|
import { Controller } from "@hotwired/stimulus";
|
||
|
|
||
|
// Connects to data-controller="import"
|
||
|
export default class extends Controller {
|
||
|
static values = {
|
||
|
csv: { type: Array, default: [] },
|
||
|
amountTypeColumnKey: { type: String, default: "" },
|
||
|
};
|
||
|
|
||
|
static targets = [
|
||
|
"signedAmountFieldset",
|
||
|
"customColumnFieldset",
|
||
|
"amountTypeValue",
|
||
|
"amountTypeStrategySelect",
|
||
|
];
|
||
|
|
||
|
connect() {
|
||
|
if (
|
||
|
this.amountTypeStrategySelectTarget.value === "custom_column" &&
|
||
|
this.amountTypeColumnKeyValue
|
||
|
) {
|
||
|
this.#showAmountTypeValueTargets(this.amountTypeColumnKeyValue);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
handleAmountTypeStrategyChange(event) {
|
||
|
const amountTypeStrategy = event.target.value;
|
||
|
|
||
|
if (amountTypeStrategy === "custom_column") {
|
||
|
this.#enableCustomColumnFieldset();
|
||
|
|
||
|
if (this.amountTypeColumnKeyValue) {
|
||
|
this.#showAmountTypeValueTargets(this.amountTypeColumnKeyValue);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (amountTypeStrategy === "signed_amount") {
|
||
|
this.#enableSignedAmountFieldset();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
handleAmountTypeChange(event) {
|
||
|
const amountTypeColumnKey = event.target.value;
|
||
|
|
||
|
this.#showAmountTypeValueTargets(amountTypeColumnKey);
|
||
|
}
|
||
|
|
||
|
#showAmountTypeValueTargets(amountTypeColumnKey) {
|
||
|
const selectableValues = this.#uniqueValuesForColumn(amountTypeColumnKey);
|
||
|
|
||
|
this.amountTypeValueTarget.classList.remove("hidden");
|
||
|
this.amountTypeValueTarget.classList.add("flex");
|
||
|
|
||
|
const select = this.amountTypeValueTarget.querySelector("select");
|
||
|
const currentValue = select.value;
|
||
|
select.options.length = 0;
|
||
|
const fragment = document.createDocumentFragment();
|
||
|
|
||
|
// Only add the prompt if there's no current value
|
||
|
if (!currentValue) {
|
||
|
fragment.appendChild(new Option("Select value", ""));
|
||
|
}
|
||
|
|
||
|
selectableValues.forEach((value) => {
|
||
|
const option = new Option(value, value);
|
||
|
if (value === currentValue) {
|
||
|
option.selected = true;
|
||
|
}
|
||
|
fragment.appendChild(option);
|
||
|
});
|
||
|
|
||
|
select.appendChild(fragment);
|
||
|
}
|
||
|
|
||
|
#uniqueValuesForColumn(column) {
|
||
|
const colIdx = this.csvValue[0].indexOf(column);
|
||
|
const values = this.csvValue.slice(1).map((row) => row[colIdx]);
|
||
|
return [...new Set(values)];
|
||
|
}
|
||
|
|
||
|
#enableCustomColumnFieldset() {
|
||
|
this.customColumnFieldsetTarget.classList.remove("hidden");
|
||
|
this.signedAmountFieldsetTarget.classList.add("hidden");
|
||
|
|
||
|
// Set required on custom column fields
|
||
|
this.customColumnFieldsetTarget
|
||
|
.querySelectorAll("select, input")
|
||
|
.forEach((field) => {
|
||
|
field.setAttribute("required", "");
|
||
|
});
|
||
|
|
||
|
// Remove required from signed amount fields
|
||
|
this.signedAmountFieldsetTarget
|
||
|
.querySelectorAll("select, input")
|
||
|
.forEach((field) => {
|
||
|
field.removeAttribute("required");
|
||
|
});
|
||
|
}
|
||
|
|
||
|
#enableSignedAmountFieldset() {
|
||
|
this.customColumnFieldsetTarget.classList.add("hidden");
|
||
|
this.signedAmountFieldsetTarget.classList.remove("hidden");
|
||
|
|
||
|
// Remove required from custom column fields
|
||
|
this.customColumnFieldsetTarget
|
||
|
.querySelectorAll("select, input")
|
||
|
.forEach((field) => {
|
||
|
field.removeAttribute("required");
|
||
|
});
|
||
|
|
||
|
// Set required on signed amount fields
|
||
|
this.signedAmountFieldsetTarget
|
||
|
.querySelectorAll("select, input")
|
||
|
.forEach((field) => {
|
||
|
field.setAttribute("required", "");
|
||
|
});
|
||
|
}
|
||
|
}
|