infopark_cloud_connector 6.9.2.1.125136549 → 6.9.3.1.36404185

Sign up to get free protection for your applications and to get access to all the features.
@@ -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;