infopark_cloud_connector 6.9.2.1.125136549 → 6.9.3.1.36404185

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -12989,50 +12989,22 @@ function program1(depth0,data) {
12989
12989
  });
12990
12990
  return this.InfoparkHandlebarsTemplates["confirmation_dialog"];
12991
12991
  }).call(this);
12992
- (function() {
12993
- this.InfoparkHandlebarsTemplates || (this.InfoparkHandlebarsTemplates = {});
12994
- this.InfoparkHandlebarsTemplates["deactivate_menu_bar_item"] = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {
12995
- this.compilerInfo = [2,'>= 1.0.0-rc.3'];
12996
- helpers = helpers || Handlebars.helpers; data = data || {};
12997
- var buffer = "", stack1, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
12998
-
12999
-
13000
- buffer += "<i class=\"ip_icon\" title=\"";
13001
- options = {hash:{},data:data};
13002
- buffer += escapeExpression(((stack1 = helpers.translate),stack1 ? stack1.call(depth0, "menu_bar.deactivate_editing", options) : helperMissing.call(depth0, "translate", "menu_bar.deactivate_editing", options)))
13003
- + "\">&#xF03E;</i>\n";
13004
- return buffer;
13005
- });
13006
- return this.InfoparkHandlebarsTemplates["deactivate_menu_bar_item"];
13007
- }).call(this);
13008
- (function() {
13009
- this.InfoparkHandlebarsTemplates || (this.InfoparkHandlebarsTemplates = {});
13010
- this.InfoparkHandlebarsTemplates["delete_current_page_item"] = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {
13011
- this.compilerInfo = [2,'>= 1.0.0-rc.3'];
13012
- helpers = helpers || Handlebars.helpers; data = data || {};
13013
- var buffer = "", stack1, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
13014
-
13015
-
13016
- buffer += "<i class=\"ip_icon\">&#xF018;</i>\n<span class=\"ip_button_label\">";
13017
- options = {hash:{},data:data};
13018
- buffer += escapeExpression(((stack1 = helpers.translate),stack1 ? stack1.call(depth0, "menu_bar.delete_current_page", options) : helperMissing.call(depth0, "translate", "menu_bar.delete_current_page", options)))
13019
- + "</span>\n";
13020
- return buffer;
13021
- });
13022
- return this.InfoparkHandlebarsTemplates["delete_current_page_item"];
13023
- }).call(this);
13024
12992
  (function() {
13025
12993
  this.InfoparkHandlebarsTemplates || (this.InfoparkHandlebarsTemplates = {});
13026
12994
  this.InfoparkHandlebarsTemplates["edit_dialog"] = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {
13027
12995
  this.compilerInfo = [2,'>= 1.0.0-rc.3'];
13028
12996
  helpers = helpers || Handlebars.helpers; data = data || {};
13029
- var buffer = "", stack1, stack2, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, functionType="function";
12997
+ var buffer = "", stack1, stack2, options, functionType="function", helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
13030
12998
 
13031
12999
 
13032
- buffer += "<div class=\"ip_edit_dialog ip_modal_big ip_adjust_dialog\">\n\n <div class=\"ip_modal_header\">\n <h3><i class=\"ip_icon\">&#xF030;</i>";
13000
+ buffer += "<div class=\"ip_edit_dialog ip_modal_big ip_adjust_dialog\">\n\n <div class=\"ip_modal_header\">\n <h3><i class=\"ip_icon\">";
13001
+ if (stack1 = helpers.icon) { stack1 = stack1.call(depth0, {hash:{},data:data}); }
13002
+ else { stack1 = depth0.icon; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; }
13003
+ if(stack1 || stack1 === 0) { buffer += stack1; }
13004
+ buffer += "</i>";
13033
13005
  options = {hash:{},data:data};
13034
13006
  buffer += escapeExpression(((stack1 = helpers.translate),stack1 ? stack1.call(depth0, "edit_dialog.title", depth0.title, options) : helperMissing.call(depth0, "translate", "edit_dialog.title", depth0.title, options)))
13035
- + "</h3>\n </div>\n\n <div class=\"ip_modal_body ip_auto_height\">";
13007
+ + "</h3>\n <div class=\"ip_edit_dialog_saving_indicator\"></div>\n </div>\n\n <div class=\"ip_modal_body ip_edit_dialog_markup ip_auto_height\">";
13036
13008
  if (stack2 = helpers.markup) { stack2 = stack2.call(depth0, {hash:{},data:data}); }
13037
13009
  else { stack2 = depth0.markup; stack2 = typeof stack2 === functionType ? stack2.apply(depth0) : stack2; }
13038
13010
  if(stack2 || stack2 === 0) { buffer += stack2; }
@@ -13151,10 +13123,53 @@ helpers = helpers || Handlebars.helpers; data = data || {};
13151
13123
 
13152
13124
 
13153
13125
 
13154
- return "<div class=\"ip_topbar\">\n <div class=\"ip_first_level\">\n <div class=\"ip_button_bar ip_app ip_no_hover\">\n <span class=\"ip_logo\"></span>\n <span class=\"ip_product_name\">CMS</span>\n </div>\n\n <div id=\"ip_select_workspace\" class=\"ip_button_bar\"></div>\n <div id=\"ip_deactivate_editing\" class=\"ip_button_bar ip_right\"></div>\n <div id=\"ip_delete_current_page\" class=\"ip_button_bar ip_right ip_red\"></div>\n </div>\n</div>\n";
13126
+ return "<div class=\"ip_topbar\">\n <div class=\"ip_first_level\">\n <div class=\"ip_button_bar ip_app ip_no_hover\">\n <span class=\"ip_logo\"></span>\n <span class=\"ip_product_name\">CMS</span>\n </div>\n\n <div id=\"ip_select_workspace\" class=\"ip_button_bar\"></div>\n <div id=\"ip_menu_bar_dropdown\" class=\"ip_button_bar ip_right\"></div>\n <div id=\"ip_menu_bar_saving_indicator\"></div>\n </div>\n</div>\n";
13155
13127
  });
13156
13128
  return this.InfoparkHandlebarsTemplates["menu_bar"];
13157
13129
  }).call(this);
