1
0
mirror of https://github.com/Jermolene/TiddlyWiki5 synced 2025-03-12 06:28:10 +00:00

Switch testcase widget to use an intrinsic template

Makes things much simpler
This commit is contained in:
jeremy@jermolene.com 2023-04-26 12:16:52 +01:00
parent 88f4ad0efd
commit 2cf0423401
6 changed files with 34 additions and 181 deletions

View File

@ -1,68 +0,0 @@
/*\
title: $:/core/modules/widgets/testcase-transclude.js
type: application/javascript
module-type: widget
Widget to transclude a tiddler from a test case
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
var Widget = require("$:/core/modules/widgets/widget.js").widget,
TestCaseWidget = require("$:/core/modules/widgets/testcase.js").testcase;
var TestCaseTranscludeWidget = function(parseTreeNode,options) {
this.initialise(parseTreeNode,options);
};
/*
Inherit from the base widget class
*/
TestCaseTranscludeWidget.prototype = new Widget();
/*
Render this widget into the DOM
*/
TestCaseTranscludeWidget.prototype.render = function(parent,nextSibling) {
this.parentDomNode = parent;
this.computeAttributes();
this.execute();
// Find the parent testcase
var pointer = this.parentWidget;
while(pointer && !(pointer instanceof TestCaseWidget)) {
pointer = pointer.parentWidget;
}
// Render the transclusion
if(pointer && pointer.testcaseRenderTiddler) {
pointer.testcaseRenderTiddler(parent,nextSibling,this.testcaseTranscludeTiddler,this.testcaseTranscludeMode)
}
};
/*
Compute the internal state of the widget
*/
TestCaseTranscludeWidget.prototype.execute = function() {
this.testcaseTranscludeTiddler = this.getAttribute("tiddler");
this.testcaseTranscludeMode = this.getAttribute("mode");
};
/*
Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering
*/
TestCaseTranscludeWidget.prototype.refresh = function(changedTiddlers) {
var changedAttributes = this.computeAttributes();
if($tw.utils.count(changedAttributes) > 0) {
this.refreshSelf();
return true;
} else {
return false;
}
};
exports["testcase-transclude"] = TestCaseTranscludeWidget;
})();

View File

@ -1,68 +0,0 @@
/*\
title: $:/core/modules/widgets/testcase-view.js
type: application/javascript
module-type: widget
Widget to render a plain text view of a tiddler from a test case
\*/
(function(){
/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";
var Widget = require("$:/core/modules/widgets/widget.js").widget,
TestCaseWidget = require("$:/core/modules/widgets/testcase.js").testcase;
var TestCaseViewWidget = function(parseTreeNode,options) {
this.initialise(parseTreeNode,options);
};
/*
Inherit from the base widget class
*/
TestCaseViewWidget.prototype = new Widget();
/*
Render this widget into the DOM
*/
TestCaseViewWidget.prototype.render = function(parent,nextSibling) {
this.parentDomNode = parent;
this.computeAttributes();
this.execute();
// Find the parent testcase
var pointer = this.parentWidget;
while(pointer && !(pointer instanceof TestCaseWidget)) {
pointer = pointer.parentWidget;
}
// Render the transclusion
if(pointer && pointer.testcaseRawTiddler) {
pointer.testcaseRawTiddler(parent,nextSibling,this.testcaseViewTiddler,this.testcaseViewField)
}
};
/*
Compute the internal state of the widget
*/
TestCaseViewWidget.prototype.execute = function() {
this.testcaseViewTiddler = this.getAttribute("tiddler");
this.testcaseViewField = this.getAttribute("field","text");
};
/*
Selectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering
*/
TestCaseViewWidget.prototype.refresh = function(changedTiddlers) {
var changedAttributes = this.computeAttributes();
if($tw.utils.count(changedAttributes) > 0) {
this.refreshSelf();
return true;
} else {
return false;
}
};
exports["testcase-view"] = TestCaseViewWidget;
})();

View File

