trumbowyg.table.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. /* ===========================================================
  2. * trumbowyg.table.custom.js v2.0
  3. * Table plugin for Trumbowyg
  4. * http://alex-d.github.com/Trumbowyg
  5. * ===========================================================
  6. * Author : Sven Dunemann [dunemann@forelabs.eu]
  7. */
  8. (function ($) {
  9. 'use strict';
  10. var defaultOptions = {
  11. rows: 8,
  12. columns: 8,
  13. styler: 'table'
  14. };
  15. $.extend(true, $.trumbowyg, {
  16. langs: {
  17. en: {
  18. table: 'Insert table',
  19. tableAddRow: 'Add row',
  20. tableAddColumn: 'Add column',
  21. tableDeleteRow: 'Delete row',
  22. tableDeleteColumn: 'Delete column',
  23. tableDestroy: 'Delete table',
  24. error: 'Error'
  25. },
  26. da: {
  27. table: 'Indsæt tabel',
  28. tableAddRow: 'Tilføj række',
  29. tableAddColumn: 'Tilføj kolonne',
  30. tableDeleteRow: 'Slet række',
  31. tableDeleteColumn: 'Slet kolonne',
  32. tableDestroy: 'Slet tabel',
  33. error: 'Fejl'
  34. },
  35. de: {
  36. table: 'Tabelle einfügen',
  37. tableAddRow: 'Zeile hinzufügen',
  38. tableAddColumn: 'Spalte hinzufügen',
  39. tableDeleteRow: 'Zeile löschen',
  40. tableDeleteColumn: 'Spalte löschen',
  41. tableDestroy: 'Tabelle löschen',
  42. error: 'Error'
  43. },
  44. sk: {
  45. table: 'Vytvoriť tabuľky',
  46. tableAddRow: 'Pridať riadok',
  47. tableAddColumn: 'Pridať stĺpec',
  48. error: 'Chyba'
  49. },
  50. fr: {
  51. table: 'Insérer un tableau',
  52. tableAddRow: 'Ajouter des lignes',
  53. tableAddColumn: 'Ajouter des colonnes',
  54. error: 'Erreur'
  55. },
  56. cs: {
  57. table: 'Vytvořit příkaz Table',
  58. tableAddRow: 'Přidat řádek',
  59. tableAddColumn: 'Přidat sloupec',
  60. error: 'Chyba'
  61. },
  62. ru: {
  63. table: 'Вставить таблицу',
  64. tableAddRow: 'Добавить строку',
  65. tableAddColumn: 'Добавить столбец',
  66. tableDeleteRow: 'Удалить строку',
  67. tableDeleteColumn: 'Удалить столбец',
  68. tableDestroy: 'Удалить таблицу',
  69. error: 'Ошибка'
  70. },
  71. ja: {
  72. table: '表の挿入',
  73. tableAddRow: '行の追加',
  74. tableAddColumn: '列の追加',
  75. error: 'エラー'
  76. },
  77. tr: {
  78. table: 'Tablo ekle',
  79. tableAddRow: 'Satır ekle',
  80. tableAddColumn: 'Kolon ekle',
  81. error: 'Hata'
  82. },
  83. zh_tw: {
  84. table: '插入表格',
  85. tableAddRow: '加入行',
  86. tableAddColumn: '加入列',
  87. tableDeleteRow: '刪除行',
  88. tableDeleteColumn: '刪除列',
  89. tableDestroy: '刪除表格',
  90. error: '錯誤'
  91. },
  92. id: {
  93. table: 'Sisipkan tabel',
  94. tableAddRow: 'Sisipkan baris',
  95. tableAddColumn: 'Sisipkan kolom',
  96. tableDeleteRow: 'Hapus baris',
  97. tableDeleteColumn: 'Hapus kolom',
  98. tableDestroy: 'Hapus tabel',
  99. error: 'Galat'
  100. },
  101. },
  102. plugins: {
  103. table: {
  104. init: function (t) {
  105. t.o.plugins.table = $.extend(true, {}, defaultOptions, t.o.plugins.table || {});
  106. var buildButtonDef = {
  107. fn: function () {
  108. t.saveRange();
  109. var btnName = 'table';
  110. var dropdownPrefix = t.o.prefix + 'dropdown',
  111. dropdownOptions = { // the dropdown
  112. class: dropdownPrefix + '-' + btnName + ' ' + dropdownPrefix + ' ' + t.o.prefix + 'fixed-top'
  113. };
  114. dropdownOptions['data-' + dropdownPrefix] = btnName;
  115. var $dropdown = $('<div/>', dropdownOptions);
  116. if (t.$box.find("." + dropdownPrefix + "-" + btnName).length === 0) {
  117. t.$box.append($dropdown.hide());
  118. } else {
  119. $dropdown = t.$box.find("." + dropdownPrefix + "-" + btnName);
  120. }
  121. // clear dropdown
  122. $dropdown.html('');
  123. // when active table show AddRow / AddColumn
  124. if (t.$box.find("." + t.o.prefix + "table-button").hasClass(t.o.prefix + 'active-button')) {
  125. $dropdown.append(t.buildSubBtn('tableAddRow'));
  126. $dropdown.append(t.buildSubBtn('tableAddColumn'));
  127. $dropdown.append(t.buildSubBtn('tableDeleteRow'));
  128. $dropdown.append(t.buildSubBtn('tableDeleteColumn'));
  129. $dropdown.append(t.buildSubBtn('tableDestroy'));
  130. } else {
  131. var tableSelect = $('<table></table>');
  132. for (var i = 0; i < t.o.plugins.table.rows; i += 1) {
  133. var row = $('<tr></tr>').appendTo(tableSelect);
  134. for (var j = 0; j < t.o.plugins.table.columns; j += 1) {
  135. $('<td></td>').appendTo(row);
  136. }
  137. }
  138. tableSelect.find('td').on('mouseover', tableAnimate);
  139. tableSelect.find('td').on('mousedown', tableBuild);
  140. $dropdown.append(tableSelect);
  141. $dropdown.append($('<center>1x1</center>'));
  142. }
  143. t.dropdown(btnName);
  144. }
  145. };
  146. var tableAnimate = function(column_event) {
  147. var column = $(column_event.target),
  148. table = column.parents('table'),
  149. colIndex = this.cellIndex,
  150. rowIndex = this.parentNode.rowIndex;
  151. // reset all columns
  152. table.find('td').removeClass('active');
  153. for (var i = 0; i <= rowIndex; i += 1) {
  154. for (var j = 0; j <= colIndex; j += 1) {
  155. table.find("tr:nth-of-type("+(i+1)+")").find("td:nth-of-type("+(j+1)+")").addClass('active');
  156. }
  157. }
  158. // set label
  159. table.next('center').html((colIndex+1) + "x" + (rowIndex+1));
  160. };
  161. var tableBuild = function(column_event) {
  162. t.saveRange();
  163. var tabler = $('<table></table>');
  164. if (t.o.plugins.table.styler) {
  165. tabler.attr('class', t.o.plugins.table.styler);
  166. }
  167. var column = $(column_event.target),
  168. colIndex = this.cellIndex,
  169. rowIndex = this.parentNode.rowIndex;
  170. for (var i = 0; i <= rowIndex; i += 1) {
  171. var row = $('<tr></tr>').appendTo(tabler);
  172. for (var j = 0; j <= colIndex; j += 1) {
  173. $('<td></td>').appendTo(row);
  174. }
  175. }
  176. t.range.deleteContents();
  177. t.range.insertNode(tabler[0]);
  178. t.$c.trigger('tbwchange');
  179. };
  180. var addRow = {
  181. title: t.lang['tableAddRow'],
  182. text: t.lang['tableAddRow'],
  183. ico: 'row-below',
  184. fn: function () {
  185. t.saveRange();
  186. var node = t.doc.getSelection().focusNode;
  187. var table = $(node).closest('table');
  188. if(table.length > 0) {
  189. var row = $('<tr></tr>');
  190. // add columns according to current columns count
  191. for (var i = 0; i < table.find('tr')[0].childElementCount; i += 1) {
  192. $('<td></td>').appendTo(row);
  193. }
  194. // add row to table
  195. row.appendTo(table);
  196. }
  197. return true;
  198. }
  199. };
  200. var addColumn = {
  201. title: t.lang['tableAddColumn'],
  202. text: t.lang['tableAddColumn'],
  203. ico: 'col-right',
  204. fn: function () {
  205. t.saveRange();
  206. var node = t.doc.getSelection().focusNode;
  207. var table = $(node).closest('table');
  208. if(table.length > 0) {
  209. $(table).find('tr').each(function() {
  210. $(this).find('td:last').after('<td></td>');
  211. });
  212. }
  213. return true;
  214. }
  215. };
  216. var destroy = {
  217. title: t.lang['tableDestroy'],
  218. text: t.lang['tableDestroy'],
  219. ico: 'table-delete',
  220. fn: function () {
  221. t.saveRange();
  222. var node = t.doc.getSelection().focusNode,
  223. table = $(node).closest('table');
  224. table.remove();
  225. return true;
  226. }
  227. };
  228. var deleteRow = {
  229. title: t.lang['tableDeleteRow'],
  230. text: t.lang['tableDeleteRow'],
  231. ico: 'row-delete',
  232. fn: function () {
  233. t.saveRange();
  234. var node = t.doc.getSelection().focusNode,
  235. row = $(node).closest('tr');
  236. row.remove();
  237. return true;
  238. }
  239. };
  240. var deleteColumn = {
  241. title: t.lang['tableDeleteColumn'],
  242. text: t.lang['tableDeleteColumn'],
  243. ico: 'col-delete',
  244. fn: function () {
  245. t.saveRange();
  246. var node = t.doc.getSelection().focusNode,
  247. table = $(node).closest('table'),
  248. td = $(node).closest('td'),
  249. cellIndex = td.index();
  250. $(table).find('tr').each(function() {
  251. $(this).find('td:eq('+cellIndex+')').remove();
  252. });
  253. return true;
  254. }
  255. };
  256. t.addBtnDef('table', buildButtonDef);
  257. t.addBtnDef('tableAddRow', addRow);
  258. t.addBtnDef('tableAddColumn', addColumn);
  259. t.addBtnDef('tableDeleteRow', deleteRow);
  260. t.addBtnDef('tableDeleteColumn', deleteColumn);
  261. t.addBtnDef('tableDestroy', destroy);
  262. }
  263. }
  264. }
  265. });
  266. })(jQuery);