From 358271d1523c3f4642fd67b82d0c4411ff822c9f Mon Sep 17 00:00:00 2001 From: David Acosta Date: Wed, 25 Jan 2023 15:57:46 -0800 Subject: [PATCH] JIRA integration, config rework, and bug fixes --- .env | 4 + README.md | 4 +- package.json | 16 +- public/server/Server.js | 36 ++ public/server/images/favicon.ico | Bin 0 -> 173809 bytes public/server/images/logo.png | Bin 0 -> 14576 bytes public/server/jira.html | 76 ++++ public/server/modules/JiraUtility.js | 41 ++ src/assets/icon/bug.svg | 4 + src/assets/icon/list.svg | 3 + src/background.js | 4 +- src/components/ControlPanel.vue | 61 ++- src/components/ExportPanel.vue | 63 ++- src/components/MenuPopover.vue | 155 ++++++++ src/components/MinimizeControlWrapper.vue | 1 - src/components/__tests__/NotesWrapper.spec.js | 2 +- src/components/__tests__/TestWrapper.spec.js | 3 +- .../authentication/SigninWrapper.vue | 188 ++++++++- .../authentication/SignupHomeWrapper.vue | 12 +- .../authentication/SignupMainWrapper.vue | 176 ++++++++- .../authentication/SignupYattieWrapper.vue | 6 +- src/components/dialogs/NoteDialog.vue | 9 +- src/components/dialogs/SummaryDialog.vue | 9 +- src/components/jira/JiraExportSession.vue | 359 ++++++++++++++++++ src/components/settings/GeneralTab.vue | 2 - src/integrations/IntegrationHelpers.js | 91 +++++ src/layouts/Default.vue | 40 +- src/locales/en.json | 6 + src/main.js | 9 + src/modules/CaptureUtility.js | 2 +- src/modules/DatabaseUtility.js | 57 ++- src/modules/FileSystemUtility.js | 12 +- src/modules/IpcHandlers.js | 18 +- src/modules/ServerUtility.js | 35 ++ src/modules/constants.js | 7 + src/views/AddSession.vue | 2 - src/views/AuthenticationView.vue | 48 ++- src/views/EditSession.vue | 1 - src/views/HomeView.vue | 99 ++++- src/views/MainView.vue | 129 +++++-- src/views/MinimizeView.vue | 12 + src/views/ResultView.vue | 39 +- vue.config.js | 1 + yarn.lock | 142 ++++++- 44 files changed, 1863 insertions(+), 121 deletions(-) create mode 100644 public/server/Server.js create mode 100644 public/server/images/favicon.ico create mode 100644 public/server/images/logo.png create mode 100644 public/server/jira.html create mode 100644 public/server/modules/JiraUtility.js create mode 100644 src/assets/icon/bug.svg create mode 100644 src/assets/icon/list.svg create mode 100644 src/components/MenuPopover.vue create mode 100644 src/components/jira/JiraExportSession.vue create mode 100644 src/integrations/IntegrationHelpers.js create mode 100644 src/modules/ServerUtility.js diff --git a/.env b/.env index f256c63d..a8331286 100644 --- a/.env +++ b/.env @@ -1,2 +1,6 @@ +VUE_APP_JIRA_CLIENT_ID=3tPI6y3UgOxjUUVd2ELL3mhZr6cGAatt +VUE_APP_JIRA_CLIENT_SECRET=ATOAHCxhe5I4NKjvZo_hnzLSS6N038CmfyUsdnoXHCI0e8el_dY_xrFmMFJVHMAfa14d8502F3BF VUE_APP_I18N_LOCALE=en VUE_APP_I18N_FALLBACK_LOCALE=en + +VUE_APP_SERVER_PORT=64064 diff --git a/README.md b/README.md index b3bab0c9..a38445a0 100644 --- a/README.md +++ b/README.md @@ -80,7 +80,7 @@ If you have an idea about how we can better meet that goal, please let us know b If you looking to contribute - please checkout the [contributing guidelines](docs/CONTRIBUTING.md). -If you're just looking to take it for a spin, check out the pre-built [packages](https://github.com/dacoaster/yattie/releases) and find the one built for your platform. Can't find the platform you're looking for? Let us know you'd like a new one supported at the [feature requests](https://features.yattie.ai) page! +If you're just looking to take it for a spin, check out the pre-built [packages](https://yatt.ai/downloads) and find the one built for your platform. Can't find the platform you're looking for? Let us know you'd like a new one supported at the [feature requests](https://features.yattie.ai) page! ### Installation @@ -88,7 +88,7 @@ TODO - This section could use some love (and screenshots!) ## Usage -TODO - This section could use some love (and screenshots!) +Check out our [docs](https://docs.yattie.ai). ## Roadmap diff --git a/package.json b/package.json index 310009d0..83dc7296 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,7 @@ { "name": "yattie", - "version": "0.4.3", + "version": "0.5.0", "private": true, - "main": "background.js", "engines": { "npm": ">=8.0.0 <9.0.0", "node": ">=16.0.0 <17.0.0" @@ -15,32 +14,41 @@ "license": "GPLv3", "scripts": { "serve": "vue-cli-service serve", + "build": "vue-cli-service electron:build", "test:unit": "vue-cli-service test:unit", "lint": "vue-cli-service lint", "dev": "vue-cli-service electron:serve", - "build": "vue-cli-service electron:build", "i18n:report": "vue-cli-service i18n:report --src \"./src/**/*.?(js|vue)\" --locales \"./src/locales/**/*.json\"", "postinstall": "electron-builder install-app-deps", "postuninstall": "electron-builder install-app-deps", "publish": "vue-cli-service electron:build -p always" }, + "main": "background.js", "dependencies": { "@fortawesome/fontawesome-free": "^6.2.1", "@johmun/vue-tags-input": "^2.1.0", "@peepi/vuetify-tiptap": "^1.2.3", - "tui-image-editor": "^3.15.3", "adm-zip": "^0.5.9", + "axios": "^1.2.1", + "body-parser": "^1.20.1", + "child_process": "^1.0.2", + "client-oauth2": "^4.3.3", "core-js": "^3.8.3", + "cors": "^2.8.5", "d3": "^5.14.2", "dayjs": "^1.11.5", "detect-file-type": "^0.2.8", + "express": "^4.18.2", "extract-zip": "^2.0.1", "ffmpeg-static": "^5.1.0", "ffprobe-static": "^3.1.0", "fluent-ffmpeg": "^2.1.2", + "form-data": "^4.0.0", "lodash": "^4.17.21", + "open": "^8.4.0", "simple-json-db": "^2.0.0", "sinon": "^15.0.0", + "tui-image-editor": "^3.15.3", "uuid": "3.3.3", "v-mask": "^2.3.0", "vue": "^2.6.14", diff --git a/public/server/Server.js b/public/server/Server.js new file mode 100644 index 00000000..30689d13 --- /dev/null +++ b/public/server/Server.js @@ -0,0 +1,36 @@ +const express = require("express"); +const bodyParser = require("body-parser"); +const cors = require("cors"); +const path = require("path"); + +const app = express(); +const port = process.env.VUE_APP_SERVER_PORT || 64064; + +const corsOptions = { + origin: `http://localhost:${port}`, +}; + +app.use(cors()); +app.use(cors(corsOptions)); + +// parse requests of content-type - application/json +app.use(bodyParser.json()); + +// parse requests of content-type - application/x-www-form-urlencoded +app.use(bodyParser.urlencoded({ extended: true })); + +// path +app.use(express.static(path.join(__dirname, "images"))); + +app.disable("x-powered-by"); + +// modules +require("./modules/JiraUtility")(app); + +try { + app.listen(port, () => { + console.log(`OAuth redirect server running at http://localhost:${port}`); + }); +} catch (err) { + console.log(err); +} diff --git a/public/server/images/favicon.ico b/public/server/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..a914da5e0fe21d4477e4462b39932810a332a3c3 GIT binary patch literal 173809 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 Q{%@qNs-se+WF7hc0FQJ3bpQYW literal 0 HcmV?d00001 diff --git a/public/server/images/logo.png b/public/server/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..bc26babd8d0ea725fd7b379717c069f8c831066d GIT binary patch literal 14576 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 + + + + + + + YATTIE + + + + + + + +
+
+ +
+ You are now connected to JIRA! You can close this window and go back to the YATTIE app to get started + testing. +
+
+ +
+ + + \ No newline at end of file diff --git a/public/server/modules/JiraUtility.js b/public/server/modules/JiraUtility.js new file mode 100644 index 00000000..f0176fe1 --- /dev/null +++ b/public/server/modules/JiraUtility.js @@ -0,0 +1,41 @@ +const open = require("open"); +const path = require("path"); +const ClientOAuth2 = require("client-oauth2"); +const port = process.env.VUE_APP_SERVER_PORT; +const auth = new ClientOAuth2({ + clientId: process.env.VUE_APP_JIRA_CLIENT_ID, + clientSecret: process.env.VUE_APP_JIRA_CLIENT_SECRET, + accessTokenUri: "https://auth.atlassian.com/oauth/token", + authorizationUri: + "https://auth.atlassian.com/authorize?audience=api.atlassian.com&prompt=consent", + redirectUri: `http://localhost:${port}/oauth2/atlassian/callback`, + scopes: ["read:jira-work", "write:jira-work", "read:me", "offline_access"], +}); +module.exports = (app) => { + app.use((req, res, next) => { + res.header( + "Access-Control-Allow-Headers", + "x-access-token, Origin, Content-Type, Accept" + ); + next(); + }); + + app.get("/oauth2/atlassian", (req, res) => { + var uri = auth.code.getUri(); + open(uri, (err) => { + console.log(err); + }); + return res.send(uri); + }); + app.get("/oauth2/atlassian/callback", (req, res) => { + auth.code.getToken(req.originalUrl).then((user) => { + const data = { + type: "jira", + accessToken: user.data, + }; + process.send(data); + + return res.sendFile(path.join(__dirname, "../jira.html")); + }); + }); +}; diff --git a/src/assets/icon/bug.svg b/src/assets/icon/bug.svg new file mode 100644 index 00000000..b937a8b2 --- /dev/null +++ b/src/assets/icon/bug.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/assets/icon/list.svg b/src/assets/icon/list.svg new file mode 100644 index 00000000..361c224f --- /dev/null +++ b/src/assets/icon/list.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/background.js b/src/background.js index 4c6ae817..32ef2a37 100644 --- a/src/background.js +++ b/src/background.js @@ -32,8 +32,8 @@ async function createWindow() { if (process.env.WEBPACK_DEV_SERVER_URL) { // Load the url of the dev server if in development mode await win.loadURL(process.env.WEBPACK_DEV_SERVER_URL); - if (isDevelopment){ - win.webContents.openDevTools(); + if (isDevelopment) { + win.webContents.openDevTools(); } } else { createProtocol("app"); diff --git a/src/components/ControlPanel.vue b/src/components/ControlPanel.vue index 3f6b4c0d..840e305b 100644 --- a/src/components/ControlPanel.vue +++ b/src/components/ControlPanel.vue @@ -58,7 +58,7 @@ color="primary" @click="deleteConfirmDialog = true" > - mdi-delete Delete + mdi-delete {{ $tc("caption.delete", 1) }} @@ -70,9 +70,17 @@ color="white" @click="exportItems" > - mdi-download Export + mdi-download {{ $tc("caption.export", 1) }} + + + @@ -482,12 +490,16 @@ import DurationConfirmDialog from "./dialogs/DurationConfirmDialog.vue"; import AudioErrorDialog from "./dialogs/AudioErrorDialog.vue"; import EndSessionDialog from "./dialogs/EndSessionDialog.vue"; import MinimizeControlWrapper from "../components/MinimizeControlWrapper.vue"; + +import JiraExportSession from "./jira/JiraExportSession"; + import { IPC_HANDLERS, IPC_FUNCTIONS, IPC_BIND_KEYS, SESSION_STATUSES, VIDEO_RESOLUTION, + STATUSES, } from "../modules/constants"; import { DEFAULT_MAP_NODES, @@ -515,6 +527,7 @@ export default { AudioErrorDialog, EndSessionDialog, MinimizeControlWrapper, + JiraExportSession, }, props: { items: { @@ -529,6 +542,14 @@ export default { type: Object, default: () => {}, }, + credentialItem: { + type: Object, + default: () => {}, + }, + isAuthenticated: { + type: Boolean, + default: () => false, + }, checkedStatusOfPreSessionTask: { type: Boolean, default: () => false, @@ -560,6 +581,12 @@ export default { configItem: function (newValue) { this.config = newValue; }, + credentialItem: function (newValue) { + this.credential = newValue; + }, + isAuthenticated: function (newValue) { + this.checkAuth = newValue; + }, "$store.state.status": { deep: true, handler(newValue) { @@ -626,6 +653,8 @@ export default { sourceId: this.srcId, itemLists: this.items, config: this.configItem, + credential: this.credentialItem, + checkAuth: this.isAuthenticated, audioDevices: [], loaded: false, status: this.$store.state.status, @@ -997,7 +1026,6 @@ export default { this.durationConfirmDialog = false; this.status = SESSION_STATUSES.PROCEED; this.changeSessionStatus(SESSION_STATUSES.PROCEED); - console.log("start interval-1"); this.startInterval(); }, updateStatus(value) { @@ -1384,7 +1412,6 @@ export default { duration: this.duration, sourceId: this.sourceId, }; - // console.log(data); localStorage.setItem("state-data", JSON.stringify(data)); if (!window.ipc) return; await window.ipc.invoke(IPC_HANDLERS.WINDOW, { @@ -1431,16 +1458,13 @@ export default { path: this.$route.path, }; if (!window.ipc) return; - await window.ipc - .invoke(IPC_HANDLERS.FILE_SYSTEM, { - func: IPC_FUNCTIONS.SAVE_SESSION, - data: data, - }) - .then(() => { - if (callback) { - callback(); - } - }); + const { status } = await window.ipc.invoke(IPC_HANDLERS.FILE_SYSTEM, { + func: IPC_FUNCTIONS.SAVE_SESSION, + data: data, + }); + if (status === STATUSES.SUCCESS && callback) { + callback(); + } }, discardSession(callback = null) { this.newSessionDialog = false; @@ -1449,7 +1473,6 @@ export default { } }, async clearSession() { - console.log("clear session"); this.$root.$emit("new-session"); this.status = SESSION_STATUSES.PENDING; @@ -1475,10 +1498,10 @@ export default { }, }); this.stopInterval(); - // const currentPath = this.$router.history.current.path; - // if (currentPath !== "/main") { - // this.$router.push({ path: "/main" }); - // } + const currentPath = this.$router.history.current.path; + if (currentPath !== "/main") { + this.$router.push({ path: "/main" }); + } }); }, async resetSession() { diff --git a/src/components/ExportPanel.vue b/src/components/ExportPanel.vue index 7dfd92b2..4b3245c5 100644 --- a/src/components/ExportPanel.vue +++ b/src/components/ExportPanel.vue @@ -2,30 +2,84 @@ - + {{ $tc("caption.export_session_report", 1) }} + + + diff --git a/src/components/MinimizeControlWrapper.vue b/src/components/MinimizeControlWrapper.vue index e9e22a36..a41d31fc 100644 --- a/src/components/MinimizeControlWrapper.vue +++ b/src/components/MinimizeControlWrapper.vue @@ -251,7 +251,6 @@ export default { y: event.screenY, }; - console.log(deltaPos); if (!window.ipc) return; window.ipc.invoke(IPC_HANDLERS.WINDOW, { diff --git a/src/components/__tests__/NotesWrapper.spec.js b/src/components/__tests__/NotesWrapper.spec.js index 6dd44244..cb6c4ba8 100644 --- a/src/components/__tests__/NotesWrapper.spec.js +++ b/src/components/__tests__/NotesWrapper.spec.js @@ -19,6 +19,6 @@ describe("NotesWrapper.vue", () => { }, vuetify, }); - + expect(wrapper.find(".content").exists()).toBe(true); }); }); diff --git a/src/components/__tests__/TestWrapper.spec.js b/src/components/__tests__/TestWrapper.spec.js index d9e35828..b217fb52 100644 --- a/src/components/__tests__/TestWrapper.spec.js +++ b/src/components/__tests__/TestWrapper.spec.js @@ -55,8 +55,7 @@ describe("TestWrapper.vue", () => { const charterTabWrapper = wrapper.find(".charter-tab"); expect(charterTabWrapper.findComponent(MindmapEditor).exists()).toBe(false); - - const precondWrapper = wrapper.find(".pre-cond"); + expect(wrapper.find(".pre-cond").exists()).toBe(true); }); test('change the value of "Time limit" input box', async () => { diff --git a/src/components/authentication/SigninWrapper.vue b/src/components/authentication/SigninWrapper.vue index bf3675a8..48eaf10b 100644 --- a/src/components/authentication/SigninWrapper.vue +++ b/src/components/authentication/SigninWrapper.vue @@ -10,13 +10,27 @@
+
+ +
- + +
{{ $tc("caption.signin_jira", 1) }}
@@ -50,29 +64,181 @@ class="text-capitalize pa-0 signup-btn" color="primary" plain - to="/authentication/signup2" + to="/authentication/signupMain" > {{ $tc("caption.sign_up", 1) }}
-->
+ + {{ snackBar.message }} + + @@ -112,6 +278,7 @@ export default { margin-left: -50px; } .content { + position: relative; background-color: #fff; border-radius: 8px; padding: 32px 40px; @@ -168,4 +335,13 @@ export default { font-weight: 500; color: #6d28d9; } + +.loading-wrapper { + position: absolute; + overflow: hidden; + z-index: 9999999; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); +} diff --git a/src/components/authentication/SignupHomeWrapper.vue b/src/components/authentication/SignupHomeWrapper.vue index 0ec47daf..920bf7e5 100644 --- a/src/components/authentication/SignupHomeWrapper.vue +++ b/src/components/authentication/SignupHomeWrapper.vue @@ -5,7 +5,7 @@
-
+
+ +
{{ $tc("caption.signup_yattie", 1) }}
- +
{{ $tc("caption.signup_jira", 1) }}
@@ -26,12 +40,12 @@
-
{{ $tc("caption.singup_qtest", 1) }}
+
{{ $tc("caption.signup_qtest", 1) }}
- {{ $tc("caption.signup_pratictest", 1) }} + {{ $tc("caption.signup_practitest", 1) }}
@@ -49,7 +63,7 @@ fill small block - to="/authentication/signup3" + to="/authentication/signupYattie" > {{ $tc("caption.sign_up", 1) }} @@ -80,29 +94,165 @@ {{ $t("message.signup_policy") }} - {{ $tc("caption.term_data_policy", 1) }} + {{ $tc("caption.signup_term_data_policy", 1) }} {{ $tc("caption.and", 1) }}   - {{ $tc("caption.cookie_policy", 1) }} + {{ $tc("caption.signup_cookie_policy", 1) }} .
+ + {{ snackBar.message }} + + diff --git a/src/components/authentication/SignupYattieWrapper.vue b/src/components/authentication/SignupYattieWrapper.vue index 32acdc58..d632a18f 100644 --- a/src/components/authentication/SignupYattieWrapper.vue +++ b/src/components/authentication/SignupYattieWrapper.vue @@ -4,7 +4,7 @@ mdi-chevron-left {{ $tc("caption.back", 1) }} @@ -79,12 +79,12 @@ {{ $t("message.signup_policy") }} - {{ $tc("caption.term_data_policy", 1) }} + {{ $tc("caption.signup_term_data_policy", 1) }} {{ $tc("caption.and", 1) }}   - {{ $tc("caption.cookie_policy", 1) }} + {{ $tc("caption.signup_cookie_policy", 1) }} . diff --git a/src/components/dialogs/NoteDialog.vue b/src/components/dialogs/NoteDialog.vue index 04857f8f..aad1e83f 100644 --- a/src/components/dialogs/NoteDialog.vue +++ b/src/components/dialogs/NoteDialog.vue @@ -1,5 +1,12 @@