diff --git a/src/core/js/edit_mode.js b/src/core/js/edit_mode.js index 78e6c66b6b0548f12e0db2ffc8bd6aa2ff2885fd..0de4266e10db1e0ddec970578b152c0ed454d080 100644 --- a/src/core/js/edit_mode.js +++ b/src/core/js/edit_mode.js @@ -726,6 +726,10 @@ var edit_mode = new function () { $(entities).find(".caosdb-entity-actions-panel").show(); } + this._init_select = function (select) { + $(select).selectpicker(); + } + this.make_header_editable = function (entity) { var header = $(entity).find('.caosdb-entity-panel-heading'); var roleElem = $(header).find('.caosdb-f-entity-role'); @@ -774,7 +778,7 @@ var edit_mode = new function () { header.append(form); // selectpicker is based on bootstrap-select and must be initializes // AFTER it had been added to the dom tree. - form.find(".selectpicker").selectpicker(); + edit_mode._init_select(form.find(".selectpicker")); edit_mode.add_parent_dropzone(entity); edit_mode.make_datatype_input_logic(form[0]); @@ -983,7 +987,7 @@ var edit_mode = new function () { } else if (property.datatype == "INTEGER") { result = "<input type='number' value='" + property.value + "'></input>"; } else if (property.datatype == "BOOLEAN") { - result = `<select class="selectpicker form-control caosdb-list-${property.datatype}"><option value=""></option><option ${property.value=="FALSE" ? "selected" : ""}>FALSE</option><option ${property.value=="TRUE" ? selected : ""}>TRUE</option></select>`; + result = `<select class="selectpicker form-control caosdb-list-${property.datatype}"><option value=""></option><option ${property.value=="FALSE" ? "selected" : ""}>FALSE</option><option ${property.value=="TRUE" ? "selected" : ""}>TRUE</option></select>`; } else if (property.reference || property.datatype == "FILE") { result = $('<div/>'); var css = { @@ -992,6 +996,7 @@ var edit_mode = new function () { "display": "inline-block", }; result.css(css); + result.append(`<select style="display: none"><option selected>${property.value}</option></select>`); result.append(createWaitingNotification(property.value)); const select = $('<select data-container="body" data-virtual-scroll="100" data-window-padding="15" data-live-search="true" class="selectpicker form-control caosdb-list-' + property.datatype + '" data-resolved="false"><option value=""></option></select>'); @@ -999,7 +1004,7 @@ var edit_mode = new function () { edit_mode.fill_reference_drop_down(select[0], _options, property.value); result.empty(); result.append(select); - select.selectpicker(); + edit_mode._init_select(select); }); } else { @@ -1214,7 +1219,9 @@ var edit_mode = new function () { var editfield = $(element).find(".caosdb-f-property-value"); editfield.children().remove(); editfield.append(inputs); - editfield.find(".selectpicker").selectpicker(); + // selectpicker is based on bootstrap-select and must be initializes + // AFTER it had been added to the dom tree. + edit_mode._init_select(editfield.find(".selectpicker")); edit_mode.change_property_data_type(element, property.datatype); @@ -1319,7 +1326,7 @@ var edit_mode = new function () { editfield.append(inputs); // selectpicker is based on bootstrap-select and must be initializes // AFTER it had been added to the dom tree. - editfield.find(".selectpicker").selectpicker(); + edit_mode._init_select(editfield.find(".selectpicker")); // CHECKBOX `List [ ]` edit_mode.add_toggle_list_checkbox(element, property.list, property.datatype); @@ -1794,10 +1801,9 @@ var edit_mode = new function () { * @param {String} [current_value] - The value which is to be selected. */ this.fill_reference_drop_down = function (drop_down, options, current_value) { - var resolved_options = options; drop_down = $(drop_down); - drop_down.append($(resolved_options).clone()); + drop_down.append($(options).clone()); if (current_value) { drop_down.val(current_value); } diff --git a/test/core/js/modules/edit_mode.js.js b/test/core/js/modules/edit_mode.js.js index ae1a51d837348ba0ba9c31f48a28a69ef2c9ad7b..17b32023627cc557e204e4cab3300f7092d78fad 100644 --- a/test/core/js/modules/edit_mode.js.js +++ b/test/core/js/modules/edit_mode.js.js @@ -614,9 +614,20 @@ QUnit.test("createElementForProperty", async function (assert) { value: data[dt], } - var html = $(edit_mode.createElementForProperty(prop)); + var options = async () => { + return [$(`<option>${data[dt]}</option>`)[0]]; + } + var html = $(edit_mode.createElementForProperty(prop, options())); + + await sleep(100); + + if($(html).find("select").val()) { + assert.equal($(html).find("select").val(), data[dt], `${dt} input has correct value`); + + } else { + assert.equal($(html).val(), data[dt], `${dt} input has correct value`); + } - assert.equal($(html).val(), data[dt], `${dt} input has correct value`); } }); @@ -810,6 +821,8 @@ QUnit.test("_toggle_list_property", async function (assert) { var val = $(single_input).val(); if (dt == "DATETIME") { val = $(single_input).find("[type='date']").val() + "T" + $(single_input).find("[type='time']").val(); + } else if (["Person", "FILE", "REFERENCE"].indexOf(dt) > -1) { + val = $(single_input).find("select").val(); } assert.equal(val, data[`LIST<${dt}>`], `single ${dt} input has correct value`); } @@ -846,49 +859,49 @@ QUnit.test("Bug #95", async function (assert) { query_done = assert.async(1); // only called with file await edit_mode.retrieve_datatype_list("FILE"); - // old option not deleted when options are empty - var resolve_function; - var empty_options = new Promise(function (res, err) { - resolve_function = res; - }); + var options = async () => { await sleep(100); return [$("<option>1234</option>")[0]]; }; var property = $("<div/>") .append(edit_mode.createElementForProperty({ reference: true, datatype: "REFERENCE", list: false, value: "1234" - }, empty_options)); + }, options())); + assert.equal($(property).find("select").val(), "1234", "old value before"); assert.equal($(property).find("option").length, 1, "one option before"); assert.equal($(property).find(":selected").text(), "1234", "old text before"); - // mimic retrieve_datatype_list with empty result - resolve_function([]); + await sleep(200); assert.equal($(property).find("select").val(), "1234", "old value after"); - assert.equal($(property).find("option").length, 1, "one option after"); + assert.equal($(property).find("option").length, 2, "two options after (one empty)"); assert.equal($(property).find(":selected").text(), "1234", "old text after"); // now an integration test. A list of options is passed to - var options = edit_mode._create_reference_options(await transformation - .transformEntities(str2xml(` - <Response> - <Record name="RName1" id="RID1"/> - <Record name="RName2" id="RID2"/> - <Record name="RName1234" id="1234"/> - </Response> - `))); + options = async () => { + return edit_mode._create_reference_options(await transformation + .transformEntities(str2xml(` + <Response> + <Record name="RName1" id="RID1"/> + <Record name="RName2" id="RID2"/> + <Record name="RName1234" id="1234"/> + </Response> + `)) + ); + } - assert.equal(options.length, 3, "3 entities returned"); var fill_method_done = assert.async(); var proxied = edit_mode.fill_reference_drop_down; - edit_mode.fill_reference_drop_down = async function (arg1, arg2) { - await proxied(arg1, arg2); + edit_mode.fill_reference_drop_down = function (arg1, arg2, arg3) { + proxied(arg1, arg2, arg3); + + assert.equal($(arg1).val(), "1234", "still old value after"); + assert.equal($(arg1).find("option").length, 4, "4 options after"); + assert.equal($(arg1).find(":selected").text(), "Name: RName1234, CaosDB ID: 1234", "new text after"); - assert.equal($(property).find("select").val(), "1234", "still old value after"); - assert.equal($(property).find("option").length, 3, "3 options after"); - assert.equal($(property).find(":selected").text(), "Name: RName1234, CaosDB ID: 1234", "new text after"); + edit_mode.fill_reference_drop_down = proxied; fill_method_done(); } @@ -898,10 +911,7 @@ QUnit.test("Bug #95", async function (assert) { datatype: "REFERENCE", list: false, value: "1234" - }, options)); - - - edit_mode.fill_reference_drop_down = proxied; + }, options())); }); @@ -918,12 +928,9 @@ QUnit.test("fill_reference_drop_down", async function (assert) { assert.equal(options.length, 3, "3 entities returned"); assert.ok($(options).is("option"), "options contains options"); - var select = $('<select><option class="caosdb-f-option-default" selected value="1234">1234</option></select>'); - assert.equal(select.find("option").length, 1, "one option before"); - assert.equal(select.val(), "1234", "old value before"); - assert.equal(select.find(":selected").text(), "1234", "oldtext before"); - await edit_mode.fill_reference_drop_down(select[0], options); + var select = $('<select></select>'); + edit_mode.fill_reference_drop_down(select[0], options, "1234"); assert.equal(select.find("option").length, 3, "3 options after"); assert.equal(select.val(), "1234", "old value after"); diff --git a/test/core/js/modules/ext_xls_download.js.js b/test/core/js/modules/ext_xls_download.js.js index 74cdb244dcf0f5c2238c8d2503a3194580c35d90..c0343828b3e4df976b006d8375936c8a339ea496 100644 --- a/test/core/js/modules/ext_xls_download.js.js +++ b/test/core/js/modules/ext_xls_download.js.js @@ -153,7 +153,6 @@ QUnit.test("_get_property_value", function (assert) { var summary = resolve_references.add_summary_field(property); - $(summary).find(".coasdb-property-value").append("summary bla"); ret = f(property); assert.equal(ret.pretty, "bla, bla, bla, bla, bla, bla, bla, bla, bla", "pretty shows list of reference info text");