Merge branch 'main' of https://dev.azure.com/freeleaps/freeleaps2-frontend/_git/freeleaps2-frontend
This commit is contained in:
commit
1ee2c68075
@ -24,7 +24,7 @@ export default {
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
retrieve_directories() {
|
retrieve_directories() {
|
||||||
ContentApi.retrieve_about_directories()
|
ContentApi.retrieve_about_directories(window.location.host)
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
this.directories = response.data
|
this.directories = response.data
|
||||||
})
|
})
|
||||||
@ -62,17 +62,20 @@ export default {
|
|||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.directory_cover_image {
|
.directory_cover_image {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
border-radius: 16px;
|
border-radius: 16px;
|
||||||
margin-bottom: 16px;
|
margin-bottom: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.directory-title {
|
.directory-title {
|
||||||
font-size: 48px;
|
font-size: 48px;
|
||||||
// font-weight: bold;
|
// font-weight: bold;
|
||||||
color: #18181a;
|
color: #18181a;
|
||||||
margin-bottom: 5px;
|
margin-bottom: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.directory-subtitle {
|
.directory-subtitle {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
color: #666666;
|
color: #666666;
|
||||||
|
|||||||
@ -23,7 +23,7 @@ export default {
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
retrieve_blogs() {
|
retrieve_blogs() {
|
||||||
ContentApi.retrieve_blogs()
|
ContentApi.retrieve_blogs(window.location.host)
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
this.blogs = response.data
|
this.blogs = response.data
|
||||||
})
|
})
|
||||||
|
|||||||
@ -24,7 +24,7 @@ export default {
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
retrieve_directories() {
|
retrieve_directories() {
|
||||||
ContentApi.retrieve_career_directories()
|
ContentApi.retrieve_career_directories(window.location.host)
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
this.directories = response.data
|
this.directories = response.data
|
||||||
})
|
})
|
||||||
@ -61,6 +61,7 @@ export default {
|
|||||||
p {
|
p {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.career-title {
|
.career-title {
|
||||||
font-size: 32px;
|
font-size: 32px;
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
|
|||||||
@ -23,7 +23,7 @@ export default {
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
retrieve_directories() {
|
retrieve_directories() {
|
||||||
ContentApi.retrieve_contact_directories()
|
ContentApi.retrieve_contact_directories(window.location.host)
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
this.directories = response.data
|
this.directories = response.data
|
||||||
})
|
})
|
||||||
@ -63,6 +63,7 @@ export default {
|
|||||||
img {
|
img {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.contact-left-content {
|
.contact-left-content {
|
||||||
padding: 32px;
|
padding: 32px;
|
||||||
display: flex;
|
display: flex;
|
||||||
@ -82,6 +83,7 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.contact-right {
|
.contact-right {
|
||||||
margin-left: 24px;
|
margin-left: 24px;
|
||||||
box-shadow: 0px 0px 24px 0px #d4d3e380;
|
box-shadow: 0px 0px 24px 0px #d4d3e380;
|
||||||
|
|||||||
@ -20,7 +20,6 @@
|
|||||||
<span class="conversation-last-update-date">{{
|
<span class="conversation-last-update-date">{{
|
||||||
getDateFromFulltimeString(conversation.create_time)
|
getDateFromFulltimeString(conversation.create_time)
|
||||||
}}</span>
|
}}</span>
|
||||||
<!-- <span v-if="unreadCountMapper" class="conversation-unreadcount">{{unreadCountMapper}}</span> -->
|
|
||||||
</div>
|
</div>
|
||||||
<div class="conversation-summary-highlight-container">
|
<div class="conversation-summary-highlight-container">
|
||||||
{{ conversation.last_message?.message_body }}
|
{{ conversation.last_message?.message_body }}
|
||||||
@ -83,24 +82,10 @@ export default {
|
|||||||
components: { SvgIcon },
|
components: { SvgIcon },
|
||||||
name: 'MessageHub',
|
name: 'MessageHub',
|
||||||
props: {},
|
props: {},
|
||||||
mounted() {
|
mounted() {},
|
||||||
// this.fetchConversations()
|
|
||||||
},
|
|
||||||
// watch: {
|
|
||||||
// conversations: {
|
|
||||||
// handler: function (val) {
|
|
||||||
// if (val && val.length > 0) {
|
|
||||||
// this.current_thread = val[0]
|
|
||||||
// this.clearUnreadMessageBy(val[0])
|
|
||||||
// }
|
|
||||||
// },
|
|
||||||
// deep: false
|
|
||||||
// }
|
|
||||||
// },
|
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
userIdentityNote: this.mnx_getUserIdentity(),
|
userIdentityNote: this.mnx_getUserIdentity(),
|
||||||
// conversations: [],
|
|
||||||
selConversation: null,
|
selConversation: null,
|
||||||
messages: [],
|
messages: [],
|
||||||
writtenMessage: null
|
writtenMessage: null
|
||||||
@ -126,19 +111,6 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
// fetchConversations() {
|
|
||||||
// MessageHubApi.fetchConversations(new Date('01 Jan 1970 00:00:00 GMT').toISOString())
|
|
||||||
// .then((response) => {
|
|
||||||
// const conversations = response.data.conversations || []
|
|
||||||
// this.conversations = conversations
|
|
||||||
// if (conversations.length > 0) {
|
|
||||||
// this.selectConversation(conversations[0])
|
|
||||||
// }
|
|
||||||
// })
|
|
||||||
// .catch((error) => {
|
|
||||||
// this.mnx_backendErrorHandler(error)
|
|
||||||
// })
|
|
||||||
// },
|
|
||||||
fetchMessageForConversation(conversation_id) {
|
fetchMessageForConversation(conversation_id) {
|
||||||
const jwt = userUtils.getJwtToken()
|
const jwt = userUtils.getJwtToken()
|
||||||
MessageHubApi.fetchMessages(
|
MessageHubApi.fetchMessages(
|
||||||
|
|||||||
@ -447,11 +447,6 @@ export default {
|
|||||||
border-top: 1px solid #dee2e6;
|
border-top: 1px solid #dee2e6;
|
||||||
}
|
}
|
||||||
|
|
||||||
// .statistics-content-label {
|
|
||||||
// @extend .label-text-light;
|
|
||||||
// @extend .w-100;
|
|
||||||
// }
|
|
||||||
|
|
||||||
.statistics-content-container {
|
.statistics-content-container {
|
||||||
@extend .flex-colum-container;
|
@extend .flex-colum-container;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
|
|||||||
@ -77,11 +77,23 @@
|
|||||||
{{ $t('Propose') }}
|
{{ $t('Propose') }}
|
||||||
</button>
|
</button>
|
||||||
<div class="request-description-content" v-html="request.content"></div>
|
<div class="request-description-content" v-html="request.content"></div>
|
||||||
<div v-for="(file, index) in request.attached_files" :key="index">
|
<div
|
||||||
<button @click="previewAttachedFile(request.id, file.document_id)">
|
class="pdf-actions"
|
||||||
|
v-for="(file, index) in request.attached_files"
|
||||||
|
:key="index"
|
||||||
|
>
|
||||||
|
<button
|
||||||
|
class="btn btn-link"
|
||||||
|
data-bs-toggle="modal"
|
||||||
|
data-bs-target="#pdf-viewer"
|
||||||
|
@click="previewAttachedFile(request.id, file.document_id, file.file_name)"
|
||||||
|
>
|
||||||
{{ $t('Preview') }}{{ file.file_name }}
|
{{ $t('Preview') }}{{ file.file_name }}
|
||||||
</button>
|
</button>
|
||||||
<button @click="downloadAttachedFile(request.id, file.document_id)">
|
<button
|
||||||
|
class="btn btn-link"
|
||||||
|
@click="downloadAttachedFile(request.id, file.document_id)"
|
||||||
|
>
|
||||||
{{ $t('Download') }}{{ file.file_name }}
|
{{ $t('Download') }}{{ file.file_name }}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
@ -179,12 +191,38 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div
|
||||||
|
class="modal fade"
|
||||||
|
id="pdf-viewer"
|
||||||
|
tabindex="-1"
|
||||||
|
aria-labelledby="pdf-viewer-label"
|
||||||
|
aria-hidden="true"
|
||||||
|
>
|
||||||
|
<div class="modal-dialog modal-xl">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h1 class="modal-title fs-5" id="pdf-viewer-label">{{ pdfDocument.title }}</h1>
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
class="btn-close"
|
||||||
|
data-bs-dismiss="modal"
|
||||||
|
aria-label="Close"
|
||||||
|
></button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<PDFReader :doc="pdfDocument.doc" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { RequestHubApi, WorksapceApi, DateUtils, requestHubUtils } from '@/utils/index'
|
import { RequestHubApi, WorksapceApi, DateUtils, requestHubUtils } from '@/utils/index'
|
||||||
import { proposingModelEnum } from '@/types/index'
|
import { proposingModelEnum } from '@/types/index'
|
||||||
|
import PDFReader from '@/components/PDFReader.vue'
|
||||||
export default {
|
export default {
|
||||||
|
components: { PDFReader },
|
||||||
name: 'RequestHub',
|
name: 'RequestHub',
|
||||||
props: {},
|
props: {},
|
||||||
mounted() {
|
mounted() {
|
||||||
@ -193,7 +231,8 @@ export default {
|
|||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
requestGroups: [],
|
requestGroups: [],
|
||||||
message: null
|
message: null,
|
||||||
|
pdfDocument: {}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -214,17 +253,16 @@ export default {
|
|||||||
getDateFromFulltimeString(fulltime) {
|
getDateFromFulltimeString(fulltime) {
|
||||||
return DateUtils.FromJsonToDateString(fulltime)
|
return DateUtils.FromJsonToDateString(fulltime)
|
||||||
},
|
},
|
||||||
previewAttachedFile(request_id, document_id) {
|
previewAttachedFile(request_id, document_id, title) {
|
||||||
// !!! SHOULD NOT use PdfContentViewer which is designed for unlogged in users.
|
this.pdfDocument.title = title
|
||||||
// !!! Instead, should have a dedicated pdf viewer which should follow the figma design.
|
WorksapceApi.fetchAttachedFileAsMediaData(request_id, document_id)
|
||||||
// WorksapceApi.fetchAttachedFileAsMediaData(request_id, document_id)
|
.then((response) => {
|
||||||
// .then((response) => {
|
let media_data = response.data
|
||||||
// let media_data = response.data
|
this.pdfDocument.doc = { url: media_data }
|
||||||
// console.log(media_data)
|
})
|
||||||
// })
|
.catch((error) => {
|
||||||
// .catch((error) => {
|
this.mnx_backendErrorHandler(error)
|
||||||
// this.mnx_backendErrorHandler(error)
|
})
|
||||||
// })
|
|
||||||
},
|
},
|
||||||
downloadAttachedFile(request_id, document_id) {
|
downloadAttachedFile(request_id, document_id) {
|
||||||
WorksapceApi.fetchAttachedFileAsDownload(request_id, document_id)
|
WorksapceApi.fetchAttachedFileAsDownload(request_id, document_id)
|
||||||
@ -413,4 +451,16 @@ export default {
|
|||||||
@extend .text-start;
|
@extend .text-start;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.pdf-actions {
|
||||||
|
text-align: left;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
margin-top: 12px;
|
||||||
|
|
||||||
|
.btn-link {
|
||||||
|
padding: 0;
|
||||||
|
margin-right: 12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@ -12,10 +12,6 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import {
|
|
||||||
UserProfileApi
|
|
||||||
// userProfileValidator,
|
|
||||||
} from '@/utils/index'
|
|
||||||
export default {
|
export default {
|
||||||
name: 'ProposalSubmitted',
|
name: 'ProposalSubmitted',
|
||||||
props: {
|
props: {
|
||||||
|
|||||||
@ -221,36 +221,6 @@
|
|||||||
<button class="stage-item-delete-button">
|
<button class="stage-item-delete-button">
|
||||||
<svg-icon v-if="index != 0" icon="delete" @click="removeStage(index)" />
|
<svg-icon v-if="index != 0" icon="delete" @click="removeStage(index)" />
|
||||||
</button>
|
</button>
|
||||||
<!-- <div class="stage-item-content-container" id="stage-item-content">
|
|
||||||
<div class="stage-payment-container">
|
|
||||||
<label class="stage-content-label" for="stage-payment-content">Payment</label>
|
|
||||||
<div class="stage-payment-content-container" id="stage-payment-content">
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
class="stage-payment-content-text"
|
|
||||||
id="stage-payment-content-text"
|
|
||||||
v-model="stage.payment"
|
|
||||||
/>
|
|
||||||
<span class="stage-payment-content-span"> {{ stage.currency }}</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="stage-duration-container">
|
|
||||||
<label class="stage-content-label" for="stage-duration-content">Duration</label>
|
|
||||||
<div class="stage-duration-content-container" id="stage-duration-content">
|
|
||||||
<input
|
|
||||||
type="text"
|
|
||||||
class="stage-duration-content-text"
|
|
||||||
v-model="stage.duration_in_days"
|
|
||||||
/>
|
|
||||||
<span class="stage-duration-content-span"> day(s)</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="stage-note-container">
|
|
||||||
<label class="stage-content-label" for="stage-note-content">Notes</label>
|
|
||||||
<input class="stage-note-content-text" id="stage-note-content" v-model="stage.note" />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div> -->
|
|
||||||
</div>
|
</div>
|
||||||
<div class="stage-more-action-container">
|
<div class="stage-more-action-container">
|
||||||
<button class="stage-add-more-button" @click="addStage()">
|
<button class="stage-add-more-button" @click="addStage()">
|
||||||
@ -350,12 +320,6 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
// loadTemplates() {
|
|
||||||
// this.mnx_navToLoadTemplates()
|
|
||||||
// },
|
|
||||||
// copyExisting() {
|
|
||||||
// this.mnx_navToCopyProposals()
|
|
||||||
// },
|
|
||||||
isUserInCNY() {
|
isUserInCNY() {
|
||||||
return window.location.host.includes('localhost') || window.location.href.includes('com.cn')
|
return window.location.host.includes('localhost') || window.location.href.includes('com.cn')
|
||||||
},
|
},
|
||||||
|
|||||||
@ -10,10 +10,6 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import {
|
|
||||||
UserProfileApi
|
|
||||||
// requestHubUtils,
|
|
||||||
} from '@/utils/index'
|
|
||||||
export default {
|
export default {
|
||||||
name: 'RquestIssueDeposit',
|
name: 'RquestIssueDeposit',
|
||||||
props: {
|
props: {
|
||||||
|
|||||||
@ -8,10 +8,6 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import {
|
|
||||||
UserProfileApi
|
|
||||||
// userProfileValidator,
|
|
||||||
} from '@/utils/index'
|
|
||||||
export default {
|
export default {
|
||||||
name: 'RquestIssueDeposited',
|
name: 'RquestIssueDeposited',
|
||||||
props: {
|
props: {
|
||||||
|
|||||||
@ -91,7 +91,7 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { WorksapceApi, requestIssueUtils, DateUtils } from '@/utils/index'
|
import { WorksapceApi, requestIssueUtils, DateUtils } from '@/utils/index'
|
||||||
import { requestStatusEnum, convertIntoToRequestStatus } from '@/types/index'
|
import { convertIntoToRequestStatus } from '@/types/index'
|
||||||
export default {
|
export default {
|
||||||
name: 'RequestManage',
|
name: 'RequestManage',
|
||||||
props: {
|
props: {
|
||||||
|
|||||||
@ -13,7 +13,6 @@ const basicStore = {
|
|||||||
language: 'zh',
|
language: 'zh',
|
||||||
conversations: [],
|
conversations: [],
|
||||||
unreadConversationCount: 0,
|
unreadConversationCount: 0,
|
||||||
// conversation_update_time: null,
|
|
||||||
downstream_web_socket: null
|
downstream_web_socket: null
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -56,12 +55,8 @@ const basicStore = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// event = connected 初始化conversation list
|
|
||||||
// 似乎并不需要在获取conversation list的时候,进行时间戳处理
|
|
||||||
MessageHubApi.fetchConversations(GWT, token).then((response) => {
|
MessageHubApi.fetchConversations(GWT, token).then((response) => {
|
||||||
const conversations = response.data.conversations || []
|
const conversations = response.data.conversations || []
|
||||||
// 既然每次都是新消息在第一位,那么只需要对比conversation list的长度,就可以知道是否有新的会话产生。
|
|
||||||
// 消息初始化不做比对
|
|
||||||
let updateLength = 0
|
let updateLength = 0
|
||||||
if (data.event !== 'connected') {
|
if (data.event !== 'connected') {
|
||||||
updateLength = conversations.length - state.conversations.length
|
updateLength = conversations.length - state.conversations.length
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
import { backendAxios } from './axios'
|
import { backendAxios } from './axios'
|
||||||
class ContentApi {
|
class ContentApi {
|
||||||
static retrieve_blogs() {
|
static retrieve_blogs(host) {
|
||||||
const request = backendAxios.post('/api/content/retrieve-blogs', {}, {})
|
const request = backendAxios.post('/api/content/retrieve-blogs', { host: host }, {})
|
||||||
return request
|
return request
|
||||||
}
|
}
|
||||||
static retrieve_blog_content(document_id) {
|
static retrieve_blog_content(document_id) {
|
||||||
@ -15,16 +15,26 @@ class ContentApi {
|
|||||||
return request
|
return request
|
||||||
}
|
}
|
||||||
|
|
||||||
static retrieve_about_directories() {
|
static retrieve_about_directories(host) {
|
||||||
const request = backendAxios.post('/api/content/retrieve-about-directories', {}, {})
|
const request = backendAxios.post('/api/content/retrieve-about-directories', { host: host }, {})
|
||||||
return request
|
return request
|
||||||
}
|
}
|
||||||
static retrieve_career_directories() {
|
static retrieve_career_directories(host) {
|
||||||
const request = backendAxios.post('/api/content/retrieve-career-directories', {}, {})
|
const request = backendAxios.post(
|
||||||
|
'/api/content/retrieve-career-directories',
|
||||||
|
{ host: host },
|
||||||
|
{}
|
||||||
|
)
|
||||||
return request
|
return request
|
||||||
}
|
}
|
||||||
static retrieve_contact_directories() {
|
static retrieve_contact_directories(host) {
|
||||||
const request = backendAxios.post('/api/content/retrieve-contact-directories', {}, {})
|
const request = backendAxios.post(
|
||||||
|
'/api/content/retrieve-contact-directories',
|
||||||
|
{
|
||||||
|
host: host
|
||||||
|
},
|
||||||
|
{}
|
||||||
|
)
|
||||||
return request
|
return request
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user