@ -47,6 +47,8 @@ TestCaseWidget.prototype.render = function(parent,nextSibling) {
this.contentRoot.render(this.contentContainer,null);
// Create a wiki
this.testcaseWiki = new $tw.Wiki();
// Always load the core plugin
this.testcaseWiki.addTiddler(this.wiki.getTiddler("$:/core"));
// Load tiddlers from child data widgets
var tiddlers = [];
this.findChildrenDataWidgets(this.contentRoot.children,"data",function(widget) {
@ -68,32 +70,13 @@ TestCaseWidget.prototype.render = function(parent,nextSibling) {
testcaseInfoData.tiddlers[title] = Object.keys(tiddler.fields);
});
this.setVariable("testcaseInfo",JSON.stringify(testcaseInfoData));
// Render children from the template
this.renderChildren(parent,nextSibling);
};
/*
Render a test case
*/
TestCaseWidget.prototype.testcaseRenderTiddler = function(parent,nextSibling,title,mode) {
var self = this;
// Parse and render a tiddler
var rootWidget = this.testcaseWiki.makeTranscludeWidget(title,{document: this.document, parseAsInline: mode === "inline", parentWidget: this});
// Render the page root template of the subwiki
var rootWidget = this.testcaseWiki.makeTranscludeWidget(this.testcaseTemplate,{document: this.document, parseAsInline: false, parentWidget: this});
rootWidget.render(parent,nextSibling);
};
/*
View a test case tiddler in plain text
*/
TestCaseWidget.prototype.testcaseRawTiddler = function(parent,nextSibling,title,field) {
var self = this;
// Render a text widget with the text of a tiddler
var text="",
tiddler = this.testcaseWiki.getTiddler(title);
if(tiddler) {
text = tiddler.getFieldString(field,"");
}
parent.insertBefore(this.document.createTextNode(text),nextSibling);
// Trap changes in the wiki and refresh the rendering
this.testcaseWiki.addEventListener("change",function(changes) {
rootWidget.refresh(changes,parent,nextSibling);
});
};
/*
@ -101,18 +84,6 @@ Compute the internal state of the widget
*/
TestCaseWidget.prototype.execute = function() {
this.testcaseTemplate = this.getAttribute("template","$:/core/ui/testcases/DefaultTemplate");
// Make child widgets
var parseTreeNodes = [{
type: "transclude",
attributes: {
tiddler: {
name: "tiddler",
type: "string",
value: this.testcaseTemplate
}
},
isBlock: true}];
this.makeChildWidgets(parseTreeNodes);
};
/*
@ -124,7 +95,7 @@ TestCaseWidget.prototype.refresh = function(changedTiddlers) {
this.refreshSelf();
return true;
} else {
return this.refreshChildren(changedTiddlers);
return false;
}
};

View File

@ -6,16 +6,16 @@ title: $:/core/ui/testcases/DefaultTemplate
>
<div class="tc-testcase-wrapper">
<div class="tc-testcase-header">
<h2><$testcase-transclude tiddler="Description" mode="inline"/></h2>
<h2><$transclude tiddler="Description" mode="inline"/></h2>
</div>
<div class="tc-testcase-panes">
<div class="tc-testcase-source">
<$macrocall $name="tabs" tabsList="[<testcaseInfo>jsonindexes[tiddlers]] -Description -ExpectedResult -[has[plugin-type]]" state=<<state>> default="Output" template="$:/core/ui/testcases/DefaultTemplate/Source"/>
<$macrocall $name="tabs" tabsList="[all[tiddlers]sort[]] -Description -ExpectedResult -[has[plugin-type]]" state=<<state>> default="Output" template="$:/core/ui/testcases/DefaultTemplate/Source"/>
</div>
<div class="tc-testcase-divider">
</div>
<div class="tc-testcase-output">
<$testcase-transclude tiddler="Output"/>
<$transclude tiddler="Output"/>
</div>
</div>
</div>

View File

@ -1,20 +1,20 @@
title: $:/core/ui/testcases/DefaultTemplate/Source
<$list filter="[<testcaseInfo>jsonget[tiddlers],<currentTab>] -text -title +[limit[1]]" variable="ignore">
<$list filter="[<currentTab>fields[]] -text +[limit[1]]" variable="ignore">
<table class="tc-field-table">
<tbody>
<tr><th>Field</th><th>Value</th></tr>
<$list filter="[<testcaseInfo>jsonget[tiddlers],<currentTab>] -text -title" variable="fieldName">
<$list filter="[<currentTab>fields[]sort[]] -text" variable="fieldName">
<tr>
<td>
<$text text=<<fieldName>>/>
</td>
<td>
<$testcase-view tiddler=<<currentTab>> field=<<fieldName>>/>
<$view tiddler=<<currentTab>> field=<<fieldName>>/>
</td>
</tr>
</$list>
</tbody>
</table>
</$list>
<pre><$testcase-view tiddler=<<currentTab>>/></pre>
<pre><$view tiddler=<<currentTab>>/></pre>

View File

@ -37,6 +37,24 @@ Retrieves photographs of a particular user, identified by their user ID.
|userID |ID of the user of whom to retrieve photos (eg 35468148136@N01) |
|photoTiddlerTemplate |Optional title of tiddler specifying field values for the created photo tiddlers |
For example:
<$testcase>
<$data $tiddler="$:/plugins/tiddlywiki/geospatial"/>
<$data title="Description" text="Get photographs from album"/>
<$data title="Output" text="""<$button>
<$macrocall $name="flickr-get-album-items" albumID="72157630297432522"/>
Get photos from album
</$button>
<$geomap
state=<<qualify "$:/state/demo-map">>
markers="[all[tiddlers+shadows]tag[$:/tags/FlickrPhoto]]"
/>
"""/>
</$testcase>
!!! `flickr-get-group-items` macro
Retrieves photographs from a group, identified by the group ID.