diff --git a/CHANGELOG.md b/CHANGELOG.md index 38b2c98f98af4499fe39d58a7ca353107f676e32..92a4141b1107624395a972f5063e01eae52ddb4b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -63,6 +63,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed (for any bug fixes) +* Auto-completion and edit_mode can handle entity names with empty spaces better now * [#251](https://gitlab.indiscale.com/caosdb/src/caosdb-webui/-/issues/251) - Data loss when editing Entities with URL-like properties ### Security (in case of vulnerabilities) diff --git a/src/core/js/edit_mode.js b/src/core/js/edit_mode.js index d1b922c413e13072a3d2a9cb5079aa1dda27a110..87e588aab11a681e49ff4e6596a81f4037628316 100644 --- a/src/core/js/edit_mode.js +++ b/src/core/js/edit_mode.js @@ -1804,7 +1804,7 @@ var edit_mode = new function () { * which can be referenced by the property. */ this.retrieve_datatype_list = async function (datatype) { - var find_entity = ["FILE", "REFERENCE"].includes(datatype) ? "" : datatype; + var find_entity = ["FILE", "REFERENCE"].includes(datatype) ? "" : `"${datatype}"`; var entities = datatype !== "FILE" ? await edit_mode.query(`FIND Record ${find_entity}`) : []; var files = await edit_mode.query(`FIND File ${find_entity}`); diff --git a/src/core/js/ext_autocomplete.js b/src/core/js/ext_autocomplete.js index 9a639fb4387a32bad128406bb7bd1f036bed5fda..2f6fa0dde729907f7248bd05367f26633872f39e 100644 --- a/src/core/js/ext_autocomplete.js +++ b/src/core/js/ext_autocomplete.js @@ -158,8 +158,16 @@ var ext_autocomplete = new function () { var start = newValue.slice(0, beginning_of_word + 1); var end = origJQElement[0].value.slice(cursorpos); var result = resultsFromServer.map(x => { + var x_quoted = x; + if (x.indexOf(" ") > -1) { + if(x.indexOf("\"") > -1) { + x_quoted = `'${x}'`; + } else { + x_quoted = `"${x}"`; + } + } return { - text: start + x + end, + text: start + x_quoted + end, html: x } }); @@ -196,4 +204,4 @@ $(document).ready(function () { if ("${BUILD_MODULE_EXT_AUTOCOMPLETE}" == "ENABLED") { caosdb_modules.register(ext_autocomplete); } -}); \ No newline at end of file +}); diff --git a/test/core/js/modules/edit_mode.js.js b/test/core/js/modules/edit_mode.js.js index 3a87ee73d167d114d0b7db2b0abe50e4a643f8fa..ae1a51d837348ba0ba9c31f48a28a69ef2c9ad7b 100644 --- a/test/core/js/modules/edit_mode.js.js +++ b/test/core/js/modules/edit_mode.js.js @@ -400,8 +400,28 @@ QUnit.test("unfreeze", function (assert) { assert.ok(edit_mode.unfreeze); }); -QUnit.test("retrieve_datatype_list", function (assert) { +QUnit.test("retrieve_datatype_list", async function (assert) { assert.ok(edit_mode.retrieve_datatype_list); + var query_done; + + edit_mode.query = function (query) { + var re = /^FIND (Record|File) "IceCore"$/g; + assert.ok(query.match(re), `${query} should match ${re}`); + query_done(); + return []; + } + query_done = assert.async(2); + await edit_mode.retrieve_datatype_list("IceCore"); + + + edit_mode.query = function (query) { + var re = /^FIND (Record|File) "Ice Core"$/g; + assert.ok(query.match(re), `${query} should match ${re}`); + query_done(); + return []; + } + query_done = assert.async(2); + await edit_mode.retrieve_datatype_list("Ice Core"); }); QUnit.test("highlight", function (assert) { diff --git a/test/core/js/modules/ext_autocomplete.js.js b/test/core/js/modules/ext_autocomplete.js.js index e8776f945b7bb46a0d431eb2d0ac0f7fe21419fc..96cab766fb848b74b04677f9b3312b574b9a3844 100644 --- a/test/core/js/modules/ext_autocomplete.js.js +++ b/test/core/js/modules/ext_autocomplete.js.js @@ -25,7 +25,7 @@ QUnit.module("ext_autocomplete.js", { before: function (assert){ ext_autocomplete.retrieve_names = async function () { - return ['IceCore', 'Bag', 'IceSample', 'IceCream', 'Palette']; + return ['IceCore', 'Bag', 'IceSample', 'IceCream', 'Palette', 'Ice Core']; } ext_autocomplete.init(); @@ -60,12 +60,34 @@ QUnit.test("search", async function(assert) { }; }; await ext_autocomplete.search("Ice", - gcallback( ['IceCore', 'IceSample', 'IceCream']) + gcallback( ['IceCore', 'IceSample', 'IceCream', 'Ice Core']) ); await ext_autocomplete.search("Core", gcallback([])); }); +QUnit.test("searchPost", async function(assert) { + const resultsFromServer = ["Ice Core", "IceCore"]; + const origJQElement = [{ + selectionEnd: 8, + value: "FIND Ice WHERE", + }]; + + const expected = [ + { + "html": "Ice Core", + "text": "FIND \"Ice Core\" WHERE" + }, + { + "html": "IceCore", + "text": "FIND IceCore WHERE" + } + ]; + + const result = ext_autocomplete.searchPost(resultsFromServer, origJQElement); + assert.propEqual(result, expected); +}); + QUnit.test("class", function(assert) { assert.ok(ext_autocomplete.switch_on_completion , "toggle available"); assert.ok(ext_autocomplete.switch_on_completion() , "toggle runs");