diff --git a/electron/main.js b/electron/main.js index 79f5e5c2..14d6b94d 100644 --- a/electron/main.js +++ b/electron/main.js @@ -104,6 +104,7 @@ function createRouter(arg) { parent: mainWindow, webPreferences: { preload: path.join(__dirname, 'preload.js'), + devTools: arg.devTools !== false, nodeIntegration: true, contextIsolation: false } @@ -133,41 +134,82 @@ function createRouter(arg) { app.whenReady().then(() => { createWindow() - app.on('activate', function () { + app.on('activate', () => { if (BrowserWindow.getAllWindows().length === 0) createWindow() }) }) -app.on('window-all-closed', function () { - if (process.platform !== 'darwin') app.quit() +app.on('window-all-closed', () => { + if (process.platform !== 'darwin') { + app.quit() + } }) app.on('before-quit', () => { willQuitApp = true }) -ipcMain.on('inheritClose', () => { +ipcMain.on('inheritClose', (event) => { inheritClose = true + event.returnValue = "ok" }) ipcMain.on('windowRouter', (event, arg) => { createRouter(arg) + event.returnValue = "ok" }) -ipcMain.on('windowHidden', () => { +ipcMain.on('windowHidden', (event) => { app.hide(); + event.returnValue = "ok" }) -ipcMain.on('windowClose', () => { - mainWindow.close() +ipcMain.on('windowClose', (event) => { + const win = BrowserWindow.fromWebContents(event.sender); + win.close() + event.returnValue = "ok" }) -ipcMain.on('windowMax', function () { - if (mainWindow.isMaximized()) { - mainWindow.restore(); - } else { - mainWindow.maximize(); +ipcMain.on('windowSize', (event, arg) => { + const win = BrowserWindow.fromWebContents(event.sender); + if (win) { + if (arg.width || arg.height) { + win.setSize(arg.width || win.getSize()[0], arg.height || win.getSize()[1]) + } + if (arg.minWidth || arg.minHeight) { + win.setMinimumSize(arg.minWidth || win.getMinimumSize()[0], arg.minHeight || win.getMinimumSize()[1]) + } + if (arg.maxWidth || arg.maxHeight) { + win.setMaximumSize(arg.maxWidth || win.getMaximumSize()[0], arg.maxHeight || win.getMaximumSize()[1]) + } } + event.returnValue = "ok" +}) + +ipcMain.on('windowMinSize', (event, arg) => { + const win = BrowserWindow.fromWebContents(event.sender); + if (win) { + win.setMinimumSize(arg.width || win.getMinimumSize()[0], arg.height || win.getMinimumSize()[1]) + } + event.returnValue = "ok" +}) + +ipcMain.on('windowMaxSize', (event, arg) => { + const win = BrowserWindow.fromWebContents(event.sender); + if (win) { + win.setMaximumSize(arg.width || win.getMaximumSize()[0], arg.height || win.getMaximumSize()[1]) + } + event.returnValue = "ok" +}) + +ipcMain.on('windowMax', (event) => { + const win = BrowserWindow.fromWebContents(event.sender); + if (win.isMaximized()) { + win.restore(); + } else { + win.maximize(); + } + event.returnValue = "ok" }) ipcMain.on('setDockBadge', (event, arg) => { @@ -180,6 +222,7 @@ ipcMain.on('setDockBadge', (event, arg) => { } else { app.dock.setBadge("") } + event.returnValue = "ok" }) ipcMain.on('saveSheet', (event, data, filename, opts) => { @@ -194,4 +237,5 @@ ipcMain.on('saveSheet', (event, data, filename, opts) => { }).then(o => { XLSX.writeFile(data, o.filePath, opts); }); + event.returnValue = "ok" }) diff --git a/electron/package.json b/electron/package.json index feb703b5..0d4b0a58 100644 --- a/electron/package.json +++ b/electron/package.json @@ -35,8 +35,9 @@ "@electron-forge/maker-zip": "^6.0.0-beta.61", "dmg-license": "^1.0.10", "dotenv": "^10.0.0", - "electron": "^16.0.4", - "electron-builder": "^22.14.5" + "electron": "^16.0.5", + "electron-builder": "^22.14.5", + "electron-log": "^4.4.3" }, "dependencies": { "electron-squirrel-startup": "^1.0.0", diff --git a/package.json b/package.json index 2ba407ec..b54e04fe 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "cross-env": "^7.0.3", "css-loader": "^6.5.1", "echarts": "^5.2.2", + "electron": "^16.0.5", "element-ui": "^2.15.6", "file-loader": "^6.2.0", "inquirer": "^8.2.0", diff --git a/public/css/fonts/taskfont.ttf b/public/css/fonts/taskfont.ttf index 6171e4f5..ff626ae4 100644 Binary files a/public/css/fonts/taskfont.ttf and b/public/css/fonts/taskfont.ttf differ diff --git a/public/css/fonts/taskfont.woff b/public/css/fonts/taskfont.woff index e12c275b..46762a51 100644 Binary files a/public/css/fonts/taskfont.woff and b/public/css/fonts/taskfont.woff differ diff --git a/public/css/fonts/taskfont.woff2 b/public/css/fonts/taskfont.woff2 index 8e00c93b..c8a7d91c 100644 Binary files a/public/css/fonts/taskfont.woff2 and b/public/css/fonts/taskfont.woff2 differ diff --git a/resources/assets/js/pages/manage.vue b/resources/assets/js/pages/manage.vue index 93f8fb39..9c980ce1 100644 --- a/resources/assets/js/pages/manage.vue +++ b/resources/assets/js/pages/manage.vue @@ -145,7 +145,7 @@ }" @on-visible-change="taskVisibleChange" footer-hide> - + diff --git a/resources/assets/js/pages/manage/components/TaskDetail.vue b/resources/assets/js/pages/manage/components/TaskDetail.vue index 585920a4..baead5ca 100644 --- a/resources/assets/js/pages/manage/components/TaskDetail.vue +++ b/resources/assets/js/pages/manage/components/TaskDetail.vue @@ -100,45 +100,50 @@

{{columnName}}

{{taskDetail.id}}

- - - - - - - -
- {{$L('标记未完成')}} -
-
- -
- {{$L('完成')}} -
-
- -
- {{$L('归档')}} -
-
- -
- {{$L('删除')}} -
-
-
-
+
+ + + + + + + + + + +
+ {{$L('标记未完成')}} +
+
+ +
+ {{$L('完成')}} +
+
+ +
+ {{$L('归档')}} +
+
+ +
+ {{$L('删除')}} +
+
+
+
+
@@ -310,7 +315,7 @@ {{$L('子任务')}}
    - +
  • @@ -412,6 +417,10 @@ export default { name: "TaskDetail", components: {ProjectLog, DialogWrapper, TaskUpload, UserInput, TaskPriority, TEditor}, props: { + taskId: { + type: Number, + default: 0 + }, openTask: { type: Object, default: () => { @@ -509,7 +518,6 @@ export default { 'userId', 'projects', 'columns', - 'taskId', 'taskSubs', 'taskContents', 'taskFiles', @@ -1114,6 +1122,10 @@ export default { }).then(({data}) => { this.$store.dispatch("saveTask", data); this.$store.dispatch("getDialogOne", data.dialog_id); + if (this.isElectron) { + this.resizeDialog(); + return; + } this.$nextTick(() => { if (this.$store.state.windowMax768) { this.goForward({path: '/manage/messenger', query: {sendmsg: this.msgText}}); @@ -1144,6 +1156,10 @@ export default { this.sendLoad = false; this.$store.dispatch("saveTask", data); this.$store.dispatch("getDialogOne", data.dialog_id); + if (this.isElectron) { + this.resizeDialog(); + return; + } this.$nextTick(() => { this.goForward({path: '/manage/messenger', query: {sendmsg: this.msgText}}); this.$store.state.method.setStorage("messenger::dialogId", data.dialog_id) @@ -1169,6 +1185,54 @@ export default { $A.modalError(msg); this.$store.dispatch("getTaskFiles", this.taskDetail.id) }); + }, + + openNewWin() { + if (!this.isElectron) { + return; + } + let config = { + parent: null, + width: Math.min(window.screen.availWidth, this.$el.clientWidth + 72), + height: Math.min(window.screen.availHeight, this.$el.clientHeight + 72), + }; + if (this.hasOpenDialog) { + config.minWidth = 800; + config.minHeight = 600; + } + this.$electron.ipcRenderer.send('windowRouter', { + name: 'task-' + this.taskDetail.id, + path: "/single/task/" + this.taskDetail.id, + force: false, // 如果窗口已存在不重新加载 + devTools: false, + config + }); + this.$store.dispatch('openTask', 0); + }, + + resizeDialog() { + if (!this.isElectron) { + return; + } + this.$electron.ipcRenderer.sendSync('windowSize', { + width: Math.max(1100, window.innerWidth), + height: Math.max(720, window.innerHeight), + minWidth: 800, + minHeight: 600 + }); + if (this.msgText) { + let num = 0; + let interval = setInterval(() => { + num++; + if (this.$refs.dialog || num > 20) { + clearInterval(interval); + if (this.$refs.dialog) { + this.$refs.dialog.sendMsg(this.msgText); + this.msgText = ""; + } + } + }, 100); + } } } } diff --git a/resources/assets/js/pages/single/task.vue b/resources/assets/js/pages/single/task.vue new file mode 100644 index 00000000..2c94590e --- /dev/null +++ b/resources/assets/js/pages/single/task.vue @@ -0,0 +1,85 @@ + + + + + diff --git a/resources/assets/js/routes.js b/resources/assets/js/routes.js index 4fc06dea..f1f83494 100755 --- a/resources/assets/js/routes.js +++ b/resources/assets/js/routes.js @@ -80,6 +80,11 @@ export default [ path: '/single/file/:id', component: () => import('./pages/single/file.vue'), }, + { + name: 'single-task', + path: '/single/task/:id', + component: () => import('./pages/single/task.vue'), + }, { name: 'login', path: '/login', diff --git a/resources/assets/sass/pages/components/task-detail.scss b/resources/assets/sass/pages/components/task-detail.scss index 2c89b0a1..b11ac776 100644 --- a/resources/assets/sass/pages/components/task-detail.scss +++ b/resources/assets/sass/pages/components/task-detail.scss @@ -10,7 +10,7 @@ .head { display: flex; align-items: center; - height: 40px; + height: 42px; padding-bottom: 10px; color: #888888; position: relative; @@ -60,14 +60,25 @@ } } } - .pick { - margin-left: 16px; - margin-right: -16px; - } - .menu { - font-size: 22px; + .function { + display: flex; + align-items: center; margin: 0 32px; - cursor: pointer; + .pick { + margin-left: 12px; + margin-right: 10px; + } + .open { + margin-top: -2px; + margin-left: 12px; + font-size: 22px; + cursor: pointer; + } + .menu { + margin-left: 12px; + font-size: 22px; + cursor: pointer; + } } } .scroller { @@ -365,7 +376,7 @@ } } .task-dialog { - flex: 1; + flex-shrink: 0; display: flex; flex-direction: column; margin-top: 22px; @@ -481,11 +492,8 @@ .task-info { overflow: auto; .head { - .menu { - margin: 0 2px; - } - .pick { - margin-right: 12px; + .function { + margin-right: 2px; } } } diff --git a/resources/assets/statics/public/css/fonts/taskfont.ttf b/resources/assets/statics/public/css/fonts/taskfont.ttf index 6171e4f5..ff626ae4 100644 Binary files a/resources/assets/statics/public/css/fonts/taskfont.ttf and b/resources/assets/statics/public/css/fonts/taskfont.ttf differ diff --git a/resources/assets/statics/public/css/fonts/taskfont.woff b/resources/assets/statics/public/css/fonts/taskfont.woff index e12c275b..46762a51 100644 Binary files a/resources/assets/statics/public/css/fonts/taskfont.woff and b/resources/assets/statics/public/css/fonts/taskfont.woff differ diff --git a/resources/assets/statics/public/css/fonts/taskfont.woff2 b/resources/assets/statics/public/css/fonts/taskfont.woff2 index 8e00c93b..c8a7d91c 100644 Binary files a/resources/assets/statics/public/css/fonts/taskfont.woff2 and b/resources/assets/statics/public/css/fonts/taskfont.woff2 differ