social_stream 0.22.1 → 0.23.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. data/base/app/assets/javascripts/activities.js.erb +0 -85
  2. data/base/app/assets/javascripts/social_stream.comments.js +63 -0
  3. data/base/app/assets/javascripts/social_stream.objects.js +23 -0
  4. data/base/app/assets/javascripts/social_stream.timeline.js +37 -10
  5. data/base/app/assets/javascripts/social_stream.wall.js.erb +135 -118
  6. data/base/app/assets/stylesheets/cheesecake.css.scss +6 -3
  7. data/base/app/models/activity_object.rb +18 -0
  8. data/base/app/models/activity_object_property.rb +5 -0
  9. data/base/app/views/activities/_new.html.erb +1 -1
  10. data/base/app/views/activities/_wall.html.erb +1 -1
  11. data/base/app/views/cheesecake/_cheesecake.html.erb +44 -10
  12. data/base/app/views/cheesecake/_index.html.erb +18 -130
  13. data/base/app/views/cheesecake/_sector_form.html.erb +176 -17
  14. data/base/app/views/comments/_new.html.erb +0 -14
  15. data/base/app/views/objects/_show.html.erb +6 -0
  16. data/base/app/views/toolbar/_home.html.erb +1 -1
  17. data/base/app/views/toolbar/_messages.html.erb +1 -1
  18. data/base/app/views/toolbar/_profile.html.erb +1 -1
  19. data/base/config/locales/es.yml +7 -0
  20. data/base/db/migrate/20120302215722_activity_object_properties.rb +24 -0
  21. data/base/lib/social_stream/ability/base.rb +2 -2
  22. data/base/lib/social_stream/base/version.rb +1 -1
  23. data/documents/app/assets/javascripts/social_stream-documents.js +5 -1
  24. data/documents/app/models/document.rb +4 -3
  25. data/documents/app/models/picture.rb +4 -0
  26. data/documents/lib/social_stream/documents/version.rb +1 -1
  27. data/documents/social_stream-documents.gemspec +1 -1
  28. data/events/app/assets/images/poster.png +0 -0
  29. data/events/app/assets/javascripts/social_stream-events.js +7 -0
  30. data/events/app/assets/javascripts/social_stream.events.poster.js +21 -0
  31. data/events/app/assets/stylesheets/events.css.scss +25 -0
  32. data/events/app/helpers/events_helper.rb +9 -0
  33. data/events/app/models/activity_object_property/poster.rb +2 -0
  34. data/events/app/models/event.rb +18 -0
  35. data/events/app/views/events/_event.html.erb +39 -27
  36. data/events/app/views/events/_form_poster.html.erb +8 -0
  37. data/events/app/views/events/edit.js.erb +5 -0
  38. data/events/config/locales/en.yml +2 -0
  39. data/events/config/locales/es.yml +2 -0
  40. data/events/lib/social_stream-events.rb +2 -1
  41. data/events/lib/social_stream/events/engine.rb +6 -0
  42. data/events/lib/social_stream/events/models/document.rb +26 -0
  43. data/events/lib/social_stream/events/version.rb +1 -1
  44. data/events/social_stream-events.gemspec +1 -1
  45. data/lib/social_stream/version.rb +1 -1
  46. data/linkser/lib/social_stream/linkser/version.rb +1 -1
  47. data/linkser/social_stream-linkser.gemspec +1 -1
  48. data/presence/app/assets/images/games/ter/classic_aspa.png +0 -0
  49. data/presence/app/assets/images/games/ter/classic_board.png +0 -0
  50. data/presence/app/assets/images/games/ter/classic_circle.png +0 -0
  51. data/presence/app/assets/images/games/ter/modern_aspa.png +0 -0
  52. data/presence/app/assets/images/games/ter/modern_board.png +0 -0
  53. data/presence/app/assets/images/games/ter/modern_circle.png +0 -0
  54. data/presence/app/assets/javascripts/jquery.ui.chatbox.sstreampresence.js +34 -3
  55. data/presence/app/assets/javascripts/presence.js.erb +4 -0
  56. data/presence/app/assets/javascripts/{xmpp_client_management.js.erb → presence_XmppClient.js.erb} +417 -49
  57. data/presence/app/assets/javascripts/{chat_audio.js.erb → presence_audio.js.erb} +0 -0
  58. data/presence/app/assets/javascripts/presence_game.js.erb +76 -0
  59. data/presence/app/assets/javascripts/presence_game_ter.js.erb +384 -0
  60. data/presence/app/assets/javascripts/presence_notifications.js +191 -0
  61. data/presence/app/assets/javascripts/{chat_parser.js → presence_parser.js} +0 -0
  62. data/presence/app/assets/javascripts/{chat_persistence.js → presence_persistence.js} +84 -70
  63. data/presence/app/assets/javascripts/{store.js → presence_store.js} +0 -0
  64. data/presence/app/assets/javascripts/{chat_interface_manager.js.erb → presence_uiManager.js.erb} +42 -132
  65. data/presence/app/assets/javascripts/{chat_utilities.js → presence_utilities.js} +10 -34
  66. data/presence/app/assets/javascripts/{videochat.js.erb → presence_videochat.js.erb} +4 -24
  67. data/presence/app/assets/javascripts/{chat_window_manager.js → presence_windowManager.js} +275 -217
  68. data/presence/app/assets/javascripts/social_stream-presence.js +0 -2
  69. data/presence/app/assets/stylesheets/chat.css.scss +12 -1
  70. data/presence/app/views/chat/_contacts.html.erb +5 -5
  71. data/presence/app/views/chat/_index.html.erb +10 -2
  72. data/presence/config/locales/en.yml +9 -1
  73. data/presence/config/locales/es.yml +9 -1
  74. data/presence/ejabberd/ejabberd_files.zip +0 -0
  75. data/presence/ejabberd/ejabberd_scripts/emanagement +132 -2
  76. data/presence/ejabberd/installer.sh +1 -0
  77. data/presence/ejabberd/mod_muc_admin/mod_muc_admin.beam +0 -0
  78. data/presence/ejabberd/mod_muc_admin/mod_muc_admin.erl +871 -0
  79. data/presence/ejabberd/mod_sspresence/mod_sspresence.beam +0 -0
  80. data/presence/lib/social_stream/presence/models/buddy_manager.rb +32 -26
  81. data/presence/lib/social_stream/presence/models/group_manager.rb +12 -2
  82. data/presence/lib/social_stream/presence/version.rb +1 -1
  83. data/presence/lib/social_stream/presence/xmpp_server_order.rb +2 -2
  84. data/presence/social_stream-presence.gemspec +1 -1
  85. data/presence/vendor/assets/javascripts/strophe.muc.js +1 -1
  86. data/social_stream.gemspec +5 -5
  87. metadata +63 -41
  88. data/events/app/assets/javascripts/0_init.js +0 -4
