it-logica-application-backbone 1.1.8 → 1.2.0

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.
Files changed (26) hide show
  1. data/VERSION +1 -1
  2. data/app/assets/javascripts/backbone_js/bootstrap_modal.js +234 -0
  3. data/app/assets/javascripts/backbone_js/ladas_breadcrumb.js.coffee +15 -2
  4. data/app/assets/javascripts/backbone_js/ladas_editable_table_aligner.js.coffee +243 -0
  5. data/app/assets/javascripts/backbone_js/ladas_editable_table_builder.js.coffee +341 -0
  6. data/app/assets/javascripts/backbone_js/ladas_editable_table_modal_dialog.js.coffee +93 -0
  7. data/app/assets/javascripts/backbone_js/ladas_functions.js +8 -0
  8. data/app/assets/javascripts/backbone_js/ladas_saving.js +6 -0
  9. data/app/assets/javascripts/backbone_js/ladas_table_builder.js.coffee +1 -1
  10. data/app/assets/stylesheets/backbone_css/bootstrap_modal.css +139 -0
  11. data/app/assets/stylesheets/backbone_css/design.css +1 -1
  12. data/app/assets/stylesheets/backbone_css/editable_tables.css.scss +108 -0
  13. data/app/views/helpers/editable_table/_build_ajax_callback_code.html.erb +3 -0
  14. data/app/views/helpers/editable_table/_build_table.html.erb +128 -0
  15. data/app/views/helpers/editable_table/_build_table_data.html.erb +14 -0
  16. data/app/views/helpers/editable_table/_build_table_filter.html.erb +70 -0
  17. data/app/views/helpers/editable_table/_build_table_header.html.erb +136 -0
  18. data/app/views/helpers/editable_table/_build_table_pager.html.erb +31 -0
  19. data/app/views/helpers/editable_table/_build_table_text_description.html.erb +66 -0
  20. data/app/views/helpers/editable_table/_build_table_wrapper.html.erb +106 -0
  21. data/it-logica-application-backbone.gemspec +16 -2
  22. data/lib/model_mixins/table_builder_class_methods.rb +49 -0
  23. data/lib/table_settings/table_action.rb +5 -0
  24. data/lib/table_settings/table_column.rb +11 -0
  25. data/lib/view_mixins/table.rb +5 -0
  26. metadata +29 -15
