comfortable_media_surfer 3.0.0 → 3.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (121) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +1 -0
  3. data/.github/workflows/coveralls.yml +13 -1
  4. data/.github/workflows/rubyonrails.yml +15 -3
  5. data/.gitignore +4 -0
  6. data/.rubocop.yml +4 -1
  7. data/CHANGELOG.md +59 -0
  8. data/CONTRIBUTING.md +4 -2
  9. data/Gemfile +6 -2
  10. data/README.md +60 -25
  11. data/app/assets/builds/.keep +0 -0
  12. data/app/assets/config/manifest.js +1 -0
  13. data/app/assets/javascripts/comfy/admin/cms/application.js +21 -36
  14. data/app/assets/javascripts/comfy/admin/cms/base.js +6 -5
  15. data/app/assets/javascripts/comfy/admin/cms/codemirror.js +22 -10
  16. data/app/assets/javascripts/comfy/admin/cms/diff.js +7 -5
  17. data/app/assets/javascripts/comfy/admin/cms/file_link.js +17 -11
  18. data/app/assets/javascripts/comfy/admin/cms/file_upload.js +67 -41
  19. data/app/assets/javascripts/comfy/admin/cms/files_modal.js +20 -13
  20. data/app/assets/javascripts/comfy/admin/cms/sortable_list.js +28 -19
  21. data/app/assets/javascripts/comfy/admin/cms/timepicker.js +20 -12
  22. data/app/assets/javascripts/comfy/admin/cms/wysiwyg.js +39 -20
  23. data/app/assets/javascripts/comfy/vendor/diff/pretty_text_diff.js +30 -18
  24. data/app/assets/javascripts/comfy/vendor/redactor/definedlinks.js +31 -34
  25. data/app/assets/javascripts/comfy/vendor/redactor/filemanager.js +77 -62
  26. data/app/assets/javascripts/comfy/vendor/redactor/i18n/hr.js +78 -76
  27. data/app/assets/javascripts/comfy/vendor/redactor/i18n/nb.js +76 -74
  28. data/app/assets/javascripts/comfy/vendor/redactor/i18n/pl.js +77 -75
  29. data/app/assets/javascripts/comfy/vendor/redactor/imagemanager.js +66 -55
  30. data/app/assets/javascripts/comfy/vendor/redactor/table.js +346 -335
  31. data/app/assets/javascripts/comfy/vendor/redactor/video.js +69 -64
  32. data/app/assets/javascripts/comfy/vendor/redactor.js +2 -0
  33. data/app/assets/stylesheets/comfy/admin/cms/application.sass +2 -2
  34. data/app/assets/stylesheets/comfy/admin/cms/codemirror_overrides.sass +1 -1
  35. data/app/helpers/comfy/admin/cms_helper.rb +2 -2
  36. data/comfortable_media_surfer.gemspec +6 -8
  37. data/config/application.rb +1 -1
  38. data/config/environments/development.rb +11 -10
  39. data/config/environments/production.rb +0 -6
  40. data/config/puma.rb +43 -0
  41. data/gemfiles/7.1.gemfile +3 -2
  42. data/gemfiles/7.2.gemfile +3 -2
  43. data/gemfiles/{6.1.gemfile → 8.0.gemfile} +3 -2
  44. data/lib/comfortable_media_surfer/engine.rb +3 -8
  45. data/lib/comfortable_media_surfer/extensions/has_revisions.rb +1 -1
  46. data/lib/comfortable_media_surfer/render_methods.rb +7 -7
  47. data/lib/comfortable_media_surfer/version.rb +1 -1
  48. data/lib/generators/comfy/scaffold/scaffold_generator.rb +1 -1
  49. data/lib/tasks/cms_assets.rake +19 -0
  50. data/package-lock.json +379 -0
  51. data/package.json +23 -0
  52. data/rakelib/create_release.rake +17 -17
  53. metadata +16 -152
  54. data/app/assets/javascripts/comfy/vendor/Moxie.swf +0 -0
  55. data/app/assets/javascripts/comfy/vendor/Moxie.xap +0 -0
  56. data/app/assets/javascripts/comfy/vendor/bootstrap.bundle.min.js +0 -7
  57. data/app/assets/javascripts/comfy/vendor/bootstrap.bundle.min.js.map +0 -1
  58. data/app/assets/javascripts/comfy/vendor/codemirror/addon/edit/closetag.js +0 -169
  59. data/app/assets/javascripts/comfy/vendor/codemirror/mode/css/css.js +0 -832
  60. data/app/assets/javascripts/comfy/vendor/codemirror/mode/htmlmixed/htmlmixed.js +0 -152
  61. data/app/assets/javascripts/comfy/vendor/codemirror/mode/javascript/javascript.js +0 -875
  62. data/app/assets/javascripts/comfy/vendor/codemirror/mode/markdown/markdown.js +0 -861
  63. data/app/assets/javascripts/comfy/vendor/codemirror/mode/xml/xml.js +0 -394
  64. data/app/assets/javascripts/comfy/vendor/codemirror.js +0 -9653
  65. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/ar.js +0 -52
  66. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/bg.js +0 -65
  67. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/bn.js +0 -65
  68. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/ca.js +0 -83
  69. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/cs.js +0 -70
  70. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/cy.js +0 -92
  71. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/da.js +0 -71
  72. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/de.js +0 -70
  73. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/default.js +0 -80
  74. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/eo.js +0 -73
  75. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/es.js +0 -69
  76. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/et.js +0 -73
  77. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/fa.js +0 -68
  78. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/fi.js +0 -69
  79. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/fr.js +0 -75
  80. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/gr.js +0 -74
  81. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/he.js +0 -57
  82. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/hi.js +0 -65
  83. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/hr.js +0 -66
  84. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/hu.js +0 -72
  85. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/id.js +0 -61
  86. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/it.js +0 -70
  87. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/ja.js +0 -57
  88. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/ko.js +0 -60
  89. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/lt.js +0 -72
  90. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/lv.js +0 -67
  91. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/mk.js +0 -69
  92. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/mn.js +0 -67
  93. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/ms.js +0 -68
  94. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/my.js +0 -69
  95. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/nl.js +0 -75
  96. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/no.js +0 -73
  97. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/pa.js +0 -65
  98. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/pl.js +0 -68
  99. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/pt-BR.js +0 -66
  100. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/pt.js +0 -66
  101. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/ro.js +0 -69
  102. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/ru.js +0 -66
  103. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/si.js +0 -65
  104. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/sk.js +0 -70
  105. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/sl.js +0 -70
  106. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/sq.js +0 -65
  107. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/sr.js +0 -69
  108. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/sv.js +0 -70
  109. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/th.js +0 -72
  110. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/tr.js +0 -66
  111. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/uk.js +0 -66
  112. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/vn.js +0 -66
  113. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/zh-CN.js +0 -61
  114. data/app/assets/javascripts/comfy/vendor/flatpickr/i18n/zh-TW.js +0 -61
  115. data/app/assets/javascripts/comfy/vendor/moxie.min.js +0 -16
  116. data/app/assets/javascripts/comfy/vendor/plupload.dev.js +0 -2497
  117. data/app/assets/javascripts/comfy/vendor/sortable.min.js +0 -5
  118. data/app/assets/stylesheets/comfy/vendor/codemirror.css +0 -346
  119. data/app/assets/stylesheets/comfy/vendor/flatpickr.min.css +0 -13
  120. data/config/initializers/assets.rb +0 -14
  121. data/gemfiles/7.0.gemfile +0 -31
