1
0
mirror of https://github.com/Jermolene/TiddlyWiki5 synced 2025-11-22 10:14:51 +00:00

Implement checkbox list mode

This commit is contained in:
Robin Munn
2022-03-24 17:00:50 +07:00
parent 3d8a158758
commit fb8fcb0a13

View File

@@ -90,6 +90,27 @@ CheckboxWidget.prototype.getValue = function() {
return false; return false;
} }
} }
if(this.checkboxListField) {
var list;
if($tw.utils.hop(tiddler.fields,this.checkboxListField)) {
list = tiddler.getFieldList(this.checkboxListField);
} else {
list = $tw.utils.parseStringArray(this.checkboxDefault || "") || [];
}
if(list.indexOf(this.checkboxChecked) !== -1) {
return true;
}
if(list.indexOf(this.checkboxUnchecked) !== -1) {
return false;
}
// Neither one present
if(this.checkboxChecked && !this.checkboxUnchecked) {
return false; // Absence of checked value
}
if(this.checkboxUnchecked && !this.checkboxChecked) {
return true; // Absence of unchecked value
}
}
} else { } else {
if(this.checkboxTag) { if(this.checkboxTag) {
return false; return false;
@@ -114,7 +135,8 @@ CheckboxWidget.prototype.handleChangeEvent = function(event) {
hasChanged = false, hasChanged = false,
tagCheck = false, tagCheck = false,
hasTag = tiddler && tiddler.hasTag(this.checkboxTag), hasTag = tiddler && tiddler.hasTag(this.checkboxTag),
value = checked ? this.checkboxChecked : this.checkboxUnchecked; value = checked ? this.checkboxChecked : this.checkboxUnchecked,
notValue = checked ? this.checkboxUnchecked : this.checkboxChecked;
if(this.checkboxTag && this.checkboxInvertTag === "yes") { if(this.checkboxTag && this.checkboxInvertTag === "yes") {
tagCheck = hasTag === checked; tagCheck = hasTag === checked;
} else { } else {
@@ -148,6 +170,37 @@ CheckboxWidget.prototype.handleChangeEvent = function(event) {
hasChanged = true; hasChanged = true;
} }
} }
// Set the list field if specified
if(this.checkboxListField) {
var fieldContents = tiddler.getFieldList(this.checkboxListField);
var oldPos = notValue ? fieldContents.indexOf(notValue) : -1;
var newPos = value ? fieldContents.indexOf(value) : -1;
if(oldPos === -1 && newPos !== -1) {
// old value absent, new value present: no change needed
} else if(oldPos === -1) {
// neither one was present
if(value) {
fieldContents.push(value);
hasChanged = true;
} else {
// value unspecified? then leave list unchanged
}
} else if(newPos === -1) {
// old value present, new value absent
if(value) {
fieldContents[oldPos] = value;
hasChanged = true;
} else {
fieldContents.splice(oldPos, 1)
hasChanged = true;
}
} else {
// both were present: just remove the old one, leave new alone
fieldContents.splice(oldPos, 1)
hasChanged = true;
}
newFields[this.checkboxListField] = $tw.utils.stringifyList(fieldContents);
}
if(hasChanged) { if(hasChanged) {
if(this.checkboxIndex) { if(this.checkboxIndex) {
this.wiki.setText(this.checkboxTitle,"",this.checkboxIndex,value); this.wiki.setText(this.checkboxTitle,"",this.checkboxIndex,value);
@@ -179,6 +232,7 @@ CheckboxWidget.prototype.execute = function() {
this.checkboxTag = this.getAttribute("tag"); this.checkboxTag = this.getAttribute("tag");
this.checkboxField = this.getAttribute("field"); this.checkboxField = this.getAttribute("field");
this.checkboxIndex = this.getAttribute("index"); this.checkboxIndex = this.getAttribute("index");
this.checkboxListField = this.getAttribute("listField");
this.checkboxChecked = this.getAttribute("checked"); this.checkboxChecked = this.getAttribute("checked");
this.checkboxUnchecked = this.getAttribute("unchecked"); this.checkboxUnchecked = this.getAttribute("unchecked");
this.checkboxDefault = this.getAttribute("default"); this.checkboxDefault = this.getAttribute("default");