13130
+ (function() {
13131
+ this.InfoparkHandlebarsTemplates || (this.InfoparkHandlebarsTemplates = {});
13132
+ this.InfoparkHandlebarsTemplates["menu_bar_dropdown"] = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {
13133
+ this.compilerInfo = [2,'>= 1.0.0-rc.3'];
13134
+ helpers = helpers || Handlebars.helpers; data = data || {};
13135
+ var buffer = "", stack1, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression, self=this;
13136
+
13137
+ function program1(depth0,data) {
13138
+
13139
+ var buffer = "", stack1, options;
13140
+ buffer += "\n ";
13141
+ stack1 = helpers['if'].call(depth0, depth0.current_page_has_edit_view, {hash:{},inverse:self.noop,fn:self.program(2, program2, data),data:data});
13142
+ if(stack1 || stack1 === 0) { buffer += stack1; }
13143
+ buffer += "\n\n <li id=\"ip_delete_current_page\" class=\"ip_menu_item\">\n <span><i class=\"ip_icon\">&#xF018;</i>";
13144
+ options = {hash:{},data:data};
13145
+ buffer += escapeExpression(((stack1 = helpers.translate),stack1 ? stack1.call(depth0, "menu_bar_dropdown.delete_current_page", options) : helperMissing.call(depth0, "translate", "menu_bar_dropdown.delete_current_page", options)))
13146
+ + "</span>\n </li>\n\n <li id=\"ip_open_current_page_in_admin_gui\" class=\"ip_menu_item\">\n <span><i class=\"ip_icon\">&#xF000;</i>";
13147
+ options = {hash:{},data:data};
13148
+ buffer += escapeExpression(((stack1 = helpers.translate),stack1 ? stack1.call(depth0, "menu_bar_dropdown.open_current_page_in_admin_gui", options) : helperMissing.call(depth0, "translate", "menu_bar_dropdown.open_current_page_in_admin_gui", options)))
13149
+ + "</span>\n </li>\n ";
13150
+ return buffer;
13151
+ }
13152
+ function program2(depth0,data) {
13153
+
13154
+ var buffer = "", stack1, options;
13155
+ buffer += "\n <li id=\"ip_edit_current_page\" class=\"ip_menu_item\">\n <span><i class=\"ip_icon\">&#xF03D;</i>";
13156
+ options = {hash:{},data:data};
13157
+ buffer += escapeExpression(((stack1 = helpers.translate),stack1 ? stack1.call(depth0, "menu_bar_dropdown.edit_current_page", options) : helperMissing.call(depth0, "translate", "menu_bar_dropdown.edit_current_page", options)))
13158
+ + "</span>\n </li>\n ";
13159
+ return buffer;
13160
+ }
13161
+
13162
+ buffer += "<i class=\"ip_icon\">&#xF03B;</i>\n\n<ul class=\"ip_menu_box ip_right\" style=\"display: none;\">\n ";
13163
+ stack1 = helpers['if'].call(depth0, depth0.has_current_page, {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data});
13164
+ if(stack1 || stack1 === 0) { buffer += stack1; }
13165
+ buffer += "\n\n <li id=\"ip_deactivate_editing\" class=\"ip_menu_item\">\n <span><i class=\"ip_icon\">&#xF06C;</i>";
13166
+ options = {hash:{},data:data};
13167
+ buffer += escapeExpression(((stack1 = helpers.translate),stack1 ? stack1.call(depth0, "menu_bar_dropdown.deactivate_editing", options) : helperMissing.call(depth0, "translate", "menu_bar_dropdown.deactivate_editing", options)))
13168
+ + "</span>\n </li>\n</ul>\n";
13169
+ return buffer;
13170
+ });
13171
+ return this.InfoparkHandlebarsTemplates["menu_bar_dropdown"];
13172
+ }).call(this);
13158
13173
  (function() {
13159
13174
  this.InfoparkHandlebarsTemplates || (this.InfoparkHandlebarsTemplates = {});
13160
13175
  this.InfoparkHandlebarsTemplates["overlay"] = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {
@@ -13217,6 +13232,25 @@ function program1(depth0,data) {
13217
13232
  });
13218
13233
  return this.InfoparkHandlebarsTemplates["prompt_dialog"];
13219
13234
  }).call(this);
