diff --git a/docs/api.md b/docs/api.md
index 6266d17..e0db3fe 100644
--- a/docs/api.md
+++ b/docs/api.md
@@ -162,15 +162,15 @@ Constructs a new JSONEditor.
Indicate the KeyCodes for trigger confirm completion, by default those keys are: [39, 35, 9] which are the code for [right, end, tab]
- - `{Function} getOptions (text: string, path: string[], input: string)`
+ - `{Function} getOptions (editor: object, text: string, path: string, input: string)`
This function will return your possible options for create the autocomplete selection, you can control dynamically which options you want to display according to the current active editing node.
*Parameters:*
-
- - `text` : The text in the current node part. (basically the text that the user is editing)
- - `path` : The document json object that is being edited.
- - `input` : Can be "field" or "value" depending if the user is editing a field name or a value of a node.
+ - `editor` : The editor instance object that the node belongs to.
+ - `text` : The text in the current node part. (basically the text that the user is editing)
+ - `path` : The json path of the node that is being edited.
+ - `input` : Can be "field" or "value" depending if the user is editing a field name or a value of a node.
*Returns:*
diff --git a/examples/12_autocomplete_dynamic.html b/examples/12_autocomplete_dynamic.html
index c3cd8ae..8dbd2ed 100644
--- a/examples/12_autocomplete_dynamic.html
+++ b/examples/12_autocomplete_dynamic.html
@@ -35,9 +35,9 @@
modes: ['text', 'tree'],
autocomplete: {
applyTo:['value'],
- getOptions: function (text, path) {
+ getOptions: function (editor, text) {
return new Promise(function (resolve, reject) {
- var options = extractUniqueWords(path);
+ var options = extractUniqueWords(editor.get());
if (options.length > 0) resolve(options); else reject();
});
}
diff --git a/examples/13_autocomplete_advanced.html b/examples/13_autocomplete_advanced.html
index fcf4292..28793d2 100644
--- a/examples/13_autocomplete_advanced.html
+++ b/examples/13_autocomplete_advanced.html
@@ -1,4 +1,4 @@
-
+
JSONEditor | Advanced Auto Complete
@@ -38,19 +38,20 @@
autocomplete: {
confirmKeys: [39, 35, 9, 190], // Confirm Autocomplete Keys: [right, end, tab, '.'] // By default are only [right, end, tab]
- getOptions: function (text, path, input) {
+ getOptions: function (editor, text, path, input) {
if (!text.startsWith(activationChar) || input !== 'value') return [];
var data = {};
var startFrom = 0;
var lastPoint = text.lastIndexOf('.');
+ var jsonObj = editor.get();
if ((lastPoint > 0) && (text.length > 1)) {
- data = jsonpath.query(path, '$.' + text.substring(activationChar.length, lastPoint));
- if (data.length > 0) data = data[0]; else data = {};
- // Indicate that autocompletion should start after the . (ignoring the first part)
- startFrom = text.lastIndexOf('.') + 1;
+ data = jsonpath.query(jsonObj, '$.' + text.substring(activationChar.length, lastPoint));
+ if (data.length > 0) data = data[0]; else data = {};
+ // Indicate that autocompletion should start after the . (ignoring the first part)
+ startFrom = text.lastIndexOf('.') + 1;
}
else
- data = path;
+ data = jsonObj;
var optionsStr = YaskON.stringify(data, null, activationChar);
var options = optionsStr.split('\n');
diff --git a/src/js/Node.js b/src/js/Node.js
index 6566300..66cb4a2 100644
--- a/src/js/Node.js
+++ b/src/js/Node.js
@@ -374,12 +374,30 @@ Node.prototype.getLevel = function() {
/**
* Get path of the root node till the current node
+ * @return {String} Returns a jsonpath of the current node in the form: node1.child1.child2, node1.array1[0].child, etc.
+ */
+Node.prototype.getNodeJsonPath = function () {
+ var path = this.parent ? this.parent.getNodePath() : [];
+ path.push(this);
+ var strPath = '';
+ path.forEach(function (node) {
+ strPath += !node.parent
+ ? '$' // do not add an (optional) field name of the root node
+ : (node.parent.type != 'array')
+ ? '.' + node.field
+ : '[' + node.index + ']';
+ });
+ return strPath;
+};
+
+/**
+ * Get jsonpath of the current node
* @return {Node[]} Returns an array with nodes
*/
-Node.prototype.getNodePath = function() {
- var path = this.parent ? this.parent.getNodePath() : [];
- path.push(this);
- return path;
+Node.prototype.getNodePath = function () {
+ var path = this.parent ? this.parent.getNodePath() : [];
+ path.push(this);
+ return path;
};
/**
diff --git a/src/js/treemode.js b/src/js/treemode.js
index c3b900f..8e1d3cd 100644
--- a/src/js/treemode.js
+++ b/src/js/treemode.js
@@ -1116,7 +1116,7 @@ treemode._onKeyDown = function (event) {
// Activate autocomplete
setTimeout(function (hnode, element) {
if (element.innerText.length > 0) {
- var result = this.options.autocomplete.getOptions(element.innerText, editor.get(), jsonElementType);
+ var result = this.options.autocomplete.getOptions(hnode.editor, element.innerText, hnode.getNodeJsonPath(), jsonElementType);
if (typeof result.then === 'function') {
// probably a promise
if (result.then(function (obj) {