@@ -1,337 +1,348 @@
1
+ import jQuery from "jquery";
2
+
1
3
  if (!RedactorPlugins) var RedactorPlugins = {};
2
4
 
3
- (function($)
4
- {
5
- RedactorPlugins.table = function()
6
- {
7
- return {
8
- getTemplate: function()
9
- {
10
- return String()
11
- + '<section id="redactor-modal-table-insert">'
12
- + '<label>' + this.lang.get('rows') + '</label>'
13
- + '<input type="text" size="5" value="2" id="redactor-table-rows" />'
14
- + '<label>' + this.lang.get('columns') + '</label>'
15
- + '<input type="text" size="5" value="3" id="redactor-table-columns" />'
16
- + '</section>';
17
- },
18
- init: function()
19
- {
20
-
21
- var dropdown = {};
22
-
23
- dropdown.insert_table = { title: this.lang.get('insert_table'), func: this.table.show };
24
- dropdown.insert_row_above = { title: this.lang.get('insert_row_above'), func: this.table.addRowAbove };
25
- dropdown.insert_row_below = { title: this.lang.get('insert_row_below'), func: this.table.addRowBelow };
26
- dropdown.insert_column_left = { title: this.lang.get('insert_column_left'), func: this.table.addColumnLeft };
27
- dropdown.insert_column_right = { title: this.lang.get('insert_column_right'), func: this.table.addColumnRight };
28
- dropdown.add_head = { title: this.lang.get('add_head'), func: this.table.addHead };
29
- dropdown.delete_head = { title: this.lang.get('delete_head'), func: this.table.deleteHead };
30
- dropdown.delete_column = { title: this.lang.get('delete_column'), func: this.table.deleteColumn };
31
- dropdown.delete_row = { title: this.lang.get('delete_row'), func: this.table.deleteRow };
32
- dropdown.delete_table = { title: this.lang.get('delete_table'), func: this.table.deleteTable };
33
-
34
- this.observe.addButton('td', 'table');
35
- this.observe.addButton('th', 'table');
36
-
37
- var button = this.button.addBefore('link', 'table', this.lang.get('table'));
38
- this.button.addDropdown(button, dropdown);
39
- },
40
- show: function()
41
- {
42
- this.modal.addTemplate('table', this.table.getTemplate());
43
-
44
- this.modal.load('table', this.lang.get('insert_table'), 300);
45
- this.modal.createCancelButton();
46
-
47
- var button = this.modal.createActionButton(this.lang.get('insert'));
48
- button.on('click', this.table.insert);
49
-
50
- this.selection.save();
51
- this.modal.show();
52
-
53
- $('#redactor-table-rows').focus();
54
-
55
- },
56
- insert: function()
57
- {
58
-
59
- var rows = $('#redactor-table-rows').val(),
60
- columns = $('#redactor-table-columns').val(),
61
- $tableBox = $('<div>'),
62
- tableId = Math.floor(Math.random() * 99999),
63
- $table = $('<table id="table' + tableId + '"><tbody></tbody></table>'),
64
- i, $row, z, $column;
65
-
66
- for (i = 0; i < rows; i++)
67
- {
68
- $row = $('<tr>');
69
-
70
- for (z = 0; z < columns; z++)
71
- {
72
- $column = $('<td>' + this.opts.invisibleSpace + '</td>');
73
-
74
- // set the focus to the first td
75
- if (i === 0 && z === 0)
76
- {
77
- $column.append(this.selection.getMarker());
78
- }
79
-
80
- $($row).append($column);
81
- }
82
-
83
- $table.append($row);
84
- }
85
-
86
- $tableBox.append($table);
87
- var html = $tableBox.html();
88
-
89
-
90
- this.modal.close();
91
- this.selection.restore();
92
-
93
- if (this.table.getTable()) return;
94
-
95
- this.buffer.set();
96
-
97
- var current = this.selection.getBlock() || this.selection.getCurrent();
98
- if (current && current.tagName != 'BODY')
99
- {
100
- if (current.tagName == 'LI') current = $(current).closest('ul, ol');
101
- $(current).after(html);
102
- }
103
- else
104
- {
105
- this.insert.html(html);
106
- }
107
-
108
- this.selection.restore();
109
-
110
- var table = this.$editor.find('#table' + tableId);
111
-
112
- if (!this.opts.linebreaks && (this.utils.browser('mozilla') || this.utils.browser('msie')))
113
- {
114
- var $next = table.next();
115
- if ($next.length === 0)
116
- {
117
- table.after(this.opts.emptyHtml);
118
- }
119
- }
120
-
121
- this.observe.buttons();
122
-
123
- table.find('span.redactor-selection-marker').remove();
124
- table.removeAttr('id');
125
-
126
- this.code.sync();
127
- this.core.setCallback('insertedTable', table);
128
- },
129
- getTable: function()
130
- {
131
- var $table = $(this.selection.getParent()).closest('table');
132
-
133
- if (!this.utils.isRedactorParent($table)) return false;
134
- if ($table.size() === 0) return false;
135
-
136
- return $table;
137
- },
138
- restoreAfterDelete: function($table)
139
- {
140
- this.selection.restore();
141
- $table.find('span.redactor-selection-marker').remove();
142
- this.code.sync();
143
- },
144
- deleteTable: function()
145
- {
146
- var $table = this.table.getTable();
147
- if (!$table) return;
148
-
149
- this.buffer.set();
150
-
151
-
152
- var $next = $table.next();
153
- if (!this.opts.linebreaks && $next.length !== 0)
154
- {
155
- this.caret.setStart($next);
156
- }
157
- else
158
- {
159
- this.caret.setAfter($table);
160
- }
161
-
162
-
163
- $table.remove();
164
-
165
- this.code.sync();
166
- },
167
- deleteRow: function()
168
- {
169
- var $table = this.table.getTable();
170
- if (!$table) return;
171
-
172
- var $current = $(this.selection.getCurrent());
173
-
174
- this.buffer.set();
175
-
176
- var $current_tr = $current.closest('tr');
177
- var $focus_tr = $current_tr.prev().length ? $current_tr.prev() : $current_tr.next();
178
- if ($focus_tr.length)
179
- {
180
- var $focus_td = $focus_tr.children('td, th').first();
181
- if ($focus_td.length) $focus_td.prepend(this.selection.getMarker());
182
- }
183
-
184
- $current_tr.remove();
185
- this.table.restoreAfterDelete($table);
186
- },
187
- deleteColumn: function()
188
- {
189
- var $table = this.table.getTable();
190
- if (!$table) return;
191
-
192
- this.buffer.set();
193
-
194
- var $current = $(this.selection.getCurrent());
195
- var $current_td = $current.closest('td, th');
196
- var index = $current_td[0].cellIndex;
197
-
198
- $table.find('tr').each($.proxy(function(i, elem)
199
- {
200
- var $elem = $(elem);
201
- var focusIndex = index - 1 < 0 ? index + 1 : index - 1;
202
- if (i === 0) $elem.find('td, th').eq(focusIndex).prepend(this.selection.getMarker());
203
-
204
- $elem.find('td, th').eq(index).remove();
205
-
206
- }, this));
207
-
208
- this.table.restoreAfterDelete($table);
209
- },
210
- addHead: function()
211
- {
212
- var $table = this.table.getTable();
213
- if (!$table) return;
214
-
215
- this.buffer.set();
216
-
217
- if ($table.find('thead').size() !== 0)
218
- {
219
- this.table.deleteHead();
220
- return;
221
- }
222
-
223
- var tr = $table.find('tr').first().clone();
224
- tr.find('td').replaceWith($.proxy(function()
225
- {
226
- return $('<th>').html(this.opts.invisibleSpace);
227
- }, this));
228
-
229
- $thead = $('<thead></thead>').append(tr);
230
- $table.prepend($thead);
231
-
232
- this.code.sync();
233
-
234
- },
235
- deleteHead: function()
236
- {
237
- var $table = this.table.getTable();
238
- if (!$table) return;
239
-
240
- var $thead = $table.find('thead');
241
- if ($thead.size() === 0) return;
242
-
243
- this.buffer.set();
244
-
245
- $thead.remove();
246
- this.code.sync();
247
- },
248
- addRowAbove: function()
249
- {
250
- this.table.addRow('before');
251
- },
252
- addRowBelow: function()
253
- {
254
- this.table.addRow('after');
255
- },
256
- addColumnLeft: function()
257
- {
258
- this.table.addColumn('before');
259
- },
260
- addColumnRight: function()
261
- {
262
- this.table.addColumn('after');
263
- },
264
- addRow: function(type)
265
- {
266
- var $table = this.table.getTable();
267
- if (!$table) return;
268
-
269
- this.buffer.set();
270
-
271
- var $current = $(this.selection.getCurrent());
272
- var $current_tr = $current.closest('tr');
273
- var new_tr = $current_tr.clone();
274
-
275
- new_tr.find('th').replaceWith(function()
276
- {
277
- var $td = $('<td>');
278
- $td[0].attributes = this.attributes;
279
-
280
- return $td.append($(this).contents());
281
- });
282
-
283
- new_tr.find('td').html(this.opts.invisibleSpace);
284
-
285
- if (type == 'after')
286
- {
287
- $current_tr.after(new_tr);
288
- }
289
- else
290
- {
291
- $current_tr.before(new_tr);
292
- }
293
-
294
- this.code.sync();
295
- },
296
- addColumn: function (type)
297
- {
298
- var $table = this.table.getTable();
299
- if (!$table) return;
300
-
301
- var index = 0;
302
- var current = $(this.selection.getCurrent());
303
-
304
- this.buffer.set();
305
-
306
- var $current_tr = current.closest('tr');
307
- var $current_td = current.closest('td, th');
308
-
309
- $current_tr.find('td, th').each($.proxy(function(i, elem)
310
- {
311
- if ($(elem)[0] === $current_td[0]) index = i;
312
-
313
- }, this));
314
-
315
- $table.find('tr').each($.proxy(function(i, elem)
316
- {
317
- var $current = $(elem).find('td, th').eq(index);
318
-
319
- var td = $current.clone();
320
- td.html(this.opts.invisibleSpace);
321
-
322
- if (type == 'after')
323
- {
324
- $current.after(td);
325
- }
326
- else
327
- {
328
- $current.before(td);
329
- }
330
-
331
- }, this));
332
-
333
- this.code.sync();
334
- }
335
- };
336
- };
337
- })(jQuery);
5
+ (function ($) {
6
+ RedactorPlugins.table = function () {
7
+ return {
8
+ getTemplate: function () {
9
+ return (
10
+ String() +
11
+ '<section id="redactor-modal-table-insert">' +
12
+ "<label>" +
13
+ this.lang.get("rows") +
14
+ "</label>" +
15
+ '<input type="text" size="5" value="2" id="redactor-table-rows" />' +
16
+ "<label>" +
17
+ this.lang.get("columns") +
18
+ "</label>" +
19
+ '<input type="text" size="5" value="3" id="redactor-table-columns" />' +
20
+ "</section>"
21
+ );
22
+ },
23
+ init: function () {
24
+ var dropdown = {};
25
+
26
+ dropdown.insert_table = {
27
+ title: this.lang.get("insert_table"),
28
+ func: this.table.show,
29
+ };
30
+ dropdown.insert_row_above = {
31
+ title: this.lang.get("insert_row_above"),
32
+ func: this.table.addRowAbove,
33
+ };
34
+ dropdown.insert_row_below = {
35
+ title: this.lang.get("insert_row_below"),
36
+ func: this.table.addRowBelow,
37
+ };
38
+ dropdown.insert_column_left = {
39
+ title: this.lang.get("insert_column_left"),
40
+ func: this.table.addColumnLeft,
41
+ };
42
+ dropdown.insert_column_right = {
43
+ title: this.lang.get("insert_column_right"),
44
+ func: this.table.addColumnRight,
45
+ };
46
+ dropdown.add_head = {
47
+ title: this.lang.get("add_head"),
48
+ func: this.table.addHead,
49
+ };
50
+ dropdown.delete_head = {
51
+ title: this.lang.get("delete_head"),
52
+ func: this.table.deleteHead,
53
+ };
54
+ dropdown.delete_column = {
55
+ title: this.lang.get("delete_column"),
56
+ func: this.table.deleteColumn,
57
+ };
58
+ dropdown.delete_row = {
59
+ title: this.lang.get("delete_row"),
60
+ func: this.table.deleteRow,
61
+ };
62
+ dropdown.delete_table = {
63
+ title: this.lang.get("delete_table"),
64
+ func: this.table.deleteTable,
65
+ };
66
+
67
+ this.observe.addButton("td", "table");
68
+ this.observe.addButton("th", "table");
69
+
70
+ var button = this.button.addBefore(
71
+ "link",
72
+ "table",
73
+ this.lang.get("table")
74
+ );
75
+ this.button.addDropdown(button, dropdown);
76
+ },
77
+ show: function () {
78
+ this.modal.addTemplate("table", this.table.getTemplate());
79
+
80
+ this.modal.load("table", this.lang.get("insert_table"), 300);
81
+ this.modal.createCancelButton();
82
+
83
+ var button = this.modal.createActionButton(this.lang.get("insert"));
84
+ button.on("click", this.table.insert);
85
+
86
+ this.selection.save();
87
+ this.modal.show();
88
+
89
+ $("#redactor-table-rows").focus();
90
+ },
91
+ insert: function () {
92
+ var rows = $("#redactor-table-rows").val(),
93
+ columns = $("#redactor-table-columns").val(),
94
+ $tableBox = $("<div>"),
95
+ tableId = Math.floor(Math.random() * 99999),
96
+ $table = $(
97
+ '<table id="table' + tableId + '"><tbody></tbody></table>'
98
+ ),
99
+ i,
100
+ $row,
101
+ z,
102
+ $column;
103
+
104
+ for (i = 0; i < rows; i++) {
105
+ $row = $("<tr>");
106
+
107
+ for (z = 0; z < columns; z++) {
108
+ $column = $("<td>" + this.opts.invisibleSpace + "</td>");
109
+
110
+ // set the focus to the first td
111
+ if (i === 0 && z === 0) {
112
+ $column.append(this.selection.getMarker());
113
+ }
114
+
115
+ $($row).append($column);
116
+ }
117
+
118
+ $table.append($row);
119
+ }
120
+
121
+ $tableBox.append($table);
122
+ var html = $tableBox.html();
123
+
124
+ this.modal.close();
125
+ this.selection.restore();
126
+
127
+ if (this.table.getTable()) return;
128
+
129
+ this.buffer.set();
130
+
131
+ var current = this.selection.getBlock() || this.selection.getCurrent();
132
+ if (current && current.tagName != "BODY") {
133
+ if (current.tagName == "LI") current = $(current).closest("ul, ol");
134
+ $(current).after(html);
135
+ } else {
136
+ this.insert.html(html);
137
+ }
138
+
139
+ this.selection.restore();
140
+
141
+ var table = this.$editor.find("#table" + tableId);
142
+
143
+ if (
144
+ !this.opts.linebreaks &&
145
+ (this.utils.browser("mozilla") || this.utils.browser("msie"))
146
+ ) {
147
+ var $next = table.next();
148
+ if ($next.length === 0) {
149
+ table.after(this.opts.emptyHtml);
150
+ }
151
+ }
152
+
153
+ this.observe.buttons();
154
+
155
+ table.find("span.redactor-selection-marker").remove();
156
+ table.removeAttr("id");
157
+
158
+ this.code.sync();
159
+ this.core.setCallback("insertedTable", table);
160
+ },
161
+ getTable: function () {
162
+ var $table = $(this.selection.getParent()).closest("table");
163
+
164
+ if (!this.utils.isRedactorParent($table)) return false;
165
+ if ($table.size() === 0) return false;
166
+
167
+ return $table;
168
+ },
169
+ restoreAfterDelete: function ($table) {
170
+ this.selection.restore();
171
+ $table.find("span.redactor-selection-marker").remove();
172
+ this.code.sync();
173
+ },
174
+ deleteTable: function () {
175
+ var $table = this.table.getTable();
176
+ if (!$table) return;
177
+
178
+ this.buffer.set();
179
+
180
+ var $next = $table.next();
181
+ if (!this.opts.linebreaks && $next.length !== 0) {
182
+ this.caret.setStart($next);
183
+ } else {
184
+ this.caret.setAfter($table);
185
+ }
186
+
187
+ $table.remove();
188
+
189
+ this.code.sync();
190
+ },
191
+ deleteRow: function () {
192
+ var $table = this.table.getTable();
193
+ if (!$table) return;
194
+
195
+ var $current = $(this.selection.getCurrent());
196
+
197
+ this.buffer.set();
198
+
199
+ var $current_tr = $current.closest("tr");
200
+ var $focus_tr = $current_tr.prev().length
201
+ ? $current_tr.prev()
202
+ : $current_tr.next();
203
+ if ($focus_tr.length) {
204
+ var $focus_td = $focus_tr.children("td, th").first();
205
+ if ($focus_td.length) $focus_td.prepend(this.selection.getMarker());
206
+ }
207
+
208
+ $current_tr.remove();
209
+ this.table.restoreAfterDelete($table);
210
+ },
211
+ deleteColumn: function () {
212
+ var $table = this.table.getTable();
213
+ if (!$table) return;
214
+
215
+ this.buffer.set();
216
+
217
+ var $current = $(this.selection.getCurrent());
218
+ var $current_td = $current.closest("td, th");
219
+ var index = $current_td[0].cellIndex;
220
+
221
+ $table.find("tr").each(
222
+ $.proxy(function (i, elem) {
223
+ var $elem = $(elem);
224
+ var focusIndex = index - 1 < 0 ? index + 1 : index - 1;
225
+ if (i === 0)
226
+ $elem
227
+ .find("td, th")
228
+ .eq(focusIndex)
229
+ .prepend(this.selection.getMarker());
230
+
231
+ $elem.find("td, th").eq(index).remove();
232
+ }, this)
233
+ );
234
+
235
+ this.table.restoreAfterDelete($table);
236
+ },
237
+ addHead: function () {
238
+ var $table = this.table.getTable();
239
+ if (!$table) return;
240
+
241
+ this.buffer.set();
242
+
243
+ if ($table.find("thead").size() !== 0) {
244
+ this.table.deleteHead();
245
+ return;
246
+ }
247
+
248
+ var tr = $table.find("tr").first().clone();
249
+ tr.find("td").replaceWith(
250
+ $.proxy(function () {
251
+ return $("<th>").html(this.opts.invisibleSpace);
252
+ }, this)
253
+ );
254
+
255
+ $thead = $("<thead></thead>").append(tr);
256
+ $table.prepend($thead);
257
+
258
+ this.code.sync();
259
+ },
260
+ deleteHead: function () {
261
+ var $table = this.table.getTable();
262
+ if (!$table) return;
263
+
264
+ var $thead = $table.find("thead");
265
+ if ($thead.size() === 0) return;
266
+
267
+ this.buffer.set();
268
+
269
+ $thead.remove();
270
+ this.code.sync();
271
+ },
272
+ addRowAbove: function () {
273
+ this.table.addRow("before");
274
+ },
275
+ addRowBelow: function () {
276
+ this.table.addRow("after");
277
+ },
278
+ addColumnLeft: function () {
279
+ this.table.addColumn("before");
280
+ },
281
+ addColumnRight: function () {
282
+ this.table.addColumn("after");
283
+ },
284
+ addRow: function (type) {
285
+ var $table = this.table.getTable();
286
+ if (!$table) return;
287
+
288
+ this.buffer.set();
289
+
290
+ var $current = $(this.selection.getCurrent());
291
+ var $current_tr = $current.closest("tr");
292
+ var new_tr = $current_tr.clone();
293
+
294
+ new_tr.find("th").replaceWith(function () {
295
+ var $td = $("<td>");
296
+ $td[0].attributes = this.attributes;
297
+
298
+ return $td.append($(this).contents());
299
+ });
300
+
301
+ new_tr.find("td").html(this.opts.invisibleSpace);
302
+
303
+ if (type == "after") {
304
+ $current_tr.after(new_tr);
305
+ } else {
306
+ $current_tr.before(new_tr);
307
+ }
308
+
309
+ this.code.sync();
310
+ },
311
+ addColumn: function (type) {
312
+ var $table = this.table.getTable();
313
+ if (!$table) return;
314
+
315
+ var index = 0;
316
+ var current = $(this.selection.getCurrent());
317
+
318
+ this.buffer.set();
319
+
320
+ var $current_tr = current.closest("tr");
321
+ var $current_td = current.closest("td, th");
322
+
323
+ $current_tr.find("td, th").each(
324
+ $.proxy(function (i, elem) {
325
+ if ($(elem)[0] === $current_td[0]) index = i;
326
+ }, this)
327
+ );
328
+
329
+ $table.find("tr").each(
330
+ $.proxy(function (i, elem) {
331
+ var $current = $(elem).find("td, th").eq(index);
332
+
333
+ var td = $current.clone();
334
+ td.html(this.opts.invisibleSpace);
335
+
336
+ if (type == "after") {
337
+ $current.after(td);
338
+ } else {
339
+ $current.before(td);
340
+ }
341
+ }, this)
342
+ );
343
+
344
+ this.code.sync();
345
+ },
346
+ };
347
+ };
348
+ })(jQuery);