mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2025-01-31 11:19:10 +00:00
Introduce a simple listview that scrolls to newly inserted entries
This commit is contained in:
parent
94744843b6
commit
71f6194f01
@ -15,6 +15,11 @@ The list widget
|
|||||||
var ListWidget = function(renderer) {
|
var ListWidget = function(renderer) {
|
||||||
// Save state
|
// Save state
|
||||||
this.renderer = renderer;
|
this.renderer = renderer;
|
||||||
|
// Initialise the listviews if they've not been done already
|
||||||
|
if(!this.listViews) {
|
||||||
|
ListWidget.prototype.listViews = {};
|
||||||
|
$tw.modules.applyMethods("listview",this.listViews);
|
||||||
|
}
|
||||||
// Generate widget elements
|
// Generate widget elements
|
||||||
this.generate();
|
this.generate();
|
||||||
};
|
};
|
||||||
@ -182,9 +187,24 @@ ListWidget.prototype.findListElementByTitle = function(startIndex,title) {
|
|||||||
return undefined;
|
return undefined;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
ListWidget.prototype.postRenderInDom = function() {
|
||||||
|
this.listview = this.chooseListView();
|
||||||
|
this.history = [];
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Select the appropriate list viewer
|
||||||
|
*/
|
||||||
|
ListWidget.prototype.chooseListView = function() {
|
||||||
|
// Instantiate the list view
|
||||||
|
var listviewName = this.renderer.getAttribute("listview");
|
||||||
|
var ListView = this.listViews[listviewName];
|
||||||
|
return ListView ? new ListView(this) : null;
|
||||||
|
};
|
||||||
|
|
||||||
ListWidget.prototype.refreshInDom = function(changedAttributes,changedTiddlers) {
|
ListWidget.prototype.refreshInDom = function(changedAttributes,changedTiddlers) {
|
||||||
// Reexecute the widget if any of our attributes have changed
|
// Reexecute the widget if any of our attributes have changed
|
||||||
if(changedAttributes.itemClass || changedAttributes.template || changedAttributes.editTemplate || changedAttributes.emptyMessage || changedAttributes.type || changedAttributes.filter || changedAttributes.template) {
|
if(changedAttributes.itemClass || changedAttributes.template || changedAttributes.editTemplate || changedAttributes.emptyMessage || changedAttributes.type || changedAttributes.filter || changedAttributes.template || changedAttributes.history || changedAttributes.listview) {
|
||||||
// Regenerate and rerender the widget and replace the existing DOM node
|
// Regenerate and rerender the widget and replace the existing DOM node
|
||||||
this.generate();
|
this.generate();
|
||||||
var oldDomNode = this.renderer.domNode,
|
var oldDomNode = this.renderer.domNode,
|
||||||
@ -193,6 +213,11 @@ ListWidget.prototype.refreshInDom = function(changedAttributes,changedTiddlers)
|
|||||||
} else {
|
} else {
|
||||||
// Handle any changes to the list, and refresh any nodes we're reusing
|
// Handle any changes to the list, and refresh any nodes we're reusing
|
||||||
this.handleListChanges(changedTiddlers);
|
this.handleListChanges(changedTiddlers);
|
||||||
|
// Update the history list
|
||||||
|
var history = this.renderer.getAttribute("history");
|
||||||
|
if(history && changedTiddlers[history]) {
|
||||||
|
this.handleHistoryChanges();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -255,6 +280,29 @@ ListWidget.prototype.handleListChanges = function(changedTiddlers) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Handle any changes to the history list
|
||||||
|
*/
|
||||||
|
ListWidget.prototype.handleHistoryChanges = function() {
|
||||||
|
// Get the history data
|
||||||
|
var historyAtt = this.renderer.getAttribute("history"),
|
||||||
|
newHistory = this.renderer.renderTree.wiki.getTiddlerData(historyAtt,[]);
|
||||||
|
// Ignore any entries of the history that match the previous history
|
||||||
|
var entry = 0;
|
||||||
|
while(entry < newHistory.length && entry < this.history.length && newHistory[entry].title === this.history[entry].title) {
|
||||||
|
entry++;
|
||||||
|
}
|
||||||
|
// Navigate forwards to each of the new tiddlers
|
||||||
|
while(entry < newHistory.length) {
|
||||||
|
if(this.listview && this.listview.navigateTo) {
|
||||||
|
this.listview.navigateTo(newHistory[entry]);
|
||||||
|
}
|
||||||
|
entry++;
|
||||||
|
}
|
||||||
|
// Update the history
|
||||||
|
this.history = newHistory;
|
||||||
|
};
|
||||||
|
|
||||||
exports.list = ListWidget;
|
exports.list = ListWidget;
|
||||||
|
|
||||||
})();
|
})();
|
||||||
|
31
core/modules/widgets/list/listviews/scroller.js
Normal file
31
core/modules/widgets/list/listviews/scroller.js
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/*\
|
||||||
|
title: $:/core/modules/widgets/list/listviews/scroller.js
|
||||||
|
type: application/javascript
|
||||||
|
module-type: listview
|
||||||
|
|
||||||
|
A list view that scrolls to newly inserted elements
|
||||||
|
|
||||||
|
\*/
|
||||||
|
(function(){
|
||||||
|
|
||||||
|
/*jslint node: true, browser: true */
|
||||||
|
/*global $tw: false */
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var ScrollerListView = function(listWidget) {
|
||||||
|
this.listWidget = listWidget;
|
||||||
|
}
|
||||||
|
|
||||||
|
ScrollerListView.prototype.navigateTo = function(historyInfo) {
|
||||||
|
var listElementIndex = this.listWidget.findListElementByTitle(0,historyInfo.title),
|
||||||
|
listElementNode = this.listWidget.children[listElementIndex],
|
||||||
|
targetElement = listElementNode.domNode;
|
||||||
|
// Scroll the node into view
|
||||||
|
var scrollEvent = document.createEvent("Event");
|
||||||
|
scrollEvent.initEvent("tw-scroll",true,true);
|
||||||
|
targetElement.dispatchEvent(scrollEvent);
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.scroller = ScrollerListView;
|
||||||
|
|
||||||
|
})();
|
@ -24,7 +24,7 @@ title: $:/templates/PageTemplate
|
|||||||
</div>
|
</div>
|
||||||
<div class="span10">
|
<div class="span10">
|
||||||
<!-- The main display -->
|
<!-- The main display -->
|
||||||
<$list filter="[list[$:/StoryList]]" history="$:/HistoryList" template="$:/templates/ViewTemplate" editTemplate="$:/templates/EditTemplate" listview=classic itemClass="tw-tiddler-frame"/>
|
<$list filter="[list[$:/StoryList]]" history="$:/HistoryList" template="$:/templates/ViewTemplate" editTemplate="$:/templates/EditTemplate" listview="scroller" itemClass="tw-tiddler-frame"/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
Loading…
Reference in New Issue
Block a user