-
-
Notifications
You must be signed in to change notification settings - Fork 203
Expand file tree
/
Copy pathbom_name_sync_controller.js
More file actions
94 lines (81 loc) · 3.63 KB
/
bom_name_sync_controller.js
File metadata and controls
94 lines (81 loc) · 3.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
import {Controller} from "@hotwired/stimulus";
export default class extends Controller {
static targets = ["part", "assembly", "name"];
connect() {
this.updatePlaceholder();
// Give TomSelect some time to initialize and set values
setTimeout(() => this.updatePlaceholder(), 100);
setTimeout(() => this.updatePlaceholder(), 500);
}
updatePlaceholder() {
const partSelect = this.hasPartTarget ? this.partTarget.querySelector('select, input') : null;
const assemblySelect = this.hasAssemblyTarget ? this.assemblyTarget.querySelector('select, input') : null;
const nameInput = this.hasNameTarget ? this.nameTarget : null;
if (!nameInput) return;
let selectedName = "";
// Helper to get name from tomselect
const getNameFromTS = (el) => {
if (el && el.tomselect) {
const val = el.tomselect.getValue();
if (val) {
const data = el.tomselect.options[val];
if (data && data.name) return data.name;
}
}
// Fallback for raw select
if (el && el.value && el.options && el.selectedIndex >= 0) {
return el.options[el.selectedIndex].text;
}
return "";
};
selectedName = getNameFromTS(partSelect);
if (!selectedName) {
selectedName = getNameFromTS(assemblySelect);
}
if (selectedName) {
nameInput.placeholder = selectedName;
if (nameInput.value === "") {
nameInput.style.opacity = "0.6";
} else {
nameInput.style.opacity = "1";
}
} else {
nameInput.placeholder = nameInput.dataset.originalPlaceholder || "";
nameInput.style.opacity = "1";
}
}
// This method will be called via action when a change occurs
sync(event) {
// Handle mutual exclusion: if a part is selected, clear the assembly (and vice-versa)
// We identify which field was changed by looking at the event target
const changedElement = event.target;
const partSelect = this.hasPartTarget ? this.partTarget.querySelector('select, input') : null;
const assemblySelect = this.hasAssemblyTarget ? this.assemblyTarget.querySelector('select, input') : null;
// If part was changed and has a value, clear assembly
if (partSelect && (changedElement === partSelect || partSelect.contains(changedElement))) {
const val = partSelect.tomselect ? partSelect.tomselect.getValue() : partSelect.value;
if (val && assemblySelect) {
if (assemblySelect.tomselect) {
assemblySelect.tomselect.clear(true); // true to silent event to avoid loops
} else {
assemblySelect.value = "";
}
}
}
// If assembly was changed and has a value, clear part
if (assemblySelect && (changedElement === assemblySelect || assemblySelect.contains(changedElement))) {
const val = assemblySelect.tomselect ? assemblySelect.tomselect.getValue() : assemblySelect.value;
if (val && partSelect) {
if (partSelect.tomselect) {
partSelect.tomselect.clear(true); // true to silent event to avoid loops
} else {
partSelect.value = "";
}
}
}
// Delay slightly to allow TomSelect to update its internal state if needed
setTimeout(() => {
this.updatePlaceholder();
}, 100);
}
}