From 3036d279d2c794aede199c7f80ad67ba9427b49d Mon Sep 17 00:00:00 2001 From: Fatih Acet Date: Mon, 10 Dec 2018 01:15:36 +0100 Subject: [PATCH] Implement discussion components. --- src/gitlab_service.js | 24 +++++++++++ src/webview/src/App.vue | 33 ++++++++++++--- .../src/components/IssuableDetails.vue | 17 +++++++- .../src/components/IssuableDiscussions.vue | 26 +++++++++--- src/webview/src/components/Note.vue | 41 +++++++++++++++++++ src/webview/src/components/NoteBody.vue | 32 +++++++++++++++ src/webview/src/components/SystemNote.vue | 21 ++++++++++ src/webview/src/components/UserAvatar.vue | 14 ++----- src/webview_controller.js | 37 ++++++++++++----- 9 files changed, 210 insertions(+), 35 deletions(-) create mode 100644 src/webview/src/components/Note.vue create mode 100644 src/webview/src/components/NoteBody.vue create mode 100644 src/webview/src/components/SystemNote.vue diff --git a/src/gitlab_service.js b/src/gitlab_service.js index 7ab0a5c..86a0bcd 100644 --- a/src/gitlab_service.js +++ b/src/gitlab_service.js @@ -386,6 +386,29 @@ async function fetchDiscussions(issuable) { return discussions; } +// TODO: Remove project fetch +async function renderMarkdown(markdown) { + let rendered = { html: markdown }; + const [ major ] = version.split('.'); + + if (parseInt(major, 10) < 11) { + return markdown; + } + + try { + const project = await fetchCurrentProject(); + rendered = await fetch('/markdown', 'POST', { + text: markdown, + project: project.path_with_namespace, + gfm: 'true', // Needs to be a string for the API + }); + } catch(e) { + return markdown; + } + + return rendered.html; +}; + exports.fetchUser = fetchUser; exports.fetchIssuesAssignedToMe = fetchIssuesAssignedToMe; exports.fetchIssuesCreatedByMe = fetchIssuesCreatedByMe; @@ -404,3 +427,4 @@ exports.createSnippet = createSnippet; exports.validateCIConfig = validateCIConfig; exports.fetchVersion = fetchVersion; exports.fetchDiscussions = fetchDiscussions; +exports.renderMarkdown = renderMarkdown; diff --git a/src/webview/src/App.vue b/src/webview/src/App.vue index 0bc2ce2..1117b48 100644 --- a/src/webview/src/App.vue +++ b/src/webview/src/App.vue @@ -2,6 +2,8 @@ import IssuableDetails from './components/IssuableDetails'; import IssuableDiscussions from './components/IssuableDiscussions'; +const vscode = acquireVsCodeApi(); + export default { name: 'app', data() { @@ -15,12 +17,36 @@ export default { IssuableDetails, IssuableDiscussions, }, + computed: { + notesById() { + const notes = {} + + this.discussions.forEach((d) => { + d.notes.forEach((n) => { + notes[n.id] = n; + }); + }); + + notes[this.issuable.id] = this.issuable; + return notes; + }, + }, created() { + window.vsCodeApi = vscode; this.isLoading = true; window.addEventListener('message', event => { - this.issuable = event.data.issuable; - this.isLoading = false; + if (event.data.type === 'issuableFetch') { + this.issuable = event.data.issuable; + this.discussions = event.data.discussions; + this.isLoading = false; + } else if (event.data.type === 'markdownRendered') { + const { ref, key, markdown } = event.data; + const note = this.notesById[ref] || {}; + + note[key] = markdown; + note.markdownRenderedOnServer = true; + } }); }, } @@ -35,6 +61,3 @@ export default { - - diff --git a/src/webview/src/components/IssuableDetails.vue b/src/webview/src/components/IssuableDetails.vue index 7949a63..9ebfb75 100644 --- a/src/webview/src/components/IssuableDetails.vue +++ b/src/webview/src/components/IssuableDetails.vue @@ -1,5 +1,6 @@