1
0
mirror of https://github.com/Jermolene/TiddlyWiki5 synced 2024-11-26 11:37:20 +00:00
TiddlyWiki5/core/modules/widgets/checkbox.js

322 lines
11 KiB
JavaScript
Raw Normal View History

/*\
title: $:/core/modules/widgets/checkbox.js
type: application/javascript
module-type: widget
Checkbox widget
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
var Widget = require("$:/core/modules/widgets/widget.js").widget;
var CheckboxWidget = function(parseTreeNode,options) {
this.initialise(parseTreeNode,options);
};
/*
Inherit from the base widget class
*/
CheckboxWidget.prototype = new Widget();
/*
Render this widget into the DOM
*/
CheckboxWidget.prototype.render = function(parent,nextSibling) {
var isChecked;
// Save the parent dom node
this.parentDomNode = parent;
// Compute our attributes
this.computeAttributes();
// Execute our logic
this.execute();
// Create our elements
this.labelDomNode = this.document.createElement("label");
Checkbox widget: list and filter modes (#6561) * Docs for CheckboxWidget list and filter modes This documents the `listField` and `filter` attributes. * Tests for checkbox widget list mode * Implement checkbox list mode * WIP on implementing filter attr for checkboxes * Improve CheckboxWidget documentation * Refactor checkbox tests: move function to top The big findNodeOfType function belongs at the top of the describe block, so that the checkbox tests are more compact and easy to read. * Move checkbox widget tests to end of file The checkbox widget tests are long and involved, so we'll move them to the end of the file so they aren't a huge block of code you need to read past to find the next test. * Improve formatting of CheckboxWidget docs The \define() calls that are short enough to fit on one line should be put on one line, for readability. The ones that are quite long have been kept on multiple lines, for readability. * Added more passing tests for checkbox widget * Add some failing tests for checkbox widget The filter mode where neither checked nor unchecked is specified (in which case an empty filter result means false and a non-empty result means true) is not working yet. * Make failing tests pass * Uncomment (and improve) test for field mode We're now ready to start working on making this test pass. (There was also one small mistake in the test, which this commit corrects). * All tests now passing * No indeterminate checkboxes in simple modes The simple checkbox modes (field and index) should not produce indeterminate checkboxes. That should be reserved for the advanced modes (list and filter). * Minor improvement to unit tests * Allow indeterminate checkboxes in list and filter modes This change may require some tweaks to the unit tests to be able to test it properly. * Slightly easier to read tests * Two more tests for list mode * Greatly simplify unit test code Turns out there's no need to jump through Object.getPrototypeOf hoops. * Minor simplification of unit test * Add tests for indeterminate in list & filter modes With this, the set of tests is complete. * More tests to specify list mode behavior * Unfocus tests so all tests run * Update docs to say "new in 5.2.3" insetad of 5.2.2 * Move checkbox widget tests into their own file The test-widget.js file was getting too long with all the checkbox tests added, so we'll move the checkbox tests into their own file. * Add checkbox widget tests for index mode This commit also adds tests for index list mode (with a listIndex attribute that will parallel the listField attribute) but leaves them commented out because they don't pass yet: the code that implements the listIndex attribute hasn't been written yet). * Add listIndex attribute to checkbox widget * Remove code that lets checkboxes be indeterminate This reverts commit 6afcb151befecd3e6656c4edee7e1b2bbf529909. We will add this code back in a later PR. * Remove indeterminate tests for checkbox widget We're currently not allowing indeterminate checkboxes, so there's no need for the tests that check for them. * Document listIndex attribute of CheckboxWidget * adds class tc-checkbox-checked when checked * equivalent to #2182 (RadioWidget) * also applies `tc-checkbox` to checkboxes by default, always * Move macro definitions inside example text Since the wikitext-example-without-html macro creates a new parsing context, it's safe to have macro definitions inside it. That makes these examples a lot easier to write, and to read. * Remove all mention of indeterminate checkboxes Also improve the documentation a little bit: mention what happens in list mode if neither checked nor unchecked is specified. * Move filter mode to bottom of checkbox docs The `filter` attribute should be under both `listField` and `listIndex` rather than being between them. The documentation for filter mode should similarly be after the `listIndex` documentation. * Improve docs for `class` attr of checkbox widget This brings the wording of the `class` attribute more in line with how it's worded in the RadioWidget docs. * Fix bug with list tiddlers If neither checked nor unchecked was specified, then the behavior should be "empty = false, non-empty = true". But if *both* are specified yet neither is found, then the checkbox should be unchecked (false). It had been falling through to the "non-empty = true" behavior, which was wrong. * Improve listIndex example of checkbox widgets * Remove unused function from test-widget.js Co-authored-by: Tobias Beer <beertobias@gmail.com>
2022-04-02 14:16:08 +00:00
this.labelDomNode.setAttribute("class","tc-checkbox " + this.checkboxClass);
this.inputDomNode = this.document.createElement("input");
this.inputDomNode.setAttribute("type","checkbox");
isChecked = this.getValue();
if(isChecked) {
this.inputDomNode.setAttribute("checked","true");
Checkbox widget: list and filter modes (#6561) * Docs for CheckboxWidget list and filter modes This documents the `listField` and `filter` attributes. * Tests for checkbox widget list mode * Implement checkbox list mode * WIP on implementing filter attr for checkboxes * Improve CheckboxWidget documentation * Refactor checkbox tests: move function to top The big findNodeOfType function belongs at the top of the describe block, so that the checkbox tests are more compact and easy to read. * Move checkbox widget tests to end of file The checkbox widget tests are long and involved, so we'll move them to the end of the file so they aren't a huge block of code you need to read past to find the next test. * Improve formatting of CheckboxWidget docs The \define() calls that are short enough to fit on one line should be put on one line, for readability. The ones that are quite long have been kept on multiple lines, for readability. * Added more passing tests for checkbox widget * Add some failing tests for checkbox widget The filter mode where neither checked nor unchecked is specified (in which case an empty filter result means false and a non-empty result means true) is not working yet. * Make failing tests pass * Uncomment (and improve) test for field mode We're now ready to start working on making this test pass. (There was also one small mistake in the test, which this commit corrects). * All tests now passing * No indeterminate checkboxes in simple modes The simple checkbox modes (field and index) should not produce indeterminate checkboxes. That should be reserved for the advanced modes (list and filter). * Minor improvement to unit tests * Allow indeterminate checkboxes in list and filter modes This change may require some tweaks to the unit tests to be able to test it properly. * Slightly easier to read tests * Two more tests for list mode * Greatly simplify unit test code Turns out there's no need to jump through Object.getPrototypeOf hoops. * Minor simplification of unit test * Add tests for indeterminate in list & filter modes With this, the set of tests is complete. * More tests to specify list mode behavior * Unfocus tests so all tests run * Update docs to say "new in 5.2.3" insetad of 5.2.2 * Move checkbox widget tests into their own file The test-widget.js file was getting too long with all the checkbox tests added, so we'll move the checkbox tests into their own file. * Add checkbox widget tests for index mode This commit also adds tests for index list mode (with a listIndex attribute that will parallel the listField attribute) but leaves them commented out because they don't pass yet: the code that implements the listIndex attribute hasn't been written yet). * Add listIndex attribute to checkbox widget * Remove code that lets checkboxes be indeterminate This reverts commit 6afcb151befecd3e6656c4edee7e1b2bbf529909. We will add this code back in a later PR. * Remove indeterminate tests for checkbox widget We're currently not allowing indeterminate checkboxes, so there's no need for the tests that check for them. * Document listIndex attribute of CheckboxWidget * adds class tc-checkbox-checked when checked * equivalent to #2182 (RadioWidget) * also applies `tc-checkbox` to checkboxes by default, always * Move macro definitions inside example text Since the wikitext-example-without-html macro creates a new parsing context, it's safe to have macro definitions inside it. That makes these examples a lot easier to write, and to read. * Remove all mention of indeterminate checkboxes Also improve the documentation a little bit: mention what happens in list mode if neither checked nor unchecked is specified. * Move filter mode to bottom of checkbox docs The `filter` attribute should be under both `listField` and `listIndex` rather than being between them. The documentation for filter mode should similarly be after the `listIndex` documentation. * Improve docs for `class` attr of checkbox widget This brings the wording of the `class` attribute more in line with how it's worded in the RadioWidget docs. * Fix bug with list tiddlers If neither checked nor unchecked was specified, then the behavior should be "empty = false, non-empty = true". But if *both* are specified yet neither is found, then the checkbox should be unchecked (false). It had been falling through to the "non-empty = true" behavior, which was wrong. * Improve listIndex example of checkbox widgets * Remove unused function from test-widget.js Co-authored-by: Tobias Beer <beertobias@gmail.com>
2022-04-02 14:16:08 +00:00
$tw.utils.addClass(this.labelDomNode,"tc-checkbox-checked");
}
if(isChecked === undefined && this.checkboxIndeterminate === "yes") {
this.inputDomNode.indeterminate = true;
}
if(this.isDisabled === "yes") {
this.inputDomNode.setAttribute("disabled",true);
}
this.labelDomNode.appendChild(this.inputDomNode);
this.spanDomNode = this.document.createElement("span");
this.labelDomNode.appendChild(this.spanDomNode);
// Add a click event handler
$tw.utils.addEventListeners(this.inputDomNode,[
{name: "change", handlerObject: this, handlerMethod: "handleChangeEvent"}
]);
// Insert the label into the DOM and render any children
parent.insertBefore(this.labelDomNode,nextSibling);
this.renderChildren(this.spanDomNode,null);
this.domNodes.push(this.labelDomNode);
};
CheckboxWidget.prototype.getValue = function() {
var tiddler = this.wiki.getTiddler(this.checkboxTitle);
Checkbox widget: list and filter modes (#6561) * Docs for CheckboxWidget list and filter modes This documents the `listField` and `filter` attributes. * Tests for checkbox widget list mode * Implement checkbox list mode * WIP on implementing filter attr for checkboxes * Improve CheckboxWidget documentation * Refactor checkbox tests: move function to top The big findNodeOfType function belongs at the top of the describe block, so that the checkbox tests are more compact and easy to read. * Move checkbox widget tests to end of file The checkbox widget tests are long and involved, so we'll move them to the end of the file so they aren't a huge block of code you need to read past to find the next test. * Improve formatting of CheckboxWidget docs The \define() calls that are short enough to fit on one line should be put on one line, for readability. The ones that are quite long have been kept on multiple lines, for readability. * Added more passing tests for checkbox widget * Add some failing tests for checkbox widget The filter mode where neither checked nor unchecked is specified (in which case an empty filter result means false and a non-empty result means true) is not working yet. * Make failing tests pass * Uncomment (and improve) test for field mode We're now ready to start working on making this test pass. (There was also one small mistake in the test, which this commit corrects). * All tests now passing * No indeterminate checkboxes in simple modes The simple checkbox modes (field and index) should not produce indeterminate checkboxes. That should be reserved for the advanced modes (list and filter). * Minor improvement to unit tests * Allow indeterminate checkboxes in list and filter modes This change may require some tweaks to the unit tests to be able to test it properly. * Slightly easier to read tests * Two more tests for list mode * Greatly simplify unit test code Turns out there's no need to jump through Object.getPrototypeOf hoops. * Minor simplification of unit test * Add tests for indeterminate in list & filter modes With this, the set of tests is complete. * More tests to specify list mode behavior * Unfocus tests so all tests run * Update docs to say "new in 5.2.3" insetad of 5.2.2 * Move checkbox widget tests into their own file The test-widget.js file was getting too long with all the checkbox tests added, so we'll move the checkbox tests into their own file. * Add checkbox widget tests for index mode This commit also adds tests for index list mode (with a listIndex attribute that will parallel the listField attribute) but leaves them commented out because they don't pass yet: the code that implements the listIndex attribute hasn't been written yet). * Add listIndex attribute to checkbox widget * Remove code that lets checkboxes be indeterminate This reverts commit 6afcb151befecd3e6656c4edee7e1b2bbf529909. We will add this code back in a later PR. * Remove indeterminate tests for checkbox widget We're currently not allowing indeterminate checkboxes, so there's no need for the tests that check for them. * Document listIndex attribute of CheckboxWidget * adds class tc-checkbox-checked when checked * equivalent to #2182 (RadioWidget) * also applies `tc-checkbox` to checkboxes by default, always * Move macro definitions inside example text Since the wikitext-example-without-html macro creates a new parsing context, it's safe to have macro definitions inside it. That makes these examples a lot easier to write, and to read. * Remove all mention of indeterminate checkboxes Also improve the documentation a little bit: mention what happens in list mode if neither checked nor unchecked is specified. * Move filter mode to bottom of checkbox docs The `filter` attribute should be under both `listField` and `listIndex` rather than being between them. The documentation for filter mode should similarly be after the `listIndex` documentation. * Improve docs for `class` attr of checkbox widget This brings the wording of the `class` attribute more in line with how it's worded in the RadioWidget docs. * Fix bug with list tiddlers If neither checked nor unchecked was specified, then the behavior should be "empty = false, non-empty = true". But if *both* are specified yet neither is found, then the checkbox should be unchecked (false). It had been falling through to the "non-empty = true" behavior, which was wrong. * Improve listIndex example of checkbox widgets * Remove unused function from test-widget.js Co-authored-by: Tobias Beer <beertobias@gmail.com>
2022-04-02 14:16:08 +00:00
if(tiddler || this.checkboxFilter) {
if(this.checkboxTag) {
if(this.checkboxInvertTag === "yes") {
return !tiddler.hasTag(this.checkboxTag);
} else {
return tiddler.hasTag(this.checkboxTag);
}
}
Checkbox widget: list and filter modes (#6561) * Docs for CheckboxWidget list and filter modes This documents the `listField` and `filter` attributes. * Tests for checkbox widget list mode * Implement checkbox list mode * WIP on implementing filter attr for checkboxes * Improve CheckboxWidget documentation * Refactor checkbox tests: move function to top The big findNodeOfType function belongs at the top of the describe block, so that the checkbox tests are more compact and easy to read. * Move checkbox widget tests to end of file The checkbox widget tests are long and involved, so we'll move them to the end of the file so they aren't a huge block of code you need to read past to find the next test. * Improve formatting of CheckboxWidget docs The \define() calls that are short enough to fit on one line should be put on one line, for readability. The ones that are quite long have been kept on multiple lines, for readability. * Added more passing tests for checkbox widget * Add some failing tests for checkbox widget The filter mode where neither checked nor unchecked is specified (in which case an empty filter result means false and a non-empty result means true) is not working yet. * Make failing tests pass * Uncomment (and improve) test for field mode We're now ready to start working on making this test pass. (There was also one small mistake in the test, which this commit corrects). * All tests now passing * No indeterminate checkboxes in simple modes The simple checkbox modes (field and index) should not produce indeterminate checkboxes. That should be reserved for the advanced modes (list and filter). * Minor improvement to unit tests * Allow indeterminate checkboxes in list and filter modes This change may require some tweaks to the unit tests to be able to test it properly. * Slightly easier to read tests * Two more tests for list mode * Greatly simplify unit test code Turns out there's no need to jump through Object.getPrototypeOf hoops. * Minor simplification of unit test * Add tests for indeterminate in list & filter modes With this, the set of tests is complete. * More tests to specify list mode behavior * Unfocus tests so all tests run * Update docs to say "new in 5.2.3" insetad of 5.2.2 * Move checkbox widget tests into their own file The test-widget.js file was getting too long with all the checkbox tests added, so we'll move the checkbox tests into their own file. * Add checkbox widget tests for index mode This commit also adds tests for index list mode (with a listIndex attribute that will parallel the listField attribute) but leaves them commented out because they don't pass yet: the code that implements the listIndex attribute hasn't been written yet). * Add listIndex attribute to checkbox widget * Remove code that lets checkboxes be indeterminate This reverts commit 6afcb151befecd3e6656c4edee7e1b2bbf529909. We will add this code back in a later PR. * Remove indeterminate tests for checkbox widget We're currently not allowing indeterminate checkboxes, so there's no need for the tests that check for them. * Document listIndex attribute of CheckboxWidget * adds class tc-checkbox-checked when checked * equivalent to #2182 (RadioWidget) * also applies `tc-checkbox` to checkboxes by default, always * Move macro definitions inside example text Since the wikitext-example-without-html macro creates a new parsing context, it's safe to have macro definitions inside it. That makes these examples a lot easier to write, and to read. * Remove all mention of indeterminate checkboxes Also improve the documentation a little bit: mention what happens in list mode if neither checked nor unchecked is specified. * Move filter mode to bottom of checkbox docs The `filter` attribute should be under both `listField` and `listIndex` rather than being between them. The documentation for filter mode should similarly be after the `listIndex` documentation. * Improve docs for `class` attr of checkbox widget This brings the wording of the `class` attribute more in line with how it's worded in the RadioWidget docs. * Fix bug with list tiddlers If neither checked nor unchecked was specified, then the behavior should be "empty = false, non-empty = true". But if *both* are specified yet neither is found, then the checkbox should be unchecked (false). It had been falling through to the "non-empty = true" behavior, which was wrong. * Improve listIndex example of checkbox widgets * Remove unused function from test-widget.js Co-authored-by: Tobias Beer <beertobias@gmail.com>
2022-04-02 14:16:08 +00:00
if(this.checkboxField || this.checkboxIndex) {
// Same logic applies to fields and indexes
var value;
Checkbox widget: list and filter modes (#6561) * Docs for CheckboxWidget list and filter modes This documents the `listField` and `filter` attributes. * Tests for checkbox widget list mode * Implement checkbox list mode * WIP on implementing filter attr for checkboxes * Improve CheckboxWidget documentation * Refactor checkbox tests: move function to top The big findNodeOfType function belongs at the top of the describe block, so that the checkbox tests are more compact and easy to read. * Move checkbox widget tests to end of file The checkbox widget tests are long and involved, so we'll move them to the end of the file so they aren't a huge block of code you need to read past to find the next test. * Improve formatting of CheckboxWidget docs The \define() calls that are short enough to fit on one line should be put on one line, for readability. The ones that are quite long have been kept on multiple lines, for readability. * Added more passing tests for checkbox widget * Add some failing tests for checkbox widget The filter mode where neither checked nor unchecked is specified (in which case an empty filter result means false and a non-empty result means true) is not working yet. * Make failing tests pass * Uncomment (and improve) test for field mode We're now ready to start working on making this test pass. (There was also one small mistake in the test, which this commit corrects). * All tests now passing * No indeterminate checkboxes in simple modes The simple checkbox modes (field and index) should not produce indeterminate checkboxes. That should be reserved for the advanced modes (list and filter). * Minor improvement to unit tests * Allow indeterminate checkboxes in list and filter modes This change may require some tweaks to the unit tests to be able to test it properly. * Slightly easier to read tests * Two more tests for list mode * Greatly simplify unit test code Turns out there's no need to jump through Object.getPrototypeOf hoops. * Minor simplification of unit test * Add tests for indeterminate in list & filter modes With this, the set of tests is complete. * More tests to specify list mode behavior * Unfocus tests so all tests run * Update docs to say "new in 5.2.3" insetad of 5.2.2 * Move checkbox widget tests into their own file The test-widget.js file was getting too long with all the checkbox tests added, so we'll move the checkbox tests into their own file. * Add checkbox widget tests for index mode This commit also adds tests for index list mode (with a listIndex attribute that will parallel the listField attribute) but leaves them commented out because they don't pass yet: the code that implements the listIndex attribute hasn't been written yet). * Add listIndex attribute to checkbox widget * Remove code that lets checkboxes be indeterminate This reverts commit 6afcb151befecd3e6656c4edee7e1b2bbf529909. We will add this code back in a later PR. * Remove indeterminate tests for checkbox widget We're currently not allowing indeterminate checkboxes, so there's no need for the tests that check for them. * Document listIndex attribute of CheckboxWidget * adds class tc-checkbox-checked when checked * equivalent to #2182 (RadioWidget) * also applies `tc-checkbox` to checkboxes by default, always * Move macro definitions inside example text Since the wikitext-example-without-html macro creates a new parsing context, it's safe to have macro definitions inside it. That makes these examples a lot easier to write, and to read. * Remove all mention of indeterminate checkboxes Also improve the documentation a little bit: mention what happens in list mode if neither checked nor unchecked is specified. * Move filter mode to bottom of checkbox docs The `filter` attribute should be under both `listField` and `listIndex` rather than being between them. The documentation for filter mode should similarly be after the `listIndex` documentation. * Improve docs for `class` attr of checkbox widget This brings the wording of the `class` attribute more in line with how it's worded in the RadioWidget docs. * Fix bug with list tiddlers If neither checked nor unchecked was specified, then the behavior should be "empty = false, non-empty = true". But if *both* are specified yet neither is found, then the checkbox should be unchecked (false). It had been falling through to the "non-empty = true" behavior, which was wrong. * Improve listIndex example of checkbox widgets * Remove unused function from test-widget.js Co-authored-by: Tobias Beer <beertobias@gmail.com>
2022-04-02 14:16:08 +00:00
if(this.checkboxField) {
if($tw.utils.hop(tiddler.fields,this.checkboxField)) {
value = tiddler.fields[this.checkboxField] || "";
} else {
value = this.checkboxDefault || "";
}
} else {
Checkbox widget: list and filter modes (#6561) * Docs for CheckboxWidget list and filter modes This documents the `listField` and `filter` attributes. * Tests for checkbox widget list mode * Implement checkbox list mode * WIP on implementing filter attr for checkboxes * Improve CheckboxWidget documentation * Refactor checkbox tests: move function to top The big findNodeOfType function belongs at the top of the describe block, so that the checkbox tests are more compact and easy to read. * Move checkbox widget tests to end of file The checkbox widget tests are long and involved, so we'll move them to the end of the file so they aren't a huge block of code you need to read past to find the next test. * Improve formatting of CheckboxWidget docs The \define() calls that are short enough to fit on one line should be put on one line, for readability. The ones that are quite long have been kept on multiple lines, for readability. * Added more passing tests for checkbox widget * Add some failing tests for checkbox widget The filter mode where neither checked nor unchecked is specified (in which case an empty filter result means false and a non-empty result means true) is not working yet. * Make failing tests pass * Uncomment (and improve) test for field mode We're now ready to start working on making this test pass. (There was also one small mistake in the test, which this commit corrects). * All tests now passing * No indeterminate checkboxes in simple modes The simple checkbox modes (field and index) should not produce indeterminate checkboxes. That should be reserved for the advanced modes (list and filter). * Minor improvement to unit tests * Allow indeterminate checkboxes in list and filter modes This change may require some tweaks to the unit tests to be able to test it properly. * Slightly easier to read tests * Two more tests for list mode * Greatly simplify unit test code Turns out there's no need to jump through Object.getPrototypeOf hoops. * Minor simplification of unit test * Add tests for indeterminate in list & filter modes With this, the set of tests is complete. * More tests to specify list mode behavior * Unfocus tests so all tests run * Update docs to say "new in 5.2.3" insetad of 5.2.2 * Move checkbox widget tests into their own file The test-widget.js file was getting too long with all the checkbox tests added, so we'll move the checkbox tests into their own file. * Add checkbox widget tests for index mode This commit also adds tests for index list mode (with a listIndex attribute that will parallel the listField attribute) but leaves them commented out because they don't pass yet: the code that implements the listIndex attribute hasn't been written yet). * Add listIndex attribute to checkbox widget * Remove code that lets checkboxes be indeterminate This reverts commit 6afcb151befecd3e6656c4edee7e1b2bbf529909. We will add this code back in a later PR. * Remove indeterminate tests for checkbox widget We're currently not allowing indeterminate checkboxes, so there's no need for the tests that check for them. * Document listIndex attribute of CheckboxWidget * adds class tc-checkbox-checked when checked * equivalent to #2182 (RadioWidget) * also applies `tc-checkbox` to checkboxes by default, always * Move macro definitions inside example text Since the wikitext-example-without-html macro creates a new parsing context, it's safe to have macro definitions inside it. That makes these examples a lot easier to write, and to read. * Remove all mention of indeterminate checkboxes Also improve the documentation a little bit: mention what happens in list mode if neither checked nor unchecked is specified. * Move filter mode to bottom of checkbox docs The `filter` attribute should be under both `listField` and `listIndex` rather than being between them. The documentation for filter mode should similarly be after the `listIndex` documentation. * Improve docs for `class` attr of checkbox widget This brings the wording of the `class` attribute more in line with how it's worded in the RadioWidget docs. * Fix bug with list tiddlers If neither checked nor unchecked was specified, then the behavior should be "empty = false, non-empty = true". But if *both* are specified yet neither is found, then the checkbox should be unchecked (false). It had been falling through to the "non-empty = true" behavior, which was wrong. * Improve listIndex example of checkbox widgets * Remove unused function from test-widget.js Co-authored-by: Tobias Beer <beertobias@gmail.com>
2022-04-02 14:16:08 +00:00
value = this.wiki.extractTiddlerDataItem(tiddler,this.checkboxIndex,this.checkboxDefault || "");
}
if(value === this.checkboxChecked) {
return true;
}
if(value === this.checkboxUnchecked) {
return false;
}
Checkbox widget: list and filter modes (#6561) * Docs for CheckboxWidget list and filter modes This documents the `listField` and `filter` attributes. * Tests for checkbox widget list mode * Implement checkbox list mode * WIP on implementing filter attr for checkboxes * Improve CheckboxWidget documentation * Refactor checkbox tests: move function to top The big findNodeOfType function belongs at the top of the describe block, so that the checkbox tests are more compact and easy to read. * Move checkbox widget tests to end of file The checkbox widget tests are long and involved, so we'll move them to the end of the file so they aren't a huge block of code you need to read past to find the next test. * Improve formatting of CheckboxWidget docs The \define() calls that are short enough to fit on one line should be put on one line, for readability. The ones that are quite long have been kept on multiple lines, for readability. * Added more passing tests for checkbox widget * Add some failing tests for checkbox widget The filter mode where neither checked nor unchecked is specified (in which case an empty filter result means false and a non-empty result means true) is not working yet. * Make failing tests pass * Uncomment (and improve) test for field mode We're now ready to start working on making this test pass. (There was also one small mistake in the test, which this commit corrects). * All tests now passing * No indeterminate checkboxes in simple modes The simple checkbox modes (field and index) should not produce indeterminate checkboxes. That should be reserved for the advanced modes (list and filter). * Minor improvement to unit tests * Allow indeterminate checkboxes in list and filter modes This change may require some tweaks to the unit tests to be able to test it properly. * Slightly easier to read tests * Two more tests for list mode * Greatly simplify unit test code Turns out there's no need to jump through Object.getPrototypeOf hoops. * Minor simplification of unit test * Add tests for indeterminate in list & filter modes With this, the set of tests is complete. * More tests to specify list mode behavior * Unfocus tests so all tests run * Update docs to say "new in 5.2.3" insetad of 5.2.2 * Move checkbox widget tests into their own file The test-widget.js file was getting too long with all the checkbox tests added, so we'll move the checkbox tests into their own file. * Add checkbox widget tests for index mode This commit also adds tests for index list mode (with a listIndex attribute that will parallel the listField attribute) but leaves them commented out because they don't pass yet: the code that implements the listIndex attribute hasn't been written yet). * Add listIndex attribute to checkbox widget * Remove code that lets checkboxes be indeterminate This reverts commit 6afcb151befecd3e6656c4edee7e1b2bbf529909. We will add this code back in a later PR. * Remove indeterminate tests for checkbox widget We're currently not allowing indeterminate checkboxes, so there's no need for the tests that check for them. * Document listIndex attribute of CheckboxWidget * adds class tc-checkbox-checked when checked * equivalent to #2182 (RadioWidget) * also applies `tc-checkbox` to checkboxes by default, always * Move macro definitions inside example text Since the wikitext-example-without-html macro creates a new parsing context, it's safe to have macro definitions inside it. That makes these examples a lot easier to write, and to read. * Remove all mention of indeterminate checkboxes Also improve the documentation a little bit: mention what happens in list mode if neither checked nor unchecked is specified. * Move filter mode to bottom of checkbox docs The `filter` attribute should be under both `listField` and `listIndex` rather than being between them. The documentation for filter mode should similarly be after the `listIndex` documentation. * Improve docs for `class` attr of checkbox widget This brings the wording of the `class` attribute more in line with how it's worded in the RadioWidget docs. * Fix bug with list tiddlers If neither checked nor unchecked was specified, then the behavior should be "empty = false, non-empty = true". But if *both* are specified yet neither is found, then the checkbox should be unchecked (false). It had been falling through to the "non-empty = true" behavior, which was wrong. * Improve listIndex example of checkbox widgets * Remove unused function from test-widget.js Co-authored-by: Tobias Beer <beertobias@gmail.com>
2022-04-02 14:16:08 +00:00
// Neither value found: were both specified?
if(this.checkboxChecked && !this.checkboxUnchecked) {
return false; // Absence of checked value
}
if(this.checkboxUnchecked && !this.checkboxChecked) {
return true; // Absence of unchecked value
}
if(this.checkboxChecked && this.checkboxUnchecked) {
// Both specified but neither found: indeterminate or false, depending
if(this.checkboxIndeterminate === "yes") {
return undefined;
} else {
return false;
}
}
}
Checkbox widget: list and filter modes (#6561) * Docs for CheckboxWidget list and filter modes This documents the `listField` and `filter` attributes. * Tests for checkbox widget list mode * Implement checkbox list mode * WIP on implementing filter attr for checkboxes * Improve CheckboxWidget documentation * Refactor checkbox tests: move function to top The big findNodeOfType function belongs at the top of the describe block, so that the checkbox tests are more compact and easy to read. * Move checkbox widget tests to end of file The checkbox widget tests are long and involved, so we'll move them to the end of the file so they aren't a huge block of code you need to read past to find the next test. * Improve formatting of CheckboxWidget docs The \define() calls that are short enough to fit on one line should be put on one line, for readability. The ones that are quite long have been kept on multiple lines, for readability. * Added more passing tests for checkbox widget * Add some failing tests for checkbox widget The filter mode where neither checked nor unchecked is specified (in which case an empty filter result means false and a non-empty result means true) is not working yet. * Make failing tests pass * Uncomment (and improve) test for field mode We're now ready to start working on making this test pass. (There was also one small mistake in the test, which this commit corrects). * All tests now passing * No indeterminate checkboxes in simple modes The simple checkbox modes (field and index) should not produce indeterminate checkboxes. That should be reserved for the advanced modes (list and filter). * Minor improvement to unit tests * Allow indeterminate checkboxes in list and filter modes This change may require some tweaks to the unit tests to be able to test it properly. * Slightly easier to read tests * Two more tests for list mode * Greatly simplify unit test code Turns out there's no need to jump through Object.getPrototypeOf hoops. * Minor simplification of unit test * Add tests for indeterminate in list & filter modes With this, the set of tests is complete. * More tests to specify list mode behavior * Unfocus tests so all tests run * Update docs to say "new in 5.2.3" insetad of 5.2.2 * Move checkbox widget tests into their own file The test-widget.js file was getting too long with all the checkbox tests added, so we'll move the checkbox tests into their own file. * Add checkbox widget tests for index mode This commit also adds tests for index list mode (with a listIndex attribute that will parallel the listField attribute) but leaves them commented out because they don't pass yet: the code that implements the listIndex attribute hasn't been written yet). * Add listIndex attribute to checkbox widget * Remove code that lets checkboxes be indeterminate This reverts commit 6afcb151befecd3e6656c4edee7e1b2bbf529909. We will add this code back in a later PR. * Remove indeterminate tests for checkbox widget We're currently not allowing indeterminate checkboxes, so there's no need for the tests that check for them. * Document listIndex attribute of CheckboxWidget * adds class tc-checkbox-checked when checked * equivalent to #2182 (RadioWidget) * also applies `tc-checkbox` to checkboxes by default, always * Move macro definitions inside example text Since the wikitext-example-without-html macro creates a new parsing context, it's safe to have macro definitions inside it. That makes these examples a lot easier to write, and to read. * Remove all mention of indeterminate checkboxes Also improve the documentation a little bit: mention what happens in list mode if neither checked nor unchecked is specified. * Move filter mode to bottom of checkbox docs The `filter` attribute should be under both `listField` and `listIndex` rather than being between them. The documentation for filter mode should similarly be after the `listIndex` documentation. * Improve docs for `class` attr of checkbox widget This brings the wording of the `class` attribute more in line with how it's worded in the RadioWidget docs. * Fix bug with list tiddlers If neither checked nor unchecked was specified, then the behavior should be "empty = false, non-empty = true". But if *both* are specified yet neither is found, then the checkbox should be unchecked (false). It had been falling through to the "non-empty = true" behavior, which was wrong. * Improve listIndex example of checkbox widgets * Remove unused function from test-widget.js Co-authored-by: Tobias Beer <beertobias@gmail.com>
2022-04-02 14:16:08 +00:00
if(this.checkboxListField || this.checkboxListIndex || this.checkboxFilter) {
// Same logic applies to lists and filters
var list;
if(this.checkboxListField) {
if($tw.utils.hop(tiddler.fields,this.checkboxListField)) {
list = tiddler.getFieldList(this.checkboxListField);
} else {
list = $tw.utils.parseStringArray(this.checkboxDefault || "") || [];
}
} else if (this.checkboxListIndex) {
list = $tw.utils.parseStringArray(this.wiki.extractTiddlerDataItem(tiddler,this.checkboxListIndex,this.checkboxDefault || "")) || [];
} else {
list = this.wiki.filterTiddlers(this.checkboxFilter,this) || [];
}
if(list.indexOf(this.checkboxChecked) !== -1) {
return true;
}
Checkbox widget: list and filter modes (#6561) * Docs for CheckboxWidget list and filter modes This documents the `listField` and `filter` attributes. * Tests for checkbox widget list mode * Implement checkbox list mode * WIP on implementing filter attr for checkboxes * Improve CheckboxWidget documentation * Refactor checkbox tests: move function to top The big findNodeOfType function belongs at the top of the describe block, so that the checkbox tests are more compact and easy to read. * Move checkbox widget tests to end of file The checkbox widget tests are long and involved, so we'll move them to the end of the file so they aren't a huge block of code you need to read past to find the next test. * Improve formatting of CheckboxWidget docs The \define() calls that are short enough to fit on one line should be put on one line, for readability. The ones that are quite long have been kept on multiple lines, for readability. * Added more passing tests for checkbox widget * Add some failing tests for checkbox widget The filter mode where neither checked nor unchecked is specified (in which case an empty filter result means false and a non-empty result means true) is not working yet. * Make failing tests pass * Uncomment (and improve) test for field mode We're now ready to start working on making this test pass. (There was also one small mistake in the test, which this commit corrects). * All tests now passing * No indeterminate checkboxes in simple modes The simple checkbox modes (field and index) should not produce indeterminate checkboxes. That should be reserved for the advanced modes (list and filter). * Minor improvement to unit tests * Allow indeterminate checkboxes in list and filter modes This change may require some tweaks to the unit tests to be able to test it properly. * Slightly easier to read tests * Two more tests for list mode * Greatly simplify unit test code Turns out there's no need to jump through Object.getPrototypeOf hoops. * Minor simplification of unit test * Add tests for indeterminate in list & filter modes With this, the set of tests is complete. * More tests to specify list mode behavior * Unfocus tests so all tests run * Update docs to say "new in 5.2.3" insetad of 5.2.2 * Move checkbox widget tests into their own file The test-widget.js file was getting too long with all the checkbox tests added, so we'll move the checkbox tests into their own file. * Add checkbox widget tests for index mode This commit also adds tests for index list mode (with a listIndex attribute that will parallel the listField attribute) but leaves them commented out because they don't pass yet: the code that implements the listIndex attribute hasn't been written yet). * Add listIndex attribute to checkbox widget * Remove code that lets checkboxes be indeterminate This reverts commit 6afcb151befecd3e6656c4edee7e1b2bbf529909. We will add this code back in a later PR. * Remove indeterminate tests for checkbox widget We're currently not allowing indeterminate checkboxes, so there's no need for the tests that check for them. * Document listIndex attribute of CheckboxWidget * adds class tc-checkbox-checked when checked * equivalent to #2182 (RadioWidget) * also applies `tc-checkbox` to checkboxes by default, always * Move macro definitions inside example text Since the wikitext-example-without-html macro creates a new parsing context, it's safe to have macro definitions inside it. That makes these examples a lot easier to write, and to read. * Remove all mention of indeterminate checkboxes Also improve the documentation a little bit: mention what happens in list mode if neither checked nor unchecked is specified. * Move filter mode to bottom of checkbox docs The `filter` attribute should be under both `listField` and `listIndex` rather than being between them. The documentation for filter mode should similarly be after the `listIndex` documentation. * Improve docs for `class` attr of checkbox widget This brings the wording of the `class` attribute more in line with how it's worded in the RadioWidget docs. * Fix bug with list tiddlers If neither checked nor unchecked was specified, then the behavior should be "empty = false, non-empty = true". But if *both* are specified yet neither is found, then the checkbox should be unchecked (false). It had been falling through to the "non-empty = true" behavior, which was wrong. * Improve listIndex example of checkbox widgets * Remove unused function from test-widget.js Co-authored-by: Tobias Beer <beertobias@gmail.com>
2022-04-02 14:16:08 +00:00
if(list.indexOf(this.checkboxUnchecked) !== -1) {
return false;
}
Checkbox widget: list and filter modes (#6561) * Docs for CheckboxWidget list and filter modes This documents the `listField` and `filter` attributes. * Tests for checkbox widget list mode * Implement checkbox list mode * WIP on implementing filter attr for checkboxes * Improve CheckboxWidget documentation * Refactor checkbox tests: move function to top The big findNodeOfType function belongs at the top of the describe block, so that the checkbox tests are more compact and easy to read. * Move checkbox widget tests to end of file The checkbox widget tests are long and involved, so we'll move them to the end of the file so they aren't a huge block of code you need to read past to find the next test. * Improve formatting of CheckboxWidget docs The \define() calls that are short enough to fit on one line should be put on one line, for readability. The ones that are quite long have been kept on multiple lines, for readability. * Added more passing tests for checkbox widget * Add some failing tests for checkbox widget The filter mode where neither checked nor unchecked is specified (in which case an empty filter result means false and a non-empty result means true) is not working yet. * Make failing tests pass * Uncomment (and improve) test for field mode We're now ready to start working on making this test pass. (There was also one small mistake in the test, which this commit corrects). * All tests now passing * No indeterminate checkboxes in simple modes The simple checkbox modes (field and index) should not produce indeterminate checkboxes. That should be reserved for the advanced modes (list and filter). * Minor improvement to unit tests * Allow indeterminate checkboxes in list and filter modes This change may require some tweaks to the unit tests to be able to test it properly. * Slightly easier to read tests * Two more tests for list mode * Greatly simplify unit test code Turns out there's no need to jump through Object.getPrototypeOf hoops. * Minor simplification of unit test * Add tests for indeterminate in list & filter modes With this, the set of tests is complete. * More tests to specify list mode behavior * Unfocus tests so all tests run * Update docs to say "new in 5.2.3" insetad of 5.2.2 * Move checkbox widget tests into their own file The test-widget.js file was getting too long with all the checkbox tests added, so we'll move the checkbox tests into their own file. * Add checkbox widget tests for index mode This commit also adds tests for index list mode (with a listIndex attribute that will parallel the listField attribute) but leaves them commented out because they don't pass yet: the code that implements the listIndex attribute hasn't been written yet). * Add listIndex attribute to checkbox widget * Remove code that lets checkboxes be indeterminate This reverts commit 6afcb151befecd3e6656c4edee7e1b2bbf529909. We will add this code back in a later PR. * Remove indeterminate tests for checkbox widget We're currently not allowing indeterminate checkboxes, so there's no need for the tests that check for them. * Document listIndex attribute of CheckboxWidget * adds class tc-checkbox-checked when checked * equivalent to #2182 (RadioWidget) * also applies `tc-checkbox` to checkboxes by default, always * Move macro definitions inside example text Since the wikitext-example-without-html macro creates a new parsing context, it's safe to have macro definitions inside it. That makes these examples a lot easier to write, and to read. * Remove all mention of indeterminate checkboxes Also improve the documentation a little bit: mention what happens in list mode if neither checked nor unchecked is specified. * Move filter mode to bottom of checkbox docs The `filter` attribute should be under both `listField` and `listIndex` rather than being between them. The documentation for filter mode should similarly be after the `listIndex` documentation. * Improve docs for `class` attr of checkbox widget This brings the wording of the `class` attribute more in line with how it's worded in the RadioWidget docs. * Fix bug with list tiddlers If neither checked nor unchecked was specified, then the behavior should be "empty = false, non-empty = true". But if *both* are specified yet neither is found, then the checkbox should be unchecked (false). It had been falling through to the "non-empty = true" behavior, which was wrong. * Improve listIndex example of checkbox widgets * Remove unused function from test-widget.js Co-authored-by: Tobias Beer <beertobias@gmail.com>
2022-04-02 14:16:08 +00:00
// 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
}
if(this.checkboxChecked && this.checkboxUnchecked) {
// Both specified but neither found: indeterminate or false, depending
if(this.checkboxIndeterminate === "yes") {
return undefined;
} else {
return false;
}
Checkbox widget: list and filter modes (#6561) * Docs for CheckboxWidget list and filter modes This documents the `listField` and `filter` attributes. * Tests for checkbox widget list mode * Implement checkbox list mode * WIP on implementing filter attr for checkboxes * Improve CheckboxWidget documentation * Refactor checkbox tests: move function to top The big findNodeOfType function belongs at the top of the describe block, so that the checkbox tests are more compact and easy to read. * Move checkbox widget tests to end of file The checkbox widget tests are long and involved, so we'll move them to the end of the file so they aren't a huge block of code you need to read past to find the next test. * Improve formatting of CheckboxWidget docs The \define() calls that are short enough to fit on one line should be put on one line, for readability. The ones that are quite long have been kept on multiple lines, for readability. * Added more passing tests for checkbox widget * Add some failing tests for checkbox widget The filter mode where neither checked nor unchecked is specified (in which case an empty filter result means false and a non-empty result means true) is not working yet. * Make failing tests pass * Uncomment (and improve) test for field mode We're now ready to start working on making this test pass. (There was also one small mistake in the test, which this commit corrects). * All tests now passing * No indeterminate checkboxes in simple modes The simple checkbox modes (field and index) should not produce indeterminate checkboxes. That should be reserved for the advanced modes (list and filter). * Minor improvement to unit tests * Allow indeterminate checkboxes in list and filter modes This change may require some tweaks to the unit tests to be able to test it properly. * Slightly easier to read tests * Two more tests for list mode * Greatly simplify unit test code Turns out there's no need to jump through Object.getPrototypeOf hoops. * Minor simplification of unit test * Add tests for indeterminate in list & filter modes With this, the set of tests is complete. * More tests to specify list mode behavior * Unfocus tests so all tests run * Update docs to say "new in 5.2.3" insetad of 5.2.2 * Move checkbox widget tests into their own file The test-widget.js file was getting too long with all the checkbox tests added, so we'll move the checkbox tests into their own file. * Add checkbox widget tests for index mode This commit also adds tests for index list mode (with a listIndex attribute that will parallel the listField attribute) but leaves them commented out because they don't pass yet: the code that implements the listIndex attribute hasn't been written yet). * Add listIndex attribute to checkbox widget * Remove code that lets checkboxes be indeterminate This reverts commit 6afcb151befecd3e6656c4edee7e1b2bbf529909. We will add this code back in a later PR. * Remove indeterminate tests for checkbox widget We're currently not allowing indeterminate checkboxes, so there's no need for the tests that check for them. * Document listIndex attribute of CheckboxWidget * adds class tc-checkbox-checked when checked * equivalent to #2182 (RadioWidget) * also applies `tc-checkbox` to checkboxes by default, always * Move macro definitions inside example text Since the wikitext-example-without-html macro creates a new parsing context, it's safe to have macro definitions inside it. That makes these examples a lot easier to write, and to read. * Remove all mention of indeterminate checkboxes Also improve the documentation a little bit: mention what happens in list mode if neither checked nor unchecked is specified. * Move filter mode to bottom of checkbox docs The `filter` attribute should be under both `listField` and `listIndex` rather than being between them. The documentation for filter mode should similarly be after the `listIndex` documentation. * Improve docs for `class` attr of checkbox widget This brings the wording of the `class` attribute more in line with how it's worded in the RadioWidget docs. * Fix bug with list tiddlers If neither checked nor unchecked was specified, then the behavior should be "empty = false, non-empty = true". But if *both* are specified yet neither is found, then the checkbox should be unchecked (false). It had been falling through to the "non-empty = true" behavior, which was wrong. * Improve listIndex example of checkbox widgets * Remove unused function from test-widget.js Co-authored-by: Tobias Beer <beertobias@gmail.com>
2022-04-02 14:16:08 +00:00
}
// Neither specified, so empty list is false, non-empty is true
return !!list.length;
}
} else {
if(this.checkboxTag) {
return false;
}
if(this.checkboxField) {
if(this.checkboxDefault === this.checkboxChecked) {
return true;
}
if(this.checkboxDefault === this.checkboxUnchecked) {
return false;
}
}
}
return false;
};
CheckboxWidget.prototype.handleChangeEvent = function(event) {
var checked = this.inputDomNode.checked,
tiddler = this.wiki.getTiddler(this.checkboxTitle),
fallbackFields = {text: ""},
newFields = {title: this.checkboxTitle},
hasChanged = false,
tagCheck = false,
hasTag = tiddler && tiddler.hasTag(this.checkboxTag),
Checkbox widget: list and filter modes (#6561) * Docs for CheckboxWidget list and filter modes This documents the `listField` and `filter` attributes. * Tests for checkbox widget list mode * Implement checkbox list mode * WIP on implementing filter attr for checkboxes * Improve CheckboxWidget documentation * Refactor checkbox tests: move function to top The big findNodeOfType function belongs at the top of the describe block, so that the checkbox tests are more compact and easy to read. * Move checkbox widget tests to end of file The checkbox widget tests are long and involved, so we'll move them to the end of the file so they aren't a huge block of code you need to read past to find the next test. * Improve formatting of CheckboxWidget docs The \define() calls that are short enough to fit on one line should be put on one line, for readability. The ones that are quite long have been kept on multiple lines, for readability. * Added more passing tests for checkbox widget * Add some failing tests for checkbox widget The filter mode where neither checked nor unchecked is specified (in which case an empty filter result means false and a non-empty result means true) is not working yet. * Make failing tests pass * Uncomment (and improve) test for field mode We're now ready to start working on making this test pass. (There was also one small mistake in the test, which this commit corrects). * All tests now passing * No indeterminate checkboxes in simple modes The simple checkbox modes (field and index) should not produce indeterminate checkboxes. That should be reserved for the advanced modes (list and filter). * Minor improvement to unit tests * Allow indeterminate checkboxes in list and filter modes This change may require some tweaks to the unit tests to be able to test it properly. * Slightly easier to read tests * Two more tests for list mode * Greatly simplify unit test code Turns out there's no need to jump through Object.getPrototypeOf hoops. * Minor simplification of unit test * Add tests for indeterminate in list & filter modes With this, the set of tests is complete. * More tests to specify list mode behavior * Unfocus tests so all tests run * Update docs to say "new in 5.2.3" insetad of 5.2.2 * Move checkbox widget tests into their own file The test-widget.js file was getting too long with all the checkbox tests added, so we'll move the checkbox tests into their own file. * Add checkbox widget tests for index mode This commit also adds tests for index list mode (with a listIndex attribute that will parallel the listField attribute) but leaves them commented out because they don't pass yet: the code that implements the listIndex attribute hasn't been written yet). * Add listIndex attribute to checkbox widget * Remove code that lets checkboxes be indeterminate This reverts commit 6afcb151befecd3e6656c4edee7e1b2bbf529909. We will add this code back in a later PR. * Remove indeterminate tests for checkbox widget We're currently not allowing indeterminate checkboxes, so there's no need for the tests that check for them. * Document listIndex attribute of CheckboxWidget * adds class tc-checkbox-checked when checked * equivalent to #2182 (RadioWidget) * also applies `tc-checkbox` to checkboxes by default, always * Move macro definitions inside example text Since the wikitext-example-without-html macro creates a new parsing context, it's safe to have macro definitions inside it. That makes these examples a lot easier to write, and to read. * Remove all mention of indeterminate checkboxes Also improve the documentation a little bit: mention what happens in list mode if neither checked nor unchecked is specified. * Move filter mode to bottom of checkbox docs The `filter` attribute should be under both `listField` and `listIndex` rather than being between them. The documentation for filter mode should similarly be after the `listIndex` documentation. * Improve docs for `class` attr of checkbox widget This brings the wording of the `class` attribute more in line with how it's worded in the RadioWidget docs. * Fix bug with list tiddlers If neither checked nor unchecked was specified, then the behavior should be "empty = false, non-empty = true". But if *both* are specified yet neither is found, then the checkbox should be unchecked (false). It had been falling through to the "non-empty = true" behavior, which was wrong. * Improve listIndex example of checkbox widgets * Remove unused function from test-widget.js Co-authored-by: Tobias Beer <beertobias@gmail.com>
2022-04-02 14:16:08 +00:00
value = checked ? this.checkboxChecked : this.checkboxUnchecked,
notValue = checked ? this.checkboxUnchecked : this.checkboxChecked;
if(this.checkboxTag && this.checkboxInvertTag === "yes") {
tagCheck = hasTag === checked;
} else {
tagCheck = hasTag !== checked;
}
// Set the tag if specified
if(this.checkboxTag && (!tiddler || tagCheck)) {
newFields.tags = tiddler ? (tiddler.fields.tags || []).slice(0) : [];
var pos = newFields.tags.indexOf(this.checkboxTag);
if(pos !== -1) {
newFields.tags.splice(pos,1);
}
if(this.checkboxInvertTag === "yes" && !checked) {
newFields.tags.push(this.checkboxTag);
} else if(this.checkboxInvertTag !== "yes" && checked) {
newFields.tags.push(this.checkboxTag);
}
hasChanged = true;
}
// Set the field if specified
if(this.checkboxField) {
if(!tiddler || tiddler.fields[this.checkboxField] !== value) {
newFields[this.checkboxField] = value;
hasChanged = true;
}
}
// Set the index if specified
if(this.checkboxIndex) {
var indexValue = this.wiki.extractTiddlerDataItem(this.checkboxTitle,this.checkboxIndex);
if(!tiddler || indexValue !== value) {
hasChanged = true;
}
}
Checkbox widget: list and filter modes (#6561) * Docs for CheckboxWidget list and filter modes This documents the `listField` and `filter` attributes. * Tests for checkbox widget list mode * Implement checkbox list mode * WIP on implementing filter attr for checkboxes * Improve CheckboxWidget documentation * Refactor checkbox tests: move function to top The big findNodeOfType function belongs at the top of the describe block, so that the checkbox tests are more compact and easy to read. * Move checkbox widget tests to end of file The checkbox widget tests are long and involved, so we'll move them to the end of the file so they aren't a huge block of code you need to read past to find the next test. * Improve formatting of CheckboxWidget docs The \define() calls that are short enough to fit on one line should be put on one line, for readability. The ones that are quite long have been kept on multiple lines, for readability. * Added more passing tests for checkbox widget * Add some failing tests for checkbox widget The filter mode where neither checked nor unchecked is specified (in which case an empty filter result means false and a non-empty result means true) is not working yet. * Make failing tests pass * Uncomment (and improve) test for field mode We're now ready to start working on making this test pass. (There was also one small mistake in the test, which this commit corrects). * All tests now passing * No indeterminate checkboxes in simple modes The simple checkbox modes (field and index) should not produce indeterminate checkboxes. That should be reserved for the advanced modes (list and filter). * Minor improvement to unit tests * Allow indeterminate checkboxes in list and filter modes This change may require some tweaks to the unit tests to be able to test it properly. * Slightly easier to read tests * Two more tests for list mode * Greatly simplify unit test code Turns out there's no need to jump through Object.getPrototypeOf hoops. * Minor simplification of unit test * Add tests for indeterminate in list & filter modes With this, the set of tests is complete. * More tests to specify list mode behavior * Unfocus tests so all tests run * Update docs to say "new in 5.2.3" insetad of 5.2.2 * Move checkbox widget tests into their own file The test-widget.js file was getting too long with all the checkbox tests added, so we'll move the checkbox tests into their own file. * Add checkbox widget tests for index mode This commit also adds tests for index list mode (with a listIndex attribute that will parallel the listField attribute) but leaves them commented out because they don't pass yet: the code that implements the listIndex attribute hasn't been written yet). * Add listIndex attribute to checkbox widget * Remove code that lets checkboxes be indeterminate This reverts commit 6afcb151befecd3e6656c4edee7e1b2bbf529909. We will add this code back in a later PR. * Remove indeterminate tests for checkbox widget We're currently not allowing indeterminate checkboxes, so there's no need for the tests that check for them. * Document listIndex attribute of CheckboxWidget * adds class tc-checkbox-checked when checked * equivalent to #2182 (RadioWidget) * also applies `tc-checkbox` to checkboxes by default, always * Move macro definitions inside example text Since the wikitext-example-without-html macro creates a new parsing context, it's safe to have macro definitions inside it. That makes these examples a lot easier to write, and to read. * Remove all mention of indeterminate checkboxes Also improve the documentation a little bit: mention what happens in list mode if neither checked nor unchecked is specified. * Move filter mode to bottom of checkbox docs The `filter` attribute should be under both `listField` and `listIndex` rather than being between them. The documentation for filter mode should similarly be after the `listIndex` documentation. * Improve docs for `class` attr of checkbox widget This brings the wording of the `class` attribute more in line with how it's worded in the RadioWidget docs. * Fix bug with list tiddlers If neither checked nor unchecked was specified, then the behavior should be "empty = false, non-empty = true". But if *both* are specified yet neither is found, then the checkbox should be unchecked (false). It had been falling through to the "non-empty = true" behavior, which was wrong. * Improve listIndex example of checkbox widgets * Remove unused function from test-widget.js Co-authored-by: Tobias Beer <beertobias@gmail.com>
2022-04-02 14:16:08 +00:00
// Set the list field (or index) if specified
if(this.checkboxListField || this.checkboxListIndex) {
var listContents, oldPos, newPos;
if(this.checkboxListField) {
listContents = tiddler.getFieldList(this.checkboxListField);
} else {
listContents = $tw.utils.parseStringArray(this.wiki.extractTiddlerDataItem(this.checkboxTitle,this.checkboxListIndex) || "") || [];
}
oldPos = notValue ? listContents.indexOf(notValue) : -1;
newPos = value ? listContents.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) {
listContents.push(value);
hasChanged = true;
} else {
// value unspecified? then leave list unchanged
}
} else if(newPos === -1) {
// old value present, new value absent
if(value) {
listContents[oldPos] = value;
hasChanged = true;
} else {
listContents.splice(oldPos, 1)
hasChanged = true;
}
} else {
// both were present: just remove the old one, leave new alone
listContents.splice(oldPos, 1)
hasChanged = true;
}
if(this.checkboxListField) {
newFields[this.checkboxListField] = $tw.utils.stringifyList(listContents);
}
// The listIndex case will be handled in the if(hasChanged) block below
}
if(hasChanged) {
if(this.checkboxIndex) {
this.wiki.setText(this.checkboxTitle,"",this.checkboxIndex,value);
Checkbox widget: list and filter modes (#6561) * Docs for CheckboxWidget list and filter modes This documents the `listField` and `filter` attributes. * Tests for checkbox widget list mode * Implement checkbox list mode * WIP on implementing filter attr for checkboxes * Improve CheckboxWidget documentation * Refactor checkbox tests: move function to top The big findNodeOfType function belongs at the top of the describe block, so that the checkbox tests are more compact and easy to read. * Move checkbox widget tests to end of file The checkbox widget tests are long and involved, so we'll move them to the end of the file so they aren't a huge block of code you need to read past to find the next test. * Improve formatting of CheckboxWidget docs The \define() calls that are short enough to fit on one line should be put on one line, for readability. The ones that are quite long have been kept on multiple lines, for readability. * Added more passing tests for checkbox widget * Add some failing tests for checkbox widget The filter mode where neither checked nor unchecked is specified (in which case an empty filter result means false and a non-empty result means true) is not working yet. * Make failing tests pass * Uncomment (and improve) test for field mode We're now ready to start working on making this test pass. (There was also one small mistake in the test, which this commit corrects). * All tests now passing * No indeterminate checkboxes in simple modes The simple checkbox modes (field and index) should not produce indeterminate checkboxes. That should be reserved for the advanced modes (list and filter). * Minor improvement to unit tests * Allow indeterminate checkboxes in list and filter modes This change may require some tweaks to the unit tests to be able to test it properly. * Slightly easier to read tests * Two more tests for list mode * Greatly simplify unit test code Turns out there's no need to jump through Object.getPrototypeOf hoops. * Minor simplification of unit test * Add tests for indeterminate in list & filter modes With this, the set of tests is complete. * More tests to specify list mode behavior * Unfocus tests so all tests run * Update docs to say "new in 5.2.3" insetad of 5.2.2 * Move checkbox widget tests into their own file The test-widget.js file was getting too long with all the checkbox tests added, so we'll move the checkbox tests into their own file. * Add checkbox widget tests for index mode This commit also adds tests for index list mode (with a listIndex attribute that will parallel the listField attribute) but leaves them commented out because they don't pass yet: the code that implements the listIndex attribute hasn't been written yet). * Add listIndex attribute to checkbox widget * Remove code that lets checkboxes be indeterminate This reverts commit 6afcb151befecd3e6656c4edee7e1b2bbf529909. We will add this code back in a later PR. * Remove indeterminate tests for checkbox widget We're currently not allowing indeterminate checkboxes, so there's no need for the tests that check for them. * Document listIndex attribute of CheckboxWidget * adds class tc-checkbox-checked when checked * equivalent to #2182 (RadioWidget) * also applies `tc-checkbox` to checkboxes by default, always * Move macro definitions inside example text Since the wikitext-example-without-html macro creates a new parsing context, it's safe to have macro definitions inside it. That makes these examples a lot easier to write, and to read. * Remove all mention of indeterminate checkboxes Also improve the documentation a little bit: mention what happens in list mode if neither checked nor unchecked is specified. * Move filter mode to bottom of checkbox docs The `filter` attribute should be under both `listField` and `listIndex` rather than being between them. The documentation for filter mode should similarly be after the `listIndex` documentation. * Improve docs for `class` attr of checkbox widget This brings the wording of the `class` attribute more in line with how it's worded in the RadioWidget docs. * Fix bug with list tiddlers If neither checked nor unchecked was specified, then the behavior should be "empty = false, non-empty = true". But if *both* are specified yet neither is found, then the checkbox should be unchecked (false). It had been falling through to the "non-empty = true" behavior, which was wrong. * Improve listIndex example of checkbox widgets * Remove unused function from test-widget.js Co-authored-by: Tobias Beer <beertobias@gmail.com>
2022-04-02 14:16:08 +00:00
} else if(this.checkboxListIndex) {
var listIndexValue = (listContents && listContents.length) ? $tw.utils.stringifyList(listContents) : undefined;
this.wiki.setText(this.checkboxTitle,"",this.checkboxListIndex,listIndexValue);
} else {
this.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),fallbackFields,tiddler,newFields,this.wiki.getModificationFields()));
}
}
// Trigger actions
if(this.checkboxActions) {
this.invokeActionString(this.checkboxActions,this,event);
}
if(this.checkboxCheckActions && checked) {
this.invokeActionString(this.checkboxCheckActions,this,event);
}
if(this.checkboxUncheckActions && !checked) {
this.invokeActionString(this.checkboxUncheckActions,this,event);
}
};
/*
Compute the internal state of the widget
*/
CheckboxWidget.prototype.execute = function() {
// Get the parameters from the attributes
this.checkboxActions = this.getAttribute("actions");
this.checkboxCheckActions = this.getAttribute("checkactions");
this.checkboxUncheckActions = this.getAttribute("uncheckactions");
this.checkboxTitle = this.getAttribute("tiddler",this.getVariable("currentTiddler"));
this.checkboxTag = this.getAttribute("tag");
this.checkboxField = this.getAttribute("field");
this.checkboxIndex = this.getAttribute("index");
Checkbox widget: list and filter modes (#6561) * Docs for CheckboxWidget list and filter modes This documents the `listField` and `filter` attributes. * Tests for checkbox widget list mode * Implement checkbox list mode * WIP on implementing filter attr for checkboxes * Improve CheckboxWidget documentation * Refactor checkbox tests: move function to top The big findNodeOfType function belongs at the top of the describe block, so that the checkbox tests are more compact and easy to read. * Move checkbox widget tests to end of file The checkbox widget tests are long and involved, so we'll move them to the end of the file so they aren't a huge block of code you need to read past to find the next test. * Improve formatting of CheckboxWidget docs The \define() calls that are short enough to fit on one line should be put on one line, for readability. The ones that are quite long have been kept on multiple lines, for readability. * Added more passing tests for checkbox widget * Add some failing tests for checkbox widget The filter mode where neither checked nor unchecked is specified (in which case an empty filter result means false and a non-empty result means true) is not working yet. * Make failing tests pass * Uncomment (and improve) test for field mode We're now ready to start working on making this test pass. (There was also one small mistake in the test, which this commit corrects). * All tests now passing * No indeterminate checkboxes in simple modes The simple checkbox modes (field and index) should not produce indeterminate checkboxes. That should be reserved for the advanced modes (list and filter). * Minor improvement to unit tests * Allow indeterminate checkboxes in list and filter modes This change may require some tweaks to the unit tests to be able to test it properly. * Slightly easier to read tests * Two more tests for list mode * Greatly simplify unit test code Turns out there's no need to jump through Object.getPrototypeOf hoops. * Minor simplification of unit test * Add tests for indeterminate in list & filter modes With this, the set of tests is complete. * More tests to specify list mode behavior * Unfocus tests so all tests run * Update docs to say "new in 5.2.3" insetad of 5.2.2 * Move checkbox widget tests into their own file The test-widget.js file was getting too long with all the checkbox tests added, so we'll move the checkbox tests into their own file. * Add checkbox widget tests for index mode This commit also adds tests for index list mode (with a listIndex attribute that will parallel the listField attribute) but leaves them commented out because they don't pass yet: the code that implements the listIndex attribute hasn't been written yet). * Add listIndex attribute to checkbox widget * Remove code that lets checkboxes be indeterminate This reverts commit 6afcb151befecd3e6656c4edee7e1b2bbf529909. We will add this code back in a later PR. * Remove indeterminate tests for checkbox widget We're currently not allowing indeterminate checkboxes, so there's no need for the tests that check for them. * Document listIndex attribute of CheckboxWidget * adds class tc-checkbox-checked when checked * equivalent to #2182 (RadioWidget) * also applies `tc-checkbox` to checkboxes by default, always * Move macro definitions inside example text Since the wikitext-example-without-html macro creates a new parsing context, it's safe to have macro definitions inside it. That makes these examples a lot easier to write, and to read. * Remove all mention of indeterminate checkboxes Also improve the documentation a little bit: mention what happens in list mode if neither checked nor unchecked is specified. * Move filter mode to bottom of checkbox docs The `filter` attribute should be under both `listField` and `listIndex` rather than being between them. The documentation for filter mode should similarly be after the `listIndex` documentation. * Improve docs for `class` attr of checkbox widget This brings the wording of the `class` attribute more in line with how it's worded in the RadioWidget docs. * Fix bug with list tiddlers If neither checked nor unchecked was specified, then the behavior should be "empty = false, non-empty = true". But if *both* are specified yet neither is found, then the checkbox should be unchecked (false). It had been falling through to the "non-empty = true" behavior, which was wrong. * Improve listIndex example of checkbox widgets * Remove unused function from test-widget.js Co-authored-by: Tobias Beer <beertobias@gmail.com>
2022-04-02 14:16:08 +00:00
this.checkboxListField = this.getAttribute("listField");
this.checkboxListIndex = this.getAttribute("listIndex");
this.checkboxFilter = this.getAttribute("filter");
this.checkboxChecked = this.getAttribute("checked");
this.checkboxUnchecked = this.getAttribute("unchecked");
this.checkboxDefault = this.getAttribute("default");
this.checkboxIndeterminate = this.getAttribute("indeterminate","no");
this.checkboxClass = this.getAttribute("class","");
this.checkboxInvertTag = this.getAttribute("invertTag","");
this.isDisabled = this.getAttribute("disabled","no");
// Make the child widgets
this.makeChildWidgets();
};
/*
Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering
*/
CheckboxWidget.prototype.refresh = function(changedTiddlers) {
var changedAttributes = this.computeAttributes();
if(changedAttributes.tiddler || changedAttributes.tag || changedAttributes.invertTag || changedAttributes.field || changedAttributes.index || changedAttributes.listField || changedAttributes.listIndex || changedAttributes.filter || changedAttributes.checked || changedAttributes.unchecked || changedAttributes["default"] || changedAttributes.indeterminate || changedAttributes["class"] || changedAttributes.disabled) {
this.refreshSelf();
return true;
2013-10-23 18:46:31 +00:00
} else {
2013-11-01 17:22:40 +00:00
var refreshed = false;
2013-10-23 18:46:31 +00:00
if(changedTiddlers[this.checkboxTitle]) {
Checkbox widget: list and filter modes (#6561) * Docs for CheckboxWidget list and filter modes This documents the `listField` and `filter` attributes. * Tests for checkbox widget list mode * Implement checkbox list mode * WIP on implementing filter attr for checkboxes * Improve CheckboxWidget documentation * Refactor checkbox tests: move function to top The big findNodeOfType function belongs at the top of the describe block, so that the checkbox tests are more compact and easy to read. * Move checkbox widget tests to end of file The checkbox widget tests are long and involved, so we'll move them to the end of the file so they aren't a huge block of code you need to read past to find the next test. * Improve formatting of CheckboxWidget docs The \define() calls that are short enough to fit on one line should be put on one line, for readability. The ones that are quite long have been kept on multiple lines, for readability. * Added more passing tests for checkbox widget * Add some failing tests for checkbox widget The filter mode where neither checked nor unchecked is specified (in which case an empty filter result means false and a non-empty result means true) is not working yet. * Make failing tests pass * Uncomment (and improve) test for field mode We're now ready to start working on making this test pass. (There was also one small mistake in the test, which this commit corrects). * All tests now passing * No indeterminate checkboxes in simple modes The simple checkbox modes (field and index) should not produce indeterminate checkboxes. That should be reserved for the advanced modes (list and filter). * Minor improvement to unit tests * Allow indeterminate checkboxes in list and filter modes This change may require some tweaks to the unit tests to be able to test it properly. * Slightly easier to read tests * Two more tests for list mode * Greatly simplify unit test code Turns out there's no need to jump through Object.getPrototypeOf hoops. * Minor simplification of unit test * Add tests for indeterminate in list & filter modes With this, the set of tests is complete. * More tests to specify list mode behavior * Unfocus tests so all tests run * Update docs to say "new in 5.2.3" insetad of 5.2.2 * Move checkbox widget tests into their own file The test-widget.js file was getting too long with all the checkbox tests added, so we'll move the checkbox tests into their own file. * Add checkbox widget tests for index mode This commit also adds tests for index list mode (with a listIndex attribute that will parallel the listField attribute) but leaves them commented out because they don't pass yet: the code that implements the listIndex attribute hasn't been written yet). * Add listIndex attribute to checkbox widget * Remove code that lets checkboxes be indeterminate This reverts commit 6afcb151befecd3e6656c4edee7e1b2bbf529909. We will add this code back in a later PR. * Remove indeterminate tests for checkbox widget We're currently not allowing indeterminate checkboxes, so there's no need for the tests that check for them. * Document listIndex attribute of CheckboxWidget * adds class tc-checkbox-checked when checked * equivalent to #2182 (RadioWidget) * also applies `tc-checkbox` to checkboxes by default, always * Move macro definitions inside example text Since the wikitext-example-without-html macro creates a new parsing context, it's safe to have macro definitions inside it. That makes these examples a lot easier to write, and to read. * Remove all mention of indeterminate checkboxes Also improve the documentation a little bit: mention what happens in list mode if neither checked nor unchecked is specified. * Move filter mode to bottom of checkbox docs The `filter` attribute should be under both `listField` and `listIndex` rather than being between them. The documentation for filter mode should similarly be after the `listIndex` documentation. * Improve docs for `class` attr of checkbox widget This brings the wording of the `class` attribute more in line with how it's worded in the RadioWidget docs. * Fix bug with list tiddlers If neither checked nor unchecked was specified, then the behavior should be "empty = false, non-empty = true". But if *both* are specified yet neither is found, then the checkbox should be unchecked (false). It had been falling through to the "non-empty = true" behavior, which was wrong. * Improve listIndex example of checkbox widgets * Remove unused function from test-widget.js Co-authored-by: Tobias Beer <beertobias@gmail.com>
2022-04-02 14:16:08 +00:00
var isChecked = this.getValue();
this.inputDomNode.checked = !!isChecked;
this.inputDomNode.indeterminate = (isChecked === undefined);
2013-11-01 17:22:40 +00:00
refreshed = true;
Checkbox widget: list and filter modes (#6561) * Docs for CheckboxWidget list and filter modes This documents the `listField` and `filter` attributes. * Tests for checkbox widget list mode * Implement checkbox list mode * WIP on implementing filter attr for checkboxes * Improve CheckboxWidget documentation * Refactor checkbox tests: move function to top The big findNodeOfType function belongs at the top of the describe block, so that the checkbox tests are more compact and easy to read. * Move checkbox widget tests to end of file The checkbox widget tests are long and involved, so we'll move them to the end of the file so they aren't a huge block of code you need to read past to find the next test. * Improve formatting of CheckboxWidget docs The \define() calls that are short enough to fit on one line should be put on one line, for readability. The ones that are quite long have been kept on multiple lines, for readability. * Added more passing tests for checkbox widget * Add some failing tests for checkbox widget The filter mode where neither checked nor unchecked is specified (in which case an empty filter result means false and a non-empty result means true) is not working yet. * Make failing tests pass * Uncomment (and improve) test for field mode We're now ready to start working on making this test pass. (There was also one small mistake in the test, which this commit corrects). * All tests now passing * No indeterminate checkboxes in simple modes The simple checkbox modes (field and index) should not produce indeterminate checkboxes. That should be reserved for the advanced modes (list and filter). * Minor improvement to unit tests * Allow indeterminate checkboxes in list and filter modes This change may require some tweaks to the unit tests to be able to test it properly. * Slightly easier to read tests * Two more tests for list mode * Greatly simplify unit test code Turns out there's no need to jump through Object.getPrototypeOf hoops. * Minor simplification of unit test * Add tests for indeterminate in list & filter modes With this, the set of tests is complete. * More tests to specify list mode behavior * Unfocus tests so all tests run * Update docs to say "new in 5.2.3" insetad of 5.2.2 * Move checkbox widget tests into their own file The test-widget.js file was getting too long with all the checkbox tests added, so we'll move the checkbox tests into their own file. * Add checkbox widget tests for index mode This commit also adds tests for index list mode (with a listIndex attribute that will parallel the listField attribute) but leaves them commented out because they don't pass yet: the code that implements the listIndex attribute hasn't been written yet). * Add listIndex attribute to checkbox widget * Remove code that lets checkboxes be indeterminate This reverts commit 6afcb151befecd3e6656c4edee7e1b2bbf529909. We will add this code back in a later PR. * Remove indeterminate tests for checkbox widget We're currently not allowing indeterminate checkboxes, so there's no need for the tests that check for them. * Document listIndex attribute of CheckboxWidget * adds class tc-checkbox-checked when checked * equivalent to #2182 (RadioWidget) * also applies `tc-checkbox` to checkboxes by default, always * Move macro definitions inside example text Since the wikitext-example-without-html macro creates a new parsing context, it's safe to have macro definitions inside it. That makes these examples a lot easier to write, and to read. * Remove all mention of indeterminate checkboxes Also improve the documentation a little bit: mention what happens in list mode if neither checked nor unchecked is specified. * Move filter mode to bottom of checkbox docs The `filter` attribute should be under both `listField` and `listIndex` rather than being between them. The documentation for filter mode should similarly be after the `listIndex` documentation. * Improve docs for `class` attr of checkbox widget This brings the wording of the `class` attribute more in line with how it's worded in the RadioWidget docs. * Fix bug with list tiddlers If neither checked nor unchecked was specified, then the behavior should be "empty = false, non-empty = true". But if *both* are specified yet neither is found, then the checkbox should be unchecked (false). It had been falling through to the "non-empty = true" behavior, which was wrong. * Improve listIndex example of checkbox widgets * Remove unused function from test-widget.js Co-authored-by: Tobias Beer <beertobias@gmail.com>
2022-04-02 14:16:08 +00:00
if(isChecked) {
$tw.utils.addClass(this.labelDomNode,"tc-checkbox-checked");
} else {
$tw.utils.removeClass(this.labelDomNode,"tc-checkbox-checked");
}
2013-10-23 18:46:31 +00:00
}
2013-11-01 17:22:40 +00:00
return this.refreshChildren(changedTiddlers) || refreshed;
}
};
exports.checkbox = CheckboxWidget;
})();