Skip to content

Commit 374f71e

Browse files
ademuriqu1ck
authored andcommitted
Add an option to grey out (darken) a row when the selected checkbox is checked.
This makes it easier to see which parts haven't been sourced or populated.
1 parent 22122f0 commit 374f71e

File tree

4 files changed

+81
-1
lines changed

4 files changed

+81
-1
lines changed

InteractiveHtmlBom/web/ibom.css

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,14 @@ canvas:active {
227227
background-color: #313b40;
228228
}
229229

230+
.bom tr.checked {
231+
color: #aaa;
232+
}
233+
234+
.dark .bom tr.checked {
235+
color: #666;
236+
}
237+
230238
.bom tr {
231239
transition: background-color 0.2s;
232240
}
@@ -567,6 +575,10 @@ mark.highlight {
567575
color: #eee;
568576
}
569577

578+
.radio-container {
579+
margin: 4px;
580+
}
581+
570582
.topmostdiv {
571583
width: 100%;
572584
height: 100%;

InteractiveHtmlBom/web/ibom.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,10 @@
111111
<input id="bomCheckboxes" class="menu-textbox" type=text
112112
oninput="setBomCheckboxes(this.value)">
113113
</label>
114+
<label class="menu-label">
115+
<div style="margin-left: 5px">Darken when checked</div>
116+
<div id="darkenWhenCheckedContainer"></div>
117+
</label>
114118
<label class="menu-label">
115119
<span class="shameless-plug">
116120
<span>Created using</span>

InteractiveHtmlBom/web/ibom.js

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,18 +150,25 @@ function setBomCheckboxState(checkbox, element, references) {
150150
}
151151

152152
function createCheckboxChangeHandler(checkbox, references) {
153-
return function() {
153+
return function(evt) {
154154
refsSet = getStoredCheckboxRefs(checkbox);
155+
var darkenWhenChecked = settings.darkenWhenChecked == checkbox;
155156
if (this.checked) {
156157
// checkbox ticked
157158
for (var ref of references) {
158159
refsSet.add(ref[1]);
159160
}
161+
if (darkenWhenChecked) {
162+
evt.target.parentElement.parentElement.classList.add("checked");
163+
}
160164
} else {
161165
// checkbox unticked
162166
for (var ref of references) {
163167
refsSet.delete(ref[1]);
164168
}
169+
if (darkenWhenChecked) {
170+
evt.target.parentElement.parentElement.classList.remove("checked");
171+
}
165172
}
166173
settings.checkboxStoredRefs[checkbox] = [...refsSet].join(",");
167174
writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
@@ -469,6 +476,9 @@ function populateBomBody() {
469476
input.type = "checkbox";
470477
input.onchange = createCheckboxChangeHandler(checkbox, references);
471478
setBomCheckboxState(checkbox, input, references);
479+
if (input.checked && settings.darkenWhenChecked == checkbox) {
480+
tr.classList.add("checked");
481+
}
472482
td.appendChild(input);
473483
tr.appendChild(td);
474484
}
@@ -813,6 +823,13 @@ function setBomCheckboxes(value) {
813823
settings.checkboxes = value.split(",").filter((e) => e);
814824
prepCheckboxes();
815825
populateBomTable();
826+
populateDarkenWhenCheckedOptions();
827+
}
828+
829+
function setDarkenWhenChecked(value) {
830+
writeStorage("darkenWhenChecked", value);
831+
settings.darkenWhenChecked = value;
832+
populateBomTable();
816833
}
817834

818835
function prepCheckboxes() {
@@ -844,6 +861,49 @@ function prepCheckboxes() {
844861
}
845862
}
846863

864+
function populateDarkenWhenCheckedOptions() {
865+
var container = document.getElementById("darkenWhenCheckedContainer");
866+
867+
if (settings.checkboxes.length == 0) {
868+
container.parentElement.style.display = "none";
869+
return;
870+
}
871+
872+
container.innerHTML = '';
873+
container.parentElement.style.display = "inline-block";
874+
875+
function createOption(name, displayName) {
876+
var id = "darkenWhenChecked-" + name;
877+
878+
var div = document.createElement("div");
879+
div.classList.add("radio-container");
880+
881+
var input = document.createElement("input");
882+
input.type = "radio";
883+
input.name = "darkenWhenChecked";
884+
input.value = name;
885+
input.id = id;
886+
input.onchange = () => setDarkenWhenChecked(name);
887+
div.appendChild(input);
888+
889+
// Preserve the selected element when the checkboxes change
890+
if (name == settings.darkenWhenChecked) {
891+
input.checked = true;
892+
}
893+
894+
var label = document.createElement("label");
895+
label.innerHTML = displayName;
896+
label.htmlFor = id;
897+
div.appendChild(label);
898+
899+
container.appendChild(div);
900+
}
901+
createOption("", "None");
902+
for (var checkbox of settings.checkboxes) {
903+
createOption(checkbox, checkbox);
904+
}
905+
}
906+
847907
function updateCheckboxStats(checkbox) {
848908
var checked = getStoredCheckboxRefs(checkbox).size;
849909
var total = pcbdata.modules.length - pcbdata.bom.skipped.length;

InteractiveHtmlBom/web/util.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,7 @@ function overwriteSettings(newSettings) {
384384
for (var checkbox of settings.checkboxes) {
385385
writeStorage("checkbox_" + checkbox, settings.checkboxStoredRefs[checkbox]);
386386
}
387+
writeStorage("darkenWhenChecked", settings.darkenWhenChecked);
387388
padsVisible(settings.renderPads);
388389
document.getElementById("padsCheckbox").checked = settings.renderPads;
389390
fabricationVisible(settings.renderFabrication);
@@ -477,6 +478,9 @@ function initDefaults() {
477478
settings.checkboxes = bomCheckboxes.split(",").filter((e) => e);
478479
document.getElementById("bomCheckboxes").value = bomCheckboxes;
479480

481+
settings.darkenWhenChecked = readStorage("darkenWhenChecked") || "";
482+
populateDarkenWhenCheckedOptions();
483+
480484
function initBooleanSetting(storageString, def, elementId, func) {
481485
var b = readStorage(storageString);
482486
if (b === null) {

0 commit comments

Comments
 (0)