diff --git a/frontend/src/components/FreeleapsEditor.vue b/frontend/src/components/FreeleapsEditor.vue index fa54837..375e684 100644 --- a/frontend/src/components/FreeleapsEditor.vue +++ b/frontend/src/components/FreeleapsEditor.vue @@ -9,6 +9,7 @@ @blur="updateAction" @mousedown.stop="selectionStart" @mouseup.stop="selectionEnd" + @keyup="keyupAction" />
@@ -223,7 +224,7 @@ export default { // console.log('window.getSelection',this.selectedRange) // console.log('is bold ? ', this.queryCommandState(sel.getRangeAt(0), 'bold')) // this.iconClick(null, 'bold') - this.editorCtrlStyle = { display: 'flex', top: `${e.layerY}px`, left: `${e.layerX}px` } + this.editorCtrlStyle = { display: 'flex', top: `${e.layerY - 30}px`, left: `${e.layerX}px` } } else { this.selectedRange = null this.editorCtrlStyle = { display: 'none' } @@ -232,6 +233,12 @@ export default { // this.commandStates = [] } }, + keyupAction(e) { + console.log('keyupAction', e) + // if (e.code == 'ShiftLeft' || e.code == 'ShiftRight') { + + // } + }, queryCommandState(range, command) { const container = document.createElement('span') container.style.display = 'none' diff --git a/frontend/src/headers/HeaderUser.vue b/frontend/src/headers/HeaderUser.vue index 64c1ddb..7eae620 100644 --- a/frontend/src/headers/HeaderUser.vue +++ b/frontend/src/headers/HeaderUser.vue @@ -12,18 +12,24 @@ @@ -65,6 +65,10 @@ export default { .directory_cover_image { width: 100%; + height: 311px; + background-repeat: no-repeat; + background-position: center center; + background-size: cover; border-radius: 16px; margin-bottom: 16px; } diff --git a/frontend/src/pages/public/Blogs.vue b/frontend/src/pages/public/Blogs.vue index f29644f..6dbee41 100644 --- a/frontend/src/pages/public/Blogs.vue +++ b/frontend/src/pages/public/Blogs.vue @@ -7,7 +7,7 @@ @click="view_blog(blog)" >

{{ blog.blog_name }}

- +

@@ -63,6 +63,12 @@ export default { } .blog_cover_image { + width: 100%; height: 311px; + background-repeat: no-repeat; + background-position: center center; + background-size: cover; + border-radius: 16px; + margin-bottom: 16px; } diff --git a/frontend/src/pages/user/messages/Home.vue b/frontend/src/pages/user/messages/Home.vue index fbb695d..069fb22 100644 --- a/frontend/src/pages/user/messages/Home.vue +++ b/frontend/src/pages/user/messages/Home.vue @@ -154,7 +154,8 @@ export default { }) }, getDateFromFulltimeString(fulltime) { - return DateUtils.FromJsonToHMDateString(fulltime) + // FromJsonToHMDateString + return DateUtils.FromJsonToDatetimeString(fulltime) } } } @@ -220,6 +221,7 @@ export default { .conversation-last-update-date { white-space: nowrap; flex-shrink: 0; + font-size: 12px; } .conversation-unreadcount { @@ -318,7 +320,7 @@ export default { color: #737478; white-space: nowrap; flex-shrink: 0; - font-size: 16px; + font-size: 12px; } } diff --git a/frontend/src/pages/user/providers/Home.vue b/frontend/src/pages/user/providers/Home.vue index 45855b4..931ef94 100644 --- a/frontend/src/pages/user/providers/Home.vue +++ b/frontend/src/pages/user/providers/Home.vue @@ -53,7 +53,7 @@ $t('Responding time') }} - {{ provider.provider_achievement.responding_time_in_minutes }} min(s) + {{ provider.provider_achievement.responding_time_in_minutes }} {{$t('min(s)')}}
@@ -129,7 +129,7 @@ $t('Weekly produced code') }} - {{ provider.provider_deliveries.lines_of_code_per_week }} line(s) + {{ provider.provider_deliveries.lines_of_code_per_week }} {{$t('line(s)')}}
@@ -198,7 +198,7 @@ $t('Issue fixing time') }} - {{ provider.provider_work_quality.issue_fixing_time_minutes }} min(s) + {{ provider.provider_work_quality.issue_fixing_time_minutes }} {{$t('min(s)')}} diff --git a/frontend/src/pages/user/requests/Home.vue b/frontend/src/pages/user/requests/Home.vue index bc9918a..4cde83e 100644 --- a/frontend/src/pages/user/requests/Home.vue +++ b/frontend/src/pages/user/requests/Home.vue @@ -241,6 +241,7 @@ export default { RequestHubApi.fetchRequestForHub() .then((response) => { this.requestGroups = response.data + this.$store.dispatch('basic/clearUnreadRequest') }) .catch((error) => { this.mnx_backendErrorHandler(error) diff --git a/frontend/src/pages/user/requests/Propose.vue b/frontend/src/pages/user/requests/Propose.vue index 01c964d..e7df503 100644 --- a/frontend/src/pages/user/requests/Propose.vue +++ b/frontend/src/pages/user/requests/Propose.vue @@ -418,7 +418,8 @@ export default { fetchExisting() { RequestHubApi.fetchMyProposals() .then((response) => { - this.existingProposals = response.data + this.existingProposals = response.data || [] + }) .catch((error) => { this.mnx_backendErrorHandler(error) @@ -509,6 +510,7 @@ export default { font-size: 18px; font-weight: bold; color: #0d1637; + white-space: nowrap } .load-templates-button { diff --git a/frontend/src/pages/user/workspace/Home.vue b/frontend/src/pages/user/workspace/Home.vue index afec165..e0debee 100644 --- a/frontend/src/pages/user/workspace/Home.vue +++ b/frontend/src/pages/user/workspace/Home.vue @@ -679,6 +679,7 @@ export default { this.projects = response.data this.newIssueDescriptions = new Array(this.projects.length) this.newInviteCollaborator = new Array(this.projects.length) + this.$store.dispatch('basic/clearUnreadWorkspace') }) .catch((error) => { this.mnx_backendErrorHandler(error) @@ -897,7 +898,9 @@ export default { WorksapceApi.withdrawProposal(project.proposal.id) .then((response) => { //We treat the proposal as drafted not existing one because it has been withdrawn - requestHubUtils.fillDraftedProposal(project.proposal) + const proposal = Object.assign({}, project.proposal) + proposal.stages = proposal?.payment_plan?.stages || [] + requestHubUtils.fillDraftedProposal(proposal) this.mnx_navToMakeProposal(project.request.id, proposingModelEnum.FROM_DRAFT) }) .catch((error) => { diff --git a/frontend/src/plugins/store/basic.js b/frontend/src/plugins/store/basic.js index 041ebd0..911c350 100644 --- a/frontend/src/plugins/store/basic.js +++ b/frontend/src/plugins/store/basic.js @@ -5,6 +5,23 @@ import { MessageHubApi } from '@/utils/backend/messageHub' const ignoreEventType = ['test'] const GWT = new Date('01 Jan 1970 00:00:00 GMT').toISOString() +const unreadWorkspaceRules = [ + {subject:'request', event:'quoted'}, + {subject:'quote', event:'accepted'}, + {subject:'quote',event:'rejected'}, + {subject:'request',event:'invited'} +] +const unreadRequestRules = [ + {subject:'request',event:'invited'} +] +const checkUnreadRulesBy = (message, rules = []) => { + for (let i = 0; i < rules.length; i ++) { + if (message?.subject == rules[i].subject && message?.event == rules[i].event) { + return true + } + } + return false +} const basicStore = { namespaced: true, @@ -13,6 +30,8 @@ const basicStore = { language: 'zh', conversations: [], unreadConversationCount: 0, + unreadWorkspace: false, + unreadRequest: false, downstream_web_socket: null } }, @@ -55,6 +74,12 @@ const basicStore = { } } + if (checkUnreadRulesBy(data, unreadRequestRules)) { + state.unreadRequest = true + } else if (checkUnreadRulesBy(data, unreadWorkspaceRules)) { + state.unreadWorkspace = true + } + MessageHubApi.fetchConversations(GWT, token).then((response) => { const conversations = response.data.conversations || [] let updateLength = 0 @@ -62,7 +87,7 @@ const basicStore = { updateLength = conversations.length - state.conversations.length if (updateLength === 0) updateLength = 1 for (let i = 0; i < updateLength; i++) { - conversations[i].unread = true + conversations[i]['unread'] = true } } const conversation = conversations[0] @@ -81,6 +106,7 @@ const basicStore = { }) } }) + }, () => { console.log('downstream_web_socket error') @@ -101,6 +127,12 @@ const basicStore = { } } } + }, + clearUnreadWorkspace(state) { + state.unreadWorkspace = false + }, + clearUnreadRequest(state) { + state.unreadRequest = false } }, actions: { @@ -112,6 +144,12 @@ const basicStore = { }, readMessageBy(context, sender) { context.commit('readMessageBy', sender) + }, + clearUnreadWorkspace(context) { + context.commit('clearUnreadWorkspace') + }, + clearUnreadRequest(context) { + context.commit('clearUnreadRequest') } }, getters: { @@ -123,6 +161,12 @@ const basicStore = { }, conversations(state) { return state.conversations + }, + unreadWorkspace(state) { + return state.unreadWorkspace + }, + unreadRequest(state) { + return state.unreadRequest } } }