@@ -46,7 +46,7 @@
46
46
  padding: 0px;
47
47
  margin: 0px;
48
48
  overflow: hidden;
49
- height: 450px;
49
+ height: 425px;
50
50
  }
51
51
  #contacts_filter {
52
52
  width: 290px;
@@ -219,7 +219,7 @@
219
219
  width: 24px;
220
220
  height: 24px;
221
221
  float: left;
222
- padding: 2px 2px 0px 2px;
222
+ padding: 2px 2px 2px 2px;
223
223
  background-color: $fill-color;
224
224
  }
225
225
  #contacts_grid_selected .actor img {
@@ -274,6 +274,7 @@
274
274
  }
275
275
  #sector_form {
276
276
  width: 300px;
277
+ height: 425px;
277
278
  float: right;
278
279
  }
279
280
  #sector_form .title {
@@ -314,7 +315,8 @@
314
315
  color: $main-color;
315
316
  background: $auxiliar-color;
316
317
  width: 260px;
317
- height: 20px;
318
+ height: 14px;
319
+ line-height: 12px;
318
320
  text-align: center;
319
321
  font-size: 15px;
320
322
  font-weight: bold;
@@ -328,6 +330,7 @@
328
330
  text-align: center;
329
331
  font-size: 11px;
330
332
  padding: 5px 0px 5px 0px;
333
+ cursor: pointer;
331
334
  }
332
335
  #sector_form .subsector .title .edited_subsector_name {
333
336
  font-size: 11px;
@@ -20,6 +20,19 @@ class ActivityObject < ActiveRecord::Base
20
20
  has_many :activity_object_activities, :dependent => :destroy
21
21
  has_many :activities, :through => :activity_object_activities
22
22
 
