From a30b65686571c29e768e7ab109a7ab3c89848bff Mon Sep 17 00:00:00 2001 From: Nathan Gray Date: Fri, 11 Oct 2013 08:41:24 +0000 Subject: [PATCH] Fully support linking before entry is saved --- etemplate/js/et2_widget_link.js | 44 +++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 7 deletions(-) diff --git a/etemplate/js/et2_widget_link.js b/etemplate/js/et2_widget_link.js index 5c31dbb66b..9c3b7a22da 100644 --- a/etemplate/js/et2_widget_link.js +++ b/etemplate/js/et2_widget_link.js @@ -316,15 +316,31 @@ var et2_link_to = et2_inputWidget.extend( this.file_upload.progress.empty(); // Server says it's OK, but didn't store - we'll send this again on submit + // This happens if you link to something before it's saved to the DB if(typeof success == "object" && success["Array:"]) { - this.options.value = success["Array:"]; + // Save as appropriate in value var i = 0; + if(typeof this.options.value != "object") + { + this.options.value = {}; + } + if(typeof this.options.value.to_id != "object") + { + this.options.value.to_id = []; + } + i = this.options.value.to_id.length; + this.options.value.to_id[i] = success["Array:"].app[0]; + + // Fake it for the UI var fake_data = { // Icon should be in registry - icon: egw.link_get_registry('addressbook','icon'), - app: this.options.value.app[i].app, - id: this.options.value.app[i].id + icon: egw.link_get_registry(this.options.value.to_id[i].app,'icon'), + app: this.options.value.to_id[i].app, + id: this.options.value.to_id[i].id, + // Make it easy to refer back if user deletes before saving + widget: this, + value_index: i }; } @@ -343,7 +359,9 @@ var et2_link_to = et2_inputWidget.extend( }, this, et2_link_list ); - + + // If there's fake data (entry is not yet saved), updating the list will + // not work, so add it in. if(list_widget && fake_data) { egw.link_title(fake_data.app, fake_data.id, function(title) { @@ -1369,7 +1387,7 @@ var et2_link_list = et2_link_string.extend( .appendTo(delete_button) // We don't use ui-icon because it assigns a bg image .addClass("delete icon") - .bind( 'click', function() {self._delete_link(_link_data.link_id, row);}); + .bind( 'click', function() {self._delete_link(_link_data.link_id||_link_data, row);}); // Context menu row.bind("contextmenu", function(e) { @@ -1384,12 +1402,24 @@ var et2_link_list = et2_link_string.extend( _delete_link: function(link_id, row) { var delete_button = jQuery('.delete',row); delete_button.removeClass("delete").addClass("loading"); - if(link_id) + if(typeof link_id != "object") { egw.json("etemplate.etemplate_widget_link.ajax_delete", [link_id], function(data) { if(data) {row.slideUp(row.remove);}} ).sendRequest(); } + else if (row) + { + // No link ID means a link on an unsaved entry. + // Just remove the row, but need to adjust the link_to value also + row.slideUp(row.remove); + var value = link_id.widget.getValue(); + if(value && value.to_id) + { + delete value.to_id[link_id.value_index]; + link_id.widget.set_value(value); + } + } } }); et2_register_widget(et2_link_list, ["link-list"]);