_page_scripts.blade.php 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. {{--
  2. Partial: JS для страницы редактирования page-edit
  3. Подключается через @include внутри @push('js') основного файла
  4. Зависимости: SortableJS (CDN), jQuery + Summernote (подключены через AdminLTE)
  5. Переменные Blade: $page (для route())
  6. --}}
  7. <script src="https://cdn.jsdelivr.net/npm/sortablejs@1.15.2/Sortable.min.js"></script>
  8. <script>
  9. (function () {
  10. // ===== Инициализация Summernote для всех текстовых секций =====
  11. $('.content-editor').each(function () {
  12. var $ta = $(this);
  13. var sectionId = $ta.data('section-id');
  14. var $wrapper = $ta.closest('.flex-grow-1').find('#editor-' + sectionId);
  15. $wrapper.summernote({
  16. lang: 'ru-RU',
  17. height: 220,
  18. toolbar: [
  19. ['style', ['style']],
  20. ['font', ['bold', 'italic', 'underline', 'clear']],
  21. ['para', ['ul', 'ol', 'paragraph']],
  22. ['insert', ['link', 'hr']],
  23. ['view', ['fullscreen', 'codeview']],
  24. ],
  25. styleTags: ['p', 'h2', 'h3', 'h4', 'blockquote'],
  26. callbacks: {
  27. onChange: function (contents) {
  28. $ta.val(contents);
  29. }
  30. }
  31. });
  32. $ta.val($wrapper.summernote('code'));
  33. });
  34. // ===== Сохранение контента текстовой секции через AJAX =====
  35. $('.btn-save-content').on('click', function () {
  36. var sectionId = $(this).data('section-id');
  37. var $btn = $(this);
  38. var $status = $('#status-' + sectionId);
  39. var $ta = $('[data-section-id="' + sectionId + '"].content-editor');
  40. var saveUrl = $ta.data('save-url');
  41. $btn.prop('disabled', true).html('<i class="fas fa-spinner fa-spin"></i>');
  42. fetch(saveUrl, {
  43. method: 'PUT',
  44. headers: {
  45. 'Content-Type': 'application/json',
  46. 'X-CSRF-TOKEN': '{{ csrf_token() }}'
  47. },
  48. body: JSON.stringify({ content: $ta.val() })
  49. })
  50. .then(function (r) { return r.json(); })
  51. .then(function (data) {
  52. $btn.prop('disabled', false).html('<i class="fas fa-save"></i> Сохранить текст');
  53. if (data.ok) {
  54. $status.show();
  55. setTimeout(function () { $status.hide(); }, 2500);
  56. } else {
  57. alert('Ошибка сохранения.');
  58. }
  59. })
  60. .catch(function () {
  61. $btn.prop('disabled', false).html('<i class="fas fa-save"></i> Сохранить текст');
  62. alert('Ошибка соединения.');
  63. });
  64. });
  65. // ===== Drag-and-drop сортировка секций =====
  66. var list = document.getElementById('sortable-sections');
  67. var btnSave = document.getElementById('btn-save-order');
  68. if (!list) return;
  69. Sortable.create(list, {
  70. handle: '.drag-handle',
  71. animation: 150,
  72. ghostClass: 'bg-light',
  73. onEnd: function () {
  74. btnSave.disabled = false;
  75. }
  76. });
  77. // Сохраняем новый порядок через AJAX
  78. btnSave.addEventListener('click', function () {
  79. btnSave.disabled = true;
  80. btnSave.innerHTML = '<i class="fas fa-spinner fa-spin"></i> Сохранение…';
  81. var ids = Array.from(list.querySelectorAll('[data-id]'))
  82. .map(function (el) { return parseInt(el.dataset.id, 10); });
  83. fetch('{{ route('admin.pages.sections.reorder', $page) }}', {
  84. method: 'POST',
  85. headers: {
  86. 'Content-Type': 'application/json',
  87. 'X-CSRF-TOKEN': '{{ csrf_token() }}'
  88. },
  89. body: JSON.stringify({ order: ids })
  90. })
  91. .then(function (r) { return r.json(); })
  92. .then(function (data) {
  93. if (data.ok) {
  94. btnSave.innerHTML = '<i class="fas fa-check"></i> Сохранено';
  95. setTimeout(function () {
  96. btnSave.innerHTML = '<i class="fas fa-save"></i> Сохранить порядок';
  97. }, 2000);
  98. } else {
  99. btnSave.disabled = false;
  100. btnSave.innerHTML = '<i class="fas fa-save"></i> Сохранить порядок';
  101. alert('Ошибка сохранения порядка.');
  102. }
  103. })
  104. .catch(function () {
  105. btnSave.disabled = false;
  106. btnSave.innerHTML = '<i class="fas fa-save"></i> Сохранить порядок';
  107. alert('Ошибка соединения.');
  108. });
  109. });
  110. })();
  111. </script>