/
amesk
/
gitlab-analyzer
Обзор
Документация
Войти
/
amesk
/
gitlab-analyzer
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
jquery
main.js
193 строки
7 KB
amesk
Excel export is now made to unique file in order to avoid file locking.
15 фев 2025, 16:24
15 фев 2025, 16:24
e6dd7b4
Код
Авторство
О чём код?
const { app, BrowserWindow, shell, ipcMain, Menu } = require('electron'); const XLSX = require('xlsx'); const path = require('path'); const os = require('os'); const crypto = require('crypto'); // Импорт функций для работы с GitLab const { updateLabel, getOpenIssues, getProjectLabels, setupApiToken } = require('./gitlab'); let mainWindow; function createWindow() { mainWindow = new BrowserWindow({ width: 800, height: 600, webPreferences: { nodeIntegration: false, // Отключаем nodeIntegration для безопасности contextIsolation: true, // Включаем изоляцию контекста preload: path.join(__dirname, 'preload.js'), // Указываем путь к preload.js }, }); mainWindow.loadFile('index.html'); // Отключаем горячие клавиши для открытия DevTools в продакшен-сборке if (process.env.NODE_ENV !== 'development') { mainWindow.webContents.on('before-input-event', (event, input) => { if (input.control && input.shift && input.key.toLowerCase() === 'i') { event.preventDefault(); // Блокируем Ctrl+Shift+I } if (input.key === 'F12') { event.preventDefault(); // Блокируем F12 } }); } // Обработчик для открытия внешних ссылок ipcMain.on('open-external-link', (event, url) => { shell.openExternal(url); // Открываем ссылку в браузере по умолчанию }); // Обработчик для открытия окна справки ipcMain.on('open-help-window', () => { const helpWindow = new BrowserWindow({ width: 600, height: 400, webPreferences: { devTools: process.env.NODE_ENV === 'development', nodeIntegration: false, contextIsolation: true, preload: path.join(__dirname, 'preload.js'), }, }); helpWindow.loadFile('help.html'); helpWindow.setMenu(null); // Обработчик для открытия ссылок во внешнем браузере helpWindow.webContents.on('will-navigate', (event, url) => { event.preventDefault(); // Отменяем стандартное поведение shell.openExternal(url); // Открываем ссылку во внешнем браузере }); // Обработчик для открытия ссылок в новых окнах (если есть target="_blank") helpWindow.webContents.setWindowOpenHandler(({ url }) => { shell.openExternal(url); // Открываем ссылку во внешнем браузере return { action: 'deny' }; // Запрещаем открытие нового окна в Electron }); }); // Обработчик для получения открытых задач ipcMain.handle('get-open-issues', async (event, projectId) => { const result = await getOpenIssues(projectId); return result; }); // Обработчик для получения словаря с метками проекта ipcMain.handle('get-project-labels', async (event, projectId) => { const result = await getProjectLabels(projectId); return result; }); // Обработчик для обновления метки ipcMain.handle('update-label', async (event, projectId, issueId, label, action) => { const result = await updateLabel(projectId, issueId, label, action); return result; }); ipcMain.handle('export-to-excel', async (event, data) => { try { const worksheet = XLSX.utils.json_to_sheet(data); const workbook = XLSX.utils.book_new(); XLSX.utils.book_append_sheet(workbook, worksheet, "Issues"); const randomSuffix = crypto.randomBytes(4).toString('hex'); const filePath = path.join(os.homedir(), `issues-${randomSuffix}.xlsx`); XLSX.writeFile(workbook, filePath); // Открываем файл с помощью программы по умолчанию await shell.openPath(filePath); return { success: true }; } catch (error) { console.error('Error exporting to Excel:', error); return { success: false, error: error.message }; } }); } app.on('ready', () => { createWindow(); }); app.on('window-all-closed', () => { if (process.platform !== 'darwin') { app.quit(); } }); app.on('activate', () => { if (BrowserWindow.getAllWindows().length === 0) { createWindow(); } }); const template = [ { label: 'File', submenu: [ { role: 'quit' } ] }, { label: 'Edit', submenu: [ { role: 'undo' }, { role: 'redo' }, { type: 'separator' }, { role: 'cut' }, { role: 'copy' }, { role: 'paste' }, { role: 'delete' }, { role: 'selectAll' } ] }, { label: 'View', submenu: [] }, { label: 'Window', submenu: [ { role: 'minimize' }, { role: 'close' } ] } ]; // Добавляем роли для разработки, если NODE_ENV === 'development' const viewSubmenu = template.find(item => item.label === 'View').submenu; if (process.env.NODE_ENV === 'development') { viewSubmenu.push( { role: 'reload' }, { role: 'forcereload' }, { role: 'toggledevtools' }, { type: 'separator' }, { role: 'resetzoom' }, { role: 'zoomin' }, { role: 'zoomout' }, { type: 'separator' }, { role: 'togglefullscreen' } ); } else { // В продакшен-режиме добавляем только остальные элементы viewSubmenu.push( { role: 'resetzoom' }, { role: 'zoomin' }, { role: 'zoomout' }, { type: 'separator' }, { role: 'togglefullscreen' } ); } const menu = Menu.buildFromTemplate(template); Menu.setApplicationMenu(menu); // Обработчик для сохранения токена ipcMain.on('save-token', (event, token) => { setupApiToken(token); }); // Обработчик для закрытия задач ipcMain.handle('close-issues', async (event, projectId, issueIds) => { const result = await closeIssues(projectId, issueIds); return result; });