diff --git a/src/core/js/edit_mode.js b/src/core/js/edit_mode.js index d1acf85f5f1a0241b8be0eb0b0941139d668b5a7..1e2557782274e888323384785144dbd7f1475f8f 100644 --- a/src/core/js/edit_mode.js +++ b/src/core/js/edit_mode.js @@ -585,6 +585,7 @@ var edit_mode = new function() { $(datatype).find("select").change(function () { const new_type = $(this).val(); + logger.debug(`datatype changed to ${new_type}.`); edit_mode.on_datatype_change(form, new_type); }); @@ -593,24 +594,19 @@ var edit_mode = new function() { } this.on_datatype_change = function (form, new_type) { - console.log(`datatype changed to ${new_type}.`); + logger.trace('enter on_datatype_change', form, new_type); if (new_type === "REFERENCE") { - console.log("datatype is REFERENCE"); form_elements.enable_name(form, "reference_target"); } else { - console.log("datatype is not REFERENCE"); form_elements.disable_name(form, "reference_target"); } if (new_type === "DOUBLE" || new_type === "INTEGER") { - console.log("show unit"); form_elements.enable_name(form, "unit"); } else { - console.log("hide unit"); form_elements.disable_name(form, "unit"); } - } @@ -638,27 +634,31 @@ var edit_mode = new function() { "REFERENCE":false, }; - + /** + * @param {string} [datatype] - defaults to TEXT if undefined. + * @param {string} [unit] optional. + */ this.make_datatype_input = function(datatype, unit) { - const is_list = edit_mode.isListDatatype(datatype); + var _datatype = datatype || "TEXT"; + const is_list = edit_mode.isListDatatype(_datatype); if (is_list) { - datatype = edit_mode.unListDatatype(datatype); + _datatype = edit_mode.unListDatatype(_datatype); } - const datatypes = edit_mode._known_atomic_datatypes; + const known_atomic_datatypes = edit_mode._known_atomic_datatypes; // is reference? var reference = undefined; - if (typeof datatype !== undefined && - typeof datatypes[datatype] === undefined) { - reference = datatype; - datatype = "REFERENCE"; + if (typeof known_atomic_datatypes[_datatype] === "undefined") { + reference = _datatype; + _datatype = "REFERENCE"; } var select = $('<select name="atomic_datatype" class="form-control"></select>'); - for (const dt of Object.keys(datatypes)) { - select.append('<option data-has-refid="' + (dt == "REFERENCE") + '" data-has-unit="' + datatypes[dt] + '" value="' + dt + '" ' + (dt == datatype ? 'selected="true"' : '') + '>' + dt + '</option>'); + for (const dt of Object.keys(known_atomic_datatypes)) { + select.append(`<option value="${dt}">${dt}</option>`); } + select.val(_datatype) const datatype_config = { name: "atomic_datatype", @@ -667,24 +667,26 @@ var edit_mode = new function() { const datatype_selector = $(form_elements ._make_field_wrapper(datatype_config.name)) .append(form_elements._make_input_label_str(datatype_config)) - .append($('<div class="col-sm-9"/>').append(select)); + .append($('<div class="col-sm-9"/>').append(select))[0]; const reference_config = { name: "reference_target", label: "reference to", + value: reference, query: "SELECT name FROM RECORDTYPE", make_desc: getEntityName, + make_value: getEntityName, }; - const refid_selector = $(form_elements - .make_reference_drop_down(reference_config)); + const refid_selector = form_elements + .make_reference_drop_down(reference_config); const list_checkbox_config = { name: "is_list", label: "list", checked: is_list, } - const list_checkbox = $(form_elements - .make_checkbox_input(list_checkbox_config)); + const list_checkbox = form_elements + .make_checkbox_input(list_checkbox_config); return [datatype_selector, refid_selector, list_checkbox, edit_mode.make_unit_input(unit)]; diff --git a/src/core/js/form_elements.js b/src/core/js/form_elements.js index 31c608912f023b85a069d6ac623b45aaa1591aac..cdc4b54176c2c635f7482f1812622cb0064ac6ba 100644 --- a/src/core/js/form_elements.js +++ b/src/core/js/form_elements.js @@ -23,7 +23,10 @@ 'use strict'; /** - * caosdb_map module for reusable form elemenst which already have a basic css styling. + * form_elements module for reusable form elemenst which already have a basic + * css styling. + * + * @version 0.2 * * IMPORTANCE CONCEPTS * @@ -205,12 +208,17 @@ var form_elements = new function () { * parameter. * @returns {HTMLElement} SELECT element with entity options. */ - this.make_reference_select = async function (entities, make_desc, multiple = false) { + this.make_reference_select = async function (entities, make_desc, + make_value, multiple) { caosdb_utils.assert_array(entities, "param `entities`", false); if (typeof make_desc !== "undefined") { caosdb_utils.assert_type(make_desc, "function", "param `make_desc`"); } + if (typeof make_value !== "undefined") { + caosdb_utils.assert_type(make_value, "function", + "param `make_value`"); + } const ret = $('<select class="selectpicker form-control" title="Nothing selected"/>'); if (multiple) { ret.attr("multiple", ""); @@ -222,7 +230,8 @@ var form_elements = new function () { let entity_id = getEntityID(entity); let desc = typeof make_desc == "function" ? await make_desc(entity) : entity_id; - let option = this.make_reference_option(entity_id, desc); + let value = typeof make_value == "function" ? await make_value(entity) : entity_id; + let option = this.make_reference_option(value, desc); ret.append(option); } return ret[0]; @@ -248,11 +257,12 @@ var form_elements = new function () { input_col.append(loading); this._query(config.query).then(async function (entities) { let select = $(await form_elements.make_reference_select( - entities, config.make_desc, config.multiple)); + entities, config.make_desc, config.make_value, config.multiple, + config.value)); select.attr("name", config.name); loading.remove(); input_col.append(select); - form_elements.init_select_picker(ret[0]); + form_elements.init_select_picker(ret[0], config.value); ret[0].dispatchEvent(form_elements.field_ready_event); select.change(function () { ret[0].dispatchEvent(form_elements.field_changed_event); @@ -268,7 +278,7 @@ var form_elements = new function () { } - this.init_select_picker = function (field) { + this.init_select_picker = function (field, value) { caosdb_utils.assert_html_element(field, "parameter `field`"); const select = $(field).find("select")[0]; const select_picker_options = {}; @@ -281,6 +291,7 @@ var form_elements = new function () { select_picker_options["liveSearchPlaceholder"] = "search..."; } $(select).selectpicker(select_picker_options); + $(select).selectpicker("val", value); this.init_actions_box(field); } diff --git a/test/core/js/modules/edit_mode.js.js b/test/core/js/modules/edit_mode.js.js index a39e1502681b7c6f3a34e7c3701ac9a50e6d2d61..0121ab55bf9b6ff377c3eaf6c85ccd5a692238a3 100644 --- a/test/core/js/modules/edit_mode.js.js +++ b/test/core/js/modules/edit_mode.js.js @@ -24,10 +24,11 @@ /* SETUP ext_references module */ QUnit.module("edit_mode.js", { - before: function(assert) { + before: function (assert) { + this.form_elements_query = form_elements._query; var done = assert.async(); // overwrite query - edit_mode.query = async function(str) { + edit_mode.query = async function (str) { return []; } retrieveTestEntities("edit_mode/getProperties_1.xml").then(entities => { @@ -39,9 +40,12 @@ QUnit.module("edit_mode.js", { done(); }); }, - after: function(assert) { + after: function (assert) { $('.modal.fade').has(".dropzone").remove(); - } + }, + afterEach: function (assert) { + form_elements._query = this.form_elements_query; + }, }); /** @@ -50,28 +54,28 @@ QUnit.module("edit_mode.js", { * * @return {HTMLElement[]} */ -async function retrieveTestEntities(testCase, transform=true) { - entities = await connection.get("xml/"+ testCase); +async function retrieveTestEntities(testCase, transform = true) { + entities = await connection.get("xml/" + testCase); return transformation.transformEntities(entities); } -QUnit.test("available", function(assert) { +QUnit.test("available", function (assert) { assert.ok(edit_mode); }); -QUnit.test("init", function(assert){ +QUnit.test("init", function (assert) { assert.ok(edit_mode.init); }); -QUnit.test("dragstart", function(assert){ +QUnit.test("dragstart", function (assert) { assert.ok(edit_mode.dragstart); }); -QUnit.test("dragleave", function(assert){ +QUnit.test("dragleave", function (assert) { assert.ok(edit_mode.dragleave); }); -QUnit.test("dragover", function(assert){ +QUnit.test("dragover", function (assert) { assert.ok(edit_mode.dragover); }); @@ -85,7 +89,7 @@ function assert_throws(assert, cb, message, name, info) { } } -QUnit.test("add_new_property", function(assert){ +QUnit.test("add_new_property", function (assert) { assert.ok(edit_mode.add_new_property); var done = assert.async(2); @@ -111,7 +115,11 @@ QUnit.test("add_new_property", function(assert){ // test good cases assert.equal($(entity).find("#test_new_prop").length, 0, "no property"); - entity.addEventListener("caosdb.edit_mode.property_added", function(e){assert.ok(e.target === new_prop, "event fired on newprop"); assert.ok(this === entity, "event detected on entity"); done();}, true); + entity.addEventListener("caosdb.edit_mode.property_added", function (e) { + assert.ok(e.target === new_prop, "event fired on newprop"); + assert.ok(this === entity, "event detected on entity"); + done(); + }, true); edit_mode.add_new_property(entity, new_prop, (x) => { assert.ok(x === new_prop, "make_property_editable_cb called"); @@ -124,56 +132,56 @@ QUnit.test("add_new_property", function(assert){ }); -QUnit.test("property_added", function(assert){ +QUnit.test("property_added", function (assert) { assert.ok(edit_mode.property_added, "available"); assert.ok(edit_mode.property_added instanceof Event, "is event"); }); -QUnit.test("add_dropped_property", function(assert){ +QUnit.test("add_dropped_property", function (assert) { assert.ok(edit_mode.add_dropped_property); }); -QUnit.test("add_dropped_parent", function(assert){ +QUnit.test("add_dropped_parent", function (assert) { assert.ok(edit_mode.add_dropped_parent); }); -QUnit.test("set_entity_dropable", function(assert){ +QUnit.test("set_entity_dropable", function (assert) { assert.ok(edit_mode.set_entity_dropable); }); -QUnit.test("unset_entity_dropable", function(assert){ +QUnit.test("unset_entity_dropable", function (assert) { assert.ok(edit_mode.unset_entity_dropable); }); -QUnit.test("remove_save_button", function(assert){ +QUnit.test("remove_save_button", function (assert) { assert.ok(edit_mode.remove_save_button); }); -QUnit.test("add_save_button", function(assert){ +QUnit.test("add_save_button", function (assert) { assert.ok(edit_mode.add_save_button); }); -QUnit.test("add_trash_button", function(assert){ +QUnit.test("add_trash_button", function (assert) { assert.ok(edit_mode.add_trash_button); }); -QUnit.test("add_parent_trash_button", function(assert){ +QUnit.test("add_parent_trash_button", function (assert) { assert.ok(edit_mode.add_parent_trash_button); }); -QUnit.test("add_parent_delete_buttons", function(assert){ +QUnit.test("add_parent_delete_buttons", function (assert) { assert.ok(edit_mode.add_parent_delete_buttons); }); -QUnit.test("add_property_trash_button", function(assert){ +QUnit.test("add_property_trash_button", function (assert) { assert.ok(edit_mode.add_property_trash_button); }); -QUnit.test("insert_entity", function(assert){ +QUnit.test("insert_entity", function (assert) { assert.ok(edit_mode.insert_entity); }); -QUnit.test("getProperties", function(assert){ +QUnit.test("getProperties", function (assert) { assert.ok(edit_mode.getProperties); assert.equal(edit_mode.getProperties(undefined).length, 0, "undefined returns empty list"); @@ -194,11 +202,11 @@ QUnit.test("getProperties", function(assert){ }); -QUnit.test("update_entity", function(assert){ +QUnit.test("update_entity", function (assert) { assert.ok(edit_mode.update_entity); }); -QUnit.test("add_edit_mode_button", function(assert){ +QUnit.test("add_edit_mode_button", function (assert) { assert.ok(edit_mode.add_edit_mode_button); var target = $(document.body)[0]; @@ -209,63 +217,169 @@ QUnit.test("add_edit_mode_button", function(assert){ $(button).remove(); }); -QUnit.test("toggle_edit_mode", function(assert){ +QUnit.test("toggle_edit_mode", function (assert) { assert.ok(edit_mode.toggle_edit_mode); }); -QUnit.test("leave_edit_mode", function(assert){ +QUnit.test("leave_edit_mode", function (assert) { assert.ok(edit_mode.leave_edit_mode); }); -QUnit.test("enter_edit_mode", function(assert){ +QUnit.test("enter_edit_mode", function (assert) { assert.ok(edit_mode.enter_edit_mode); }); -QUnit.test("make_header_editable", function(assert){ +QUnit.test("make_header_editable", function (assert) { assert.ok(edit_mode.make_header_editable); }); -QUnit.test("isListDatatype", function(assert){ +QUnit.test("isListDatatype", function (assert) { assert.ok(edit_mode.unListDatatype); }); -QUnit.test("make_dataype_input_logic", function(assert){ +QUnit.test("make_dataype_input_logic", function (assert) { assert.ok(edit_mode.make_dataype_input_logic); }); -QUnit.test("make_datatype_input", function(assert){ - assert.ok(edit_mode.make_datatype_input); +QUnit.test("make_datatype_input", function (assert) { + var done = assert.async(9); + + // mock query response of server + form_elements._query = async function (q) { + console.log(q); + const entities = str2xml(`<Response> + <RecordType name="Person"/></Response>`); + return transformation.transformEntities(entities); + }; const form_wrapper = "<form/>"; - // test cases + const no_dt_input = edit_mode.make_datatype_input(undefined, undefined); + no_dt_input[1].addEventListener("caosdb.field.ready", function (e) { + var obj = form_elements + .form_to_object($(form_wrapper).append(no_dt_input)[0]); + assert.propEqual(obj, { + "atomic_datatype": "TEXT", + "unit": "", + "reference_target": null, + }, "No datatype (defaults to TEXT)"); + done(); + }); + const text_dt_input = edit_mode.make_datatype_input("TEXT", undefined); - const ref_dt_input = $(edit_mode.make_datatype_input("REFERENCE", undefined)); - const file_dt_input = $(edit_mode.make_datatype_input("FILE", undefined)); - const person_dt_input = $(edit_mode.make_datatype_input("Person", undefined)); - const list_text_dt_input = $(edit_mode.make_datatype_input("LIST<TEXT>", undefined)); - const list_ref_dt_input = $(edit_mode.make_datatype_input("LIST<REFERENCE>", undefined)); - const list_file_dt_input = $(edit_mode.make_datatype_input("LIST<FILE>", undefined)); - const list_per_dt_input = $(edit_mode.make_datatype_input("LIST<Person>", undefined)); + text_dt_input[1].addEventListener("caosdb.field.ready", function (e) { + var obj = form_elements + .form_to_object($(form_wrapper).append(text_dt_input)[0]); + assert.propEqual(obj, { + "atomic_datatype": "TEXT", + "unit": "", + "reference_target": null, + }, "TEXT"); + done(); + }); - assert.equal(text_dt_input.length, 4); - var obj = form_elements - .form_to_object($(form_wrapper).append(text_dt_input)[0]); - assert.propEqual(obj, {"atomic_datatype": "TEXT"}); + const ref_dt_input = edit_mode.make_datatype_input("REFERENCE", undefined); + ref_dt_input[1].addEventListener("caosdb.field.ready", function (e) { + var obj = form_elements + .form_to_object($(form_wrapper).append(ref_dt_input)[0]); + assert.propEqual(obj, { + "atomic_datatype": "REFERENCE", + "unit": "", + "reference_target": null, + }, "REF"); + done(); + }); + + const file_dt_input = edit_mode.make_datatype_input("FILE", undefined); + file_dt_input[1].addEventListener("caosdb.field.ready", function (e) { + var obj = form_elements + .form_to_object($(form_wrapper).append(file_dt_input)[0]); + assert.propEqual(obj, { + "atomic_datatype": "FILE", + "unit": "", + "reference_target": null, + }, "FILE"); + done(); + }); + + const person_dt_input = edit_mode.make_datatype_input("Person", undefined); + person_dt_input[1].addEventListener("caosdb.field.ready", function (e) { + var obj = form_elements + .form_to_object($(form_wrapper).append(person_dt_input)[0]); + assert.propEqual(obj, { + "atomic_datatype": "REFERENCE", + "unit": "", + "reference_target": "Person", + }, "Person"); + done(); + }); + + const list_text_dt_input = edit_mode.make_datatype_input("LIST<TEXT>", + undefined); + list_text_dt_input[1].addEventListener("caosdb.field.ready", function (e) { + var obj = form_elements + .form_to_object($(form_wrapper).append(list_text_dt_input)[0]); + assert.propEqual(obj, { + "atomic_datatype": "TEXT", + "unit": "", + "reference_target": null, + "is_list": "on", + }, "LIST<TEXT>"); + done(); + }); + + const list_ref_dt_input = edit_mode.make_datatype_input("LIST<REFERENCE>", + undefined); + list_ref_dt_input[1].addEventListener("caosdb.field.ready", function (e) { + var obj = form_elements + .form_to_object($(form_wrapper).append(list_ref_dt_input)[0]); + assert.propEqual(obj, { + "atomic_datatype": "REFERENCE", + "unit": "", + "reference_target": null, + "is_list": "on", + }, "LIST<REFERENCE>"); + done(); + }); + + const list_file_dt_input = edit_mode.make_datatype_input("LIST<FILE>", + undefined); + list_file_dt_input[1].addEventListener("caosdb.field.ready", function (e) { + var obj = form_elements + .form_to_object($(form_wrapper).append(list_file_dt_input)[0]); + assert.propEqual(obj, { + "atomic_datatype": "FILE", + "unit": "", + "reference_target": null, + "is_list": "on", + }, "LIST<FILE>"); + done(); + }); + + const list_per_dt_input = edit_mode.make_datatype_input("LIST<Person>", + undefined); + list_per_dt_input[1].addEventListener("caosdb.field.ready", function (e) { + var obj = form_elements + .form_to_object($(form_wrapper).append(list_per_dt_input)[0]); + assert.propEqual(obj, { + "atomic_datatype": "REFERENCE", + "unit": "", + "reference_target": "Person", + "is_list": "on", + }, "LIST<Person>"); + done(); + }); - obj = form_elements - .form_to_object($(form_wrapper).append(text_dt_input)); - assert.propEqual(obj, {"atomic_datatype": "REFERENCE"}); }); -QUnit.test("make_input", function(assert){ +QUnit.test("make_input", function (assert) { assert.ok(edit_mode.make_input); }); -QUnit.test("smooth_replace", function(assert){ +QUnit.test("smooth_replace", function (assert) { assert.ok(edit_mode.smooth_replace); }); -QUnit.test("make_property_editable", function(assert) { +QUnit.test("make_property_editable", function (assert) { assert.ok(edit_mode.make_property_editable); assert.throws(() => edit_mode.make_property_editable(undefined), /param 'element' is expected to be an HTMLElement, was undefined/, "undefined"); @@ -280,212 +394,212 @@ QUnit.test("make_property_editable", function(assert) { }); -QUnit.test("create_new_record", function(assert){ +QUnit.test("create_new_record", function (assert) { assert.ok(edit_mode.create_new_record); }); -QUnit.test("init_edit_app", function(assert){ +QUnit.test("init_edit_app", function (assert) { assert.ok(edit_mode.init_edit_app); }); -QUnit.test("has_errors", function(assert){ +QUnit.test("has_errors", function (assert) { assert.ok(edit_mode.has_errors); }); -QUnit.test("freeze_but", function(assert){ +QUnit.test("freeze_but", function (assert) { assert.ok(edit_mode.freeze_but); }); -QUnit.test("unfreeze", function(assert){ +QUnit.test("unfreeze", function (assert) { assert.ok(edit_mode.unfreeze); }); -QUnit.test("retrieve_datatype_list", function(assert){ +QUnit.test("retrieve_datatype_list", function (assert) { assert.ok(edit_mode.retrieve_datatype_list); }); -QUnit.test("highlight", function(assert){ +QUnit.test("highlight", function (assert) { assert.ok(edit_mode.highlight); }); -QUnit.test("unhighlight", function(assert){ +QUnit.test("unhighlight", function (assert) { assert.ok(edit_mode.unhighlight); }); -QUnit.test("handle_error", function(assert){ +QUnit.test("handle_error", function (assert) { assert.ok(edit_mode.handle_error); }); -QUnit.test("get_edit_panel", function(assert){ +QUnit.test("get_edit_panel", function (assert) { assert.ok(edit_mode.get_edit_panel); }); -QUnit.test("add_wait_datamodel_info", function(assert){ +QUnit.test("add_wait_datamodel_info", function (assert) { assert.ok(edit_mode.add_wait_datamodel_info); }); -QUnit.test("toggle_edit_panel", function(assert){ +QUnit.test("toggle_edit_panel", function (assert) { assert.ok(edit_mode.toggle_edit_panel); }); -QUnit.test("leave_edit_mode_template", function(assert){ +QUnit.test("leave_edit_mode_template", function (assert) { assert.ok(edit_mode.leave_edit_mode_template); }); -QUnit.test("is_edit_mode", function(assert){ +QUnit.test("is_edit_mode", function (assert) { assert.ok(edit_mode.is_edit_mode); }); -QUnit.test("add_cancel_button", function(assert){ +QUnit.test("add_cancel_button", function (assert) { assert.ok(edit_mode.add_cancel_button); }); -QUnit.test("create_new_entity", function(assert){ +QUnit.test("create_new_entity", function (assert) { assert.ok(edit_mode.create_new_entity); }); -QUnit.test("remove_cancel_button", function(assert){ +QUnit.test("remove_cancel_button", function (assert) { assert.ok(edit_mode.remove_cancel_button); }); -QUnit.test("freeze_entity", function(assert){ +QUnit.test("freeze_entity", function (assert) { assert.ok(edit_mode.freeze_entity); }); -QUnit.test("unfreeze_entity", function(assert){ +QUnit.test("unfreeze_entity", function (assert) { assert.ok(edit_mode.unfreeze_entity); }); -QUnit.test("filter", function(assert){ +QUnit.test("filter", function (assert) { assert.ok(edit_mode.filter); }); -QUnit.test("add_start_edit_button", function(assert){ +QUnit.test("add_start_edit_button", function (assert) { assert.ok(edit_mode.add_start_edit_button); }); -QUnit.test("remove_start_edit_button", function(assert){ +QUnit.test("remove_start_edit_button", function (assert) { assert.ok(edit_mode.remove_start_edit_button); }); -QUnit.test("add_new_record_button", function(assert){ +QUnit.test("add_new_record_button", function (assert) { assert.ok(edit_mode.add_new_record_button); }); -QUnit.test("remove_new_record_button", function(assert){ +QUnit.test("remove_new_record_button", function (assert) { assert.ok(edit_mode.remove_new_record_button); }); -QUnit.test("add_delete_button", function(assert){ +QUnit.test("add_delete_button", function (assert) { assert.ok(edit_mode.add_delete_button); }); -QUnit.test("remove_delete_button", function(assert){ +QUnit.test("remove_delete_button", function (assert) { assert.ok(edit_mode.remove_delete_button); }); { - const sleep = function sleep(ms) { - return new Promise(resolve => setTimeout(resolve, ms)); - } + const sleep = function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); + } - const datamodel = ` + const datamodel = ` <div><div class=\"btn-group-vertical\"><button type=\"button\" class=\"btn btn-default caosdb-f-edit-panel-new-button new-property\">Create new Property</button><button type=\"button\" class=\"btn btn-default caosdb-f-edit-panel-new-button new-recordtype\">Create new RecordType</button></div><div title=\"Drag and drop Properties from this panel to the Entities on the left.\" class=\"panel panel-default\"><div class=\"panel-heading\"><h5>Existing Properties</h5></div><div class=\"panel-body\"><div class=\"input-group\" style=\"width: 100%;\"><input class=\"form-control\" placeholder=\"filter...\" title=\"Type a name (full or partial).\" oninput=\"edit_mode.filter('properties');\" id=\"caosdb-f-filter-properties\" type=\"text\" /><span class=\"input-group-btn\"><button class=\"btn btn-default caosdb-f-edit-panel-new-button new-property caosdb-f-hide-on-empty-input\" title=\"Create this Property.\"><span class=\"glyphicon glyphicon-plus\"></span></button></span></div><ul class=\"caosdb-v-edit-list\"><li class=\"caosdb-f-edit-drag list-group-item caosdb-v-edit-drag\" id=\"caosdb-f-edit-p-20\">name</li><li class=\"caosdb-f-edit-drag list-group-item caosdb-v-edit-drag\" id=\"caosdb-f-edit-p-21\">unit</li><li class=\"caosdb-f-edit-drag list-group-item caosdb-v-edit-drag\" id=\"caosdb-f-edit-p-24\">description</li></ul></div></div><div title=\"Drag and drop RecordTypes from this panel to the Entities on the left.\" class=\"panel panel-default\"><div class=\"panel-heading\"><h5>Existing RecordTypes</h5></div><div class=\"panel-body\"><div class=\"input-group\" style=\"width: 100%;\"><input class=\"form-control\" placeholder=\"filter...\" title=\"Type a name (full or partial).\" oninput=\"edit_mode.filter('recordtypes');\" id=\"caosdb-f-filter-recordtypes\" type=\"text\" /><span class=\"input-group-btn\"><button class=\"btn btn-default caosdb-f-edit-panel-new-button new-recordtype caosdb-f-hide-on-empty-input\" title=\"Create this RecordType\"><span class=\"glyphicon glyphicon-plus\"></span></button></span></div><ul class=\"caosdb-v-edit-list\"><li class=\"caosdb-f-edit-drag list-group-item caosdb-v-edit-drag\" id=\"caosdb-f-edit-rt-30992\">Test</li><li class=\"caosdb-f-edit-drag list-group-item caosdb-v-edit-drag\" id=\"caosdb-f-edit-rt-31015\">Test2</li></ul></div></div></div>`; - QUnit.test("test case 1 - insert property", async function(assert) { + QUnit.test("test case 1 - insert property", async function (assert) { - // here lives the test tool box - const test_tool_box = $('<div class="caosdb-f-edit-panel-body" />'); + // here lives the test tool box + const test_tool_box = $('<div class="caosdb-f-edit-panel-body" />'); - // here live the entities - const main_panel = $('<div class="caosdb-f-main-entities"/>'); - assert.equal($(".caosdb-f-main-entities").length,0); + // here live the entities + const main_panel = $('<div class="caosdb-f-main-entities"/>'); + assert.equal($(".caosdb-f-main-entities").length, 0); - $(document.body).append(test_tool_box).append(main_panel); + $(document.body).append(test_tool_box).append(main_panel); - // ENTER EDIT MODE - assert.equal(edit_mode.is_edit_mode(), false, "edit_mode should not be active"); - // fake server response - edit_mode.retrieve_data_model = async function() { - return str2xml(datamodel); - } - var app = await edit_mode.enter_edit_mode(); - assert.equal(edit_mode.is_edit_mode(), true, "now, edit_mode should be active"); + // ENTER EDIT MODE + assert.equal(edit_mode.is_edit_mode(), false, "edit_mode should not be active"); + // fake server response + edit_mode.retrieve_data_model = async function () { + return str2xml(datamodel); + } + var app = await edit_mode.enter_edit_mode(); + assert.equal(edit_mode.is_edit_mode(), true, "now, edit_mode should be active"); - // NEW PROPERTY - assert.equal($(".caosdb-f-edit-panel-new-button.new-property").length, 2, "two new-property buttons should be present"); - assert.equal($(".caosdb-entity-panel").length, 0, "no entities"); - assert.equal(app.state, "initial", "initial state"); - // click on "new property" - $(".caosdb-f-edit-panel-new-button.new-property").first().click(); + // NEW PROPERTY + assert.equal($(".caosdb-f-edit-panel-new-button.new-property").length, 2, "two new-property buttons should be present"); + assert.equal($(".caosdb-entity-panel").length, 0, "no entities"); + assert.equal(app.state, "initial", "initial state"); + // click on "new property" + $(".caosdb-f-edit-panel-new-button.new-property").first().click(); - while(app.state === "initial") { - await sleep(500); - } + while (app.state === "initial") { + await sleep(500); + } - // EDIT PROPERTY - assert.equal(app.state, "changed", "changed state"); - var entity = $(".caosdb-entity-panel"); - assert.equal(entity.length, 1, "entity added"); - // set name - $(".caosdb-entity-panel .caosdb-f-entity-name").val("TestProperty"); - - // SAVE - var save_button = $(".caosdb-f-entity-save-button"); - assert.equal(save_button.length, 1, "save button available"); - // fake server response - connection.post = async function(uri, data) { - await sleep(500); - assert.equal(xml2str(data), "<Request><Property name=\"TestProperty\" datatype=\"TEXT\"/></Request>"); - assert.equal(app.state, "wait", "in wait state"); - return str2xml("<Response><Property id=\"newId\" name=\"TestProperty\" datatype=\"TEXT\"/></Response>"); - } - // click save button - var updated_entity = main_panel.find(".caosdb-entity-panel .caosdb-id:contains('newId')"); - assert.equal(updated_entity.length, 0, "entity with id not yet in main panel"); - save_button.click(); + // EDIT PROPERTY + assert.equal(app.state, "changed", "changed state"); + var entity = $(".caosdb-entity-panel"); + assert.equal(entity.length, 1, "entity added"); + // set name + $(".caosdb-entity-panel .caosdb-f-entity-name").val("TestProperty"); + + // SAVE + var save_button = $(".caosdb-f-entity-save-button"); + assert.equal(save_button.length, 1, "save button available"); + // fake server response + connection.post = async function (uri, data) { + await sleep(500); + assert.equal(xml2str(data), "<Request><Property name=\"TestProperty\" datatype=\"TEXT\"/></Request>"); + assert.equal(app.state, "wait", "in wait state"); + return str2xml("<Response><Property id=\"newId\" name=\"TestProperty\" datatype=\"TEXT\"/></Response>"); + } + // click save button + var updated_entity = main_panel.find(".caosdb-entity-panel .caosdb-id:contains('newId')"); + assert.equal(updated_entity.length, 0, "entity with id not yet in main panel"); + save_button.click(); - while(app.state === "changed" || app.state === "wait" ) { - await sleep(500); - } + while (app.state === "changed" || app.state === "wait") { + await sleep(500); + } - // SEE RESPONSE - assert.equal(app.state, "initial", "initial state"); + // SEE RESPONSE + assert.equal(app.state, "initial", "initial state"); - var response = $("#newId"); - assert.equal(response.length, 1, "entity added"); + var response = $("#newId"); + assert.equal(response.length, 1, "entity added"); - // entity has been added to main panel - updated_entity = main_panel.find(".caosdb-entity-panel .caosdb-id:contains('newId')"); - assert.equal(updated_entity.length, 1, "entity with new id now in main panel"); + // entity has been added to main panel + updated_entity = main_panel.find(".caosdb-entity-panel .caosdb-id:contains('newId')"); + assert.equal(updated_entity.length, 1, "entity with new id now in main panel"); - // tests for closed issue https://gitlab.com/caosdb/caosdb-webui/issues/47 - assert.equal(main_panel.find(".caosdb-entity-panel .caosdb-entity-actions-panel").length, 1, "general actions panel there"); - assert.equal(main_panel.find(".caosdb-entity-panel .caosdb-f-edit-mode-entity-actions-panel").length, 1, "edit_mode actions panel there (BUG caosdb-webui#47)"); + // tests for closed issue https://gitlab.com/caosdb/caosdb-webui/issues/47 + assert.equal(main_panel.find(".caosdb-entity-panel .caosdb-entity-actions-panel").length, 1, "general actions panel there"); + assert.equal(main_panel.find(".caosdb-entity-panel .caosdb-f-edit-mode-entity-actions-panel").length, 1, "edit_mode actions panel there (BUG caosdb-webui#47)"); - main_panel.remove(); - test_tool_box.remove(); + main_panel.remove(); + test_tool_box.remove(); - edit_mode.leave_edit_mode(); - assert.equal(edit_mode.is_edit_mode(), false, "edit_mode should not be active"); + edit_mode.leave_edit_mode(); + assert.equal(edit_mode.is_edit_mode(), false, "edit_mode should not be active"); - }); + }); } -var transformProperty = async function(xml_str) { +var transformProperty = async function (xml_str) { var xml = str2xml(`<Response>${xml_str}</Response>`); return (await transformation.transformProperty(xml)).firstElementChild; } -QUnit.test("createElementForProperty", async function(assert) { +QUnit.test("createElementForProperty", async function (assert) { assert.timeout(100000); // unique dummy values for each data type var data = { @@ -513,7 +627,7 @@ QUnit.test("createElementForProperty", async function(assert) { } }); -QUnit.test("getPropertyFromElement", async function(assert) { +QUnit.test("getPropertyFromElement", async function (assert) { assert.timeout(100000); // unique dummy values for each data type var data = { @@ -580,7 +694,7 @@ QUnit.test("getPropertyFromElement", async function(assert) { * * This test case performs a large set of different data types. */ -QUnit.test("_toggle_list_property_object", async function(assert) { +QUnit.test("_toggle_list_property_object", async function (assert) { // unique dummy values for each data type var data = { @@ -636,7 +750,9 @@ QUnit.test("_toggle_list_property_object", async function(assert) { assert.equal(list_inputs_property.listDatatype, dt, `single->list has correct listDatatype (${dt}).`); - assert.throws(() => {edit_mode._toggle_list_property_object(long_list_prop_html, false)}, /Could not toggle to list=false with value=/, "long list throws on list->single"); + assert.throws(() => { + edit_mode._toggle_list_property_object(long_list_prop_html, false) + }, /Could not toggle to list=false with value=/, "long list throws on list->single"); } }); @@ -648,7 +764,7 @@ QUnit.test("_toggle_list_property_object", async function(assert) { * _toggle_list_property_object: HTML -> JS Object -> Converted JS Object -> * Converted HTML. */ -QUnit.test("_toggle_list_property", async function(assert) { +QUnit.test("_toggle_list_property", async function (assert) { // unique dummy values for each data type var data = { @@ -690,13 +806,15 @@ QUnit.test("_toggle_list_property", async function(assert) { var list_inputs = edit_mode._toggle_list_property(non_list_prop_html, true); var single_input = edit_mode._toggle_list_property(list_prop_html, false); - assert.throws(() => {edit_mode._toggle_list_property(long_list_prop_html, false)}, /Could not toggle to list=false with value=/, "long list throws on list->single"); + assert.throws(() => { + edit_mode._toggle_list_property(long_list_prop_html, false) + }, /Could not toggle to list=false with value=/, "long list throws on list->single"); assert.equal($(list_inputs[0].parentElement).find("ol li :input:not(button)").is.length, 1, "one list input"); assert.equal($(list_inputs[0].parentElement).find("ol li :input").val(), data[dt], `list ${dt} input has correct value`); assert.equal($(single_input.parentElement).find("ol :input").length, 0, "no list input"); var val = $(single_input).val(); - if(dt=="DATETIME") { + if (dt == "DATETIME") { val = $(single_input).find("[type='date']").val() + "T" + $(single_input).find("[type='time']").val(); } assert.equal(val, data[`LIST<${dt}>`], `single ${dt} input has correct value`); @@ -719,7 +837,7 @@ QUnit.test("_toggle_list_property", async function(assert) { * (from which the user would normally choose a reference and the old reference * was pre-selected), effectively deleting the old value of the reference. */ -QUnit.test("Bug #95", async function(assert) { +QUnit.test("Bug #95", async function (assert) { var query_done; edit_mode.query = function (query) { var re = /^FIND (Record|File)\s*$/g; @@ -736,7 +854,7 @@ QUnit.test("Bug #95", async function(assert) { // old option not deleted when options are empty var resolve_function; - var empty_options = new Promise(function(res, err) { + var empty_options = new Promise(function (res, err) { resolve_function = res; }); var property = $("<div/>") @@ -745,7 +863,7 @@ QUnit.test("Bug #95", async function(assert) { datatype: "REFERENCE", list: false, value: "1234" - }, empty_options)); + }, empty_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"); @@ -771,7 +889,7 @@ QUnit.test("Bug #95", async function(assert) { 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) { + edit_mode.fill_reference_drop_down = async function (arg1, arg2) { await proxied(arg1, arg2); assert.equal($(property).find("select").val(), "1234", "still old value after"); @@ -786,7 +904,7 @@ QUnit.test("Bug #95", async function(assert) { datatype: "REFERENCE", list: false, value: "1234" - }, options)); + }, options)); edit_mode.fill_reference_drop_down = proxied; @@ -794,7 +912,7 @@ QUnit.test("Bug #95", async function(assert) { }); -QUnit.test("fill_reference_drop_down", async function(assert) { +QUnit.test("fill_reference_drop_down", async function (assert) { var options = edit_mode._create_reference_options(await transformation .transformEntities(str2xml(` <Response> @@ -823,9 +941,9 @@ QUnit.test("fill_reference_drop_down", async function(assert) { /** * Test the inner logic of retrieve_datatype_list. */ -QUnit.test("_create_reference_options", async function(assert) { - var entities = await transformation - .transformEntities(str2xml(` +QUnit.test("_create_reference_options", async function (assert) { + var entities = await transformation + .transformEntities(str2xml(` <Response> <Record name="RName" id="RID"/> </Response>