23
+ has_many :activity_object_properties,
24
+ :dependent => :destroy
25
+ has_many :object_properties,
26
+ :through => :activity_object_properties,
27
+ :source => :property
28
+ has_many :activity_object_holders,
29
+ :class_name => "ActivityObjectProperty",
30
+ :foreign_key => :property_id,
31
+ :dependent => :destroy
32
+ has_many :object_holders,
33
+ :through => :activity_object_holders,
34
+ :source => :activity_object
35
+
23
36
  validates_presence_of :object_type
24
37
 
25
38
  scope :authored_by, lambda { |subject|
@@ -42,4 +55,9 @@ class ActivityObject < ActiveRecord::Base
42
55
  def acts_as_actor?
43
56
  object_type == "Actor"
44
57
  end
58
+
59
+ def object_holder_hash
60
+
61
+ end
62
+
45
63
  end
@@ -0,0 +1,5 @@
1
+ class ActivityObjectProperty < ActiveRecord::Base
2
+ belongs_to :activity_object
3
+ belongs_to :property,
4
+ :class_name => "ActivityObject"
5
+ end
@@ -51,7 +51,7 @@
51
51
 
52
52
  <%= javascript_tag do %>
53
53
  $(function(){
54
- SocialStream.Wall.setup();
54
+ SocialStream.Wall.init();
55
55
  });
56
56
  <% end %>
57
57
 
@@ -5,7 +5,7 @@
5
5
 
6
6
  <%= javascript_tag do %>
7
7
  $(function(){
8
- SocialStream.Timeline.setup();
8
+ SocialStream.Timeline.init();
9
9
  });
10
10
  <% end %>
11
11
 
@@ -1,4 +1,5 @@
1
1
  $(function(){
2
+ //Cheesecake settings
2
3
  var cheesecakeData = {
3
4
  container: {
4
5
  id: "contacts_cheesecake",
@@ -33,10 +34,14 @@ $(function(){
33
34
  rMax : 200,
34
35
  center: {x : 220, y : 220}
35
36
  };
37
+ //Adding Cheesecake settings the sectors and users information from social_stream
36
38
  cheesecakeData.sectors = <%= raw(current_subject.cheesecake_json) %>.sectors;
39
+ //Cheesecake is created
37
40
  var cheese = new socialCheesecake.Cheesecake(cheesecakeData);
41
+ //We dont use synchronized callbacks for focus
38
42
  cheese.syncSectorFocusCallbacks = false;
39
- cheese.onSectorFocusBegin = function(cheesecake,callback){
43
+ //Callback when a sector focusing begins
44
+ socialCheesecake.eventCallbackHandlers.onSectorFocusBegin = function(cheesecake,callback){
40
45
  if((cheese.highlightedSector)&&(cheese.highlightedSector.auxiliar)){
41
46
  $("#sector_editor").data("prepare")(cheese);
42
47
  $("#sector_editor").data("show")();
@@ -44,7 +49,8 @@ $(function(){
44
49
  $("#contacts_grid_available").fadeOut("fast", callback);
45
50
  }
46
51
  };
47
- cheese.onSectorFocusEnd = function(cheesecake){
52
+ //Callback when a sector focusing ends
53
+ socialCheesecake.eventCallbackHandlers.onSectorFocusEnd = function(cheesecake){
48
54
  if((cheese.highlightedSector)&&(cheese.highlightedSector.auxiliar)){
49
55
 
50
56
  }else{
@@ -53,7 +59,8 @@ $(function(){
53
59
  $("#edit_sector_button").fadeIn("fast");
54
60
  }
55
61
  };
56
- cheese.onSectorUnfocusBegin = function(cheesecake,callback){
62
+ //Callback when a sector unfocusing begins
63
+ socialCheesecake.eventCallbackHandlers.onSectorUnfocusBegin = function(cheesecake,callback){
57
64
  if((cheese.highlightedSector)&&(cheese.highlightedSector.auxiliar)){
58
65
 
59
66
  }else{
@@ -62,7 +69,8 @@ $(function(){
62
69
  $("#edit_sector_button").fadeOut("fast");
63
70
  }
64
71
  };
65
- cheese.onSectorUnfocusEnd = function(cheesecake){
72
+ //Callback when a sector unfocusing ends
73
+ socialCheesecake.eventCallbackHandlers.onSectorUnfocusEnd = function(cheesecake){
66
74
  if((cheese.highlightedSector)&&(cheese.highlightedSector.auxiliar)){
67
75
 
68
76
  }else{
@@ -73,14 +81,40 @@ $(function(){
73
81
  $("#sector_editor").data("hide")();
74
82
  }
75
83
  };
76
- cheese.onSubsectorAdded = function(subsector){
77
- $("#sector_editor").data("prepare")(subsector.getCheesecake(),subsector);
84
+ //Callback when adding a new subsector begins
85
+ socialCheesecake.eventCallbackHandlers.onSubsectorAddedBegin = function(subsector){
86
+ var cheesecake = subsector.getCheesecake();
87
+ $("#edit_sector_button").off("click.edit");
88
+ $("#edit_sector_button").fadeOut("fast",function(){
89
+ $("#edit_sector_button").html("<%= escape_javascript image_tag "btn/cheese_close_edit.png" %>");
90
+ $("#edit_sector_button").fadeIn("fast");
91
+ });
92
+ $("#sector_editor").data("prepare")(cheesecake, subsector, true);
93
+ $("#sector_editor").data("show")(function(){
94
+ $("#edit_sector_button").on("click.close_edit", cheesecake, $("#edit_sector_button").data("close_edit_sector_click"));
95
+ });
96
+ $(".subsector .content").each(function(){
97
+ if($(this).is(':visible')){
98
+ $(this).stop().slideToggle(500);
99
+ }
100
+ });
101
+ $("#sector_editor").data("prepare")(cheesecake,subsector,false);
102
+ $(".add_subsector").each(function(){
103
+ $(this).off("click");
104
+ });
105
+ };
106
+ //Callback when adding a new subsector ends
107
+ socialCheesecake.eventCallbackHandlers.onSubsectorAddedEnd = function(subsector){
108
+ $("#sector_editor").data("prepare")(subsector.getCheesecake(),subsector,false);
78
109
  };
79
110
  $("#contacts_filter_input").keyup(function(){
80
111
  cheese.filter($("#contacts_filter_input").val());
81
112
  //TODO: Make users unfiltered visible again
82
113
  });
83
- cheese.onChange = function(cheesecake){
114
+ //Callback when any change is made (added peopel, removed, edited or added secto, etc)
115
+ //This updates the changes hiddend field (sent when saving changes) and the detailed
116
+ //changes display
117
+ socialCheesecake.eventCallbackHandlers.onChange = function(cheesecake){
84
118
  var initial = cheesecake.getInitialState();
85
119
  var changes = cheesecake.getChanges();
86
120
  if((changes.actors)&&(changes.actors.length==0)&&(changes.sectors)&&(changes.sectors.length==0)&&(changes.subsectors)&&(changes.subsectors.length==0)){
@@ -162,7 +196,8 @@ $(function(){
162
196
  }
163
197
  }
164
198
  $("#contacts_changes_details").html(changes_html);
165
- }
199
+ }
200
+ //Tipsy for displaying detailed changes
166
201
  $('#contacts_changes_button').tipsy({
167
202
  delayIn: 0,
168
203
  delayOut: 0,
@@ -178,8 +213,7 @@ $(function(){
178
213
  });
179
214
  $("#contacts_save_changes").val(JSON.stringify(cheese.getChanges()));
180
215
  $("#contacts_save_form").off("submit.disable");
181
- $("#contacts_save_form").on("submit.disable",function(){
182
-
216
+ $("#contacts_save_form").on("submit.disable",function(){
183
217
  if($(".contacts_changes_tipsy_menu").length != 0){
184
218
  $("#contacts_changes_button").tipsy("hide");
185
219
  }
@@ -24,16 +24,6 @@
24
24
  <% end %>
25
25
  </div>
26
26
  </div>
27
- <div id="contacts_changes_button" style="display:none;">
28
- <%= t('cheesecake.changes.details') %> (<span id="contacts_changes_button_total">0</span>)
29
- </div>
30
- <div id="contacts_save" style="display:none;">
31
- <form action="<%= update_cheesecake_path %>" method="get" data-remote="true" id="contacts_save_form">
32
- <input type="submit" id="contacts_save_button" value="<%= t('cheesecake.changes.save') %>">
33
- <input type="hidden" id="contacts_save_changes" name="contacts_save_changes">
34
- </form>
35
- </div>
36
- <br class="clearfloat">
37
27
  <div id="contacts_changes">
38
28
  <div id="contacts_changes_title">
39
29
  <%= t('cheesecake.changes.details') %>
@@ -43,16 +33,23 @@
43
33
  </div>
44
34
  </div>
45
35
  </div>
36
+ <div id="contacts_changes_button" style="display:none;">
37
+ <%= t('cheesecake.changes.details') %> (<span id="contacts_changes_button_total">0</span>)
38
+ </div>
39
+ <div id="contacts_save" style="display:none;">
40
+ <form action="<%= update_cheesecake_path %>" method="get" data-remote="true" id="contacts_save_form">
41
+ <input type="submit" id="contacts_save_button" value="<%= t('cheesecake.changes.save') %>">
42
+ <input type="hidden" id="contacts_save_changes" name="contacts_save_changes">
43
+ </form>
44
+ </div>
45
+ <br class="clearfloat">
46
46
  <%= javascript_tag do %>
47
+ //Tweak to remove right bar
47
48
  $("#center_body").css("width","782px");
48
49
  $("#center_body").css("max-width","782px");
49
50
  $("#content").css("width","782px");
50
51
  $("#contacts_filter_input").Watermark("<%= escape_javascript(I18n.t('search.name')) %>");
51
- $("#contacts_grid_extra").click(function(){
52
- $("#contacts_grid").css("overflow-y","scroll");
53
- $("#contacts_grid").scrollTo("+=308px", 800, {axis:'y'});
54
- $("#contacts_grid_extra").css("opacity",0);
55
- });
52
+ //When clicking an unselected actor
56
53
  var unselected_actor_click = function(){
57
54
  var clone = $(this).clone();
58
55
  clone.attr("id",$(this).attr("id") + "_selected");
@@ -72,6 +69,7 @@
72
69
  $(this).fadeIn("fast");
73
70
  });
74
71
  };
72
+ //When clicking an selected actor
75
73
  var selected_actor_click = function(){
76
74
  var clone = $("#" + $(this).attr("id") + "_selected");
77
75
  $(this).fadeOut("fast",function(){
@@ -89,6 +87,7 @@
89
87
  clone.remove();
90
88
  });
91
89
  };
90
+ //Unselecting all actors
92
91
  $("#contacts_selector_clear").on("click",function(){
93
92
  $("#contacts_grid_selected .actor").each(function(){
94
93
  var evt = document.createEvent("MouseEvents");
@@ -98,6 +97,7 @@
98
97
  });
99
98
  });
100
99
  $(".actor").on("click.unselected_actor",unselected_actor_click);
100
+ //Detailed changes display
101
101
  $("#contacts_changes_button").click(function(){
102
102
  if($(".contacts_changes_tipsy_menu").length != 0){
103
103
  $("#contacts_changes_button").tipsy("hide");
@@ -112,120 +112,7 @@
112
112
  });
113
113
  }
114
114
  });
115
- $("#sector_editor").data("show", function(callback){
116
- $("#contacts_explorer").stop().animate({width: 0},500);
117
- $("#sector_editor").stop().animate({width: 300},500, function(){
118
- if(callback) callback();
119
- });
120
- });
121
- $("#sector_editor").data("hide", function(callback){
122
- $("#sector_editor").stop().animate({width: 0},500);
123
- $("#contacts_explorer").stop().animate({width: 300},500, function(){
124
- if(callback) callback();
125
- });
126
- });
127
- $("#sector_editor").data("prepare", function(cheese, newSubsector){
128
- var sector = cheese.getFocusedSector();
129
- var newIndex = -1;
130
- if(newSubsector){
131
- newIndex = newSubsector.getIndex();
132
- }
133
- if(sector){
134
- var subsector_count = sector.subsectors.length;
135
- var maxReached = (subsector_count==4);
136
- $("#form_sector_name").val(sector.label);
137
- $("#edited_sector_name").html(sector.label);
138
- $("#form_sector_name").off("keyup");
139
- $("#form_sector_name").on("keyup",function(){
140
- $("#edited_sector_name").html($("#form_sector_name").val());
141
- sector.changeLabel($("#form_sector_name").val());
142
- });
143
- if(maxReached){
144
- $(".add_subsector").each(function(){
145
- if($(this).is(':visible')){
146
- $(this).slideToggle();
147
- }
148
- })
149
- }
150
- for(var i = 3; i >= 0; i--){
151
- (function(){
152
- var subsector = sector.subsectors[i];
153
- var index = i;
154
- var recentlyCreated = (newIndex != -1)&&(newIndex == index);
155
- if(subsector){
156
- if(!$("#subsector_" + i).is(':visible')){
157
- $("#subsector_" + i).slideToggle();
158
- }
159
- if(recentlyCreated || ((newIndex == -1)&&(i == 0))){
160
- if(!$("#subsector_" + i).find(".content").is(':visible')){
161
- $("#subsector_" + i).find(".content").slideToggle();
162
- }
163
- }else{
164
- if($("#subsector_" + i).find(".content").is(':visible')){
165
- $("#subsector_" + i).find(".content").slideToggle();
166
- }
167
- }
168
- if(!maxReached){
169
- if(sector.subsectors[i+1]==undefined){
170
- $("#add_subsector_" + (i+1)).off("click");
171
- if(!$("#add_subsector_" + (i+1)).is(':visible')){
172
- $("#add_subsector_" + (i+1)).slideToggle();
173
- }
174
- $("#add_subsector_" + (i+1)).on("click",function(){
175
- cheese.addNewSubsector(index+1);
176
- $(".subsector .content").each(function(){
177
- if($(this).is(':visible')){
178
- $(this).slideToggle();
179
- }
180
- });
181
- });
182
- }
183
- $("#add_subsector_" + i).off("click");
184
- if(!$("#add_subsector_" + i).is(':visible')){
185
- $("#add_subsector_" + i).slideToggle();
186
- }
187
- $("#add_subsector_" + i).on("click",function(){
188
- cheese.addNewSubsector(index);
189
- $(".subsector .content").each(function(){
190
- if($(this).is(':visible')){
191
- $(this).slideToggle();
192
- }
193
- });
194
- });
195
- }
196
- $("#form_subsector_name_" + i).val(subsector.label);
197
- $("#edited_subsector_name_" + i).html(subsector.label);
198
- $("#form_subsector_name_" + i).off("keyup");
199
- $("#form_subsector_name_" + i).on("keyup", [i,subsector],function(event){
200
- $("#edited_subsector_name_" + event.data[0]).html($("#form_subsector_name_" + event.data[0]).val());
201
- event.data[1].changeLabel($("#form_subsector_name_" + event.data[0]).val());
202
- });
203
- $("#subsector_" + i).find(".permissions_field .permission").each(function(){
204
- var permission_field = $(this);
205
- var update_state = function(){
206
- var label_class = permission_field.attr("id").replace("form_", "edited_");
207
- if(permission_field.is(":checked")){
208
- $("." + label_class).removeClass("negative").addClass("positive");
209
- $("." + label_class).find(".negative_message").hide();
210
- $("." + label_class).find(".positive_message").show();
211
- }else{
212
- $("." + label_class).removeClass("positive").addClass("negative");
213
- $("." + label_class).find(".positive_message").hide();
214
- $("." + label_class).find(".negative_message").show();
215
- }
216
- }
217
- update_state();
218
- permission_field.on("change",update_state);
219
- });
220
- }else{
221
- $("#subsector_" + i).hide();
222
- $("#add_subsector_" + i).off("click");
223
- $("#add_subsector_" + i).hide();
224
- }
225
- })();
226
- }
227
- }
228
- });
115
+ //Opening editing sector form
229
116
  $("#edit_sector_button").data("edit_sector_click", function(event){
230
117
  var cheese = event.data;
231
118
  $("#edit_sector_button").off("click.edit");
@@ -233,11 +120,12 @@
233
120
  $("#edit_sector_button").html("<%= escape_javascript image_tag "btn/cheese_close_edit.png" %>");
234
121
  $("#edit_sector_button").fadeIn("fast");
235
122
  });
236
- $("#sector_editor").data("prepare")(cheese);
123
+ $("#sector_editor").data("prepare")(cheese, null, false);
237
124
  $("#sector_editor").data("show")(function(){
238
125
  $("#edit_sector_button").on("click.close_edit", cheese, $("#edit_sector_button").data("close_edit_sector_click"));
239
126
  });
240
127
  });
128
+ //Closing editing sector form
241
129
  $("#edit_sector_button").data("close_edit_sector_click", function(event){
242
130
  var cheese = event.data;
243
131
  $("#edit_sector_button").off("click.close_edit");
@@ -68,7 +68,7 @@
68
68
  </div>
69
69
  </div>
70
70
  <div class="form_row less_padding">
71
- <div class="add_subsector" id="add_subsector_<%= i %>">
71
+ <div class="add_subsector" id="add_subsector_<%= i %>" style="display:none;">
72
72
  +
73
73
  </div>
74
74
  </div>
@@ -78,6 +78,7 @@
78
78
 
79
79
  <%= javascript_tag do %>
80
80
  $(function(){
81
+ //Toggling between subsectors forms
81
82
  $(".subsector .title").off("click.toggle");
82
83
  $(".subsector .title").on("click.toggle",function(){
83
84
  if(!$(this).parent().find(".content").is(':visible')){
@@ -89,22 +90,180 @@
89
90
  $(this).parent().find(".content").slideToggle();
90
91
  }
91
92
  })
92
- });
93
- $(".permissions_field").each(function(){
94
- $(this).tipsy({
95
- delayIn: 500,
96
- delayOut: 200,
97
- gravity: 'e',
98
- offset: 100,
99
- opacity: 1,
100
- className: 'permissions_explanation_tipsy_menu',
101
- html: true,
102
- hoverable: true,
103
- title: function(){
104
- var html = $(this).parent().find('.permissions_explanation').html();
105
- var relation = $(this).parent().parent().find('.form_subsector_name').val();
106
- return html.replace(/%RELATION_NAME%/g, relation);
93
+ //Tipsy for permission fields
94
+ $(".permissions_field").each(function(){
95
+ $(this).tipsy({
96
+ delayIn: 500,
97
+ delayOut: 200,
98
+ gravity: 'e',
99
+ offset: 100,
100
+ opacity: 1,
101
+ className: 'permissions_explanation_tipsy_menu',
102
+ html: true,
103
+ hoverable: true,
104
+ title: function(){
105
+ var html = $(this).parent().find('.permissions_explanation').html();
106
+ var relation = $(this).parent().parent().find('.form_subsector_name').val();
107
+ return html.replace(/%RELATION_NAME%/g, relation);
108
+ }
109
+ });
110
+ });
111
+ //Showing form
112
+ $("#sector_editor").data("show", function(callback){
113
+ $("#contacts_explorer").stop().animate({width: 0},500);
114
+ $("#sector_editor").stop().animate({width: 300},500, function(){
115
+ if(callback) callback();
116
+ });
117
+ });
118
+ //Hidding form
119
+ $("#sector_editor").data("hide", function(callback){
120
+ $("#sector_editor").stop().animate({width: 0},500);
121
+ $("#contacts_explorer").stop().animate({width: 300},500, function(){
122
+ if(callback) callback();
123
+ });
124
+ });
125
+ //Preparing form
126
+ $("#sector_editor").data("prepare", function(cheese, newSubsector, noAdding){
127
+ var sector = cheese.getFocusedSector();
128
+ var newIndex = -1;
129
+ var defaultPermissions = "true,true,true,false,false";
130
+ if(newSubsector != undefined){
131
+ //newSubsector is used when we prepare the form just after creating a subsector
132
+ newIndex = newSubsector.getIndex();
133
+ }
134
+ if(noAdding == undefined){
135
+ //noAdding tweat when creating a subsector
136
+ noAdding = false;
107
137
  }
138
+ if(sector){
139
+ var subsector_count = sector.subsectors.length;
140
+ var maxReached = (subsector_count==4);
141
+ $("#form_sector_name").val(sector.label);
142
+ $("#edited_sector_name").html(sector.label);
143
+ $("#form_sector_name").off("keyup");
144
+ $("#form_sector_name").on("keyup",function(){
145
+ $("#edited_sector_name").html($("#form_sector_name").val());
146
+ sector.changeLabel($("#form_sector_name").val());
147
+ });
148
+ if(maxReached){
149
+ $(".add_subsector").each(function(){
150
+ /*if($(this).is(':visible')){
151
+ $(this).slideToggle();
152
+ }*/
153
+ $(this).hide();
154
+ })
155
+ }
156
+ for(var i = 3; i >= 0; i--){
157
+ (function(){
158
+ var subsector = sector.subsectors[i];
159
+ var index = i;
160
+ var recentlyCreated = (newIndex != -1)&&(newIndex == index);
161
+ if(subsector){
162
+ if(noAdding && (newIndex != -1)){
163
+ //Tweat to move permissions fields when a subsector is created below
164
+ if(i > newIndex){
165
+ $("#subsector_" + i).find(".permissions_field").data("fromString")($("#subsector_" + (i-1)).find(".permissions_field").data("toString")());
166
+ }else if(i == newIndex){
167
+ $("#subsector_" + i).find(".permissions_field").data("fromString")(defaultPermissions);
168
+ }
169
+ }
170
+ //Sliding content with different times as Cheesecake animation durations change
171
+ if(!noAdding && (recentlyCreated || ((newIndex == -1)&&(i == 0)))){
172
+ if(!$("#subsector_" + i).find(".content").is(':visible')){
173
+ var time = 1000;
174
+ if(subsector_count==2){
175
+ time = 2200;
176
+ }else if(subsector_count==3){
177
+ time = 1000;
178
+ }else if(subsector_count==4){
179
+ time = 650;
180
+ }
181
+ $("#subsector_" + i).find(".content").stop().slideToggle(time);
182
+ }
183
+ }else{
184
+ $("#subsector_" + i).find(".content").hide();
185
+ }
186
+ $("#subsector_" + i).stop().show();
187
+ //Adding buttons are only shonw if the maximum was not reached
188
+ if(!maxReached){
189
+ if(sector.subsectors[i+1]==undefined){
190
+ $("#add_subsector_" + (i+1)).off("click");
191
+ if(!$("#add_subsector_" + (i+1)).is(':visible')){
192
+ $("#add_subsector_" + (i+1)).stop().slideToggle();
193
+ }
194
+ if(!noAdding){
195
+ $("#add_subsector_" + (i+1)).on("click",function(){
196
+ $("#add_subsector_" + (index+1)).off("click");
197
+ cheese.addNewSubsector(index+1);
198
+ });
199
+ }
200
+ }
201
+ $("#add_subsector_" + i).off("click");
202
+ if(!$("#add_subsector_" + i).is(':visible')){
203
+ $("#add_subsector_" + i).stop().slideToggle();
204
+ }
205
+ if(!noAdding){
206
+ $("#add_subsector_" + i).on("click",function(){
207
+ $("#add_subsector_" + index).off("click");
208
+ cheese.addNewSubsector(index);
209
+ });
210
+ }
211
+ }
212
+ $("#form_subsector_name_" + i).val(subsector.label);
213
+ $("#edited_subsector_name_" + i).html(subsector.label);
214
+ $("#form_subsector_name_" + i).off("keyup");
215
+ $("#form_subsector_name_" + i).on("keyup", [i,subsector],function(event){
216
+ $("#edited_subsector_name_" + event.data[0]).html($("#form_subsector_name_" + event.data[0]).val());
217
+ event.data[1].changeLabel($("#form_subsector_name_" + event.data[0]).val());
218
+ });
219
+ $("#subsector_" + i).find(".permissions_field .permission").each(function(){
220
+ var permission_field = $(this);
221
+ var update_state = function(){
222
+ var label_class = permission_field.attr("id").replace("form_", "edited_");
223
+ if(permission_field.is(":checked")){
224
+ $("." + label_class).removeClass("negative").addClass("positive");
225
+ $("." + label_class).find(".negative_message").hide();
226
+ $("." + label_class).find(".positive_message").show();
227
+ }else{
228
+ $("." + label_class).find(".positive_message").hide();
229
+ $("." + label_class).find(".negative_message").show();
230
+ }
231
+ }
232
+ update_state();
233
+ permission_field.on("change",update_state);
234
+ });
235
+ }else{
236
+ $("#subsector_" + i).hide();
237
+ //$("#add_subsector_" + i).off("click");
238
+ //$("#add_subsector_" + i).hide();
239
+ }
240
+ })();
241
+ }
242
+ }
243
+ });
244
+ // toString and fromString methods for permissions fields
245
+ // to move permissions fileds from one sector to another
246
+ $(".permissions_field").each(function(){
247
+ var permissionsField = $(this)
248
+ permissionsField.data("toString", function(){
249
+ var permissions = []
250
+ permissionsField.find("input").each(function(){
251
+ permissions.push($(this).is(":checked"));
252
+ });
253
+ return permissions.toString();
254
+ });
108
255
  });
109
- });
256
+ $(".permissions_field").each(function(){
257
+ var permissionsField = $(this)
258
+ permissionsField.data("fromString", function(values){
259
+ var permissions = values.split(",");
260
+ for(var i in permissions){
261
+ permissions[i] = (permissions[i] === "true");
262
+ permissionsField.find("input").eq(i).attr('checked', permissions[i]);
263
+ }
264
+ console.log(permissions);
265
+ });
266
+ });
267
+ });
268
+
110
269
  <% end %>