Attempt to improve prefix handling in hint
diff --git a/dev/js/spec/hintSpec.js b/dev/js/spec/hintSpec.js
index 225ac37..940ba8f 100644
--- a/dev/js/spec/hintSpec.js
+++ b/dev/js/spec/hintSpec.js
@@ -145,6 +145,10 @@
describe('KorAP.Hint', function () {
KorAP.hintArray = {
+ "-" : [
+ ["Base Annotation", "base/s=", "Structure"],
+ ["CoreNLP", "corenlp/", "Constituency, Named Entities, Part-of-Speech"]
+ ],
"corenlp/" : [
["Named Entity", "ne=" , "Combined"],
["Named Entity", "ne_dewac_175m_600=" , "ne_dewac_175m_600"],
@@ -212,18 +216,30 @@
// show with context
hint.unshow();
- hint.show(true);
+ hint.show(false);
+
+ console.log('1: >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>');
+ console.log(hint.inputField().container().innerHTML);
expect(hint.inputField().container().getElementsByTagName('div').length).toEqual(4);
expect(hint.inputField().container().getElementsByTagName('ul').length).toEqual(1);
+ expect(hint.inputField().container().getElementsByTagName('li').length).toEqual(3);
+ hint.unshow();
hint.inputField().insert(' hhhh');
// show with context
- hint.unshow();
- hint.show(true);
+ hint.show(false);
+
+ console.log('2: >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>');
+ console.log(hint.inputField().container().innerHTML);
expect(hint.inputField().container().getElementsByTagName('div').length).toEqual(4);
expect(hint.inputField().container().getElementsByTagName('ul').length).toEqual(1);
+ expect(hint.inputField().container().getElementsByTagName('li').length).toEqual(2);
+
+/*
+
+
hint.unshow();
hint.inputField().insert(' aaaa/');
@@ -235,7 +251,10 @@
expect(hint.inputField().container().getElementsByTagName('div').length).toEqual(4);
expect(hint.inputField().container().getElementsByTagName('ul').length).toEqual(1);
+*/
});
+
+ xit('should remove all menus on escape');
});
describe('KorAP.HintMenuItem', function () {
diff --git a/dev/js/src/hint.js b/dev/js/src/hint.js
index 89003ee..16b3f8b 100644
--- a/dev/js/src/hint.js
+++ b/dev/js/src/hint.js
@@ -9,6 +9,11 @@
* TODO: Sometimes the drop-down box down vanish when list is shown
* TODO: Create should expect an input text field
* TODO: Embed only one single menu (not multiple)
+ * By holding the current menu in _active
+ * TODO: show() should accept a context field (especially for no-context fields,
+ * like fragments)
+ * TODO: Improve context analyzer from hint!
+ * TODO: Marked annotations should be addable to "fragments"
*/
define([
'hint/input',
@@ -70,7 +75,7 @@
// Holds all menus per prefix context
this._menu = {};
this._alert = alertClass.create();
- this._active = false;
+ this._active = null;
// Get input field
var qfield = param["inputField"] || document.getElementById("q-field");
@@ -146,19 +151,19 @@
// Set container to active (aka hide the hint helper button)
this._alert.show(msg);
- this.active(true);
+ this.active(this._alert);
return true;
},
_unshowAlert : function () {
- this._alert.unshow();
- this.active(false);
+ this._alert.hide();
+ this.active(null);
},
update : function () {
this._inputField.update();
- if (this._alert.unshow())
- this.active(false);
+ if (this._alert.hide())
+ this.active(null);
},
@@ -186,29 +191,32 @@
* Get the correct menu based on the context
*/
contextMenu : function (ifContext) {
+
+ // Get context (aka left text)
var context = this._inputField.context();
- if (context === undefined || context.length == 0)
+ if (context === undefined || context.length === 0)
return ifContext ? undefined : this.menu("-");
+ // Get context (aka left text matching regex)
context = this._analyzer.test(context);
if (context === undefined || context.length == 0)
return ifContext ? undefined : this.menu("-");
- return this.menu(context);
+ return this.menu(context) || this.menu('-');
},
- active : function (bool) {
+ active : function (obj) {
if (arguments.length === 1) {
var c = this._inputField.container();
- if (bool && !this._active) {
+ if (obj !== null) {
c.classList.add('active');
- this._active = true;
+ this._active = obj;
}
else {
c.classList.remove('active');
- this._active = false;
+ this._active = null;
}
};
return this._active;
@@ -219,23 +227,43 @@
* Show the menu.
* Currently this means that multiple menus may be loaded
* but not shown.
+ *
+ * @param {boolean} Boolean value to indicate if context
+ * is necessary (true) or if the main context should
+ * be shown if context fails.
+ *
*/
show : function (ifContext) {
+ var c = this._inputField.container();
+
// Menu is already active
- if (this.active()) {
+ if (this.active() !== null) {
+
+ // This does not work for alert currently!
+ if (this._active._type !== 'alert') {
+ c.removeChild(this._active.element());
+ };
+
+ // This may already be hidden!
+ this._active.hide();
+ this.active(null);
// Alert is not active
- if (!this._alert.unshow())
+ /*
+ if (!this._alert.unshow())
return;
+ */
};
// Get the menu
var menu;
if (menu = this.contextMenu(ifContext)) {
- var c = this._inputField.container();
- this.active(true);
- // c.classList.add('active');
+
+// TODO: Remove old element!
+
+ this.active(menu);
+
c.appendChild(menu.element());
menu.show();
menu.focus();
@@ -244,8 +272,16 @@
};
},
+ // Show an object in the containerField
+ // This will hide all other objects
+ // Accepts menus as well as alerts
+ show2 : function (obj) {},
+
+ // This will get the context of the field
+ getContext : function () {},
+
unshow : function () {
- this.active(false);
+ this.active(null);
this.inputField().element().focus();
}
};
diff --git a/dev/js/src/hint/alert.js b/dev/js/src/hint/alert.js
index a5b43de..f34fde8 100644
--- a/dev/js/src/hint/alert.js
+++ b/dev/js/src/hint/alert.js
@@ -8,6 +8,7 @@
return Object.create(this)._init(msg);
},
_init : function (msg) {
+ this._type = 'alert';
this.active = false;
this._element = document.createElement('div');
this._element.style.opacity = 0;
@@ -20,7 +21,7 @@
this._element.style.opacity = 1;
},
- unshow : function () {
+ hide : function () {
if (!this.active)
return false;
this._element.style.opacity = 0;
diff --git a/dev/js/src/hint/item.js b/dev/js/src/hint/item.js
index 3747a72..cfea816 100644
--- a/dev/js/src/hint/item.js
+++ b/dev/js/src/hint/item.js
@@ -22,8 +22,6 @@
this._name = params[0];
this._action = params[1];
this._lcField = ' ' + this._name.toLowerCase();
-
- console.log('!!!!');
if (params.length > 2) {
this._desc = params[2];
@@ -50,7 +48,7 @@
onclick : function (e) {
var m = this.menu();
var h = m.hint();
- m.hide();
+ // m.hide();
// Update input field
var input = h.inputField();
@@ -58,6 +56,7 @@
e.halt();
+ // show alt
h.show(true);
},
diff --git a/dev/js/src/match.js b/dev/js/src/match.js
index 07a46ec..28d2154 100644
--- a/dev/js/src/match.js
+++ b/dev/js/src/match.js
@@ -7,6 +7,7 @@
/*
* - Highlight (at least mark as bold) the match
* - Scroll to match vertically per default
+ * - A click on a table field and a tree node should at the field description to the fragments list.
*/
define([
'match/info',
diff --git a/dev/js/src/menu.js b/dev/js/src/menu.js
index 9f91e96..8619d89 100644
--- a/dev/js/src/menu.js
+++ b/dev/js/src/menu.js
@@ -11,6 +11,8 @@
* TODO: Add a "title" to a menu that is not scrollable.
* TODO: Make the menu responsive by showing less items on smaller screens
* or anytime items would be outside the screen.
+ * TODO: Add a .match() method to items for scrolling and probably for prefixing.
+ * TODO: Add static header (for title, sortation fields, but also for menu points like "fragments" and "history".
*/
define([
'menu/item',