13235
+ (function() {
13236
+ this.InfoparkHandlebarsTemplates || (this.InfoparkHandlebarsTemplates = {});
13237
+ this.InfoparkHandlebarsTemplates["saving_indicator"] = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {
13238
+ this.compilerInfo = [2,'>= 1.0.0-rc.3'];
13239
+ helpers = helpers || Handlebars.helpers; data = data || {};
13240
+ var buffer = "", stack1, options, helperMissing=helpers.helperMissing, escapeExpression=this.escapeExpression;
13241
+
13242
+
13243
+ buffer += "<span class=\"ip_saving_indicator ip_saving_state_bar\">\n <span class=\"ip_saving_in_progress\" style=\"display:none;\">\n <i class=\"ip_icon ip_spinning\">&#xf023;</i>\n <span class=\"ip_button_label\"><span>";
13244
+ options = {hash:{},data:data};
13245
+ buffer += escapeExpression(((stack1 = helpers.translate),stack1 ? stack1.call(depth0, "saving_indicator_item.saving", options) : helperMissing.call(depth0, "translate", "saving_indicator_item.saving", options)))
13246
+ + "</span></span>\n </span>\n\n <span class=\"ip_saving_done\">\n <i class=\"ip_icon\">&#xf03F;</i>\n <span class=\"ip_button_label\"><span>";
13247
+ options = {hash:{},data:data};
13248
+ buffer += escapeExpression(((stack1 = helpers.translate),stack1 ? stack1.call(depth0, "saving_indicator_item.saved", options) : helperMissing.call(depth0, "translate", "saving_indicator_item.saved", options)))
13249
+ + "</span></span>\n </span>\n</div>\n";
13250
+ return buffer;
13251
+ });
13252
+ return this.InfoparkHandlebarsTemplates["saving_indicator"];
13253
+ }).call(this);
13220
13254
  (function() {
13221
13255
  this.InfoparkHandlebarsTemplates || (this.InfoparkHandlebarsTemplates = {});
13222
13256
  this.InfoparkHandlebarsTemplates["saving_overlay"] = Handlebars.template(function (Handlebars,depth0,helpers,partials,data) {
@@ -13413,6 +13447,7 @@ $.i18n().load({
13413
13447
  'accept': 'Übernehmen',
13414
13448
  'close': 'Schließen',
13415
13449
  'loading': 'Lade...',
13450
+ 'current_page': 'Aktuelle Seite',
13416
13451
 
13417
13452
  'choose_obj_class_dialog.add_child_page.title': 'Seitenvorlage auswählen',
13418
13453
  'choose_obj_class_dialog.add_widget.title': 'Widget auswählen',
@@ -13426,7 +13461,6 @@ $.i18n().load({
13426
13461
 
13427
13462
  'edit_dialog.title': '$1 bearbeiten',
13428
13463
 
13429
- 'menu_bar.deactivate_editing': 'Direktbearbeitung deaktivieren',
13430
13464
  'menu_bar.working_copy': 'Arbeitskopie',
13431
13465
  'menu_bar.empty_workspace_title': '<leerer Titel>',
13432
13466
  'menu_bar.published_workspace_title': 'Veröffentlichte Inhalte',
@@ -13447,21 +13481,30 @@ $.i18n().load({
13447
13481
  'menu_bar.create_new_ws_confirmation': 'Arbeitskopie anlegen',
13448
13482
  'menu_bar.create_new_ws_confirmation_desc': 'Bitte geben Sie den Titel der neuen Arbeitskopie ein.',
13449
13483
  'menu_bar.create_new_ws_confirmation_placeholder': 'Neuer Titel',
13450
- 'menu_bar.delete_current_page': 'Diese Seite löschen',
13484
+
13485
+ 'menu_bar_dropdown.edit_current_page': 'Diese Seite bearbeiten',
13486
+ 'menu_bar_dropdown.delete_current_page': 'Diese Seite löschen',
13487
+ 'menu_bar_dropdown.open_current_page_in_admin_gui': 'Im Admin-GUI öffnen',
13488
+ 'menu_bar_dropdown.deactivate_editing': 'Direktbearbeitung deaktivieren',
13489
+
13490
+ 'saving_indicator_item.saving': 'Wird gespeichert...',
13491
+ 'saving_indicator_item.saved': 'Alle Änderungen gespeichert',
13451
13492
 
13452
13493
  'child_list_menus.add_subpage': 'Neue Seite anlegen',
13453
13494
 
13454
13495
  'widget_menus.add_widget': 'Widget einfügen',
13455
13496
  'widget_menus.edit_widget': 'Widget bearbeiten',
13456
13497
  'widget_menus.delete_widget': 'Widget löschen',
13457
- 'widget_menus.open_in_admin_gui': ' Im Admin-GUI öffnen',
13498
+ 'widget_menus.open_in_admin_gui': 'Im Admin-GUI öffnen',
13458
13499
 
13459
13500
  'commands.delete_obj.confirm_title': 'Wirklich diese Seite löschen?',
13460
13501
  'commands.delete_obj.confirm_description': 'Eine gelöschte Seite kann nicht wiederhergestellt werden.',
13461
13502
  'commands.delete_widget.confirm_title': 'Wirklich dieses Widget löschen?',
13462
13503
  'commands.delete_widget.confirm_description': 'Ein gelöschtes Widget kann nicht wiederhergestellt werden.',
13463
13504
 
13464
- 'image_upload.too_many_files': 'Nur eine Detei erlaubt.'
13505
+ 'image_upload.too_many_files': 'Nur eine Detei erlaubt.',
13506
+
13507
+ 'warn_before_unloading': 'Sie haben ungespeicherte Änderungen! Sind Sie sicher, dass sie schließen wollen?'
13465
13508
  }, 'de');
13466
13509
  $.i18n().load({
13467
13510
  'confirm': 'Confirm',
@@ -13472,6 +13515,7 @@ $.i18n().load({
13472
13515
  'accept': 'Accept',
13473
13516
  'close': 'Close',
13474
13517
  'load': 'Loading...',
13518
+ 'current_page': 'current page',
13475
13519
 
13476
13520
  'choose_obj_class_dialog.add_child_page.title': 'Select Page Type',
13477
13521
  'choose_obj_class_dialog.add_widget.title': 'Select Widget',
@@ -13485,7 +13529,6 @@ $.i18n().load({
13485
13529
 
13486
13530
  'edit_dialog.title': 'Edit $1',
13487
13531
 
13488
- 'menu_bar.deactivate_editing': 'deactivate in-place editing',
13489
13532
  'menu_bar.working_copy': 'Working copy',
13490
13533
  'menu_bar.empty_workspace_title': '<empty title>',
13491
13534
  'menu_bar.published_workspace_title': 'Published content',
@@ -13506,7 +13549,14 @@ $.i18n().load({
13506
13549
  'menu_bar.create_new_ws_confirmation': 'Create a working copy',
13507
13550
  'menu_bar.create_new_ws_confirmation_desc': 'Please enter the title of the new working copy.',
13508
13551
  'menu_bar.create_new_ws_confirmation_placeholder': 'new title',
13509
- 'menu_bar.delete_current_page': 'Delete this page',
13552
+
13553
+ 'menu_bar_dropdown.edit_current_page': 'Edit this page',
13554
+ 'menu_bar_dropdown.delete_current_page': 'Delete this page',
13555
+ 'menu_bar_dropdown.open_current_page_in_admin_gui': 'Open in admin GUI',
13556
+ 'menu_bar_dropdown.deactivate_editing': 'Deactivate in-place editing',
13557
+
13558
+ 'saving_indicator_item.saving': 'Saving...',
13559
+ 'saving_indicator_item.saved': 'All changes saved',
13510
13560
 
13511
13561
  'child_list_menus.add_subpage': 'Create new page',
13512
13562
 
@@ -13520,7 +13570,9 @@ $.i18n().load({
13520
13570
  'commands.delete_widget.confirm_title': 'Really delete this widget?',
13521
13571
  'commands.delete_widget.confirm_description': 'A deleted widget cannot be restored.',
13522
13572
 
13523
- 'image_upload.too_many_files': 'Only one file allowed.'
13573
+ 'image_upload.too_many_files': 'Only one file allowed.',
13574
+
13575
+ 'warn_before_unloading': 'You have unsaved changes. Are you sure you want to quit?'
13524
13576
  }, 'en');
13525
13577
  /*global alert:false */
13526
13578
 
@@ -13558,7 +13610,11 @@ var infopark = {
13558
13610
  },
13559
13611
 
13560
13612
  reload: function() {
13561
- infopark.reload_location();
13613
+ if (infopark.write_monitor.is_writing()) {
13614
+ infopark.write_monitor.on('end_write', function() { infopark.reload(); });
13615
+ } else {
13616
+ infopark.reload_location();
13617
+ }
13562
13618
  return $.Deferred();
13563
13619
  },
13564
13620
 
@@ -13633,14 +13689,28 @@ var infopark = {
13633
13689
  }
13634
13690
  });
13635
13691
  } else if (event === 'new_content') {
13636
- infopark.editing.on('refresh', function(new_content) {
13637
- if (new_content) {
13638
- callback(new_content);
13692
+ infopark.editing.on('refresh', function(dom_element) {
13693
+ if (dom_element) {
13694
+ callback(dom_element);
13639
13695
  }
13640
13696
  });
13641
13697
  } else {
13642
13698
  $.error('Unknown event "' + event + '"');
13643
13699
  }
13700
+ },
13701
+
13702
+ create_obj: function(attributes) {
13703
+ return infopark.obj.create(attributes).then(function(obj) {
13704
+ return {id: obj.id()};
13705
+ });
13706
+ },
13707
+
13708
+ delete_obj: function(id) {
13709
+ if (id) {
13710
+ return infopark.obj.create_instance(id).destroy();
13711
+ } else {
13712
+ $.error("Can't delete without ID");
13713
+ }
13644
13714
  }
13645
13715
  };
13646
13716
  (function() {
@@ -13669,25 +13739,51 @@ var infopark = {
13669
13739
  });
13670
13740
  }());
13671
13741
  (function() {
13742
+ var assert_valid_dom_element = function(dom_element) {
13743
+ if (dom_element.length > 0) {
13744
+ if (dom_element.length === 1) {
13745
+ return true;
13746
+ } else {
13747
+ $.error('Can not call "infopark" method on more than one tag');
13748
+ }
13749
+ }
13750
+ };
13751
+
13752
+ var build_cms_field_element = function(dom_element) {
13753
+ var cms_field_element = infopark.cms_element.from_dom_element(dom_element);
13754
+ if (cms_field_element) {
13755
+ return cms_field_element;
13756
+ } else {
13757
+ $.error('Can not call "infopark" method on a non-cms tag');
13758
+ }
13759
+ };
13760
+
13761
+ var save_content = function(dom_element, content) {
13762
+ if (assert_valid_dom_element(dom_element)) {
13763
+ if (content === undefined || content === null) {
13764
+ $.error('Can not call "save" with no content');
13765
+ } else {
13766
+ var cms_field_element = build_cms_field_element(dom_element);
13767
+ return cms_field_element.save(content).then(function() {
13768
+ cms_field_element.set_original_content(content);
13769
+ });
13770
+ }
13771
+ }
13772
+ };
13773
+
13774
+ var get_original_content = function(dom_element) {
13775
+ if (assert_valid_dom_element(dom_element)) {
13776
+ return build_cms_field_element(dom_element).original_content();
13777
+ } else {
13778
+ $.error('Can not call "infopark" method on an empty element');
13779
+ }
13780
+ };
13781
+
13672
13782
  $.fn.infopark = function(method, content) {
13673
13783
  if (method === 'save') {
13674
- var dom_element = $(this);
13675
- if (dom_element.length > 0) {
13676
- if (dom_element.length === 1) {
13677
- var cms_field_element = infopark.cms_element.from_dom_element(dom_element);
13678
- if (cms_field_element) {
13679
- if (content === undefined || content === null) {
13680
- $.error('Can not call "save" with no content');
13681
- } else {
13682
- return cms_field_element.save(content);
13683
- }
13684
- } else {
13685
- $.error('Can not call "save" on a non-cms tag');
13686
- }
13687
- } else {
13688
- $.error('Can not call "save" on more than one tag');
13689
- }
13690
- }
13784
+ return save_content($(this), content);
13785
+ } else if (method === 'content') {
13786
+ return get_original_content($(this));
13691
13787
  } else {
13692
13788
  $.error('Unknown method "' + method + '"');
13693
13789
  }
@@ -13730,10 +13826,10 @@ var infopark = {
13730
13826
  infopark.reload();
13731
13827
  },
13732
13828
 
13733
- refresh: function(new_content) {
13829
+ refresh: function(dom_element) {
13734
13830
  _.each($(event_handlers.refresh), function(handler) {
13735
- if (new_content) {
13736
- handler($(new_content));
13831
+ if (dom_element) {
13832
+ handler(dom_element);
13737
13833
  } else if (handler.length === 0) {
13738
13834
  handler();
13739
13835
  }
@@ -13812,13 +13908,81 @@ var infopark = {
13812
13908
 
13813
13909
  $.extend(infopark, {
13814
13910
  ajax: function(type, path, options) {
13815
- return single_ajax(type, path, options).then(function(result) {
13911
+ var is_write_request = type === 'PUT' || type === 'POST' || type === 'DELETE';
13912
+ if (is_write_request) {
13913
+ infopark.write_monitor.start_write();
13914
+ }
13915
+
13916
+ var ajax_promise = single_ajax(type, path, options).then(function(result) {
13816
13917
  if (result && result.task && _.size(result) === 1) {
13817
13918
  return handle_task(result.task);
13818
13919
  } else {
13819
13920
  return $.Deferred().resolve(result);
13820
13921
  }
13821
13922
  });
13923
+
13924
+ if (is_write_request) {
13925
+ return ajax_promise.always(function() {
13926
+ infopark.write_monitor.end_write();
13927
+ });
13928
+ } else {
13929
+ return ajax_promise;
13930
+ }
13931
+ }
13932
+ });
13933
+ }());
13934
+ (function() {
13935
+ var callbacks = {};
13936
+ var current_token = 0;
13937
+ var counter = 0;
13938
+
13939
+ var run_callbacks = function(event_name) {
13940
+ _.each(callbacks[event_name], function(callback) {
13941
+ callback();
13942
+ });
13943
+ };
13944
+
13945
+ $.extend(infopark, {
13946
+ write_monitor: {
13947
+ on: function(event_name, callback) {
13948
+ if (callbacks[event_name] === undefined) {
13949
+ callbacks[event_name] = {};
13950
+ }
13951
+ current_token += 1;
13952
+ callbacks[event_name][current_token] = callback;
13953
+ return current_token;
13954
+ },
13955
+
13956
+ off: function(token) {
13957
+ _.each(callbacks, function(event_callbacks) {
13958
+ delete event_callbacks[token];
13959
+ });
13960
+ },
13961
+
13962
+ is_writing: function() {
13963
+ return counter > 0;
13964
+ },
13965
+
13966
+ start_write: function() {
13967
+ run_callbacks('start_write');
13968
+ counter += 1;
13969
+ },
13970
+
13971
+ end_write: function() {
13972
+ counter -= 1;
13973
+ run_callbacks('end_write');
13974
+ },
13975
+
13976
+ // For test purpose only.
13977
+ reset_callbacks: function() {
13978
+ callbacks = {};
13979
+ current_token = 0;
13980
+ },
13981
+
13982
+ // For test purpose only.
13983
+ reset_counter: function() {
13984
+ counter = 0;
13985
+ }
13822
13986
  }
13823
13987
  });
13824
13988
  }());
@@ -13874,17 +14038,11 @@ var infopark = {
13874
14038
  });
13875
14039
  }());
13876
14040
  (function() {
13877
- $(document).on("click.ip-deactivate-editing", "#ip_deactivate_editing", function(e) {
13878
- e.preventDefault();
13879
- infopark.editing.deactivate();
13880
- });
13881
-
13882
14041
  $.extend(infopark, {
13883
- deactivate_menu_bar_item: {
14042
+ menu_bar_saving_indicator: {
13884
14043
  init: function() {
13885
14044
  infopark.menu_bar.register_item_renderer(function(parent_view) {
13886
- var view = $(infopark.template.render('deactivate_menu_bar_item'));
13887
- parent_view.find('#ip_deactivate_editing').append(view);
14045
+ infopark.saving_indicator.create(parent_view.find('#ip_menu_bar_saving_indicator'));
13888
14046
  });
13889
14047
  }
13890
14048
  }
@@ -13892,22 +14050,47 @@ var infopark = {
13892
14050
  }());
13893
14051
  (function() {
13894
14052
  $.extend(infopark, {
13895
- delete_current_page_item: {
14053
+ menu_bar_dropdown: {
13896
14054
  init: function() {
13897
- infopark.menu_bar.register_item_renderer(function(target) {
13898
- if (infopark.obj.current_page()) {
13899
- target.find('#ip_delete_current_page').append(
13900
- $(infopark.template.render('delete_current_page_item')));
13901
- }
14055
+ infopark.menu_bar.register_item_renderer(function(menu_bar) {
14056
+ var view = infopark.template.render('menu_bar_dropdown', {
14057
+ has_current_page: infopark.obj.current_page_id,
14058
+ current_page_has_edit_view: infopark.obj.current_page_has_edit_view
14059
+ });
14060
+ menu_bar.find('#ip_menu_bar_dropdown').append(view);
13902
14061
  });
13903
14062
  }
13904
14063
  }
13905
14064
  });
13906
14065
 
13907
- $(document).on('click.ip-delete-current-page', '#ip_delete_current_page', function(e) {
13908
- e.preventDefault();
14066
+ var on_click = function(element_id, callback) {
14067
+ $(document).on('click.' + element_id, '#' + element_id, function(event) {
14068
+ event.preventDefault();
14069
+ callback();
14070
+ });
14071
+ };
14072
+
14073
+ on_click('ip_menu_bar_dropdown', function() {
14074
+ var target = $('#ip_menu_bar_dropdown');
14075
+ target.toggleClass('active');
14076
+ target.find('.ip_menu_box').fadeToggle('50');
14077
+ });
14078
+
14079
+ on_click('ip_edit_current_page', function() {
14080
+ infopark.commands.edit_obj(infopark.obj.current_page());
14081
+ });
14082
+
14083
+ on_click('ip_delete_current_page', function() {
13909
14084
  infopark.commands.delete_obj(infopark.obj.current_page());
13910
14085
  });
14086
+
14087
+ on_click('ip_open_current_page_in_admin_gui', function() {
14088
+ infopark.commands.open_in_admin_gui(infopark.obj.current_page_id);
14089
+ });
14090
+
14091
+ on_click('ip_deactivate_editing', function() {
14092
+ infopark.editing.deactivate();
14093
+ });
13911
14094
  }());
13912
14095
  (function() {
13913
14096
  var t = infopark.i18n.translate;
@@ -14070,7 +14253,10 @@ var infopark = {
14070
14253
  blob: {
14071
14254
  create: function(file) {
14072
14255
  return get_upload_permission().then(function(permission) {
14073
- return upload_to_s3(file, permission);
14256
+ infopark.write_monitor.start_write();
14257
+ return upload_to_s3(file, permission).always(function() {
14258
+ infopark.write_monitor.end_write();
14259
+ });
14074
14260
  });
14075
14261
  },
14076
14262
 
@@ -14113,7 +14299,8 @@ var infopark = {
14113
14299
  },
14114
14300
 
14115
14301
  fetch_page_class_selection: function() {
14116
- return infopark.ajax('GET', 'objs/page_class_selection');
14302
+ return infopark.ajax('GET', 'objs/page_class_selection?' +
14303
+ $.param({parent_path: that.path()}));
14117
14304
  },
14118
14305
 
14119
14306
  create_child: function(obj_class) {
@@ -14174,6 +14361,10 @@ $(function() {
14174
14361
  });
14175
14362
  }());
14176
14363
  (function() {
14364
+ var has_original_content = function(field_type) {
14365
+ return _.contains(['string', 'text', 'html', 'enum', 'multienum'], field_type);
14366
+ };
14367
+
14177
14368
  $.extend(infopark, {
14178
14369
  cms_field_element: {
14179
14370
  create_instance: function(cms_element) {
@@ -14205,6 +14396,20 @@ $(function() {
14205
14396
  var changes = {};
14206
14397
  changes[that.field_name()] = content;
14207
14398
  return that.obj().save(changes);
14399
+ },
14400
+
14401
+ original_content: function() {
14402
+ if (has_original_content(that.field_type())) {
14403
+ return JSON.parse(that.dom_element().attr('data-ip-field-original-content'));
14404
+ } else {
14405
+ $.error('Fields of type ' + that.field_type() + ' do not support original content');
14406
+ }
14407
+ },
14408
+
14409
+ set_original_content: function(content) {
14410
+ if (has_original_content(that.field_type())) {
14411
+ that.dom_element().attr('data-ip-field-original-content', JSON.stringify(content));
14412
+ }
14208
14413
  }
14209
14414
 
14210
14415
  });
@@ -14219,10 +14424,7 @@ $(function() {
14219
14424
  date_field_element: {
14220
14425
  create_instance: function(cms_element) {
14221
14426
  if (cms_element.dom_element().attr('data-ip-field-type') === 'date') {
14222
- var cms_field_element = infopark.cms_field_element.create_instance(cms_element);
14223
- return $.extend({}, cms_field_element, {save: function(content) {
14224
- return cms_field_element.save(content instanceof Date ? format_date(content) : content);
14225
- }});
14427
+ return infopark.cms_field_element.create_instance(cms_element);
14226
14428
  }
14227
14429
  },
14228
14430
 
@@ -14234,20 +14436,6 @@ $(function() {
14234
14436
  }
14235
14437
  });
14236
14438
 
14237
- var format_date = function(date) {
14238
- return date.getUTCFullYear().toString() +
14239
- format_number(date.getUTCMonth() + 1) + // Month numbers are starting at 0.
14240
- format_number(date.getUTCDate()) +
14241
- format_number(date.getUTCHours()) +
14242
- format_number(date.getUTCMinutes()) +
14243
- format_number(date.getUTCSeconds());
14244
- };
14245
-
14246
- var format_number = function(number) {
14247
- var string = number.toString();
14248
- return string.length === 1 ? '0' + string : string;
14249
- };
14250
-
14251
14439
  infopark.cms_element.definitions.push(infopark.date_field_element);
14252
14440
  }());
14253
14441
  (function() {
@@ -14316,6 +14504,39 @@ $(function() {
14316
14504
  infopark.cms_element.definitions.push(infopark.multienum_field_element);
14317
14505
  }());
14318
14506
  (function() {
14507
+ var format_date = function(date) {
14508
+ return date.getUTCFullYear().toString() +
14509
+ format_date_number(date.getUTCMonth() + 1) + // Month numbers are starting at 0.
14510
+ format_date_number(date.getUTCDate()) +
14511
+ format_date_number(date.getUTCHours()) +
14512
+ format_date_number(date.getUTCMinutes()) +
14513
+ format_date_number(date.getUTCSeconds());
14514
+ };
14515
+
14516
+ var format_date_number = function(number) {
14517
+ var string = number.toString();
14518
+ return string.length === 1 ? '0' + string : string;
14519
+ };
14520
+
14521
+ var prepare_attributes = function(data) {
14522
+ var attributes = {};
14523
+ _.each(data, function(value, field_name) {
14524
+ if (value instanceof Date) {
14525
+ value = format_date(value);
14526
+ }
14527
+ attributes[field_name] = value;
14528
+ });
14529
+
14530
+ if (attributes.blob) {
14531
+ return infopark.blob.create(attributes.blob).then(function(blob_id) {
14532
+ attributes.blob = blob_id;
14533
+ return attributes;
14534
+ });
14535
+ } else {
14536
+ return $.Deferred().resolve(attributes);
14537
+ }
14538
+ };
14539
+
14319
14540
  $.extend(infopark, {
14320
14541
  obj: {
14321
14542
  create_instance: function(id, obj_class_name) {
@@ -14329,13 +14550,21 @@ $(function() {
14329
14550
  },
14330
14551
 
14331
14552
  save: function(data) {
14332
- return infopark.ajax('PUT', 'objs/' + that.id(), {data: {obj: data}}).then(
14333
- function(result) { return; }
14334
- );
14553
+ return prepare_attributes(data).then(function(attributes) {
14554
+ return infopark.ajax('PUT', 'objs/' + that.id(), {data: {obj: attributes}}).then(
14555
+ function(result) { return; }
14556
+ );
14557
+ });
14335
14558
  },
14336
14559
 
14337
14560
  destroy: function() {
14338
14561
  return infopark.ajax('DELETE', 'objs/' + that.id());
14562
+ },
14563
+
14564
+ fetch_edit_markup: function() {
14565
+ return infopark.ajax('GET', 'objs/' + that.id() + '/edit').then(function(data) {
14566
+ return data.markup;
14567
+ });
14339
14568
  }
14340
14569
  };
14341
14570
 
@@ -14343,11 +14572,11 @@ $(function() {
14343
14572
  },
14344
14573
 
14345
14574
  create: function(data) {
14346
- return infopark.ajax('POST', 'objs', {data: {obj: data}}).then(
14347
- function(new_data) {
14575
+ return prepare_attributes(data).then(function(attributes) {
14576
+ return infopark.ajax('POST', 'objs', {data: {obj: attributes}}).then(function(new_data) {
14348
14577
  return infopark.obj.create_instance(new_data.id, new_data._obj_class);
14349
- }
14350
- );
14578
+ });
14579
+ });
14351
14580
  },
14352
14581
 
14353
14582
  current_page_id: null,
@@ -14356,7 +14585,9 @@ $(function() {
14356
14585
  if (infopark.obj.current_page_id) {
14357
14586
  return infopark.obj.create_instance(infopark.obj.current_page_id);
14358
14587
  }
14359
- }
14588
+ },
14589
+
14590
+ current_page_has_edit_view: false
14360
14591
  }
14361
14592
  });
14362
14593
  }());
@@ -14410,7 +14641,7 @@ $(function() {
14410
14641
  },
14411
14642
 
14412
14643
  fetch_edit_markup: function() {
14413
- return infopark.ajax('GET', 'objs/' + that.obj().id() + '/edit').then(function(data) {
14644
+ return infopark.ajax('GET', 'objs/' + that.obj().id() + '/edit_widget').then(function(data) {
14414
14645
  return data.markup;
14415
14646
  });
14416
14647
  },
@@ -14474,7 +14705,8 @@ $(function() {
14474
14705
  },
14475
14706
 
14476
14707
  fetch_widget_class_selection: function() {
14477
- return infopark.ajax('GET', 'objs/_/widget_class_selection');
14708
+ return infopark.ajax('GET', 'objs/' + that.obj().id() + '/widget_class_selection?' +
14709
+ $.param({field_name: that.field_name()}));
14478
14710
  }
14479
14711
  });
14480
14712
 
@@ -14568,7 +14800,8 @@ $(function() {
14568
14800
  transition: function(target, trigger_fn) {
14569
14801
  var deferred = $.Deferred();
14570
14802
  if (!infopark.transition.immediate_mode) {
14571
- target.on('transitionend', deferred.resolve);
14803
+ target.on('webkitTransitionEnd oTransitionEnd otransitionend transitionend msTransitionEnd',
14804
+ function() { deferred.resolve(); });
14572
14805
  setTimeout(trigger_fn, 0);
14573
14806
  } else {
14574
14807
  trigger_fn();
@@ -14590,41 +14823,28 @@ $(function() {
14590
14823
  }
14591
14824
 
14592
14825
  var dom_element = editor.$element;
14593
- var item = infopark.cms_element.from_dom_element(dom_element);
14594
14826
 
14595
- item.save().done(function() {
14596
- dom_element.attr('data-ip-field-original-content', item.content());
14827
+ dom_element.infopark('save', $.trim(dom_element.html())).done(function() {
14597
14828
  editor.destroy();
14598
- }).fail(function(error_message) {
14829
+ }).fail(function() {
14599
14830
  editor.getBox().removeClass('ip_field_saving');
14600
- infopark.alert(error_message);
14601
14831
  });
14602
14832
  };
14603
14833
 
14604
14834
  var cancel_action = function(button_name, button_dom, button_object) {
14605
14835
  // restore old content
14606
- var item = this.$element;
14607
- this.set(item.attr('data-ip-field-original-content'));
14608
- item.removeData('ip-field-original-content');
14609
-
14836
+ this.set(this.$element.infopark('content') || '');
14610
14837
  this.destroy();
14611
14838
  };
14612
14839
 
14613
14840
  var redactor_options_for_type = function(type) {
14614
14841
  var default_options = {
14615
- lang: infopark.i18n.locale(),
14616
14842
  focus: true,
14617
14843
  convertDivs: false,
14618
14844
  linebreaks: true,
14619
14845
  buttonsCustom: {
14620
- saveButton: {
14621
- title: infopark.i18n.translate('save'),
14622
- callback: save_action
14623
- },
14624
- cancelButton: {
14625
- title: infopark.i18n.translate('cancel'),
14626
- callback: cancel_action
14627
- }
14846
+ saveButton: {title: 'Save', callback: save_action},
14847
+ cancelButton: {title: 'Cancel', callback: cancel_action}
14628
14848
  }
14629
14849
  };
14630
14850
  var special_options = {};
@@ -14658,47 +14878,40 @@ $(function() {
14658
14878
  return $.extend(default_options, special_options);
14659
14879
  };
14660
14880
 
14661
- var cms_fields = function() {
14662
- return $.merge(
14663
- infopark.string_field_element.all(),
14664
- infopark.html_field_element.all()
14665
- );
14881
+ var cms_fields = function(content, field_type) {
14882
+ return content.find('[data-ip-field-type="' + field_type + '"]');
14666
14883
  };
14667
14884
 
14668
- var add_onclick_redactor_handlers = function() {
14669
- if (infopark.editing.workspace().is_editable()) {
14670
- _.each(cms_fields(), function(cms_field) {
14671
- var redactor_options = redactor_options_for_type(cms_field.field_type());
14672
- var dom_item = cms_field.dom_element();
14885
+ var add_onclick_redactor_handlers = function(content) {
14886
+ _.each(['string', 'html'], function(field_type) {
14887
+ _.each(cms_fields(content, field_type), function(cms_field) {
14888
+ var dom_element = $(cms_field);
14889
+ var redactor_options = redactor_options_for_type(field_type);
14673
14890
  if (redactor_options !== null) {
14674
- if(!($(dom_item).hasClass('ip_field_editable'))) {
14675
- $(dom_item).addClass('ip_field_editable');
14676
-
14677
- $(dom_item).on('click.ip-editing', function(e) {
14891
+ if(!dom_element.hasClass('ip_field_editable')) {
14892
+ dom_element.addClass('ip_field_editable');
14893
+ dom_element.on('click', function(e) {
14678
14894
  e.preventDefault();
14679
-
14680
- infopark.inplace_menus.close_all_menus();
14681
-
14682
- if($(dom_item).data('redactor') === undefined) {
14683
- $(dom_item).html($(dom_item).attr('data-ip-field-original-content'));
14684
- $(dom_item).redactor(redactor_options);
14895
+ if(dom_element.data('redactor') === undefined) {
14896
+ dom_element.html(dom_element.infopark('content') || '');
14897
+ dom_element.redactor(redactor_options);
14685
14898
  }
14686
14899
  });
14687
14900
  }
14688
14901
  }
14689
14902
  });
14690
- }
14903
+ });
14691
14904
  };
14692
14905
 
14693
14906
  $.extend(infopark, {
14694
14907
  redactor: {
14695
14908
  init: function() {
14696
- infopark.editing.on('activate', function() {
14697
- add_onclick_redactor_handlers();
14909
+ infopark.on('editing', function() {
14910
+ add_onclick_redactor_handlers($('body'));
14698
14911
  });
14699
14912
 
14700
- infopark.editing.on('refresh', function() {
14701
- add_onclick_redactor_handlers();
14913
+ infopark.on('new_content', function(dom_element) {
14914
+ add_onclick_redactor_handlers($(dom_element));
14702
14915
  });
14703
14916
  }
14704
14917
  }
@@ -14904,6 +15117,43 @@ $(function() {
14904
15117
 
14905
15118
  return infopark;
14906
15119
  }());
15120
+ (function() {
15121
+ $.extend(infopark, {
15122
+ saving_indicator: {
15123
+ create: function(parent_view) {
15124
+ var target_selector = '.ip_saving_indicator';
15125
+ var saving_in_progress_selector = target_selector + ' .ip_saving_in_progress';
15126
+ var saving_done_selector = target_selector + ' .ip_saving_done';
15127
+
15128
+ parent_view.append(infopark.template.render('saving_indicator'));
15129
+
15130
+ var start_write_token = infopark.write_monitor.on('start_write', function() {
15131
+ parent_view.find(saving_in_progress_selector).show();
15132
+ parent_view.find(saving_done_selector).hide();
15133
+ });
15134
+
15135
+ var end_write_token = infopark.write_monitor.on('end_write', function() {
15136
+ if (!infopark.write_monitor.is_writing()) {
15137
+ parent_view.find(saving_in_progress_selector).hide();
15138
+ parent_view.find(saving_done_selector).show();
15139
+ }
15140
+ });
15141
+
15142
+ return {
15143
+ destroy: function() {
15144
+ infopark.write_monitor.off(start_write_token);
15145
+ infopark.write_monitor.off(end_write_token);
15146
+ parent_view.find(target_selector).remove();
15147
+ },
15148
+
15149
+ // Test purpose only.
15150
+ start_write_token: start_write_token,
15151
+ end_write_token: end_write_token
15152
+ };
15153
+ }
15154
+ }
15155
+ });
15156
+ }());
14907
15157
  (function() {
14908
15158
  $.extend(infopark, {
14909
15159
  with_element_overlay: function(dom_element, promise) {
@@ -15106,13 +15356,8 @@ $(function() {
15106
15356
  }));
15107
15357
 
15108
15358
  obj_classes_deferred.done(function(obj_class_selection) {
15109
- var obj_classes = _.map(obj_class_selection, function(markup, name) {
15110
- return {name: name, markup: markup};
15111
- });
15112
-
15113
- var selection_view = infopark.template.render('choose_obj_class_list', {
15114
- obj_classes: obj_classes
15115
- });
15359
+ var selection_view = infopark.template.render('choose_obj_class_list',
15360
+ {obj_classes: obj_class_selection});
15116
15361
 
15117
15362
  selection_view = $($.trim(selection_view));
15118
15363
 
@@ -15148,15 +15393,20 @@ $(function() {
15148
15393
  (function() {
15149
15394
  $.extend(infopark, {
15150
15395
  edit_dialog: {
15151
- open: function(title, markup) {
15396
+ open: function(title, markup, icon) {
15152
15397
  var deferred = $.Deferred();
15153
15398
 
15154
- var view = $(infopark.template.render('edit_dialog', {title: title, markup: markup}));
15399
+ var view = $(infopark.template.render('edit_dialog',
15400
+ {icon: icon || '&#xF030;', title: title, markup: markup}));
15155
15401
 
15156
15402
  $('#ip-editing').append(view);
15157
15403
 
15404
+ var saving_indicator = infopark.saving_indicator.create(
15405
+ view.find('.ip_edit_dialog_saving_indicator'));
15406
+
15158
15407
  var cancel_action = function(e) {
15159
15408
  e.preventDefault();
15409
+ saving_indicator.destroy();
15160
15410
  infopark.dialog.close(view);
15161
15411
  deferred.resolve();
15162
15412
  };
@@ -15165,12 +15415,11 @@ $(function() {
15165
15415
 
15166
15416
  infopark.transition(view, function() {
15167
15417
  view.addClass('ip_show');
15418
+ }).then(function() {
15419
+ infopark.dialog.adjust(view);
15420
+ infopark.editing.refresh(view.find('.ip_edit_dialog_markup').get(0));
15168
15421
  });
15169
15422
 
15170
- infopark.dialog.adjust(view);
15171
-
15172
- infopark.editing.refresh(markup);
15173
-
15174
15423
  return infopark.with_dialog_behaviour(deferred, {escape: cancel_action});
15175
15424
  }
15176
15425
  }
@@ -15329,6 +15578,22 @@ $(window).on('load', function () { infopark.inplace_menus.refresh_positions(); }
15329
15578
  );
15330
15579
  },
15331
15580
 
15581
+ edit_obj: function(obj) {
15582
+ return obj.fetch_edit_markup().then(function(markup) {
15583
+ var has_changes = false;
15584
+ var token = infopark.write_monitor.on('start_write', function() {
15585
+ has_changes = true;
15586
+ });
15587
+ var title = infopark.i18n.translate('current_page');
15588
+ return infopark.edit_dialog.open(title, markup, '&#xF03D;').then(function() {
15589
+ infopark.write_monitor.off(token);
15590
+ if (has_changes) {
15591
+ return infopark.with_saving_overlay(infopark.reload());
15592
+ }
15593
+ });
15594
+ });
15595
+ },
15596
+
15332
15597
  delete_obj: function(obj) {
15333
15598
  return infopark.confirmation_dialog({
15334
15599
  icon: '&#xF018;',
@@ -15347,20 +15612,21 @@ $(window).on('load', function () { infopark.inplace_menus.refresh_positions(); }
15347
15612
  return infopark.choose_obj_class_dialog(
15348
15613
  widget_field_element.fetch_widget_class_selection(), 'add_widget').then(
15349
15614
  function(obj_class) {
15350
- var new_dom_element;
15615
+ var dom_element;
15351
15616
  infopark.with_saving_overlay(
15352
15617
  widget_field_element.create_widget(obj_class).then(function(data) {
15353
- new_dom_element = $(data.markup);
15618
+ dom_element = $(data.markup);
15354
15619
  if (widget_element) {
15355
- widget_element.dom_element().after(new_dom_element);
15620
+ widget_element.dom_element().after(dom_element);
15356
15621
  } else {
15357
- widget_field_element.dom_element().append(new_dom_element);
15622
+ widget_field_element.dom_element().append(dom_element);
15358
15623
  }
15359
- infopark.editing.refresh(new_dom_element);
15360
- return widget_field_element.save();
15624
+ infopark.editing.refresh(dom_element.get(0));
15361
15625
  })
15362
15626
  ).then(function() {
15363
- infopark.ensure_fully_visible_within(new_dom_element, $('body'), $(window).height());
15627
+ return widget_field_element.save().then(function() {
15628
+ infopark.ensure_fully_visible_within(dom_element, $('body'), $(window).height());
15629
+ });
15364
15630
  });
15365
15631
  }
15366
15632
  );
@@ -15370,13 +15636,21 @@ $(window).on('load', function () { infopark.inplace_menus.refresh_positions(); }
15370
15636
  var obj = widget_element.obj();
15371
15637
  var dom_element = widget_element.dom_element();
15372
15638
  return widget_element.fetch_edit_markup().then(function(edit_markup) {
15639
+ var has_changes = false;
15640
+ var token = infopark.write_monitor.on('start_write', function() {
15641
+ has_changes = true;
15642
+ });
15373
15643
  return infopark.edit_dialog.open(obj.obj_class_name(), edit_markup).then(function() {
15374
- return infopark.with_element_overlay(dom_element,
15375
- widget_element.fetch_show_markup().then(function(show_markup) {
15376
- dom_element.replaceWith(show_markup);
15377
- infopark.editing.refresh();
15378
- })
15379
- );
15644
+ infopark.write_monitor.off(token);
15645
+ if (has_changes) {
15646
+ return infopark.with_element_overlay(dom_element,
15647
+ widget_element.fetch_show_markup().then(function(show_markup) {
15648
+ var new_dom_element = $(show_markup);
15649
+ dom_element.replaceWith(new_dom_element);
15650
+ infopark.editing.refresh(new_dom_element.get(0));
15651
+ })
15652
+ );
15653
+ }
15380
15654
  });
15381
15655
  });
15382
15656
  },
@@ -15389,14 +15663,11 @@ $(window).on('load', function () { infopark.inplace_menus.refresh_positions(); }
15389
15663
  title: infopark.i18n.translate('commands.delete_widget.confirm_title'),
15390
15664
  description: infopark.i18n.translate('commands.delete_widget.confirm_description')
15391
15665
  }).then(function() {
15392
- var delete_widget = function() {
15393
- widget_element.dom_element().remove();
15394
- infopark.editing.refresh();
15395
- return widget_field_element.save().then(function() {
15396
- return widget_element.obj().destroy();
15397
- });
15398
- };
15399
- infopark.with_saving_overlay(delete_widget());
15666
+ widget_element.dom_element().remove();
15667
+ infopark.editing.refresh();
15668
+ return widget_field_element.save().then(function() {
15669
+ return widget_element.obj().destroy();
15670
+ });
15400
15671
  });
15401
15672
  },
15402
15673
 
@@ -15497,7 +15768,7 @@ $(window).on('load', function () { infopark.inplace_menus.refresh_positions(); }
15497
15768
  update: function(event, ui) {
15498
15769
  infopark.editing.refresh();
15499
15770
  var widget_field_element = infopark.cms_element.from_dom_element(ui.item).widget_field();
15500
- infopark.with_saving_overlay(widget_field_element.save());
15771
+ widget_field_element.save();
15501
15772
  }
15502
15773
  }
15503
15774
  });
@@ -15576,7 +15847,6 @@ $(window).on('load', function () { infopark.inplace_menus.refresh_positions(); }
15576
15847
  image_upload: {
15577
15848
  init: function() {
15578
15849
  infopark.editing.on('activate', activate);
15579
- infopark.editing.on('refresh', activate);
15580
15850
 
15581
15851
  // Disable DnD for all elements by default to prevent the user
15582
15852
  // from accidentally opening an image in browser.
@@ -15601,27 +15871,23 @@ $(window).on('load', function () { infopark.inplace_menus.refresh_positions(); }
15601
15871
  var obj_id = dom_element.attr('data-ip-resource-source-obj-id');
15602
15872
  var field_name = dom_element.attr('data-ip-resource-source-field-name');
15603
15873
 
15604
- var create_resource_obj = function(blob_id) {
15874
+ var create_image = function(file) {
15605
15875
  var obj_name = file.name.replace(/[^a-z0-9_.$\-]/ig, '-');
15606
15876
  var path = '_resources/' + infopark.random_hex() + '/' + obj_name;
15607
- return infopark.obj.create({ blob: blob_id, _path: path, _obj_class: 'Image' });
15877
+ return infopark.obj.create({blob: file, _path: path, _obj_class: 'Image'});
15608
15878
  };
15609
15879
 
15610
- var link_resource_obj = function(resource_id) {
15880
+ var link_image = function(resource_id) {
15611
15881
  var attributes = {};
15612
15882
  attributes[field_name] = [{obj_id: resource_id}];
15613
15883
  return infopark.obj.create_instance(obj_id).save(attributes);
15614
15884
  };
15615
15885
 
15616
- infopark.with_saving_overlay(
15617
- infopark.blob.create(file).then(function(blob_id) {
15618
- return create_resource_obj(blob_id).then(function(resource_data) {
15619
- return link_resource_obj(resource_data.id()).then(function() {
15620
- return infopark.reload();
15621
- });
15622
- });
15623
- })
15624
- );
15886
+ infopark.with_saving_overlay(create_image(file).then(function(data) {
15887
+ return link_image(data.id()).then(function() {
15888
+ return infopark.reload();
15889
+ });
15890
+ }));
15625
15891
  }
15626
15892
 
15627
15893
  }
@@ -15730,6 +15996,18 @@ $(window).on('load', function () { infopark.inplace_menus.refresh_positions(); }
15730
15996
  }
15731
15997
  });
15732
15998
  }());
15999
+ (function() {
16000
+ $.extend(infopark, {
16001
+ warn_before_unloading: function() {
16002
+ if (infopark.write_monitor.is_writing()) {
16003
+ return infopark.i18n.translate('warn_before_unloading');
16004
+ }
16005
+ }
16006
+ });
16007
+ }());
16008
+
16009
+
16010
+
15733
16011
 
15734
16012
 
15735
16013
 
@@ -15780,8 +16058,8 @@ $(window).on('load', function () { infopark.inplace_menus.refresh_positions(); }
15780
16058
 
15781
16059
  infopark.redactor.init();
15782
16060
  infopark.inplace_menus.init();
15783
- infopark.deactivate_menu_bar_item.init();
15784
- infopark.delete_current_page_item.init();
16061
+ infopark.menu_bar_saving_indicator.init();
16062
+ infopark.menu_bar_dropdown.init();
15785
16063
  infopark.workspace_select.init();
15786
16064
  infopark.menu_bar.init();
15787
16065
  infopark.widget_menus.init();
@@ -15789,3 +16067,5 @@ infopark.widget_sorting.init();
15789
16067
  infopark.image_upload.init();
15790
16068
  infopark.child_list_menus.init();
15791
16069
  infopark.editable_workspace_dialog.init();
16070
+
16071
+ window.onbeforeunload = infopark.warn_before_unloading;