/** * Nextcloud Editor Integration JavaScript * JavaScript для интеграции редактора документов Nextcloud */ /** * Открытие папки проекта в Nextcloud */ function openProjectFolder(projectId, projectName) { console.log('📁 Opening project folder in Nextcloud:', projectId, projectName); // Нормализуем имя проекта (убираем пробелы и кавычки) if (projectName) { // Убираем кавычки (заменяем на подчёркивание) projectName = projectName.replace(/"/g, '_'); // Заменяем ВСЕ пробелы на подчёркивания projectName = projectName.replace(/\s+/g, '_'); // Заменяем множественные подчёркивания на одинарное projectName = projectName.replace(/_+/g, '_'); // Убираем подчёркивания в начале и конце projectName = projectName.replace(/^_+|_+$/g, ''); } // Формируем URL для папки проекта в Nextcloud const folderName = projectName ? `${projectName}_${projectId}` : `project_${projectId}`; const encodedFolderName = encodeURIComponent(folderName); const nextcloudUrl = 'https://office.clientright.ru:8443'; // URL для папки проекта в Nextcloud External Storage (со структурой Project/) const folderUrl = `${nextcloudUrl}/apps/files/?dir=/crm/crm2/CRM_Active_Files/Documents/Project/${encodedFolderName}`; console.log('🔗 Folder URL:', folderUrl); // Открываем папку в новом окне window.open(folderUrl, 'nextcloud_folder', 'width=1200,height=800,scrollbars=yes,resizable=yes'); } /** * Открытие редактора Nextcloud для документа */ function openNextcloudEditor(recordId, fileName) { console.log('🚀 NEXTCLOUD EDITOR v3 - COLLABORA: Function called!', recordId, fileName); // COLLABORA через Nextcloud (работает!) const redirectUrl = `/crm_extensions/file_storage/api/open_file_v3_collabora.php?recordId=${recordId}&fileName=${encodeURIComponent(fileName)}&v=${Date.now()}`; console.log('🎯 Opening via Collabora v3:', redirectUrl); console.log('⚠️ Если открывается OnlyOffice - очисти кеш браузера (Ctrl+Shift+R)!'); // Открываем в новом окне const win = window.open(redirectUrl, 'nextcloud_editor_' + Date.now(), 'width=1400,height=900,scrollbars=yes,resizable=yes'); if (win) { console.log('✅ Collabora editor opened successfully'); } else { console.log('❌ Failed to open editor window - popup blocked'); alert('❌ Не удалось открыть редактор. Проверьте блокировку всплывающих окон.'); } } function testSimpleAPI(recordId, fileName) { console.log('🧪 Testing simple API...', recordId, fileName); // Пропускаем простой API и сразу идем к основному console.log('🎯 Skipping simple API, going to main API...'); callMainAPI(recordId, fileName); } function createEditUrls(baseEditUrl, recordId, fileName, fileId = 662) { console.log('🔗 Creating edit URLs in JavaScript...', { fileId, fileName }); // Извлекаем базовый URL из базовой ссылки const baseUrl = 'https://office.clientright.ru:8443'; const encodedFileName = encodeURIComponent(fileName); const filePath = `/crm/crm2/CRM_Active_Files/Documents/${recordId}/${encodedFileName}`; // Токен для RichDocuments (из настроек Nextcloud) const richDocumentsToken = '1sanuq71b3n4fm1ldkbb'; const urls = { // ЛУЧШИЙ СПОСОБ! - редирект через нашу промежуточную страницу (БЕЗ CSRF!) 'redirect_to_nextcloud': fileId ? `/crm_extensions/file_storage/api/open_file.php?fileId=${fileId}&fileName=${encodedFileName}&recordId=${recordId}` : null, // РАБОЧИЙ СПОСОБ! - прямая ссылка на Nextcloud 'files_editing_auto': fileId ? `${baseUrl}/apps/files/files/${fileId}?dir=/&editing=true&openfile=true` : null, // Вариант без автоматического редактирования 'files_editing': fileId ? `${baseUrl}/apps/files/files/${fileId}?dir=/&editing=false&openfile=true` : null, // Collabora Editor 'collabora_editor': fileId ? `${baseUrl}/index.php/apps/richdocuments/index?fileId=${fileId}` : null, // OnlyOffice Editor 'onlyoffice_editor': fileId ? `${baseUrl}/apps/onlyoffice?fileId=${fileId}` : null, // Прямое открытие файла 'files_direct': fileId ? `${baseUrl}/apps/files/files/${fileId}` : `${baseUrl}/apps/files/?dir=/&openfile=${encodedFileName}`, // Файловый менеджер 'files_manager': `${baseUrl}/apps/files/?dir=/&openfile=${encodedFileName}` }; // Убираем null значения Object.keys(urls).forEach(key => { if (urls[key] === null) { delete urls[key]; } }); return { all: urls, // РЕДИРЕКТ через нашу страницу - лучший способ (обходит CSRF) recommended: urls.redirect_to_nextcloud || urls.files_editing_auto || urls.files_editing || urls.collabora_editor }; } function getEditUrls(recordId, fileName, simpleData) { console.log('🔗 Getting edit URLs...'); $.ajax({ url: '/crm_extensions/file_storage/api/get_edit_urls.php', method: 'GET', data: { record: recordId, fileName: fileName }, dataType: 'json', success: function(response) { console.log('✅ Edit URLs received:', response); if (response.success) { // Пробуем открыть рекомендуемый URL const recommendedUrl = response.data.urls[response.data.recommended]; console.log('🎯 Trying recommended URL:', recommendedUrl); openEditor(recommendedUrl, { ...simpleData, urls: response.data.urls, recommended: response.data.recommended }); } else { // Если не получилось, используем простой API openEditor(simpleData.edit_url, simpleData); } }, error: function(xhr, status, error) { console.error('❌ Failed to get edit URLs:', error); // Если не получилось, используем простой API openEditor(simpleData.edit_url, simpleData); } }); } function callMainAPI(recordId, fileName) { console.log('🎯 Calling main API...', recordId, fileName); // Показываем прогресс if (typeof app !== 'undefined' && app.helper && app.helper.showProgress) { app.helper.showProgress({ message: 'Подготовка файла к редактированию...' }); } // Вызываем ПРАВИЛЬНЫЙ API для подготовки файла $.ajax({ url: '/index.php?module=Documents&action=NcPrepareEdit', method: 'GET', data: { record: recordId, fileName: fileName }, dataType: 'json', success: function(response) { console.log('📡 API Response:', response); // Скрываем прогресс if (typeof app !== 'undefined' && app.helper && app.helper.hideProgress) { app.helper.hideProgress(); } if (response.success) { console.log('✅ File prepared successfully'); // Открываем редактор openEditor(response.data.edit_url, response.data); } else { console.error('❌ API Error:', response.error); showError('Ошибка подготовки файла: ' + response.error); } }, error: function(xhr, status, error) { console.error('❌ AJAX Error:', error); console.error('❌ Status:', status); console.error('❌ Response:', xhr.responseText); console.error('❌ Status Code:', xhr.status); // Скрываем прогресс if (typeof app !== 'undefined' && app.helper && app.helper.hideProgress) { app.helper.hideProgress(); } // Показываем подробную ошибку let errorMessage = 'Ошибка подключения к серверу: ' + error; if (xhr.responseText) { errorMessage += '\n\nОтвет сервера:\n' + xhr.responseText; } showError(errorMessage); } }); } // Функция для открытия редактора function openEditor(editUrl, fileData) { console.log('🎯 Opening editor with URL:', editUrl); console.log('📋 All available URLs:', fileData.urls); // Открываем редактор в новом окне var win = window.open(editUrl, 'nextcloud_editor', 'width=1200,height=800,scrollbars=yes,resizable=yes'); if (win) { console.log('✅ Editor opened successfully'); // Показываем уведомление об успехе if (typeof app !== 'undefined' && app.helper && app.helper.showSuccessNotification) { app.helper.showSuccessNotification({ message: 'Редактор открыт! Файл: ' + fileData.file_name }); } else { // alert('✅ Редактор открыт! Файл: ' + fileData.file_name); } // Показываем информацию о файле showFileInfo(fileData); } else { console.log('❌ Failed to open editor window - popup blocked or error'); console.log('📋 Showing modal with alternative URLs'); // Показываем модальное окно с альтернативными вариантами showModalWithUrls(editUrl, fileData); } } // Функция для отображения информации о файле function showFileInfo(fileData) { // Проверяем, есть ли нужные поля в fileData var location = 'Неизвестно'; var nextcloudPath = 'Не указан'; var status = 'Не указан'; if (fileData.file_location && fileData.file_location.type) { location = fileData.file_location.type === 's3' ? 'S3 хранилище' : 'Локальное хранилище'; } if (fileData.nextcloud_path) { nextcloudPath = fileData.nextcloud_path; } if (fileData.message) { status = fileData.message; } var infoHtml = `
Файл: ${fileData.file_name}
Расположение: ${location}
Путь в Nextcloud: ${nextcloudPath}
Статус: ${status}