refactor attaching file to request
This commit is contained in:
parent
2ddab90136
commit
0be0e7819d
@ -1,46 +1,24 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="request-issue-container offcanvas-parent">
|
<div class="request-issue-container offcanvas-parent">
|
||||||
<div
|
<div class="offcanvas offcanvas-end offcanvas-container" tabindex="-1" id="offcanvas-copy-existing"
|
||||||
class="offcanvas offcanvas-end offcanvas-container"
|
aria-labelledby="offcanvas-copy-existing">
|
||||||
tabindex="-1"
|
|
||||||
id="offcanvas-copy-existing"
|
|
||||||
aria-labelledby="offcanvas-copy-existing"
|
|
||||||
>
|
|
||||||
<div class="offcanvas-header">
|
<div class="offcanvas-header">
|
||||||
<h5 class="offcanvas-title" id="offcanvas-copy-existing">Copy from existing request</h5>
|
<h5 class="offcanvas-title" id="offcanvas-copy-existing">Copy from existing request</h5>
|
||||||
<button
|
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
|
||||||
type="button"
|
|
||||||
class="btn-close"
|
|
||||||
data-bs-dismiss="offcanvas"
|
|
||||||
aria-label="Close"
|
|
||||||
></button>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="offcanvas-body">
|
<div class="offcanvas-body">
|
||||||
<div class="accordion" id="existing-request-item-container">
|
<div class="accordion" id="existing-request-item-container">
|
||||||
<div
|
<div v-for="(existingRequest, index) in existingRequests" :key="index" :id="'existing-request' + index"
|
||||||
v-for="(existingRequest, index) in existingRequests"
|
class="accordion-item">
|
||||||
:key="index"
|
|
||||||
:id="'existing-request' + index"
|
|
||||||
class="accordion-item"
|
|
||||||
>
|
|
||||||
<h2 class="accordion-header" :id="'existing-heading' + index">
|
<h2 class="accordion-header" :id="'existing-heading' + index">
|
||||||
<button
|
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse"
|
||||||
class="accordion-button collapsed"
|
:data-bs-target="'#' + 'existing-request-collapse' + index" aria-expanded="false"
|
||||||
type="button"
|
:aria-controls="'collapse' + index">
|
||||||
data-bs-toggle="collapse"
|
|
||||||
:data-bs-target="'#' + 'existing-request-collapse' + index"
|
|
||||||
aria-expanded="false"
|
|
||||||
:aria-controls="'collapse' + index"
|
|
||||||
>
|
|
||||||
{{ existingRequest.title }}
|
{{ existingRequest.title }}
|
||||||
</button>
|
</button>
|
||||||
</h2>
|
</h2>
|
||||||
<div
|
<div :id="'existing-request-collapse' + index" class="accordion-collapse collapse"
|
||||||
:id="'existing-request-collapse' + index"
|
:aria-labelledby="'existing-heading' + index" data-bs-parent="#existing-request-item-container">
|
||||||
class="accordion-collapse collapse"
|
|
||||||
:aria-labelledby="'existing-heading' + index"
|
|
||||||
data-bs-parent="#existing-request-item-container"
|
|
||||||
>
|
|
||||||
<div class="accordion-body">
|
<div class="accordion-body">
|
||||||
<button class="copy-existing-button" @click="copyRequest(existingRequest)">
|
<button class="copy-existing-button" @click="copyRequest(existingRequest)">
|
||||||
Copy
|
Copy
|
||||||
@ -52,47 +30,24 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div class="offcanvas offcanvas-end offcanvas-container" tabindex="-1" id="offcanvas-template"
|
||||||
class="offcanvas offcanvas-end offcanvas-container"
|
aria-labelledby="offcanvas-template">
|
||||||
tabindex="-1"
|
|
||||||
id="offcanvas-template"
|
|
||||||
aria-labelledby="offcanvas-template"
|
|
||||||
>
|
|
||||||
<div class="offcanvas-header">
|
<div class="offcanvas-header">
|
||||||
<h5 class="offcanvas-title" id="offcanvas-template">Apply request template</h5>
|
<h5 class="offcanvas-title" id="offcanvas-template">Apply request template</h5>
|
||||||
<button
|
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
|
||||||
type="button"
|
|
||||||
class="btn-close"
|
|
||||||
data-bs-dismiss="offcanvas"
|
|
||||||
aria-label="Close"
|
|
||||||
></button>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="offcanvas-body">
|
<div class="offcanvas-body">
|
||||||
<div class="accordion" id="template-item-container">
|
<div class="accordion" id="template-item-container">
|
||||||
<div
|
<div v-for="(template, index) in availableTemplates" :key="index" :id="'template' + index"
|
||||||
v-for="(template, index) in availableTemplates"
|
class="accordion-item">
|
||||||
:key="index"
|
|
||||||
:id="'template' + index"
|
|
||||||
class="accordion-item"
|
|
||||||
>
|
|
||||||
<h2 class="accordion-header" :id="'heading' + index">
|
<h2 class="accordion-header" :id="'heading' + index">
|
||||||
<button
|
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse"
|
||||||
class="accordion-button collapsed"
|
:data-bs-target="'#' + 'collapse' + index" aria-expanded="false" :aria-controls="'collapse' + index">
|
||||||
type="button"
|
|
||||||
data-bs-toggle="collapse"
|
|
||||||
:data-bs-target="'#' + 'collapse' + index"
|
|
||||||
aria-expanded="false"
|
|
||||||
:aria-controls="'collapse' + index"
|
|
||||||
>
|
|
||||||
{{ template.title }}
|
{{ template.title }}
|
||||||
</button>
|
</button>
|
||||||
</h2>
|
</h2>
|
||||||
<div
|
<div :id="'collapse' + index" class="accordion-collapse collapse" :aria-labelledby="'heading' + index"
|
||||||
:id="'collapse' + index"
|
data-bs-parent="#template-item-container">
|
||||||
class="accordion-collapse collapse"
|
|
||||||
:aria-labelledby="'heading' + index"
|
|
||||||
data-bs-parent="#template-item-container"
|
|
||||||
>
|
|
||||||
<div class="accordion-body">
|
<div class="accordion-body">
|
||||||
<button class="select-template-button" @click="selectTemplate(template)">
|
<button class="select-template-button" @click="selectTemplate(template)">
|
||||||
Apply
|
Apply
|
||||||
@ -113,30 +68,15 @@
|
|||||||
{{ product.name }}
|
{{ product.name }}
|
||||||
</option>
|
</option>
|
||||||
</select>
|
</select>
|
||||||
<input
|
<input v-if="selectedProduct === 'new'" type="text" class="product-input-box" v-model="newProduct"
|
||||||
v-if="selectedProduct === 'new'"
|
placeholder="Enter new product name" />
|
||||||
type="text"
|
|
||||||
class="product-input-box"
|
|
||||||
v-model="newProduct"
|
|
||||||
placeholder="Enter new product name"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
<button
|
<button class="action-button" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvas-template"
|
||||||
class="action-button"
|
aria-controls="offcanvas-template">
|
||||||
type="button"
|
|
||||||
data-bs-toggle="offcanvas"
|
|
||||||
data-bs-target="#offcanvas-template"
|
|
||||||
aria-controls="offcanvas-template"
|
|
||||||
>
|
|
||||||
Templates...
|
Templates...
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button class="action-button" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvas-copy-existing"
|
||||||
class="action-button"
|
aria-controls="offcanvas-copy-existing">
|
||||||
type="button"
|
|
||||||
data-bs-toggle="offcanvas"
|
|
||||||
data-bs-target="#offcanvas-copy-existing"
|
|
||||||
aria-controls="offcanvas-copy-existing"
|
|
||||||
>
|
|
||||||
Copy...
|
Copy...
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
@ -167,8 +107,7 @@
|
|||||||
import {
|
import {
|
||||||
WorksapceApi,
|
WorksapceApi,
|
||||||
textAreaAujuster,
|
textAreaAujuster,
|
||||||
requestIssueUtils,
|
requestIssueUtils
|
||||||
DocumentApi
|
|
||||||
} from '../../../../utils/index'
|
} from '../../../../utils/index'
|
||||||
import { requestIssuingModelEnum } from '../../../../types/index'
|
import { requestIssuingModelEnum } from '../../../../types/index'
|
||||||
import VueQuill from '@/components/VueQuill.vue'
|
import VueQuill from '@/components/VueQuill.vue'
|
||||||
@ -282,6 +221,16 @@ export default {
|
|||||||
back() {
|
back() {
|
||||||
this.mnx_goBack()
|
this.mnx_goBack()
|
||||||
},
|
},
|
||||||
|
attachFile() {
|
||||||
|
if (this.uploadFile) {
|
||||||
|
WorksapceApi.attachFileToRequest(this.uploadFile)
|
||||||
|
.then((response) => {
|
||||||
|
this.mnx_navToRequestSubmitted(this.request_id)
|
||||||
|
}).catch((error) => {
|
||||||
|
this.mnx_backendErrorHandler(error)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
},
|
||||||
submit() {
|
submit() {
|
||||||
var product = this.selectedProduct
|
var product = this.selectedProduct
|
||||||
if (this.selectedProduct === 'new') {
|
if (this.selectedProduct === 'new') {
|
||||||
@ -293,33 +242,25 @@ export default {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TODO: need to move to validator module
|
||||||
if (!/^[a-zA-Z0-9-]+$/.test(product)) {
|
if (!/^[a-zA-Z0-9-]+$/.test(product)) {
|
||||||
alert('Product name should only contain letters, numbers, or dashes')
|
alert('Product name should only contain letters, numbers, or dashes')
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.uploadFile) {
|
WorksapceApi.postRequest(this.content, product)
|
||||||
DocumentApi.upload(this.uploadFile)
|
.then((response) => {
|
||||||
.then((response) => {
|
this.request_id = response.data.request_id
|
||||||
return WorksapceApi.postRequest(this.content, product, response.data.document_id)
|
if (this.uploadFile) {
|
||||||
})
|
this.attachFile()
|
||||||
.then((response) => {
|
}
|
||||||
this.request_id = response.data.request_id
|
else {
|
||||||
this.mnx_navToRequestSubmitted(this.request_id)
|
this.mnx_navToRequestSubmitted(this.request_id)
|
||||||
})
|
}
|
||||||
.catch((error) => {
|
})
|
||||||
this.mnx_backendErrorHandler(error)
|
.catch((error) => {
|
||||||
})
|
this.mnx_backendErrorHandler(error)
|
||||||
} else {
|
})
|
||||||
WorksapceApi.postRequest(this.content, product, null)
|
|
||||||
.then((response) => {
|
|
||||||
this.request_id = response.data.request_id
|
|
||||||
this.mnx_navToRequestSubmitted(this.request_id)
|
|
||||||
})
|
|
||||||
.catch((error) => {
|
|
||||||
this.mnx_backendErrorHandler(error)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,31 +0,0 @@
|
|||||||
import { backendAxios } from './axios'
|
|
||||||
import { userUtils } from '../store/index'
|
|
||||||
|
|
||||||
class DocumentApi {
|
|
||||||
static upload(file) {
|
|
||||||
let jwt = userUtils.getJwtToken()
|
|
||||||
const formData = new FormData()
|
|
||||||
formData.append('file', file)
|
|
||||||
|
|
||||||
const request = backendAxios.post('/api/document/upload', formData, {
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'multipart/form-data',
|
|
||||||
Authorization: `Bearer ${jwt}`
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return request
|
|
||||||
}
|
|
||||||
|
|
||||||
static download(document_id) {
|
|
||||||
let jwt = userUtils.getJwtToken()
|
|
||||||
const request = backendAxios.get(`/api/document/download/${document_id}`, {
|
|
||||||
headers: {
|
|
||||||
Authorization: `Bearer ${jwt}`
|
|
||||||
},
|
|
||||||
responseType: 'blob'
|
|
||||||
})
|
|
||||||
return request
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export { DocumentApi }
|
|
||||||
@ -4,6 +4,5 @@ export { WorksapceApi } from './workspace'
|
|||||||
export { RequestHubApi } from './requestHub'
|
export { RequestHubApi } from './requestHub'
|
||||||
export { ProviderHubApi } from './providerHub'
|
export { ProviderHubApi } from './providerHub'
|
||||||
export { MessageHubApi } from './messageHub'
|
export { MessageHubApi } from './messageHub'
|
||||||
export { DocumentApi } from './document'
|
|
||||||
export { HistoryApi } from './history'
|
export { HistoryApi } from './history'
|
||||||
export { ContentApi } from './content'
|
export { ContentApi } from './content'
|
||||||
|
|||||||
@ -153,41 +153,19 @@ class WorksapceApi {
|
|||||||
return request
|
return request
|
||||||
}
|
}
|
||||||
|
|
||||||
static postRequest(content, product, document_id) {
|
static postRequest(content, product) {
|
||||||
let jwt = userUtils.getJwtToken()
|
let jwt = userUtils.getJwtToken()
|
||||||
const requestData = {
|
const requestData = {
|
||||||
content: content,
|
content: content,
|
||||||
product: product
|
product: product
|
||||||
}
|
}
|
||||||
|
|
||||||
if (document_id) {
|
|
||||||
requestData.document_id = document_id
|
|
||||||
}
|
|
||||||
|
|
||||||
const request = backendAxios.post('/api/workspace/request/post-request', requestData, {
|
const request = backendAxios.post('/api/workspace/request/post-request', requestData, {
|
||||||
headers: { Authorization: `Bearer ${jwt}` }
|
headers: { Authorization: `Bearer ${jwt}` }
|
||||||
})
|
})
|
||||||
return request
|
return request
|
||||||
}
|
}
|
||||||
|
|
||||||
static postRequestWithFile(content, product, file) {
|
|
||||||
let jwt = userUtils.getJwtToken()
|
|
||||||
const formData = new FormData()
|
|
||||||
formData.append('content', content)
|
|
||||||
formData.append('product', product)
|
|
||||||
if (file) {
|
|
||||||
formData.append('file', file)
|
|
||||||
}
|
|
||||||
|
|
||||||
const request = backendAxios.post('/api/workspace/request/post-request', formData, {
|
|
||||||
headers: {
|
|
||||||
'Content-Type': 'multipart/form-data',
|
|
||||||
Authorization: `Bearer ${jwt}`
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return request
|
|
||||||
}
|
|
||||||
|
|
||||||
static withdrawRequest(id) {
|
static withdrawRequest(id) {
|
||||||
let jwt = userUtils.getJwtToken()
|
let jwt = userUtils.getJwtToken()
|
||||||
const request = backendAxios.post(
|
const request = backendAxios.post(
|
||||||
@ -327,6 +305,25 @@ class WorksapceApi {
|
|||||||
)
|
)
|
||||||
return request
|
return request
|
||||||
}
|
}
|
||||||
|
static attachFileToRequest(request_id, file) {
|
||||||
|
let jwt = userUtils.getJwtToken()
|
||||||
|
const formData = new FormData()
|
||||||
|
formData.append('file', file)
|
||||||
|
|
||||||
|
const request = backendAxios.post(
|
||||||
|
'/api/document/upload',
|
||||||
|
{
|
||||||
|
request_id: request_id
|
||||||
|
},
|
||||||
|
formData,
|
||||||
|
{
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'multipart/form-data',
|
||||||
|
Authorization: `Bearer ${jwt}`
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return request
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export { WorksapceApi }
|
export { WorksapceApi }
|
||||||
|
|||||||
@ -5,7 +5,6 @@ export {
|
|||||||
RequestHubApi,
|
RequestHubApi,
|
||||||
ProviderHubApi,
|
ProviderHubApi,
|
||||||
MessageHubApi,
|
MessageHubApi,
|
||||||
DocumentApi,
|
|
||||||
HistoryApi,
|
HistoryApi,
|
||||||
ContentApi
|
ContentApi
|
||||||
} from './backend/index'
|
} from './backend/index'
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user