| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- {{--
- Partial: JS для страницы редактирования page-edit
- Подключается через @include внутри @push('js') основного файла
- Зависимости: SortableJS (CDN), jQuery + Summernote (подключены через AdminLTE)
- Переменные Blade: $page (для route())
- --}}
- <script src="https://cdn.jsdelivr.net/npm/sortablejs@1.15.2/Sortable.min.js"></script>
- <script>
- (function () {
- // ===== Инициализация Summernote для всех текстовых секций =====
- $('.content-editor').each(function () {
- var $ta = $(this);
- var sectionId = $ta.data('section-id');
- var $wrapper = $ta.closest('.flex-grow-1').find('#editor-' + sectionId);
- $wrapper.summernote({
- lang: 'ru-RU',
- height: 220,
- toolbar: [
- ['style', ['style']],
- ['font', ['bold', 'italic', 'underline', 'clear']],
- ['para', ['ul', 'ol', 'paragraph']],
- ['insert', ['link', 'hr']],
- ['view', ['fullscreen', 'codeview']],
- ],
- styleTags: ['p', 'h2', 'h3', 'h4', 'blockquote'],
- callbacks: {
- onChange: function (contents) {
- $ta.val(contents);
- }
- }
- });
- $ta.val($wrapper.summernote('code'));
- });
- // ===== Сохранение контента текстовой секции через AJAX =====
- $('.btn-save-content').on('click', function () {
- var sectionId = $(this).data('section-id');
- var $btn = $(this);
- var $status = $('#status-' + sectionId);
- var $ta = $('[data-section-id="' + sectionId + '"].content-editor');
- var saveUrl = $ta.data('save-url');
- $btn.prop('disabled', true).html('<i class="fas fa-spinner fa-spin"></i>');
- fetch(saveUrl, {
- method: 'PUT',
- headers: {
- 'Content-Type': 'application/json',
- 'X-CSRF-TOKEN': '{{ csrf_token() }}'
- },
- body: JSON.stringify({ content: $ta.val() })
- })
- .then(function (r) { return r.json(); })
- .then(function (data) {
- $btn.prop('disabled', false).html('<i class="fas fa-save"></i> Сохранить текст');
- if (data.ok) {
- $status.show();
- setTimeout(function () { $status.hide(); }, 2500);
- } else {
- alert('Ошибка сохранения.');
- }
- })
- .catch(function () {
- $btn.prop('disabled', false).html('<i class="fas fa-save"></i> Сохранить текст');
- alert('Ошибка соединения.');
- });
- });
- // ===== Drag-and-drop сортировка секций =====
- var list = document.getElementById('sortable-sections');
- var btnSave = document.getElementById('btn-save-order');
- if (!list) return;
- Sortable.create(list, {
- handle: '.drag-handle',
- animation: 150,
- ghostClass: 'bg-light',
- onEnd: function () {
- btnSave.disabled = false;
- }
- });
- // Сохраняем новый порядок через AJAX
- btnSave.addEventListener('click', function () {
- btnSave.disabled = true;
- btnSave.innerHTML = '<i class="fas fa-spinner fa-spin"></i> Сохранение…';
- var ids = Array.from(list.querySelectorAll('[data-id]'))
- .map(function (el) { return parseInt(el.dataset.id, 10); });
- fetch('{{ route('admin.pages.sections.reorder', $page) }}', {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- 'X-CSRF-TOKEN': '{{ csrf_token() }}'
- },
- body: JSON.stringify({ order: ids })
- })
- .then(function (r) { return r.json(); })
- .then(function (data) {
- if (data.ok) {
- btnSave.innerHTML = '<i class="fas fa-check"></i> Сохранено';
- setTimeout(function () {
- btnSave.innerHTML = '<i class="fas fa-save"></i> Сохранить порядок';
- }, 2000);
- } else {
- btnSave.disabled = false;
- btnSave.innerHTML = '<i class="fas fa-save"></i> Сохранить порядок';
- alert('Ошибка сохранения порядка.');
- }
- })
- .catch(function () {
- btnSave.disabled = false;
- btnSave.innerHTML = '<i class="fas fa-save"></i> Сохранить порядок';
- alert('Ошибка соединения.');
- });
- });
- })();
- </script>
|