diff --git a/core/images/list.tid b/core/images/list.tid
new file mode 100644
index 000000000..c27a51647
--- /dev/null
+++ b/core/images/list.tid
@@ -0,0 +1,9 @@
+title: $:/core/images/list
+tags: $:/tags/Image
+
+
\ No newline at end of file
diff --git a/core/language/en-GB/Buttons.multids b/core/language/en-GB/Buttons.multids
index 3a8f21969..5c8398f6d 100644
--- a/core/language/en-GB/Buttons.multids
+++ b/core/language/en-GB/Buttons.multids
@@ -54,6 +54,8 @@ Home/Caption: home
Home/Hint: Open the default tiddlers
Language/Caption: language
Language/Hint: Choose the user interface language
+Manager/Caption: tiddler manager
+Manager/Hint: Open tiddler manager
More/Caption: more
More/Hint: More actions
NewHere/Caption: new here
diff --git a/core/modules/filters/all/tags.js b/core/modules/filters/all/tags.js
new file mode 100644
index 000000000..2aaa9dec2
--- /dev/null
+++ b/core/modules/filters/all/tags.js
@@ -0,0 +1,22 @@
+/*\
+title: $:/core/modules/filters/all/tags.js
+type: application/javascript
+module-type: allfilteroperator
+
+Filter function for [all[tags]]
+
+\*/
+(function(){
+
+/*jslint node: true, browser: true */
+/*global $tw: false */
+"use strict";
+
+/*
+Export our filter function
+*/
+exports.tags = function(source,prefix,options) {
+ return Object.keys(options.wiki.getTagMap());
+};
+
+})();
diff --git a/core/modules/filters/is.js b/core/modules/filters/is.js
index 0db243044..514443a62 100644
--- a/core/modules/filters/is.js
+++ b/core/modules/filters/is.js
@@ -28,11 +28,20 @@ Export our filter function
exports.is = function(source,operator,options) {
// Dispatch to the correct isfilteroperator
var isFilterOperators = getIsFilterOperators();
- var isFilterOperator = isFilterOperators[operator.operand];
- if(isFilterOperator) {
- return isFilterOperator(source,operator.prefix,options);
+ if(operator.operand) {
+ var isFilterOperator = isFilterOperators[operator.operand];
+ if(isFilterOperator) {
+ return isFilterOperator(source,operator.prefix,options);
+ } else {
+ return [$tw.language.getString("Error/IsFilterOperator")];
+ }
} else {
- return [$tw.language.getString("Error/IsFilterOperator")];
+ // Return all tiddlers if the operand is missing
+ var results = [];
+ source(function(tiddler,title) {
+ results.push(title);
+ });
+ return results;
}
};
diff --git a/core/modules/filters/listops.js b/core/modules/filters/listops.js
index 58f74f092..d7a07b62a 100644
--- a/core/modules/filters/listops.js
+++ b/core/modules/filters/listops.js
@@ -12,6 +12,23 @@ Filter operators for manipulating the current selection list
/*global $tw: false */
"use strict";
+/*
+Order a list
+*/
+exports.order = function(source,operator,options) {
+ var results = [];
+ if(operator.operand.toLowerCase() === "reverse") {
+ source(function(tiddler,title) {
+ results.unshift(title);
+ });
+ } else {
+ source(function(tiddler,title) {
+ results.push(title);
+ });
+ }
+ return results;
+};
+
/*
Reverse list
*/
diff --git a/core/modules/filters/tag.js b/core/modules/filters/tag.js
index 408d7f98f..a421c61d7 100644
--- a/core/modules/filters/tag.js
+++ b/core/modules/filters/tag.js
@@ -17,19 +17,30 @@ Export our filter function
*/
exports.tag = function(source,operator,options) {
var results = [];
- if(operator.prefix === "!") {
+ if((operator.suffix || "").toLowerCase() === "strict" && !operator.operand) {
+ // New semantics:
+ // Always return copy of input if operator.operand is missing
source(function(tiddler,title) {
- if(tiddler && !tiddler.hasTag(operator.operand)) {
- results.push(title);
- }
+ results.push(title);
});
} else {
- source(function(tiddler,title) {
- if(tiddler && tiddler.hasTag(operator.operand)) {
- results.push(title);
- }
- });
- results = options.wiki.sortByList(results,operator.operand);
+ // Old semantics:
+ if(operator.prefix === "!") {
+ // Returns a copy of the input if operator.operand is missing
+ source(function(tiddler,title) {
+ if(tiddler && !tiddler.hasTag(operator.operand)) {
+ results.push(title);
+ }
+ });
+ } else {
+ // Returns empty results if operator.operand is missing
+ source(function(tiddler,title) {
+ if(tiddler && tiddler.hasTag(operator.operand)) {
+ results.push(title);
+ }
+ });
+ results = options.wiki.sortByList(results,operator.operand);
+ }
}
return results;
};
diff --git a/core/modules/filters/untagged.js b/core/modules/filters/untagged.js
index 5a08b4edc..ed0f90ff4 100644
--- a/core/modules/filters/untagged.js
+++ b/core/modules/filters/untagged.js
@@ -16,16 +16,22 @@ Filter operator returning all the selected tiddlers that are untagged
Export our filter function
*/
exports.untagged = function(source,operator,options) {
- var results = [];
+ var results = [],
+ isTagged = (operator.operand || operator.suffix || "").toLowerCase() === "no" ?
+ function(tiddler) {
+ return false;
+ } : function(tiddler) {
+ return tiddler && $tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length > 0;
+ };
if(operator.prefix === "!") {
source(function(tiddler,title) {
- if(tiddler && $tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length > 0) {
+ if(isTagged(tiddler)) {
$tw.utils.pushTop(results,title);
}
});
} else {
source(function(tiddler,title) {
- if(!tiddler || !tiddler.hasField("tags") || ($tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length === 0)) {
+ if(!isTagged(tiddler)) {
$tw.utils.pushTop(results,title);
}
});
diff --git a/core/modules/widgets/checkbox.js b/core/modules/widgets/checkbox.js
index 2480ff319..6c1d64feb 100644
--- a/core/modules/widgets/checkbox.js
+++ b/core/modules/widgets/checkbox.js
@@ -65,7 +65,12 @@ CheckboxWidget.prototype.getValue = function() {
}
}
if(this.checkboxField) {
- var value = tiddler.fields[this.checkboxField] || this.checkboxDefault || "";
+ var value;
+ if($tw.utils.hop(tiddler.fields,this.checkboxField)) {
+ value = tiddler.fields[this.checkboxField] || "";
+ } else {
+ value = this.checkboxDefault || "";
+ }
if(value === this.checkboxChecked) {
return true;
}
diff --git a/core/modules/widgets/dropzone.js b/core/modules/widgets/dropzone.js
index 4ac8e78f4..f7f75b0ab 100644
--- a/core/modules/widgets/dropzone.js
+++ b/core/modules/widgets/dropzone.js
@@ -202,32 +202,42 @@ DropZoneWidget.prototype.importDataTypes = [
];
DropZoneWidget.prototype.handlePasteEvent = function(event) {
+ var self = this,
+ createTiddlerFromString = function(text,type) {
+ var tiddlerFields = {
+ title: self.wiki.generateNewTitle("Untitled"),
+ text: text,
+ type: type
+ };
+ if($tw.log.IMPORT) {
+ console.log("Importing string '" + text + "', type: '" + type + "'");
+ }
+ self.dispatchEvent({type: "tm-import-tiddlers", param: JSON.stringify([tiddlerFields])});
+ };
// Let the browser handle it if we're in a textarea or input box
if(["TEXTAREA","INPUT"].indexOf(event.target.tagName) == -1) {
- var self = this,
- items = event.clipboardData.items;
+ var items = event.clipboardData.items;
// Enumerate the clipboard items
- for(var t = 0; t> backgroundColor="""$colour$""">
> class="tc-tag-label">
@@ -15,39 +17,24 @@ color:$(foregroundColor)$;
$vars>
\end
+
\define tag-body(colour,palette)
<$macrocall $name="tag-body-inner" colour="""$colour$""" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}}/>
\end
+
+\define tag-picker-actions()
+<$action-listops
+ $tiddler=<>
+ $field="tags"
+ $subfilter="[] [all[current]tags[]]"
+/>
+\end
+
\ No newline at end of file
+<$macrocall $name="tag-picker" actions=<>/>
+
diff --git a/core/ui/Manager.tid b/core/ui/Manager.tid
new file mode 100644
index 000000000..941ece4d7
--- /dev/null
+++ b/core/ui/Manager.tid
@@ -0,0 +1,111 @@
+title: $:/Manager
+icon: $:/core/images/list
+color: #bbb
+
+\define tag-checkbox-actions()
+<$action-listops
+ $tiddler="$:/config/Manager/RecentTags"
+ $subfilter="[] [list[$:/config/Manager/RecentTags]] +[limit[12]]"
+/>
+\end
+
+\define tag-picker-actions()
+<>
+<$action-listops
+ $tiddler=<>
+ $field="tags"
+ $subfilter="[] [all[current]tags[]]"
+/>
+\end
+
+\define list-item-content-item()
+
+ <$vars state-title="""$:/state/popup/manager/item/$(listItem)$""">
+ <$reveal state=<> type="match" text="show" default="show" tag="div">
+ <$button set=<> setTo="hide" class="tc-btn-invisible tc-manager-list-item-content-item-heading">
+ {{$:/core/images/down-arrow}} <$transclude tiddler=<> field="caption"/>
+ $button>
+ $reveal>
+ <$reveal state=<> type="nomatch" text="show" default="show" tag="div">
+ <$button set=<> setTo="show" class="tc-btn-invisible tc-manager-list-item-content-item-heading">
+ {{$:/core/images/right-arrow}} <$transclude tiddler=<> field="caption"/>
+ $button>
+ $reveal>
+ <$reveal state=<> type="match" text="show" default="show" tag="div" class="tc-manager-list-item-content-item-body">
+ <$transclude tiddler=<>/>
+ $reveal>
+ $vars>
+
+\end
+
+
+
+
+ Show: <$select tiddler="$:/config/Manager/Show" default="tiddlers">
+
+
+ $select>
+
+
+ Search: <$edit-text tiddler="$:/config/Manager/Filter" tag="input" default="" placeholder="Search"/>
+
+
+ Filter by tag: <$select tiddler="$:/config/Manager/Tag" default="">
+
+ <$list filter="[!is{$:/config/Manager/System}tags[]!is[system]sort[title]]" variable="tag">
+
+ $list>
+ $select>
+
+
+ Sort by: <$select tiddler="$:/config/Manager/Sort" default="title">
+
+
+ $select>
+ <$checkbox tiddler="$:/config/Manager/Order" field="text" checked="reverse" unchecked="forward" default="forward">
+ Reverse order
+ $checkbox>
+
+
+ <$checkbox tiddler="$:/config/Manager/Untagged" field="text" checked="yes" unchecked="no" default="no">
+ Only show untagged tiddlers
+ $checkbox>
+
+
+ <$checkbox tiddler="$:/config/Manager/System" field="text" checked="" unchecked="system" default="system">
+ Include system tiddlers
+ $checkbox>
+
+
+
+ <$list filter="[all{$:/config/Manager/Show}!is{$:/config/Manager/System}search{$:/config/Manager/Filter}tag:strict{$:/config/Manager/Tag}untagged:no{$:/config/Manager/Untagged}sort{$:/config/Manager/Sort}order{$:/config/Manager/Order}]">
+ <$vars transclusion=<
>>
+
+ <$button popup=<
> class="tc-btn-invisible tc-manager-list-item-heading" selectedClass="tc-manager-list-item-heading-selected">
+ <$text text=<>/>
+ $button>
+ <$reveal state=<> type="nomatch" text="" default="" tag="div" class="tc-manager-list-item-content tc-popup-handle">
+
+ <$list filter="[all[shadows+tiddlers]tag[$:/tags/Manager/ItemMain]!has[draft.of]]" variable="listItem">
+ <>
+ $list>
+
+
+ $reveal>
+
+ $vars>
+ $list>
+
+
diff --git a/core/ui/Manager/ItemMainFields.tid b/core/ui/Manager/ItemMainFields.tid
new file mode 100644
index 000000000..922cee3bd
--- /dev/null
+++ b/core/ui/Manager/ItemMainFields.tid
@@ -0,0 +1,9 @@
+title: $:/Manager/ItemMain/Fields
+tags: $:/tags/Manager/ItemMain
+caption: Fields
+
+
+
+<$list filter="[all[current]fields[]sort[title]] -text" template="$:/core/ui/TiddlerFieldTemplate" variable="listItem"/>
+
+
diff --git a/core/ui/Manager/ItemMainRawText.tid b/core/ui/Manager/ItemMainRawText.tid
new file mode 100644
index 000000000..578ebff22
--- /dev/null
+++ b/core/ui/Manager/ItemMainRawText.tid
@@ -0,0 +1,5 @@
+title: $:/Manager/ItemMain/RawText
+tags: $:/tags/Manager/ItemMain
+caption: Raw text
+
+<$view/>
diff --git a/core/ui/Manager/ItemMainWikifiedText.tid b/core/ui/Manager/ItemMainWikifiedText.tid
new file mode 100644
index 000000000..51f19c6fd
--- /dev/null
+++ b/core/ui/Manager/ItemMainWikifiedText.tid
@@ -0,0 +1,5 @@
+title: $:/Manager/ItemMain/WikifiedText
+tags: $:/tags/Manager/ItemMain
+caption: Wikified text
+
+<$transclude mode="block"/>
diff --git a/core/ui/Manager/ItemSidebarColour.tid b/core/ui/Manager/ItemSidebarColour.tid
new file mode 100644
index 000000000..0bf3c9967
--- /dev/null
+++ b/core/ui/Manager/ItemSidebarColour.tid
@@ -0,0 +1,15 @@
+title: $:/Manager/ItemSidebar/Colour
+tags: $:/tags/Manager/ItemSidebar
+caption: Colour
+
+\define swatch-styles()
+height: 1em;
+background-color: $(colour)$
+\end
+
+<$vars colour={{!!color}}>
+>/>
+$vars>
+
+<$edit-text field="color" tag="input" type="color"/> / <$edit-text field="color" tag="input" type="text" size="9"/>
+
diff --git a/core/ui/Manager/ItemSidebarIcon.tid b/core/ui/Manager/ItemSidebarIcon.tid
new file mode 100644
index 000000000..3f607573a
--- /dev/null
+++ b/core/ui/Manager/ItemSidebarIcon.tid
@@ -0,0 +1,9 @@
+title: $:/Manager/ItemSidebar/Icon
+tags: $:/tags/Manager/ItemSidebar
+caption: Icon
+
+
+<$macrocall $name="image-picker-dropdown" image-tiddler={{!!icon}} fallback="(none)" actions="""
+<$action-setfield $field="icon" $value=<>/>
+"""/>
+
diff --git a/core/ui/Manager/ItemSidebarTagsEditor.tid b/core/ui/Manager/ItemSidebarTagsEditor.tid
new file mode 100644
index 000000000..c7ababc99
--- /dev/null
+++ b/core/ui/Manager/ItemSidebarTagsEditor.tid
@@ -0,0 +1,16 @@
+title: $:/Manager/ItemSidebar/Tags
+tags: $:/tags/Manager/ItemSidebar
+caption: Tags
+
+
+<$list filter="[is[current]tags[]] [list[$:/config/Manager/RecentTags]] +[sort[title]] " variable="tag">
+
+<$checkbox tiddler=<> tag=<> actions=<>>
+<$macrocall $name="tag-pill" tag=<>/>
+$checkbox>
+
+$list>
+
+
+<$macrocall $name="tag-picker" actions=<>/>
+
diff --git a/core/ui/Manager/ItemSidebarTools.tid b/core/ui/Manager/ItemSidebarTools.tid
new file mode 100644
index 000000000..793487ca9
--- /dev/null
+++ b/core/ui/Manager/ItemSidebarTools.tid
@@ -0,0 +1,10 @@
+title: $:/Manager/ItemSidebar/Tools
+tags: $:/tags/Manager/ItemSidebar
+caption: Tools
+
+
+<$button to=<>>{{$:/core/images/link}} open$button>
+
+
+<$button message="tm-edit-tiddler" param=<>>{{$:/core/images/edit-button}} edit$button>
+
diff --git a/core/ui/PageControls/manager.tid b/core/ui/PageControls/manager.tid
new file mode 100644
index 000000000..b2a7ed9bf
--- /dev/null
+++ b/core/ui/PageControls/manager.tid
@@ -0,0 +1,19 @@
+title: $:/core/ui/Buttons/manager
+tags: $:/tags/PageControls
+caption: {{$:/core/images/list}} {{$:/language/Buttons/Manager/Caption}}
+description: {{$:/language/Buttons/Manager/Hint}}
+
+\define manager-button(class)
+<$button to="$:/Manager" tooltip={{$:/language/Buttons/Manager/Hint}} aria-label={{$:/language/Buttons/Manager/Caption}} class="""$(tv-config-toolbar-class)$ $class$""">
+<$list filter="[prefix[yes]]">
+{{$:/core/images/list}}
+$list>
+<$list filter="[prefix[yes]]">
+<$text text={{$:/language/Buttons/Manager/Caption}}/>
+$list>
+$button>
+\end
+
+<$list filter="[list[$:/StoryList]] +[field:title[$:/Manager]]" emptyMessage=<>>
+<>
+$list>
diff --git a/core/ui/TagManager.tid b/core/ui/TagManager.tid
index fe3489dc9..eeb2135c5 100644
--- a/core/ui/TagManager.tid
+++ b/core/ui/TagManager.tid
@@ -1,6 +1,7 @@
title: $:/TagManager
icon: $:/core/images/tag-button
color: #bbb
+caption: {{$:/language/TagManager/Caption}}
\define lingo-base() $:/language/TagManager/
\define iconEditorTab(type)
@@ -51,7 +52,7 @@ $title$$(currentTiddler)$
<$list filter="[tags[]!is[system]sort[title]]">
<$edit-text field="color" tag="input" type="color"/> |
-<$transclude tiddler="$:/core/ui/TagTemplate"/> |
+<$macrocall $name="tag" tag=<>/> |
<$count filter="[all[current]tagging[]]"/> |
<$macrocall $name="iconEditor" title={{!!title}}/>
diff --git a/core/ui/TagTemplate.tid b/core/ui/TagTemplate.tid
index f302d8f3d..569e6ad0f 100644
--- a/core/ui/TagTemplate.tid
+++ b/core/ui/TagTemplate.tid
@@ -1,30 +1,3 @@
title: $:/core/ui/TagTemplate
-\define tag-styles()
-background-color:$(backgroundColor)$;
-fill:$(foregroundColor)$;
-color:$(foregroundColor)$;
-\end
-
-\define tag-body-inner(colour,fallbackTarget,colourA,colourB)
-<$vars foregroundColor=<> backgroundColor="""$colour$""">
-<$button popup=<> class="tc-btn-invisible tc-tag-label" style=<>>
-<$transclude tiddler={{!!icon}}/> <$view field="title" format="text" />
-$button>
-<$reveal state=<> type="popup" position="below" animate="yes" class="tc-drop-down"><$transclude tiddler="$:/core/ui/ListItemTemplate"/>
-<$list filter="[all[shadows+tiddlers]tag[$:/tags/TagDropdown]!has[draft.of]]" variable="listItem">
-<$transclude tiddler=<>/>
-$list>
-
-<$list filter="[all[current]tagging[]]" template="$:/core/ui/ListItemTemplate"/>
-$reveal>
-$vars>
-\end
-
-\define tag-body(colour,palette)
-
-<$macrocall $name="tag-body-inner" colour="""$colour$""" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}}/>
-
-\end
-
-<$macrocall $name="tag-body" colour={{!!color}} palette={{$:/palette}}/>
+<$macrocall $name="tag" tag=<>/>
diff --git a/core/wiki/config/Manager.multids b/core/wiki/config/Manager.multids
new file mode 100644
index 000000000..93fa0944a
--- /dev/null
+++ b/core/wiki/config/Manager.multids
@@ -0,0 +1,10 @@
+title: $:/config/Manager/
+
+Show: tiddlers
+Filter:
+Order: forward
+Sort: title
+System: system
+Tag:
+Untagged: no
+View: wikified
diff --git a/core/wiki/config/ManagerItemState.multids b/core/wiki/config/ManagerItemState.multids
new file mode 100644
index 000000000..845034ff6
--- /dev/null
+++ b/core/wiki/config/ManagerItemState.multids
@@ -0,0 +1,3 @@
+title: $:/state/popup/manager/item/$:/Manager/
+
+ItemMain/RawText: hide
\ No newline at end of file
diff --git a/core/wiki/config/PageControlButtons.multids b/core/wiki/config/PageControlButtons.multids
index 7ad91db29..f880b3399 100644
--- a/core/wiki/config/PageControlButtons.multids
+++ b/core/wiki/config/PageControlButtons.multids
@@ -11,6 +11,7 @@ core/ui/Buttons/refresh: hide
core/ui/Buttons/import: hide
core/ui/Buttons/language: hide
core/ui/Buttons/tag-manager: hide
+core/ui/Buttons/manager: hide
core/ui/Buttons/more-page-actions: hide
core/ui/Buttons/new-journal: hide
core/ui/Buttons/new-image: hide
diff --git a/core/wiki/macros/image-picker.tid b/core/wiki/macros/image-picker.tid
index 68bbba34d..339c68001 100644
--- a/core/wiki/macros/image-picker.tid
+++ b/core/wiki/macros/image-picker.tid
@@ -3,24 +3,31 @@ tags: $:/tags/Macro
\define image-picker-inner(actions)
<$button tag="a" tooltip="""$(imageTitle)$""">
-
$actions$
-
<$transclude tiddler=<>/>
-
$button>
\end
\define image-picker(actions,subfilter:"")
-
<$list filter="[all[shadows+tiddlers]is[image]$subfilter$!has[draft.of]] -[type[application/pdf]] +[sort[title]]" variable="imageTitle">
-
<$macrocall $name="image-picker-inner" actions="""$actions$"""/>
-
$list>
-
-
\end
+\define image-picker-dropdown(image-tiddler,fallback,actions)
+
+<$button popup=< > class="tc-btn-invisible">
+<$transclude tiddler="""$image-tiddler$""">
+$fallback$
+$transclude>
+$button>
+
+<$reveal state=< > type="nomatch" text="" default="">
+
+<$macrocall $name="image-picker" actions="""$actions$"""/>
+
+$reveal>
+
+\end
diff --git a/core/wiki/macros/tag-picker.tid b/core/wiki/macros/tag-picker.tid
new file mode 100644
index 000000000..aaea75632
--- /dev/null
+++ b/core/wiki/macros/tag-picker.tid
@@ -0,0 +1,41 @@
+title: $:/core/macros/tag-picker
+tags: $:/tags/Macro
+
+\define tag-button()
+<$button class="tc-btn-invisible" tag="a">
+$(actions)$
+<$action-deletetiddler $tiddler="$:/temp/NewTagName"/>
+<$macrocall $name="tag-pill" tag=<>/>
+$button>
+\end
+
+\define tag-picker(actions)
+<$set name="actions" value="""$actions$""">
+
+
+<$edit-text tiddler="$:/temp/NewTagName" tag="input" default="" placeholder={{$:/language/EditTemplate/Tags/Add/Placeholder}} focusPopup=<> class="tc-edit-texteditor tc-popup-handle"/>
+ <$button popup=<> class="tc-btn-invisible" tooltip={{$:/language/EditTemplate/Tags/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Tags/Dropdown/Caption}}>{{$:/core/images/down-arrow}}$button>
+<$set name="tag" value={{$:/temp/NewTagName}}>
+<$button set="$:/temp/NewTagName" setTo="" class="">
+$actions$
+<$action-deletetiddler $tiddler="$:/temp/NewTagName"/>
+{{$:/language/EditTemplate/Tags/Add/Button}}
+$button>
+$set>
+
+
+
+<$reveal state=< > type="nomatch" text="" default="">
+
+<$list filter="[tags[]!is[system]search:title{$:/temp/NewTagName}sort[]]" variable="tag">
+<>
+$list>
+
+<$list filter="[tags[]is[system]search:title{$:/temp/NewTagName}sort[]]" variable="tag">
+<>
+$list>
+
+$reveal>
+
+$set>
+\end
diff --git a/core/wiki/macros/tag.tid b/core/wiki/macros/tag.tid
index b65bfc046..dc23f3238 100644
--- a/core/wiki/macros/tag.tid
+++ b/core/wiki/macros/tag.tid
@@ -1,6 +1,44 @@
title: $:/core/macros/tag
tags: $:/tags/Macro
-\define tag(tag)
-{{$tag$||$:/core/ui/TagTemplate}}
+\define tag-pill-styles()
+background-color:$(backgroundColor)$;
+fill:$(foregroundColor)$;
+color:$(foregroundColor)$;
+\end
+
+\define tag-pill-inner(tag,icon,colour,fallbackTarget,colourA,colourB,element-tag,element-attributes,actions)
+<$vars foregroundColor=<> backgroundColor="""$colour$""">
+<$element-tag$ $element-attributes$ class="tc-tag-label tc-btn-invisible" style=<>>
+$actions$<$transclude tiddler="""$icon$"""/> <$view tiddler="""$tag$""" field="title" format="text" />
+$element-tag$>
+$vars>
+\end
+
+\define tag-pill-body(tag,icon,colour,palette,element-tag,element-attributes,actions)
+<$macrocall $name="tag-pill-inner" tag="""$tag$""" icon="""$icon$""" colour="""$colour$""" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}} element-tag="""$element-tag$""" element-attributes="""$element-attributes$""" actions="""$actions$"""/>
+\end
+
+\define tag-pill(tag,element-tag:"span",element-attributes:"",actions:"")
+
+<$macrocall $name="tag-pill-body" tag="""$tag$""" icon={{$tag$!!icon}} colour={{$tag$!!color}} palette={{$:/palette}} element-tag="""$element-tag$""" element-attributes="""$element-attributes$""" actions="""$actions$"""/>
+
+\end
+
+\define tag(tag)
+
+<$set name="transclusion" value="""$tag$""">
+<$macrocall $name="tag-pill-body" tag="""$tag$""" icon={{$tag$!!icon}} colour={{$tag$!!color}} palette={{$:/palette}} element-tag="""$button""" element-attributes="""popup=<>"""/>
+<$reveal state=<> type="popup" position="below" animate="yes" class="tc-drop-down">
+<$tiddler tiddler="""$tag$""">
+<$transclude tiddler="$:/core/ui/ListItemTemplate"/>
+<$list filter="[all[shadows+tiddlers]tag[$:/tags/TagDropdown]!has[draft.of]]" variable="listItem">
+<$transclude tiddler=<>/>
+$list>
+
+<$list filter="[all[current]tagging[]]" template="$:/core/ui/ListItemTemplate"/>
+$tiddler>
+$reveal>
+$set>
+
\end
diff --git a/core/wiki/tags/ManagerItemMain.tid b/core/wiki/tags/ManagerItemMain.tid
new file mode 100644
index 000000000..fa1af0824
--- /dev/null
+++ b/core/wiki/tags/ManagerItemMain.tid
@@ -0,0 +1,2 @@
+title: $:/tags/Manager/ItemMain
+list: $:/Manager/ItemMain/WikifiedText $:/Manager/ItemMain/RawText $:/Manager/ItemMain/Fields
\ No newline at end of file
diff --git a/core/wiki/tags/ManagerItemSidebar.tid b/core/wiki/tags/ManagerItemSidebar.tid
new file mode 100644
index 000000000..b450ef772
--- /dev/null
+++ b/core/wiki/tags/ManagerItemSidebar.tid
@@ -0,0 +1,2 @@
+title: $:/tags/Manager/ItemSidebar
+list: $:/Manager/ItemSidebar/Tags $:/Manager/ItemSidebar/Colour $:/Manager/ItemSidebar/Icon $:/Manager/ItemSidebar/Tools
\ No newline at end of file
diff --git a/core/wiki/tags/PageControls.tid b/core/wiki/tags/PageControls.tid
index 3bef09b7d..4d5972827 100644
--- a/core/wiki/tags/PageControls.tid
+++ b/core/wiki/tags/PageControls.tid
@@ -1,2 +1,2 @@
title: $:/tags/PageControls
-list: [[$:/core/ui/Buttons/home]] [[$:/core/ui/Buttons/close-all]] [[$:/core/ui/Buttons/fold-all]] [[$:/core/ui/Buttons/unfold-all]] [[$:/core/ui/Buttons/permaview]] [[$:/core/ui/Buttons/new-tiddler]] [[$:/core/ui/Buttons/new-journal]] [[$:/core/ui/Buttons/new-image]] [[$:/core/ui/Buttons/import]] [[$:/core/ui/Buttons/export-page]] [[$:/core/ui/Buttons/control-panel]] [[$:/core/ui/Buttons/advanced-search]] [[$:/core/ui/Buttons/tag-manager]] [[$:/core/ui/Buttons/language]] [[$:/core/ui/Buttons/palette]] [[$:/core/ui/Buttons/theme]] [[$:/core/ui/Buttons/storyview]] [[$:/core/ui/Buttons/encryption]] [[$:/core/ui/Buttons/full-screen]] [[$:/core/ui/Buttons/save-wiki]] [[$:/core/ui/Buttons/refresh]] [[$:/core/ui/Buttons/more-page-actions]]
+list: [[$:/core/ui/Buttons/home]] [[$:/core/ui/Buttons/close-all]] [[$:/core/ui/Buttons/fold-all]] [[$:/core/ui/Buttons/unfold-all]] [[$:/core/ui/Buttons/permaview]] [[$:/core/ui/Buttons/new-tiddler]] [[$:/core/ui/Buttons/new-journal]] [[$:/core/ui/Buttons/new-image]] [[$:/core/ui/Buttons/import]] [[$:/core/ui/Buttons/export-page]] [[$:/core/ui/Buttons/control-panel]] [[$:/core/ui/Buttons/advanced-search]] [[$:/core/ui/Buttons/manager]] [[$:/core/ui/Buttons/tag-manager]] [[$:/core/ui/Buttons/language]] [[$:/core/ui/Buttons/palette]] [[$:/core/ui/Buttons/theme]] [[$:/core/ui/Buttons/storyview]] [[$:/core/ui/Buttons/encryption]] [[$:/core/ui/Buttons/timestamp]] [[$:/core/ui/Buttons/full-screen]] [[$:/core/ui/Buttons/print]] [[$:/core/ui/Buttons/save-wiki]] [[$:/core/ui/Buttons/refresh]] [[$:/core/ui/Buttons/more-page-actions]]
diff --git a/editions/tw5.com/tiddlers/filters/is.tid b/editions/tw5.com/tiddlers/filters/is.tid
index c274e3a86..113af22c8 100644
--- a/editions/tw5.com/tiddlers/filters/is.tid
+++ b/editions/tw5.com/tiddlers/filters/is.tid
@@ -1,5 +1,5 @@
created: 20140410103123179
-modified: 20150220161001000
+modified: 20161127142329969
tags: [[Filter Operators]] [[Common Operators]] [[Negatable Operators]]
title: is Operator
type: text/vnd.tiddlywiki
@@ -23,7 +23,7 @@ The parameter <<.place C>> is one of the following fundamental categories:
|^`tag` |is in use as a tag |
|^`tiddler` |exists as a non-shadow tiddler |
-If <<.place C>> is anything else, the output is an error message.
+If <<.place C>> is anything else an error message is returned. <<.from-version "5.1.14"> if <<.place C>> is blank, the output is passed through unchanged (in earlier versions an error message was returned).
`!is[tiddler]` is a synonym for `is[missing]`, and vice versa.
diff --git a/editions/tw5.com/tiddlers/filters/tag.tid b/editions/tw5.com/tiddlers/filters/tag.tid
index 995cae7b1..929464b15 100644
--- a/editions/tw5.com/tiddlers/filters/tag.tid
+++ b/editions/tw5.com/tiddlers/filters/tag.tid
@@ -1,18 +1,23 @@
+caption: tag
created: 20140410103123179
-modified: 20150203191853000
+modified: 20161126122900712
+op-input: a [[selection of titles|Title Selection]]
+op-neg-output: those input tiddlers that do <<.em not>> have tag <<.place T>>
+op-output: those input tiddlers that have tag <<.place T>>
+op-parameter: the title of a [[tag|Tagging]]
+op-parameter-name: T
+op-purpose: filter the input by tag
+op-suffix: <<.from-version "5.1.14">> optional `strict` flag
+op-suffix-name: S
tags: [[Filter Operators]] [[Common Operators]] [[Tag Operators]] [[Negatable Operators]]
title: tag Operator
type: text/vnd.tiddlywiki
-caption: tag
-op-purpose: filter the input by tag
-op-input: a [[selection of titles|Title Selection]]
-op-parameter: the title of a [[tag|Tagging]]
-op-parameter-name: T
-op-output: those input tiddlers that have tag <<.place T>>
-op-neg-output: those input tiddlers that do <<.em not>> have tag <<.place T>>
The output is [[sorted|Order of Tagged Tiddlers]] using the tag's <<.field list>> field and the tiddlers' <<.field list-before>> and <<.field list-after>> fields.
-If <<.place T>> is empty, the output of `tag` is empty, and the output of `!tag` is a copy of the input.
+The behaviour when <<.place T>> is empty depends on the settings of the <<.place S>> optional suffix:
+
+* if <<.place T>> is missing and <<.place S>> is either missing or set to "loose", then the output of `tag` is empty, and the output of `!tag` is a copy of the input.
+* <<.from-version "5.1.14">> if <<.place T>> is missing and <<.place S>> is set to "strict", then the output of both `tag` and `!tag` is a copy of the input
<<.operator-examples "tag">>
diff --git a/themes/tiddlywiki/snowwhite/base.tid b/themes/tiddlywiki/snowwhite/base.tid
index 78aae3b1f..9452a2ebe 100644
--- a/themes/tiddlywiki/snowwhite/base.tid
+++ b/themes/tiddlywiki/snowwhite/base.tid
@@ -50,7 +50,7 @@ canvas.tc-edit-bitmapeditor {
<>
}
-.tc-drop-down {
+.tc-drop-down, .tc-drop-down-simple {
border-radius: 4px;
<>
}
diff --git a/themes/tiddlywiki/vanilla/base.tid b/themes/tiddlywiki/vanilla/base.tid
index 0cadceb1e..48f6153b3 100644
--- a/themes/tiddlywiki/vanilla/base.tid
+++ b/themes/tiddlywiki/vanilla/base.tid
@@ -1287,6 +1287,14 @@ html body.tc-body.tc-single-tiddler-window {
position: relative;
}
+.tc-drop-down-simple {
+ min-width: 380px;
+ border: 1px solid <>;
+ background-color: <>;
+ padding: 7px;
+ margin: 4px 0 0 0;
+}
+
.tc-drop-down {
min-width: 380px;
border: 1px solid <>;
@@ -1725,6 +1733,103 @@ html body.tc-body.tc-single-tiddler-window {
border: none;
}
+/*
+** Manager
+*/
+
+.tc-manager-wrapper {
+
+}
+
+.tc-manager-controls {
+
+}
+
+.tc-manager-control {
+ margin: 0.5em 0;
+}
+
+.tc-manager-list {
+ width: 100%;
+ border-top: 1px solid <>;
+ border-left: 1px solid <>;
+ border-right: 1px solid <>;
+}
+
+.tc-manager-list-item {
+
+}
+
+.tc-manager-list-item-heading {
+ display: block;
+ width: 100%;
+ text-align: left;
+ border-bottom: 1px solid <>;
+ padding: 3px;
+}
+
+.tc-manager-list-item-heading-selected {
+ font-weight: bold;
+ color: <>;
+ fill: <>;
+ background-color: <>;
+}
+
+.tc-manager-list-item-heading:hover {
+ background: <>;
+ color: <>;
+}
+
+.tc-manager-list-item-content {
+ display: flex;
+}
+
+.tc-manager-list-item-content-sidebar {
+ flex: 1 0;
+ background: <>;
+ border-right: 0.5em solid <>;
+ border-bottom: 0.5em solid <>;
+ white-space: nowrap;
+}
+
+.tc-manager-list-item-content-item-heading {
+ display: block;
+ width: 100%;
+ text-align: left;
+ background: <>;
+ text-transform: uppercase;
+ font-size: 0.6em;
+ font-weight: bold;
+ padding: 0.5em 0 0.5em 0;
+}
+
+.tc-manager-list-item-content-item-body {
+ padding: 0 0.5em 0 0.5em;
+}
+
+.tc-manager-list-item-content-item-body > pre {
+ margin: 0.5em 0 0.5em 0;
+ border: none;
+ background: inherit;
+}
+
+.tc-manager-list-item-content-tiddler {
+ flex: 3 1;
+ border-left: 0.5em solid <>;
+ border-right: 0.5em solid <>;
+ border-bottom: 0.5em solid <>;
+}
+
+.tc-manager-list-item-content-item-body > table {
+ border: none;
+ padding: 0;
+ margin: 0;
+}
+
+.tc-manager-list-item-content-item-body > table td {
+ border: none;
+}
+
/*
** Alerts
*/
|