diff --git a/src/core/js/edit_mode.js b/src/core/js/edit_mode.js index fda1547727395b79083c41c3126ab7f6cf03c836..7e74c4248661768602d7055f765b5e3f1cb3bc5e 100644 --- a/src/core/js/edit_mode.js +++ b/src/core/js/edit_mode.js @@ -313,6 +313,18 @@ var edit_mode = new function() { } + this.get_datatype_str = function (atomic, refid, list) { + var result = atomic; + if (typeof refid !== "undefined") { + result = refid; + } + if (list === "on" || list === true) { + result = `LIST<${result}>`; + } + return result; + } + + /** * Insert entities. * @@ -324,21 +336,28 @@ var edit_mode = new function() { ent_elements = caosdb_utils.assert_array(ent_elements, "param `ent_elements`", true); var xmls = []; for ( const ent_element of ent_elements ) { - xmls.push(createEntityXML( - getEntityRole(ent_element), - getEntityName(ent_element), - undefined, - edit_mode.getProperties(ent_element), - getParents(ent_element), - true, - getEntityDatatype(ent_element), - getEntityDescription(ent_element), - getEntityUnit(ent_element), - )); + xmls.push(edit_mode.form_to_xml(ent_element)); } return await insert(xmls); } + this.form_to_xml = function(ent_element) { + const obj = form_elements.form_to_object($(ent_element).find("form")[0]); + return createEntityXML( + getEntityRole(ent_element), + getEntityName(ent_element), + getEntityID(ent_element), + edit_mode.getProperties(ent_element), + getParents(ent_element), + true, + edit_mode.get_datatype_str( + obj.atomic_datatype, + obj.reference_target, + obj.is_list), + getEntityDescription(ent_element), + obj.unit, + ); + } /** * TODO merge with getPropertyFromElement in caosdb.js @@ -415,17 +434,7 @@ var edit_mode = new function() { } this.update_entity = async function(ent_element) { - var xml = createEntityXML( - getEntityRole(ent_element), - getEntityName(ent_element), - getEntityID(ent_element), - edit_mode.getProperties(ent_element), - getParents(ent_element), - true, - getEntityDatatype(ent_element), - getEntityDescription(ent_element), - getEntityUnit(ent_element), - ); + var xml = edit_mode.form_to_xml(ent_element); return await edit_mode.update(xml); } @@ -556,9 +565,10 @@ var edit_mode = new function() { } // remove other stuff header.children().remove(); - header.append($('<form class="form-horizontal"></form>').append(inputs)); - edit_mode.make_dataype_input_logic(header); + const form = $('<form class="form-horizontal"></form>').append(inputs); + header.append(form); + edit_mode.make_dataype_input_logic(form[0]); edit_mode.add_parent_delete_buttons(header[0]); } @@ -570,30 +580,55 @@ var edit_mode = new function() { return datatype.substring(5, datatype.length - 1); } - this.make_dataype_input_logic = function(header) { - var unitLabel = $(header).find(".caosdb-f-entity-unit-label"); - var unitInput = $(header).find(".caosdb-f-entity-unit"); - var isListLabel = $(header).find(".caosdb-f-entity-is-list-label"); - var isListInput = $(header).find(".caosdb-f-entity-is-list"); - var referenceLabel = $(header).find(".caosdb-f-entity-reference-label"); - var referenceInput = $(header).find(".caosdb-f-entity-reference"); + this.make_dataype_input_logic = function(form) { + const datatype = form_elements.get_fields(form, "atomic_datatype"); - // TODO show on reference - referenceInput.hide(); - referenceLabel.hide(); + $(datatype).find("select").change(function () { + const new_type = $(this).val(); + edit_mode.on_datatype_change(form, new_type); + }); - // TODO show unit for double and integer + // trigger for the first time + edit_mode.on_datatype_change(form, $(datatype).find("select").val()); } + this.on_datatype_change = function (form, new_type) { + console.log(`datatype changed to ${new_type}.`); - this.make_datatype_input = function(datatype, unit) { - var is_list = edit_mode.isListDatatype(datatype); - if (is_list) { - datatype = edit_mode.unListDatatype(datatype); + 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"); } - // datatypes {name: has_unit?} - var datatypes = { + 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"); + } + + } + + + this.make_unit_input = function(unit) { + const unit_input = $('<div class="form-group"/>') + .append(form_elements + .make_text_input({ + name: "unit", + label: "unit", + value: unit, + })); + return unit_input; + } + + /** + * { name: has_unit? } + */ + this._known_atomic_datatypes = { "TEXT": false, "DOUBLE": true, "INTEGER": true, @@ -601,30 +636,66 @@ var edit_mode = new function() { "BOOLEAN": false, "FILE": false, "REFERENCE":false, + }; + + + this.make_datatype_input = function(datatype, unit) { + const is_list = edit_mode.isListDatatype(datatype); + if (is_list) { + datatype = edit_mode.unListDatatype(datatype); } - var select = $('<select></select>'); + + const datatypes = edit_mode._known_atomic_datatypes; + + // is reference? + var reference = undefined; + if (typeof datatype !== undefined && + typeof datatypes[datatype] === undefined) { + reference = datatype; + datatype = "REFERENCE"; + } + + var select = $('<select 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>'); } - const datatype_input = $(` -<div class="form-group"> - <label class="col-sm-2 control-label caosdb-f-entity-datatype-label">datatype</label> - <div class="col-sm-3"> - <select class="form-control caosdb-f-entity-datatype">${select.html()}</select> - </div> - <label class="col-sm-2 control-label caosdb-f-entity-reference-label">reference</label> - <div class="col-sm-3"> - <input readonly="true" class="form-control caosdb-f-entity-reference" value="" placeholder="Drop a RT"></input> - </div> - <label class="col-sm-1 control-label caosdb-f-entity-is-list-label">list</label> - <div class="col-sm-1"> - <input class="caosdb-f-entity-is-list" type="checkbox" ${(is_list ? 'checked="true" ' : "")}/> - </div> -</div>`)[0]; - - const unit_input = $('<div class="form-group"><label class="col-sm-2 control-label caosdb-f-entity-unit-label">unit</label><div class="col-sm-2"><input type="text" class="form-control caosdb-f-entity-unit" value="' + (typeof unit == 'undefined' ? "" : unit) + '"></input></div></div>')[0], - return [ datatype_input, unit_input ]; + const datatype_config = { + name: "atomic_datatype", + label: "datatype", + }; + 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)); + + const reference_config = { + name: "reference_target", + label: "reference to", + query: "SELECT name FROM RECORDTYPE", + make_desc: getEntityName, + required: true, + }; + 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 datatype_input = $(`<div class="form-group"></div>`) + //.append(datatype_selector) + //.append(refid_selector) + //.append(list_checkbox); + + return [datatype_selector, refid_selector, list_checkbox, + edit_mode.make_unit_input(unit)]; + + //return [datatype_input, edit_mode.make_unit_input(unit)]; } this.make_input = function(label, value) { diff --git a/src/core/js/form_elements.js b/src/core/js/form_elements.js index 5c29058f532dc30daa98b6354b60e3caab88a7a6..31c608912f023b85a069d6ac623b45aaa1591aac 100644 --- a/src/core/js/form_elements.js +++ b/src/core/js/form_elements.js @@ -238,10 +238,8 @@ var form_elements = new function () { * * @param {object} config * @returns {HTMLElement} SELECT element. - * - * TODO make syncronous */ - this.make_reference_drop_down = async function (config) { + this.make_reference_drop_down = function (config) { let ret = $(this._make_field_wrapper(config.name)); let label = this._make_input_label_str(config); let loading = $('<div class="caosdb-f-field-not-ready">loading...</div>'); @@ -486,7 +484,7 @@ var form_elements = new function () { } else if (type === "range") { field = await this.make_range_input(config); } else if (type === "reference_drop_down") { - field = await this.make_reference_drop_down(config); + field = this.make_reference_drop_down(config); } else if (type === "subform") { // TODO handle cache and required for subforms return await this.make_subform(config); @@ -664,11 +662,11 @@ var form_elements = new function () { } this.enable_name = function (form, name) { - this.enable_fields(form.find(".caosdb-f-field[data-field-name='" + name + "']").toArray()); + this.enable_fields($(form).find(".caosdb-f-field[data-field-name='" + name + "']").toArray()); } this.disable_name = function (form, name) { - this.disable_fields(form.find(".caosdb-f-field[data-field-name='" + name + "']").toArray()); + this.disable_fields($(form).find(".caosdb-f-field[data-field-name='" + name + "']").toArray()); } this.make_script_form = async function (config, script) { @@ -963,7 +961,8 @@ var form_elements = new function () { */ this._make_field_wrapper = function (name) { caosdb_utils.assert_string(name, "param `name`"); - return $('<div class="form-group caosdb-f-field caosdb-f-entity-property" data-field-name="' + name + '" />') + // TODO check where caosdb-f-entity-property class was used + return $('<div class="form-group caosdb-f-field" data-field-name="' + name + '" />') .css({"padding": "0"})[0]; }