import {Controller} from "@hotwired/stimulus" const TRADE_TYPES = { BUY: "buy", SELL: "sell", TRANSFER_IN: "transfer_in", TRANSFER_OUT: "transfer_out", INTEREST: "interest" } const FIELD_VISIBILITY = { [TRADE_TYPES.BUY]: {ticker: true, qty: true, price: true}, [TRADE_TYPES.SELL]: {ticker: true, qty: true, price: true}, [TRADE_TYPES.TRANSFER_IN]: {amount: true, transferAccount: true}, [TRADE_TYPES.TRANSFER_OUT]: {amount: true, transferAccount: true}, [TRADE_TYPES.INTEREST]: {amount: true} } // Connects to data-controller="trade-form" export default class extends Controller { static targets = ["typeInput", "tickerInput", "amountInput", "transferAccountInput", "qtyInput", "priceInput"] connect() { this.handleTypeChange = this.handleTypeChange.bind(this) this.typeInputTarget.addEventListener("change", this.handleTypeChange) this.updateFields(this.typeInputTarget.value || TRADE_TYPES.BUY) } disconnect() { this.typeInputTarget.removeEventListener("change", this.handleTypeChange) } handleTypeChange(event) { this.updateFields(event.target.value) } updateFields(type) { const visibleFields = FIELD_VISIBILITY[type] || {} Object.entries(this.fieldTargets).forEach(([field, target]) => { const isVisible = visibleFields[field] || false // Update visibility target.hidden = !isVisible // Update required status based on visibility if (isVisible) { target.setAttribute('required', '') } else { target.removeAttribute('required') } }) } get fieldTargets() { return { ticker: this.tickerInputTarget, amount: this.amountInputTarget, transferAccount: this.transferAccountInputTarget, qty: this.qtyInputTarget, price: this.priceInputTarget } } }