mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2024-09-19 10:49:43 +00:00
04e91245cb
Now there is now longer a dummy DOM element corresponding to the macro itself. Instead, macros must create a single element child. This allows us to more easily fit Bootstrap's requirements for HTML layout (eg, that problem with links in navbars not being recognised). The refactoring isn't complete, there are still a few bugs to chase down
109 lines
3.0 KiB
JavaScript
109 lines
3.0 KiB
JavaScript
/*\
|
|
title: $:/core/modules/macros/edit/editors/texteditor.js
|
|
type: application/javascript
|
|
module-type: editor
|
|
|
|
An editor plugin for editting text
|
|
|
|
\*/
|
|
(function(){
|
|
|
|
/*jslint node: true, browser: true */
|
|
/*global $tw: false */
|
|
"use strict";
|
|
|
|
function TextEditor(macroNode) {
|
|
this.macroNode = macroNode;
|
|
}
|
|
|
|
TextEditor.prototype.getChild = function() {
|
|
var tiddler = this.macroNode.wiki.getTiddler(this.macroNode.tiddlerTitle),
|
|
field = this.macroNode.hasParameter("field") ? this.macroNode.params.field : "title",
|
|
value;
|
|
if(tiddler) {
|
|
value = tiddler.getFieldString(field);
|
|
} else {
|
|
switch(field) {
|
|
case "text":
|
|
value = "Type the text for the tiddler '" + this.macroNode.tiddlerTitle + "'";
|
|
break;
|
|
case "title":
|
|
value = this.macroNode.tiddlerTitle;
|
|
break;
|
|
default:
|
|
value = "";
|
|
break;
|
|
}
|
|
}
|
|
var attributes = {
|
|
"class": ["tw-edit-field"]
|
|
},
|
|
tagName,
|
|
content = [];
|
|
if(field === "text") {
|
|
tagName = "textarea";
|
|
content.push($tw.Tree.Text(value));
|
|
} else {
|
|
tagName = "input";
|
|
attributes.type = "text";
|
|
attributes.value = value;
|
|
}
|
|
return $tw.Tree.Element("div",{},[$tw.Tree.Element(tagName,attributes,content)]);
|
|
};
|
|
|
|
TextEditor.prototype.addEventHandlers = function() {
|
|
this.macroNode.child.domNode.addEventListener("focus",this,false);
|
|
this.macroNode.child.domNode.addEventListener("keyup",this,false);
|
|
};
|
|
|
|
TextEditor.prototype.handleEvent = function(event) {
|
|
// Get the value of the field if it might have changed
|
|
if("keyup".split(" ").indexOf(event.type) !== -1) {
|
|
this.saveChanges();
|
|
}
|
|
// Whatever the event, fix the height of the textarea if required
|
|
var self = this;
|
|
window.setTimeout(function() {
|
|
self.fixHeight();
|
|
},5);
|
|
return true;
|
|
};
|
|
|
|
TextEditor.prototype.saveChanges = function() {
|
|
var text = this.macroNode.child.children[0].domNode.value,
|
|
tiddler = this.macroNode.wiki.getTiddler(this.macroNode.tiddlerTitle);
|
|
if(tiddler && text !== tiddler.fields[this.macroNode.params.field]) {
|
|
var update = {};
|
|
update[this.macroNode.params.field] = text;
|
|
this.macroNode.wiki.addTiddler(new $tw.Tiddler(tiddler,update));
|
|
}
|
|
};
|
|
|
|
TextEditor.prototype.fixHeight = function() {
|
|
if(this.macroNode.child && this.macroNode.child.domNode) {
|
|
var wrapper = this.macroNode.child.domNode,
|
|
textarea = this.macroNode.child.children[0].domNode;
|
|
// Set the text area height to 1px temporarily, which allows us to read the true scrollHeight
|
|
var prevWrapperHeight = wrapper.style.height;
|
|
wrapper.style.height = textarea.style.height + "px";
|
|
textarea.style.overflow = "hidden";
|
|
textarea.style.height = "1px";
|
|
textarea.style.height = textarea.scrollHeight + "px";
|
|
wrapper.style.height = prevWrapperHeight;
|
|
}
|
|
};
|
|
|
|
TextEditor.prototype.postRenderInDom = function() {
|
|
this.fixHeight();
|
|
};
|
|
|
|
TextEditor.prototype.isRefreshable = function() {
|
|
// Don't refresh the editor if it contains the caret or selection
|
|
return document.activeElement !== this.macroNode.child.children[0].domNode;
|
|
};
|
|
|
|
exports["text/x-tiddlywiki"] = TextEditor;
|
|
exports["text/plain"] = TextEditor;
|
|
|
|
})();
|