ui.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. //= require rails_admin/custom/ckeditor_ajax
  2. (function($) {
  3. function replaceCkeditor(textarea) {
  4. if (!window.CKEDITOR || !textarea || !textarea.id) {
  5. return;
  6. }
  7. try {
  8. if (window.CKEDITOR.instances[textarea.id]) {
  9. window.CKEDITOR.instances[textarea.id].updateElement();
  10. window.CKEDITOR.instances[textarea.id].destroy(true);
  11. }
  12. } catch (error) {}
  13. var $textarea = $(textarea);
  14. $textarea.removeClass('ckeditored');
  15. window.CKEDITOR.replace(textarea, $textarea.data('options') || {});
  16. $textarea.addClass('ckeditored');
  17. }
  18. function refreshPaneEditors($scope) {
  19. $scope.find('[data-richtext=ckeditor]').each(function() {
  20. replaceCkeditor(this);
  21. });
  22. }
  23. function ensurePaneEditors($scope) {
  24. var $editors = $scope.find('[data-richtext=ckeditor]');
  25. if ($editors.length === 0) {
  26. return;
  27. }
  28. if (window.CKEDITOR) {
  29. setTimeout(function() {
  30. refreshPaneEditors($scope);
  31. }, 0);
  32. return;
  33. }
  34. var options = $editors.first().data('options') || {};
  35. if (options.base_location) {
  36. window.CKEDITOR_BASEPATH = options.base_location;
  37. }
  38. if (options.jspath) {
  39. $.getScript(options.jspath, function() {
  40. setTimeout(function() {
  41. refreshPaneEditors($scope);
  42. }, 0);
  43. });
  44. }
  45. }
  46. function nearestField($input) {
  47. return $input.closest('.form-group, .control-group');
  48. }
  49. function buildProductLocaleTabs() {
  50. var $form = $('form').filter(function() {
  51. return $(this).find('[name="product[name]"]').length > 0;
  52. }).first();
  53. if ($form.length === 0) {
  54. return;
  55. }
  56. var fieldMap = [
  57. {
  58. key: 'zh-CN',
  59. label: '简体中文',
  60. nameField: nearestField($form.find('[name="product[name]"]')),
  61. detailField: nearestField($form.find('[name="product[detail]"]'))
  62. },
  63. {
  64. key: 'en',
  65. label: 'English',
  66. nameField: nearestField($form.find('[name="product[name_en]"]')),
  67. detailField: nearestField($form.find('[name="product[detail_en]"]'))
  68. },
  69. {
  70. key: 'ru',
  71. label: 'Русский',
  72. nameField: nearestField($form.find('[name="product[name_ru]"]')),
  73. detailField: nearestField($form.find('[name="product[detail_ru]"]'))
  74. },
  75. {
  76. key: 'zh-TW',
  77. label: '繁體中文',
  78. nameField: nearestField($form.find('[name="product[name_tw]"]')),
  79. detailField: nearestField($form.find('[name="product[detail_tw]"]'))
  80. }
  81. ];
  82. if ($form.find('.product-locale-tabs').length > 0) {
  83. return;
  84. }
  85. var hasAllFields = true;
  86. $.each(fieldMap, function(_, group) {
  87. if (group.nameField.length === 0 || group.detailField.length === 0) {
  88. hasAllFields = false;
  89. return false;
  90. }
  91. });
  92. if (!hasAllFields) {
  93. return;
  94. }
  95. var $anchor = fieldMap[0].nameField;
  96. var $mount = $('<div class="product-locale-tabs-mount"></div>');
  97. $anchor.before($mount);
  98. var $tabs = $('<div class="product-locale-tabs"></div>');
  99. var $header = $('<div class="product-locale-tabs-header"><div><h4>商品多语言内容</h4><p>名称与详情按语言分别维护,未填写时接口默认回退到简体中文。</p></div></div>');
  100. var $nav = $('<ul class="nav nav-tabs product-locale-tabs-nav" role="tablist"></ul>');
  101. var $content = $('<div class="tab-content product-locale-tabs-content"></div>');
  102. $.each(fieldMap, function(index, group) {
  103. var tabId = 'product-locale-tab-' + group.key.replace(/[^a-zA-Z0-9]/g, '-').toLowerCase();
  104. var activeClass = index === 0 ? 'active' : '';
  105. var $navItem = $('<li role="presentation" class="' + activeClass + '"></li>');
  106. var $link = $('<a data-toggle="tab" role="tab"></a>');
  107. $link.attr('href', '#' + tabId);
  108. $link.append($('<span class="product-locale-tab-title"></span>').text(group.label));
  109. $link.append($('<span class="product-locale-tab-code"></span>').text(group.key));
  110. $navItem.append($link);
  111. $nav.append($navItem);
  112. var $pane = $('<div role="tabpanel" class="tab-pane product-locale-pane ' + activeClass + '" id="' + tabId + '"></div>');
  113. $pane.append(group.nameField);
  114. $pane.append(group.detailField);
  115. $content.append($pane);
  116. });
  117. $tabs.append($header).append($nav).append($content);
  118. $mount.replaceWith($tabs);
  119. ensurePaneEditors($content.find('.product-locale-pane.active'));
  120. $nav.on('shown.bs.tab', 'a[data-toggle="tab"]', function() {
  121. var selector = $(this).attr('href');
  122. if (!selector) {
  123. return;
  124. }
  125. ensurePaneEditors($content.find(selector));
  126. });
  127. }
  128. $(document).on('ready page:load turbolinks:load', buildProductLocaleTabs);
  129. })(jQuery);