1
0
mirror of https://github.com/Jermolene/TiddlyWiki5 synced 2024-12-28 19:10:28 +00:00
TiddlyWiki5/editions/test/tiddlers/tests/test-checkbox-widget.js

541 lines
32 KiB
JavaScript
Raw Normal View History

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
/*\
title: testcheckbox-widget.js
type: application/javascript
tags: [[$:/tags/test-spec]]
Tests the checkbox widget thoroughly.
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
describe("Checkbox widget", function() {
var widget = require("$:/core/modules/widgets/widget.js");
function createWidgetNode(parseTreeNode,wiki) {
return new widget.widget(parseTreeNode,{
wiki: wiki,
document: $tw.fakeDocument
});
}
function parseText(text,wiki,options) {
var parser = wiki.parseText("text/vnd.tiddlywiki",text,options);
return parser ? {type: "widget", children: parser.tree} : undefined;
}
function renderWidgetNode(widgetNode) {
$tw.fakeDocument.setSequenceNumber(0);
var wrapper = $tw.fakeDocument.createElement("div");
widgetNode.render(wrapper,null);
return wrapper;
}
// Find a particular type of node from inside the widget tree
// Less brittle than wrapper.children[0].children[0] if the parse
// tree ever changes in the future
function findNodeOfType(targetType, currentNode) {
if(currentNode.parseTreeNode && currentNode.parseTreeNode.type === targetType) {
return currentNode;
} else if(currentNode.children && currentNode.children.length) {
var child, result, i;
for (i = 0; i < currentNode.children.length; i++) {
child = currentNode.children[i];
result = findNodeOfType(targetType, child);
if(result) return result;
}
}
return undefined;
}
/*
* Test data for checkbox widget tests
*/
const fieldModeTests = [
{
testName: "field mode checked",
tiddlers: [{title: "TiddlerOne", text: "Jolly Old World", expand: "yes"}],
widgetText: "<$checkbox tiddler='TiddlerOne' field='expand' checked='yes' />",
startsOutChecked: true,
expectedChange: { "TiddlerOne": { expand: undefined } }
},
{
testName: "field mode unchecked",
tiddlers: [{title: "TiddlerOne", text: "Jolly Old World", expand: "no"}],
widgetText: "<$checkbox tiddler='TiddlerOne' field='expand' unchecked='no' />",
startsOutChecked: false,
expectedChange: { "TiddlerOne": { expand: undefined } }
},
{
testName: "field mode toggle",
tiddlers: [{title: "TiddlerOne", text: "Jolly Old World", expand: "no"}],
widgetText: "<$checkbox tiddler='TiddlerOne' field='expand' checked='yes' unchecked='no' />",
startsOutChecked: false,
expectedChange: { "TiddlerOne": { expand: "yes" } }
},
{
testName: "field mode indeterminate -> true",
tiddlers: [{title: "TiddlerOne", text: "Jolly Old World", expand: "some other value"}],
widgetText: "<$checkbox tiddler='TiddlerOne' field='expand' indeterminate='yes' checked='yes' unchecked='no' />",
startsOutChecked: undefined,
expectedChange: { "TiddlerOne": { expand: "yes" } }
},
// true -> indeterminate cannot happen in field mode
{
testName: "field mode not indeterminate",
tiddlers: [{title: "TiddlerOne", text: "Jolly Old World", expand: "some other value"}],
widgetText: "<$checkbox tiddler='TiddlerOne' field='expand' indeterminate='' checked='yes' unchecked='no' />",
startsOutChecked: false,
expectedChange: { "TiddlerOne": { expand: "yes" } }
},
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
];
const indexModeTests = fieldModeTests.map(data => {
const newData = {...data};
const newName = data.testName.replace('field mode', 'index mode');
const newTiddlers = data.tiddlers.map(tiddler => {
return {title: tiddler.title, type: "application/x-tiddler-dictionary", text: `one: a\nexpand: ${tiddler.expand}\ntwo: b`}
});
const newWidgetText = data.widgetText.replace("field='expand'", "index='expand'");
const newChange = {};
for (const key of Object.keys(data.expectedChange)) {
const oldChange = data.expectedChange[key];
if (oldChange.expand) {
newChange[key] = { text: `one: a\nexpand: ${oldChange.expand}\ntwo: b` }
} else {
// In index tiddlers, the "expand" field gets completely removed, not turned into "expand: (undefined)"
newChange[key] = { text: `one: a\ntwo: b` }
}
}
newData.testName = newName;
newData.tiddlers = newTiddlers;
newData.widgetText = newWidgetText;
newData.expectedChange = newChange;
return newData;
});
const listModeTests = [
{
testName: "list mode add",
tiddlers: [{title: "Colors", colors: "orange yellow"}],
widgetText: "<$checkbox tiddler='Colors' listField='colors' checked='green' />",
startsOutChecked: false,
expectedChange: { "Colors": { colors: "orange yellow green" } }
},
{
testName: "list mode remove",
tiddlers: [{title: "Colors", colors: "green orange yellow"}],
widgetText: "<$checkbox tiddler='Colors' listField='colors' checked='green' />",
startsOutChecked: true,
expectedChange: { "Colors": { colors: "orange yellow" } }
},
{
testName: "list mode remove inverted",
tiddlers: [{title: "Colors", colors: "red orange yellow"}],
widgetText: "<$checkbox tiddler='Colors' listField='colors' unchecked='red' />",
startsOutChecked: false,
expectedChange: { "Colors": { colors: "orange yellow" } }
},
{
testName: "list mode remove in middle position",
tiddlers: [{title: "Colors", colors: "orange green yellow"}],
widgetText: "<$checkbox tiddler='Colors' listField='colors' checked='green' />",
startsOutChecked: true,
expectedChange: { "Colors": { colors: "orange yellow" } }
},
{
testName: "list mode remove in middle position inverted",
tiddlers: [{title: "Colors", colors: "orange red yellow"}],
widgetText: "<$checkbox tiddler='Colors' listField='colors' unchecked='red' />",
startsOutChecked: false,
expectedChange: { "Colors": { colors: "orange yellow" } }
},
{
testName: "list mode remove in final position",
tiddlers: [{title: "Colors", colors: "orange yellow green"}],
widgetText: "<$checkbox tiddler='Colors' listField='colors' checked='green' />",
startsOutChecked: true,
expectedChange: { "Colors": { colors: "orange yellow" } }
},
{
testName: "list mode remove in final position inverted",
tiddlers: [{title: "Colors", colors: "orange yellow red"}],
widgetText: "<$checkbox tiddler='Colors' listField='colors' unchecked='red' />",
startsOutChecked: false,
expectedChange: { "Colors": { colors: "orange yellow" } }
},
{
testName: "list mode toggle",
tiddlers: [{title: "Colors", colors: "red orange yellow"}],
widgetText: "<$checkbox tiddler='Colors' listField='colors' unchecked='red' checked='green' />",
startsOutChecked: false,
expectedChange: { "Colors": { colors: "green orange yellow" } }
},
{
testName: "list mode toggle in middle position",
tiddlers: [{title: "Colors", colors: "orange red yellow"}],
widgetText: "<$checkbox tiddler='Colors' listField='colors' unchecked='red' checked='green' />",
startsOutChecked: false,
expectedChange: { "Colors": { colors: "orange green yellow" } }
},
{
testName: "list mode remove in final position",
tiddlers: [{title: "Colors", colors: "orange yellow red"}],
widgetText: "<$checkbox tiddler='Colors' listField='colors' unchecked='red' checked='green' />",
startsOutChecked: false,
expectedChange: { "Colors": { colors: "orange yellow green" } }
},
{
testName: "list mode neither checked nor unchecked specified: field value remains unchanged",
tiddlers: [{title: "Colors", colors: "orange yellow red"}],
widgetText: "<$checkbox tiddler='Colors' listField='colors' />",
startsOutChecked: true,
finalValue: true,
expectedChange: { "Colors": { colors: "orange yellow red" } }
},
{
testName: "list mode neither checked nor unchecked specified, but actions specified to change field value",
tiddlers: [{title: "ExampleTiddler", someField: "yes"}],
widgetText: "\\define checkActions() <$action-listops $tiddler='ExampleTiddler' $field='someField' $filter='yes'/>\n" +
"\\define uncheckActions() <$action-listops $tiddler='ExampleTiddler' $field='someField' $filter='-yes'/>\n" +
"<$checkbox tiddler='ExampleTiddler' listField='someField' checkactions=<<checkActions>> uncheckactions=<<uncheckActions>> />",
startsOutChecked: true,
expectedChange: { "ExampleTiddler": { someField: "" } }
},
{
testName: "list mode neither checked nor unchecked specified, means field value is treated as empty=false, nonempty=true",
tiddlers: [{title: "ExampleTiddler", someField: "yes"}],
widgetText: "\\define checkActions() <$action-listops $tiddler='ExampleTiddler' $field='someField' $filter='yes -no'/>\n" +
"\\define uncheckActions() <$action-listops $tiddler='ExampleTiddler' $field='someField' $filter='-yes no'/>\n" +
"<$checkbox tiddler='ExampleTiddler' listField='someField' checkactions=<<checkActions>> uncheckactions=<<uncheckActions>> />",
startsOutChecked: true,
finalValue: true, // "no" is considered true when neither `checked` nor `unchecked` is specified
expectedChange: { "ExampleTiddler": { someField: "no" } }
},
{
testName: "list mode indeterminate -> true",
tiddlers: [{title: "Colors", colors: "orange"}],
widgetText: "<$checkbox tiddler='Colors' listField='colors' indeterminate='yes' unchecked='red' checked='green' />",
startsOutChecked: undefined,
expectedChange: { "Colors": { colors: "orange green" } }
},
// true -> indeterminate cannot happen in list mode
{
testName: "list mode not indeterminate",
tiddlers: [{title: "Colors", colors: "orange"}],
widgetText: "<$checkbox tiddler='Colors' listField='colors' unchecked='red' checked='green' />",
startsOutChecked: false,
expectedChange: { "Colors": { colors: "orange green" } }
},
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
];
// https://github.com/Jermolene/TiddlyWiki5/issues/6871
const listModeTestsWithListField = (
listModeTests
.filter(data => data.widgetText.includes("listField='colors'"))
.map(data => {
const newData = {
...data,
tiddlers: data.tiddlers.map(tiddler => ({...tiddler, list: tiddler.colors, colors: undefined})),
widgetText: data.widgetText.replace("listField='colors'", "listField='list'"),
expectedChange: {
"Colors": { list: data.expectedChange.Colors.colors.split(' ') }
},
}
return newData;
})
);
const listModeTestsWithTagsField = (
listModeTests
.filter(data => data.widgetText.includes("listField='colors'"))
.map(data => {
const newData = {
...data,
tiddlers: data.tiddlers.map(tiddler => ({...tiddler, tags: tiddler.colors, colors: undefined})),
widgetText: data.widgetText.replace("listField='colors'", "listField='tags'"),
expectedChange: {
"Colors": { tags: data.expectedChange.Colors.colors.split(' ') }
},
}
return newData;
})
);
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
const indexListModeTests = listModeTests.map(data => {
const newData = {...data};
const newName = data.testName.replace('list mode', 'index list mode');
const newTiddlers = data.tiddlers.map(tiddler => {
if (tiddler.hasOwnProperty('colors')) {
return {title: tiddler.title, type: "application/x-tiddler-dictionary", text: `one: a\ncolors: ${tiddler.colors}\ntwo: b`}
} else if (tiddler.hasOwnProperty('someField')) {
return {title: tiddler.title, type: "application/x-tiddler-dictionary", text: `one: a\nsomeField: ${tiddler.someField}\ntwo: b`}
}
});
const newWidgetText = data.widgetText.replace("listField='colors'", "listIndex='colors'").replace(/\$field/g, '$index').replace("listField='someField'", "listIndex='someField'");
const newChange = {};
for (const key of Object.keys(data.expectedChange)) {
const oldChange = data.expectedChange[key];
if (oldChange.colors) {
newChange[key] = { text: `one: a\ncolors: ${oldChange.colors}\ntwo: b` }
} else if (oldChange.someField !== undefined) {
newChange[key] = { text: `one: a\nsomeField: ${oldChange.someField}\ntwo: b` }
} else {
// In index tiddlers, fields with value undefined get completely removed
newChange[key] = { text: `one: a\ntwo: b` }
}
}
newData.testName = newName;
newData.tiddlers = newTiddlers;
newData.widgetText = newWidgetText;
newData.expectedChange = newChange;
return newData;
});
const filterModeTests = [
{
testName: "filter mode false -> true",
tiddlers: [{title: "Colors", colors: "red orange yellow"}],
widgetText: "\\define checkActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='-red green'/>\n" +
"\\define uncheckActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='red -green'/>\n" +
"<$checkbox filter='[list[Colors!!colors]]' checked='green' unchecked='red' default='green' checkactions=<<checkActions>> uncheckactions=<<uncheckActions>> />",
startsOutChecked: false,
expectedChange: { "Colors": { colors: "orange yellow green" } }
},
{
testName: "filter mode true -> false",
tiddlers: [{title: "Colors", colors: "green orange yellow"}],
widgetText: "\\define checkActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='-red green'/>\n" +
"\\define uncheckActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='red -green'/>\n" +
"<$checkbox filter='[list[Colors!!colors]]' checked='green' unchecked='red' default='green' checkactions=<<checkActions>> uncheckactions=<<uncheckActions>> />",
startsOutChecked: true,
expectedChange: { "Colors": { colors: "orange yellow red" } }
},
{
testName: "filter mode no default false -> true",
tiddlers: [{title: "Colors", colors: "red orange yellow"}],
widgetText: "\\define checkActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='-red green'/>\n" +
"\\define uncheckActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='red -green'/>\n" +
"<$checkbox filter='[list[Colors!!colors]]' checked='green' unchecked='red' checkactions=<<checkActions>> uncheckactions=<<uncheckActions>> />",
startsOutChecked: false,
expectedChange: { "Colors": { colors: "orange yellow green" } }
},
{
testName: "filter mode no default true -> false",
tiddlers: [{title: "Colors", colors: "green orange yellow"}],
widgetText: "\\define checkActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='-red green'/>\n" +
"\\define uncheckActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='red -green'/>\n" +
"<$checkbox filter='[list[Colors!!colors]]' checked='green' unchecked='red' checkactions=<<checkActions>> uncheckactions=<<uncheckActions>> />",
startsOutChecked: true,
expectedChange: { "Colors": { colors: "orange yellow red" } }
},
{
testName: "filter mode only checked specified false -> true",
tiddlers: [{title: "Colors", colors: "red orange yellow"}],
widgetText: "\\define checkActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='-red green'/>\n" +
"\\define uncheckActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='red -green'/>\n" +
"<$checkbox filter='[list[Colors!!colors]]' checked='green' default='green' checkactions=<<checkActions>> uncheckactions=<<uncheckActions>> />",
startsOutChecked: false,
expectedChange: { "Colors": { colors: "orange yellow green" } }
},
{
testName: "filter mode only checked specified true -> false",
tiddlers: [{title: "Colors", colors: "green orange yellow"}],
widgetText: "\\define checkActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='-red green'/>\n" +
"\\define uncheckActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='red -green'/>\n" +
"<$checkbox filter='[list[Colors!!colors]]' checked='green' default='green' checkactions=<<checkActions>> uncheckactions=<<uncheckActions>> />",
startsOutChecked: true,
expectedChange: { "Colors": { colors: "orange yellow red" } }
},
{
testName: "filter mode only checked specified no default false -> true",
tiddlers: [{title: "Colors", colors: "red orange yellow"}],
widgetText: "\\define checkActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='-red green'/>\n" +
"\\define uncheckActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='red -green'/>\n" +
"<$checkbox filter='[list[Colors!!colors]]' checked='green' checkactions=<<checkActions>> uncheckactions=<<uncheckActions>> />",
startsOutChecked: false,
expectedChange: { "Colors": { colors: "orange yellow green" } }
},
{
testName: "filter mode only checked specified no default true -> false",
tiddlers: [{title: "Colors", colors: "green orange yellow"}],
widgetText: "\\define checkActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='-red green'/>\n" +
"\\define uncheckActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='red -green'/>\n" +
"<$checkbox filter='[list[Colors!!colors]]' checked='green' checkactions=<<checkActions>> uncheckactions=<<uncheckActions>> />",
startsOutChecked: true,
expectedChange: { "Colors": { colors: "orange yellow red" } }
},
{
testName: "filter mode only unchecked specified false -> true",
tiddlers: [{title: "Colors", colors: "red orange yellow"}],
widgetText: "\\define checkActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='-red green'/>\n" +
"\\define uncheckActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='red -green'/>\n" +
"<$checkbox filter='[list[Colors!!colors]]' unchecked='red' default='green' checkactions=<<checkActions>> uncheckactions=<<uncheckActions>> />",
startsOutChecked: false,
expectedChange: { "Colors": { colors: "orange yellow green" } }
},
{
testName: "filter mode only unchecked specified true -> false",
tiddlers: [{title: "Colors", colors: "green orange yellow"}],
widgetText: "\\define checkActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='-red green'/>\n" +
"\\define uncheckActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='red -green'/>\n" +
"<$checkbox filter='[list[Colors!!colors]]' unchecked='red' default='green' checkactions=<<checkActions>> uncheckactions=<<uncheckActions>> />",
startsOutChecked: true,
expectedChange: { "Colors": { colors: "orange yellow red" } }
},
{
testName: "filter mode only unchecked specified no default false -> true",
tiddlers: [{title: "Colors", colors: "red orange yellow"}],
widgetText: "\\define checkActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='-red green'/>\n" +
"\\define uncheckActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='red -green'/>\n" +
"<$checkbox filter='[list[Colors!!colors]]' unchecked='red' checkactions=<<checkActions>> uncheckactions=<<uncheckActions>> />",
startsOutChecked: false,
expectedChange: { "Colors": { colors: "orange yellow green" } }
},
{
testName: "filter mode only unchecked specified no default true -> false",
tiddlers: [{title: "Colors", colors: "green orange yellow"}],
widgetText: "\\define checkActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='-red green'/>\n" +
"\\define uncheckActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='red -green'/>\n" +
"<$checkbox filter='[list[Colors!!colors]]' unchecked='red' checkactions=<<checkActions>> uncheckactions=<<uncheckActions>> />",
startsOutChecked: true,
expectedChange: { "Colors": { colors: "orange yellow red" } }
},
{
testName: "filter mode neither checked nor unchecked specified false -> true",
tiddlers: [{title: "Colors"}],
widgetText: "\\define checkActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='green'/>\n" +
"\\define uncheckActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='-green'/>\n" +
"<$checkbox filter='[list[Colors!!colors]]' default='green' checkactions=<<checkActions>> uncheckactions=<<uncheckActions>> />",
startsOutChecked: false,
expectedChange: { "Colors": { colors: "green" } }
},
{
testName: "filter mode neither checked nor unchecked specified true -> false",
tiddlers: [{title: "Colors", colors: "green"}],
widgetText: "\\define checkActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='green'/>\n" +
"\\define uncheckActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='-green'/>\n" +
"<$checkbox filter='[list[Colors!!colors]]' default='green' checkactions=<<checkActions>> uncheckactions=<<uncheckActions>> />",
startsOutChecked: true,
expectedChange: { "Colors": { colors: "" } }
},
{
testName: "filter mode neither checked nor unchecked no default specified false -> true",
tiddlers: [{title: "Colors", colors: ""}],
widgetText: "\\define checkActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='green'/>\n" +
"\\define uncheckActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='-green'/>\n" +
"<$checkbox filter='[list[Colors!!colors]]' checkactions=<<checkActions>> uncheckactions=<<uncheckActions>> />",
startsOutChecked: false,
expectedChange: { "Colors": { colors: "green" } }
},
{
testName: "filter mode neither checked nor unchecked no default specified true -> false",
tiddlers: [{title: "Colors", colors: "green"}],
widgetText: "\\define checkActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='green'/>\n" +
"\\define uncheckActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='-green'/>\n" +
"<$checkbox filter='[list[Colors!!colors]]' checkactions=<<checkActions>> uncheckactions=<<uncheckActions>> />",
startsOutChecked: true,
expectedChange: { "Colors": { colors: "" } }
},
{
testName: "filter mode indeterminate -> true",
tiddlers: [{title: "Colors", colors: "orange yellow"}],
widgetText: "\\define checkActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='green'/>\n" +
"\\define uncheckActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='-green'/>\n" +
"<$checkbox filter='[list[Colors!!colors]]' indeterminate='yes' checked='green' unchecked='red' default='green' checkactions=<<checkActions>> uncheckactions=<<uncheckActions>> />",
startsOutChecked: undefined,
expectedChange: { "Colors": { colors: "orange yellow green" } }
},
{
testName: "filter mode true -> indeterminate",
tiddlers: [{title: "Colors", colors: "green orange yellow"}],
widgetText: "\\define checkActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='green'/>\n" +
"\\define uncheckActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='-green'/>\n" +
"<$checkbox filter='[list[Colors!!colors]]' indeterminate='yes' checked='green' unchecked='red' default='green' checkactions=<<checkActions>> uncheckactions=<<uncheckActions>> />",
startsOutChecked: true,
finalValue: undefined,
expectedChange: { "Colors": { colors: "orange yellow" } }
},
{
testName: "filter mode not indeterminate -> true",
tiddlers: [{title: "Colors", colors: "orange yellow"}],
widgetText: "\\define checkActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='green'/>\n" +
"\\define uncheckActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='-green'/>\n" +
"<$checkbox filter='[list[Colors!!colors]]' checked='green' unchecked='red' default='green' checkactions=<<checkActions>> uncheckactions=<<uncheckActions>> />",
startsOutChecked: false,
expectedChange: { "Colors": { colors: "orange yellow green" } }
},
{
testName: "filter mode true -> not indeterminate",
tiddlers: [{title: "Colors", colors: "green orange yellow"}],
widgetText: "\\define checkActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='green'/>\n" +
"\\define uncheckActions() <$action-listops $tiddler='Colors' $field='colors' $subfilter='-green'/>\n" +
"<$checkbox filter='[list[Colors!!colors]]' checked='green' unchecked='red' default='green' checkactions=<<checkActions>> uncheckactions=<<uncheckActions>> />",
startsOutChecked: true,
finalValue: false,
expectedChange: { "Colors": { colors: "orange yellow" } }
},
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
];
const checkboxTestData = fieldModeTests.concat(
indexModeTests,
listModeTests,
listModeTestsWithListField,
listModeTestsWithTagsField,
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
indexListModeTests,
filterModeTests,
);
/*
* Checkbox widget tests using the test data above
*/
for (const data of checkboxTestData) {
it('checkbox widget test: ' + data.testName, function() {
// Setup
var wiki = new $tw.Wiki();
wiki.addTiddlers(data.tiddlers);
var widgetNode = createWidgetNode(parseText(data.widgetText,wiki),wiki);
var wrapper = renderWidgetNode(widgetNode);
// Check initial state
const widget = findNodeOfType('checkbox', widgetNode);
// Verify that the widget is or is not checked as expected
expect(widget.getValue()).toBe(data.startsOutChecked);
// Fake an event that toggles the checkbox
// fakedom elmenets don't have a "checked" property. so we fake it because
// Checkbox.prototype.handleChangeEvent looks at the "checked" DOM property
widget.inputDomNode.checked = !!widget.inputDomNode.attributes.checked;
// Now simulate checking the box
widget.inputDomNode.checked = !widget.inputDomNode.checked;
widget.handleChangeEvent(null);
// Check state again: in most tests, checkbox should be inverse of what it was
const finalValue = data.hasOwnProperty('finalValue') ? data.finalValue : !data.startsOutChecked;
expect(widget.getValue()).toBe(finalValue);
// Check that tiddler(s) has/have gone through expected change(s)
for (const key of Object.keys(data.expectedChange)) {
const tiddler = wiki.getTiddler(key);
const change = data.expectedChange[key];
for (const fieldName of Object.keys(change)) {
const expectedValue = change[fieldName];
const fieldValue = tiddler.fields[fieldName];
expect(fieldValue).toEqual(expectedValue);
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
}
}
})
}
});
})();