@@ -0,0 +1,341 @@
1
+ class EditableTableBuilder
2
+ @render_tbody: (obj) ->
3
+ EditableTableBuilder.obj = obj
4
+
5
+ EditableTableBuilder.html = ""
6
+
7
+ EditableTableBuilder.make_table()
8
+
9
+
10
+ return EditableTableBuilder.html
11
+
12
+
13
+ @update_rows: (obj) ->
14
+ EditableTableBuilder.obj = obj
15
+ row_count = 0
16
+ for row in EditableTableBuilder.obj.data
17
+ do (row) ->
18
+ EditableTableBuilder.html = ""
19
+ row_count += 1
20
+
21
+ # load and render new row
22
+ EditableTableBuilder.add_row_checkboxes(row, row_count)
23
+ EditableTableBuilder.add_row_functions(row, row_count)
24
+ EditableTableBuilder.add_row_columns(row, row_count)
25
+
26
+
27
+
28
+ row_color = ""
29
+ if EditableTableBuilder.obj.row_colors?
30
+ if EditableTableBuilder.obj.row_colors[row.row_id]?
31
+ row_color = EditableTableBuilder.obj.row_colors[row.row_id]["color"]
32
+ row_background_color = EditableTableBuilder.obj.row_colors[row.row_id]["background_color"]
33
+
34
+ # update row
35
+ $('.centerContainer tr[data-row-id="' + row.row_id + '"]').html(EditableTableBuilder.html).css({"background-color" : row_background_color, "color" : row_color })
36
+
37
+ EditableTableAligner.align_after_rows_update(obj)
38
+
39
+ #############################################################################33
40
+ ##############################private #######################################333
41
+ ##############################################################################33
42
+
43
+
44
+ @make_table: ->
45
+ row_count = 0
46
+ for row in EditableTableBuilder.obj.data
47
+ do (row) ->
48
+ row_count += 1
49
+ EditableTableBuilder.html += '<tr data-row-count-number="' + row_count + '"'
50
+ console.log(EditableTableBuilder.obj.row_colors)
51
+ if EditableTableBuilder.obj.row_colors?
52
+ if EditableTableBuilder.obj.row_colors[row.row_id]?
53
+ style = 'color:' + EditableTableBuilder.obj.row_colors[row.row_id]["color"]
54
+ style += '; background-color:' + EditableTableBuilder.obj.row_colors[row.row_id]["background_color"]
55
+ EditableTableBuilder.html += ' style="' + style+ '"'
56
+
57
+ EditableTableBuilder.html += ' data-row-id="' + row.row_id + '">'
58
+
59
+ # todo make possible to insertt function on the first or last column
60
+ EditableTableBuilder.add_row_checkboxes(row, row_count)
61
+ EditableTableBuilder.add_row_functions(row, row_count)
62
+ EditableTableBuilder.add_row_columns(row, row_count)
63
+
64
+ EditableTableBuilder.html += '</tr>'
65
+
66
+ EditableTableBuilder.add_summary_row()
67
+
68
+ @add_summary_row: ->
69
+ functions_present = EditableTableBuilder.obj.row? && EditableTableBuilder.obj.row.functions?
70
+
71
+ # code for sumarizes of the page (paginated)
72
+ summarize_page_present = false
73
+ summarize_page = ""
74
+ summarize_page += '<tr class="summarize_page" data-row-count-number="summarize_page">'
75
+ # todo make sure functions collumn got skipped when placement is different, eg. on the end
76
+
77
+ if EditableTableBuilder.obj.static_columns_left_side?
78
+ summarize_page += '<td class="summarize headcol" colspan="2"><span class="label">Celkem na stránce: </span></td>' if EditableTableBuilder.obj.checkboxes?
79
+ summarize_page += '<td class="summarize headcol">Celkem na stránce: </td>' if functions_present && !EditableTableBuilder.obj.checkboxes?
80
+ else
81
+ summarize_page += '<td class="summarize headcol" colspan="2"><span class="label">Celkem na stránce: </span></td>' if EditableTableBuilder.obj.checkboxes?
82
+ summarize_page += '<td class="summarize headcol">Celkem na stránce: </td>' if functions_present && !EditableTableBuilder.obj.checkboxes?
83
+
84
+ #headcol" if ((EditableTableBuilder.obj.static_columns_left_side).indexOf(col.name) != -1)
85
+
86
+ col_count = 0
87
+ for col in EditableTableBuilder.obj.columns
88
+ do (col) ->
89
+ col_count += 1
90
+ # the sumarize label has 2 colspan, so it has to be without 1 first column if there is no function column
91
+ unless col_count == 1 && !functions_present
92
+ summarize_page += '<td class="summarize ' + col.class
93
+ summarize_page += " headcol" if ((EditableTableBuilder.obj.static_columns_left_side).indexOf(col.name) != -1)
94
+ summarize_page += '">'
95
+
96
+ if col.summarize_page? || col.summarize_page_value?
97
+ summarize_page_present = true
98
+ summarize_page += '<div class="summarize_page non-breakable-collumn">'
99
+ summarize_page += if col.summarize_page_label? then col.summarize_page_label else ''
100
+ summarize_page += '<span class="value">'
101
+ summarize_page += if col.summarize_page_value? then col.summarize_page_value else 0
102
+ summarize_page += '</span>'
103
+ summarize_page += '</div>'
104
+
105
+ summarize_page += '</td>'
106
+ summarize_page += '</tr>'
107
+
108
+
109
+ EditableTableBuilder.html += summarize_page if summarize_page_present
110
+
111
+ # code for sumarizes of the all filtered data (paginated is not used)
112
+ summarize_all_present = false
113
+ summarize_all = ""
114
+ summarize_all += '<tr class="summarize_all" data-row-count-number="summarize_all">'
115
+
116
+ if EditableTableBuilder.obj.static_columns_left_side?
117
+ summarize_all += '<td class="summarize headcol" colspan="2"><span class="label">Celkem: </span></td>' if EditableTableBuilder.obj.checkboxes?
118
+ #it has colspan 2 so there is no function column
119
+ summarize_all += '<td class="summarize headcol">Celkem: </td>' if functions_present && !EditableTableBuilder.obj.checkboxes?
120
+ else
121
+ summarize_all += '<td class="summarize headcol" colspan="2"><span class="label">Celkem: </span></td>' if EditableTableBuilder.obj.checkboxes?
122
+ #it has colspan 2 so there is no function column
123
+ summarize_all += '<td class="summarize headcol">Celkem: </td>' if functions_present && !EditableTableBuilder.obj.checkboxes?
124
+
125
+ col_count = 0
126
+ for col in EditableTableBuilder.obj.columns
127
+ do (col) ->
128
+ col_count += 1
129
+ # the sumarize label has 2 colspan, so it has to without 1 first column if there is no function column
130
+ unless col_count == 1 && !functions_present
131
+ summarize_all += '<td class="summarize ' + col.class
132
+ summarize_all += " headcol" if ((EditableTableBuilder.obj.static_columns_left_side).indexOf(col.name) != -1)
133
+ summarize_all += '">'
134
+
135
+ if col.summarize_all? || col.summarize_all_value?
136
+ summarize_all_present = true
137
+ summarize_all += '<div class="summarize_all non-breakable-collumn">'
138
+ summarize_all += if col.summarize_all_label? then col.summarize_all_label else ''
139
+ summarize_all += '<span class="value">'
140
+ summarize_all += if col.summarize_all_value? then col.summarize_all_value else 0
141
+ summarize_all += '</span>'
142
+ summarize_all += '</div>'
143
+ summarize_all += '</td>'
144
+ summarize_all += '</tr>'
145
+
146
+ EditableTableBuilder.html += summarize_all if summarize_all_present
147
+
148
+ @add_row_checkboxes: (row, row_count) ->
149
+ if EditableTableBuilder.obj.checkboxes?
150
+
151
+ el_class = "chbox"
152
+ el_class += static_left_column_class = " headcol" if EditableTableBuilder.obj.static_columns_left_side?
153
+
154
+ if row_count == 1
155
+ EditableTableBuilder.html += '<td class="' + el_class + '" '
156
+ EditableTableBuilder.html += 'data-width-align-id="special_checbox_filtering"'
157
+ else
158
+ EditableTableBuilder.html += '<td class="' + el_class + '" '
159
+ EditableTableBuilder.html += '">'
160
+
161
+ EditableTableBuilder.html += '<input type="checkbox" class="row_checkboxes" name="checkboxes[' + row.row_id + ']"'
162
+ EditableTableBuilder.html += ' onclick="CheckboxPool.change($(this))"'
163
+ #console.log CheckboxPool.get_pool_by_form_id(TableBuilder.obj.form_id, row.row_id)
164
+ #console.log CheckboxPool.include_value(TableBuilder.obj.form_id, row.row_id)
165
+ EditableTableBuilder.html += ' checked="checked"' if CheckboxPool.include_value(EditableTableBuilder.obj.form_id, row.row_id)
166
+ EditableTableBuilder.html += ' value="' + row.row_id + '">'
167
+
168
+
169
+ EditableTableBuilder.html += '</td>'
170
+
171
+
172
+ @add_row_functions: (row, row_count) ->
173
+ if EditableTableBuilder.obj.row? && EditableTableBuilder.obj.row.functions?
174
+ static_left_column_class = ""
175
+ static_left_column_class = "headcol" if EditableTableBuilder.obj.static_columns_left_side?
176
+
177
+ if row_count == 1
178
+ EditableTableBuilder.html += '<td class="' + static_left_column_class + '"'
179
+ EditableTableBuilder.html += 'data-width-align-id="special_functions">'
180
+ else
181
+ EditableTableBuilder.html += '<td class="' + static_left_column_class + '">'
182
+
183
+ # todo editacni tabulka si bude mit fixni vysku radku
184
+ EditableTableBuilder.html += '<div class="non-breakable-collumn">' if true
185
+ #col.non_breakable? && col.non_breakable
186
+
187
+ for function_name, settings of EditableTableBuilder.obj.row.functions
188
+ EditableTableBuilder.make_row_function_button(settings, row)
189
+
190
+ EditableTableBuilder.html += '</div>'
191
+ EditableTableBuilder.html += '</td>'
192
+
193
+ @add_row_columns: (row, row_count) ->
194
+ for col in EditableTableBuilder.obj.columns
195
+ do (col) ->
196
+ cell_name = ""
197
+ cell_name += col.table if col.table?
198
+ cell_name += '___' + col.name if col.name?
199
+
200
+
201
+ EditableTableBuilder.html += '<td '
202
+
203
+ if EditableTableBuilder.obj.cell_colors?
204
+ if EditableTableBuilder.obj.cell_colors[row.row_id]?
205
+ if EditableTableBuilder.obj.cell_colors[row.row_id][col.name]?
206
+ style = 'background-color:' + EditableTableBuilder.obj.cell_colors[row.row_id][col.name]["background_color"] + ' !important'
207
+ style += '; color:' + EditableTableBuilder.obj.cell_colors[row.row_id][col.name]["color"] + ' !important'
208
+ EditableTableBuilder.html += ' style="' + style + '"'
209
+
210
+ if col.editable?
211
+ EditableTableBuilder.html += ' data-cell-identifier="' + cell_name + "___" + row.row_id + '"'
212
+ EditableTableBuilder.html += ' onclick="EditableTableModalDialog.show(this, \'' + EditableTableBuilder.obj.editable_table_edit_cell_path + '\')"'
213
+
214
+ # row number 1 of body is for width synchronizin with header (if I edit first row, it will affect all others)
215
+ if row_count == 1
216
+ EditableTableBuilder.html += ' data-width-align-id="'
217
+ EditableTableBuilder.html += cell_name
218
+ EditableTableBuilder.html += '"'
219
+
220
+ EditableTableBuilder.html += ' class="' + col.class
221
+ # adding colhead class, determines if it will be moved to static left column
222
+ EditableTableBuilder.html += " headcol" if ((EditableTableBuilder.obj.static_columns_left_side).indexOf(col.name) != -1)
223
+ EditableTableBuilder.html += " editable_cell" if col.editable?
224
+ EditableTableBuilder.html += '"'
225
+
226
+ EditableTableBuilder.html += '">'
227
+
228
+ # todo editacni tabulka si bude mit fixni vysku radku
229
+ EditableTableBuilder.html += '<div class="non-breakable-collumn">' if true
230
+ #col.non_breakable? && col.non_breakable
231
+
232
+ if (is_hash(row[col.table + '_' + col.name]))
233
+ # hash span or href (styled as button)
234
+ button_settings = row[col.table + '_' + col.name]
235
+ button_settings = {} if !button_settings?
236
+ EditableTableBuilder.make_column_from_hash(button_settings, row, col)
237
+
238
+ else if (is_array(row[col.table + '_' + col.name]))
239
+ # array of hashes (probably buttons)
240
+ one_cell_buttons = row[col.table + '_' + col.name]
241
+ for one_cell_button in one_cell_buttons
242
+ do (one_cell_button) ->
243
+ one_cell_button = {} if !one_cell_buttons?
244
+ EditableTableBuilder.make_column_from_hash(one_cell_button, row, col)
245
+
246
+ else if (is_string(row[col.table + '_' + col.name]))
247
+ # its just string
248
+ text = ""
249
+ text = row[col.table + '_' + col.name] if row[col.table + '_' + col.name]?
250
+ text = row[col.name] if row[col.name]? && text? && text.length <= 0
251
+
252
+ sliced_text = text
253
+ if (col.max_text_length)
254
+ max = col.max_text_length - 3
255
+ sliced_text = sliced_text.slice(0, col.max_text_length) + "..." if ( max > 0 && sliced_text.length > max)
256
+ else
257
+ # i will be always slicing
258
+ max = 30
259
+ sliced_text = sliced_text.slice(0, max + 3) + "..." if ( max > 0 && sliced_text.length > max)
260
+
261
+ EditableTableBuilder.html += '<span title="' + text + '">' + sliced_text + '</span>'
262
+
263
+ else
264
+ # its something else eg. number cant be sliced, or its probably aliens Kveigars
265
+ text = ""
266
+ text = row[col.table + '_' + col.name] if row[col.table + '_' + col.name]?
267
+ text = row[col.name] if row[col.name]? && text? && text.length <= 0
268
+ # console.log[text]
269
+
270
+ EditableTableBuilder.html += '<span title="' + text + '">' + text + '</span>'
271
+ EditableTableBuilder.html += '</div>' if col.non_breakable? && col.non_breakable
272
+ EditableTableBuilder.html += '</td>'
273
+
274
+
275
+ @make_href_button: (settings, row, col) ->
276
+ sliced_text = settings['name']
277
+ if col?
278
+ if (col.max_text_length)
279
+ max = col.max_text_length - 3
280
+ sliced_text = sliced_text.slice(0, col.max_text_length) + "..." if ( max > 0 && sliced_text.length > max)
281
+
282
+ it_is_link = false
283
+ it_is_link = true if (settings.url || settings.symlink_controller || settings.symlink_action || settings.symlink_id || settings.symlink_outer_controller || settings.symlink_outer_id)
284
+
285
+
286
+ if it_is_link
287
+ stringified_settings = JSON.stringify(settings)
288
+
289
+ stringified_settings = stringified_settings.replace(/"/g, '&quot;')
290
+ # this is crutial unless the double quotes will fuck up html
291
+ non_ajax_url = build_get_url(settings)
292
+ EditableTableBuilder.html += '<a href="' + non_ajax_url + '"'
293
+ else
294
+ EditableTableBuilder.html += '<span'
295
+
296
+ EditableTableBuilder.html += ' class="' + settings.class + '"' if settings.class?
297
+ if settings.title?
298
+ EditableTableBuilder.html += ' title="' + settings.title + '"'
299
+ else
300
+ EditableTableBuilder.html += ' title="' + settings.name + '"'
301
+
302
+ EditableTableBuilder.html += ' data-tr_class="' + settings.tr_class + '"' if settings.tr_class?
303
+ EditableTableBuilder.html += ' data-td_class="' + settings.td_class + '"' if settings.td_class? && settings.td_class.length > 0
304
+
305
+ if it_is_link
306
+ if (settings.confirm)
307
+ EditableTableBuilder.html += ' onclick="if (confirm(\'' + settings.confirm + '\')){ load_page(' + stringified_settings + ',this); }; return false;"'
308
+ else
309
+ EditableTableBuilder.html += ' onclick="load_page(' + stringified_settings + ',this); return false;"'
310
+
311
+ else if settings.js_code?
312
+ # a javascrip code can be passed, it will be put as onclick javascript of the button
313
+ EditableTableBuilder.html += ' onclick="' + settings.js_code
314
+ EditableTableBuilder.html += '"'
315
+
316
+ EditableTableBuilder.html += '>' + sliced_text
317
+
318
+ if it_is_link
319
+ EditableTableBuilder.html += '</a>'
320
+ else
321
+ EditableTableBuilder.html += '</span>'
322
+
323
+
324
+
325
+
326
+ @make_row_function_button: (button_settings, row, col) ->
327
+ button_settings.symlink_id = row.row_id if row?
328
+ # only for generic row functions, they are defined without the id
329
+ EditableTableBuilder.make_href_button(button_settings, row, col)
330
+
331
+ @make_column_from_hash: (button_settings, row, col) ->
332
+ button_settings['origin'] = 'table'
333
+ EditableTableBuilder.make_href_button(button_settings, row, col)
334
+
335
+
336
+ window.EditableTableBuilder = EditableTableBuilder
337
+
338
+
339
+
340
+
341
+
@@ -0,0 +1,93 @@
1
+ class EditableTableModalDialog
2
+ @init: (modal_id) ->
3
+ # init will be called only once
4
+ EditableTableModalDialog.modal_id = modal_id
5
+ modal_id_jquery = '#' + modal_id
6
+
7
+ # I want to focus the input in the modal, but I can do this onlz after it's shown
8
+ $(modal_id_jquery).on('shown', ->
9
+ EditableTableModalDialog.focus()
10
+ )
11
+
12
+ # on enter I want to submit form inside
13
+ $(modal_id_jquery).on('keyup', (e) ->
14
+ event_obj = e
15
+
16
+ unless event_obj?
17
+ if window.event
18
+ event_obj = window.event
19
+ else
20
+ #FF uses this
21
+ event_obj =event.which;
22
+
23
+
24
+
25
+ # We don't want this to act as a link so cancel the link action
26
+ event_obj .stopPropagation()
27
+ event_obj .preventDefault()
28
+
29
+
30
+ # if enter pressed
31
+ if event_obj.keyCode == 13
32
+ if (!event_obj.shiftKey && !event_obj.ctrlKey)
33
+ #Find form and submit it
34
+ $(modal_id_jquery).find('form').submit();
35
+ # todo zjistit jak oddelat onkey down asi ze submitu, ted se form pri stiknuti enteru posila dvakrat, jenom kdzy jsem v testarei, tak ne
36
+ # todo zatim jsem to osral tim ze jsem dal do fromu prazdny button ktery ty eventy odchytava a pak to funguje hezky, musim to ale udelat jinak
37
+ #console.log($(modal_id_jquery).find('input[type="submit"]')) # nekde ten button je, musim ho najit a deaktivovat
38
+ )
39
+
40
+
41
+
42
+
43
+ @show: (cell_element, edit_cell_path) ->
44
+ cell_id = $(cell_element).data("cell-identifier")
45
+
46
+ url = "fill_the_url_in_controller"
47
+ url = edit_cell_path if edit_cell_path?
48
+ url += "?cell_id=" + cell_id
49
+
50
+ # load the content of modal
51
+ load_page({
52
+ "content_id": "modal_cell_editing",
53
+ 'symlink_remote': true,
54
+ 'url': url,
55
+ "no_tracking": true
56
+
57
+ })
58
+
59
+ #show the modal and then it will be loaded with data
60
+ #$('#modal_cell_editing').modal('show')
61
+
62
+
63
+ # asynchronosly put content of modal when it is prepared and show it
64
+ $(document).bind('page_loader.loaded', EditableTableModalDialog.display)
65
+
66
+
67
+
68
+ @hide: ->
69
+ $('#modal_cell_editing').modal('hide')
70
+
71
+ #############################################3
72
+ ############## private #####################
73
+
74
+
75
+ @display: ->
76
+ $('#modal_cell_editing').modal('show')
77
+
78
+ # unbing the event and the handler, it should remove only this one binded handler
79
+ # todo check if this wont remove other binded handlers !!!!!!!!!!!!
80
+ $(document).unbind('page_loader.loaded', EditableTableModalDialog.display)
81
+
82
+
83
+ @focus: ->
84
+ if ($('#modal_cell_editing').find('[data-focus-id="this_will_be_focused_input_id"]').length > 0)
85
+ $('#modal_cell_editing').find('[data-focus-id="this_will_be_focused_input_id"]').focus()
86
+ $('#modal_cell_editing').find('[data-focus-id="this_will_be_focused_input_id"]').focus()
87
+
88
+ window.EditableTableModalDialog = EditableTableModalDialog
89
+
90
+
91
+
92
+
93
+
@@ -10,4 +10,12 @@ function is_array(object) {
10
10
 
11
11
  function is_string(object) {
12
12
  return object && (Object.prototype.toString.call(object) == '[object String]');
13
+ }
14
+
15
+
16
+ function mark_active_color_box(obj)
17
+ {
18
+ $(obj).parents(".colors_block").find("label").removeClass("active")
19
+ $(obj).addClass("active")
20
+
13
21
  }
@@ -28,6 +28,12 @@ function connect_callback_to_form(caller_id) {
28
28
  process_error_data(form, data);
29
29
  Alert.show("#" + caller_id);
30
30
  }
31
+ else if (data['status'] == "modal-ok") {
32
+ Alert.show("#" + caller_id);
33
+ // todo bud sem dat zpoydeni nebo tu message yobrayit jinak, takhle se hned schova dialog a s nim i message
34
+ EditableTableModalDialog.hide();
35
+ EditableTableBuilder.update_rows(data['updated_settings'])
36
+ }
31
37
  else {
32
38
  if (data['settings']) {
33
39
  load_page(data['settings']);