admin.js 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. /**
  2. * Admin JavaScript for Studiou WC Product Category Manager
  3. */
  4. (function($) {
  5. 'use strict';
  6. // Initialize admin scripts
  7. $(document).ready(function() {
  8. // Import form handling
  9. if ($('#studiou-wcpcm-import-form').length) {
  10. initImportForm();
  11. }
  12. // Export form handling
  13. if ($('#studiou-wcpcm-export-form').length) {
  14. initExportForm();
  15. }
  16. // Move products form handling
  17. if ($('#studiou-wcpcm-move-form').length) {
  18. initMoveForm();
  19. }
  20. // Sample CSV download handler
  21. if ($('#studiou-wcpcm-download-sample').length) {
  22. initSampleDownload();
  23. }
  24. });
  25. /**
  26. * Initialize import form
  27. */
  28. function initImportForm() {
  29. $('#studiou-wcpcm-import-form').on('submit', function(e) {
  30. e.preventDefault();
  31. // Show spinner
  32. var $submitBtn = $(this).find('#studiou-wcpcm-import-button');
  33. var $spinner = $(this).find('.spinner');
  34. $submitBtn.prop('disabled', true);
  35. $spinner.css('visibility', 'visible');
  36. // Clear previous notices
  37. $('.studiou-wcpcm-notice-area').empty();
  38. // Create form data
  39. var formData = new FormData(this);
  40. formData.append('action', 'studiou_wcpcm_import');
  41. formData.append('nonce', studiouWcpcm.nonce);
  42. // Send AJAX request
  43. $.ajax({
  44. url: studiouWcpcm.ajaxUrl,
  45. type: 'POST',
  46. data: formData,
  47. processData: false,
  48. contentType: false,
  49. success: function(response) {
  50. if (response.success) {
  51. showNotice('success', studiouWcpcm.i18n.importSuccess);
  52. // Show results
  53. $('#studiou-wcpcm-import-results').text(response.data.message);
  54. $('.studiou-wcpcm-import-results').show();
  55. } else {
  56. showNotice('error', response.data.message);
  57. }
  58. },
  59. error: function() {
  60. showNotice('error', studiouWcpcm.i18n.importError);
  61. },
  62. complete: function() {
  63. // Hide spinner
  64. $submitBtn.prop('disabled', false);
  65. $spinner.css('visibility', 'hidden');
  66. }
  67. });
  68. });
  69. }
  70. /**
  71. * Initialize export form
  72. */
  73. function initExportForm() {
  74. $('#studiou-wcpcm-export-form').on('submit', function(e) {
  75. e.preventDefault();
  76. // Show spinner
  77. var $submitBtn = $(this).find('#studiou-wcpcm-export-button');
  78. var $spinner = $(this).find('.spinner');
  79. $submitBtn.prop('disabled', true);
  80. $spinner.css('visibility', 'visible');
  81. // Clear previous notices
  82. $('.studiou-wcpcm-notice-area').empty();
  83. // Send AJAX request
  84. $.ajax({
  85. url: studiouWcpcm.ajaxUrl,
  86. type: 'POST',
  87. data: {
  88. action: 'studiou_wcpcm_export',
  89. nonce: studiouWcpcm.nonce
  90. },
  91. success: function(response) {
  92. if (response.success) {
  93. showNotice('success', studiouWcpcm.i18n.exportSuccess);
  94. // Show download link
  95. $('#studiou-wcpcm-export-message').text(response.data.message);
  96. $('#studiou-wcpcm-download-export').attr('href', response.data.download_url);
  97. $('.studiou-wcpcm-export-results').show();
  98. } else {
  99. showNotice('error', response.data.message);
  100. }
  101. },
  102. error: function() {
  103. showNotice('error', studiouWcpcm.i18n.exportError);
  104. },
  105. complete: function() {
  106. // Hide spinner
  107. $submitBtn.prop('disabled', false);
  108. $spinner.css('visibility', 'hidden');
  109. }
  110. });
  111. });
  112. }
  113. /**
  114. * Initialize move products form
  115. */
  116. function initMoveForm() {
  117. $('#studiou-wcpcm-move-form').on('submit', function(e) {
  118. e.preventDefault();
  119. // Validate that different categories are selected
  120. var sourceCategory = $('#source_category').val();
  121. var targetCategory = $('#target_category').val();
  122. if (sourceCategory === targetCategory) {
  123. showNotice('error', studiouWcpcm.i18n.selectDifferentCategories);
  124. return;
  125. }
  126. // Show spinner
  127. var $submitBtn = $(this).find('#studiou-wcpcm-move-button');
  128. var $spinner = $(this).find('.spinner');
  129. $submitBtn.prop('disabled', true);
  130. $spinner.css('visibility', 'visible');
  131. // Clear previous notices
  132. $('.studiou-wcpcm-notice-area').empty();
  133. // Send AJAX request
  134. $.ajax({
  135. url: studiouWcpcm.ajaxUrl,
  136. type: 'POST',
  137. data: {
  138. action: 'studiou_wcpcm_move_products',
  139. source_category: sourceCategory,
  140. target_category: targetCategory,
  141. nonce: studiouWcpcm.nonce
  142. },
  143. success: function(response) {
  144. if (response.success) {
  145. showNotice('success', studiouWcpcm.i18n.moveSuccess);
  146. // Show results
  147. $('#studiou-wcpcm-move-message').html('<p>' + response.data.message + '</p>');
  148. $('.studiou-wcpcm-move-results').show();
  149. // Refresh the page to update category counts
  150. setTimeout(function() {
  151. location.reload();
  152. }, 3000);
  153. } else {
  154. showNotice('error', response.data.message);
  155. }
  156. },
  157. error: function() {
  158. showNotice('error', studiouWcpcm.i18n.moveError);
  159. },
  160. complete: function() {
  161. // Hide spinner
  162. $submitBtn.prop('disabled', false);
  163. $spinner.css('visibility', 'hidden');
  164. }
  165. });
  166. });
  167. }
  168. /**
  169. * Initialize sample CSV download
  170. */
  171. function initSampleDownload() {
  172. $('#studiou-wcpcm-download-sample').on('click', function(e) {
  173. e.preventDefault();
  174. // Sample CSV content
  175. var csvContent = 'name,url-name,parent-name,description,display-type,visibility,protected-passwords,operation\n' +
  176. '"Clothing","clothing","","Top quality clothing","default","public","","A"\n' +
  177. '"Men","men","Clothing","Men\'s clothing","products","public","","A"\n' +
  178. '"Women","women","Clothing","Women\'s clothing","products","protected","password123","A"\n' +
  179. '"Kids","kids","Clothing","Kids clothing","products","public","","U"\n' +
  180. '"Accessories","accessories","","All accessories","default","public","","D"';
  181. // Create download link
  182. var blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });
  183. var url = URL.createObjectURL(blob);
  184. var link = document.createElement('a');
  185. link.setAttribute('href', url);
  186. link.setAttribute('download', 'sample-product-categories.csv');
  187. link.style.visibility = 'hidden';
  188. document.body.appendChild(link);
  189. link.click();
  190. document.body.removeChild(link);
  191. });
  192. }
  193. /**
  194. * Show notice message
  195. *
  196. * @param {string} type Notice type (success, error)
  197. * @param {string} message Notice message
  198. */
  199. function showNotice(type, message) {
  200. var $notice = $('<div class="studiou-wcpcm-notice studiou-wcpcm-notice-' + type + '"></div>').text(message);
  201. $('.studiou-wcpcm-notice-area').append($notice);
  202. // Scroll to notice
  203. $('html, body').animate({
  204. scrollTop: $('.studiou-wcpcm-notice-area').offset().top - 50
  205. }, 500);
  206. }
  207. })(jQuery);