Task Detail View (#37)
This commit is contained in:
@ -40,13 +40,16 @@ export default class AbstractService {
|
||||
this.http.interceptors.request.use( (config) => {
|
||||
switch (config.method) {
|
||||
case 'post':
|
||||
config.data = JSON.stringify(self.beforeUpdate(config.data))
|
||||
if(this.useUpdateInterceptor())
|
||||
config.data = JSON.stringify(self.beforeUpdate(config.data))
|
||||
break
|
||||
case 'put':
|
||||
config.data = JSON.stringify(self.beforeCreate(config.data))
|
||||
if(this.useCreateInterceptor())
|
||||
config.data = JSON.stringify(self.beforeCreate(config.data))
|
||||
break
|
||||
case 'delete':
|
||||
config.data = JSON.stringify(self.beforeDelete(config.data))
|
||||
if(this.useDeleteInterceptor())
|
||||
config.data = JSON.stringify(self.beforeDelete(config.data))
|
||||
break
|
||||
}
|
||||
return config
|
||||
@ -69,6 +72,30 @@ export default class AbstractService {
|
||||
delete: paths.delete !== undefined ? paths.delete : '',
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether or not to use the create interceptor which processes a request payload into json
|
||||
* @returns {boolean}
|
||||
*/
|
||||
useCreateInterceptor() {
|
||||
return true
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether or not to use the update interceptor which processes a request payload into json
|
||||
* @returns {boolean}
|
||||
*/
|
||||
useUpdateInterceptor() {
|
||||
return true
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether or not to use the delete interceptor which processes a request payload into json
|
||||
* @returns {boolean}
|
||||
*/
|
||||
useDeleteInterceptor() {
|
||||
return true
|
||||
}
|
||||
|
||||
/////////////////////
|
||||
// Global error handler
|
||||
|
85
src/services/attachment.js
Normal file
85
src/services/attachment.js
Normal file
@ -0,0 +1,85 @@
|
||||
import AbstractService from './abstractService'
|
||||
import AttachmentModel from '../models/attachment'
|
||||
|
||||
export default class AttachmentService extends AbstractService {
|
||||
constructor() {
|
||||
super({
|
||||
create: '/tasks/{task_id}/attachments',
|
||||
getAll: '/tasks/{task_id}/attachments',
|
||||
delete: '/tasks/{task_id}/attachments/{id}',
|
||||
})
|
||||
}
|
||||
|
||||
uploadProgress = 0
|
||||
|
||||
useCreateInterceptor() {
|
||||
return false
|
||||
}
|
||||
|
||||
modelFactory(data) {
|
||||
return new AttachmentModel(data)
|
||||
}
|
||||
|
||||
modelCreateFactory(data) {
|
||||
// Success contains the uploaded attachments
|
||||
data.success = (data.success === null ? [] : data.success).map(a => {
|
||||
return this.modelFactory(a)
|
||||
})
|
||||
return data
|
||||
}
|
||||
|
||||
download(model) {
|
||||
this.http({
|
||||
url: '/tasks/' + model.task_id + '/attachments/' + model.id,
|
||||
method: 'GET',
|
||||
responseType: 'blob',
|
||||
}).then((response) => {
|
||||
const url = window.URL.createObjectURL(new Blob([response.data]));
|
||||
const link = document.createElement('a');
|
||||
link.href = url;
|
||||
link.setAttribute('download', model.file.name);
|
||||
link.click();
|
||||
window.URL.revokeObjectURL(url);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Uploads a file to the server
|
||||
* @param model
|
||||
* @param files
|
||||
* @returns {Promise<any|never>}
|
||||
*/
|
||||
create(model, files) {
|
||||
|
||||
let data = new FormData()
|
||||
for (let i = 0; i < files.length; i++) {
|
||||
// TODO: Validation of file size
|
||||
data.append('files', new Blob([files[i]]), files[i].name);
|
||||
}
|
||||
|
||||
const cancel = this.setLoading()
|
||||
return this.http.put(
|
||||
this.getReplacedRoute(this.paths.create, model),
|
||||
data,
|
||||
{
|
||||
headers: {
|
||||
'Content-Type':
|
||||
'multipart/form-data; boundary=' + data._boundary,
|
||||
},
|
||||
onUploadProgress: progressEvent => {
|
||||
this.uploadProgress = Math.round( (progressEvent.loaded * 100) / progressEvent.total );
|
||||
}
|
||||
}
|
||||
)
|
||||
.catch(error => {
|
||||
return this.errorHandler(error)
|
||||
})
|
||||
.then(response => {
|
||||
return Promise.resolve(this.modelCreateFactory(response.data))
|
||||
})
|
||||
.finally(() => {
|
||||
this.uploadProgress = 0
|
||||
cancel()
|
||||
})
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
import AbstractService from "./abstractService";
|
||||
import AbstractService from './abstractService'
|
||||
import LabelModel from '../models/label'
|
||||
|
||||
export default class LabelService extends AbstractService {
|
||||
|
@ -6,6 +6,7 @@ export default class TaskService extends AbstractService {
|
||||
super({
|
||||
create: '/lists/{listID}',
|
||||
getAll: '/tasks/all',
|
||||
get: '/tasks/{id}',
|
||||
update: '/tasks/{id}',
|
||||
delete: '/tasks/{id}',
|
||||
});
|
||||
@ -73,6 +74,13 @@ export default class TaskService extends AbstractService {
|
||||
model.hexColor = model.hexColor.substring(1, 7)
|
||||
}
|
||||
|
||||
// Do the same for all related tasks
|
||||
Object.keys(model.related_tasks).forEach(relationKind => {
|
||||
model.related_tasks[relationKind] = model.related_tasks[relationKind].map(t => {
|
||||
return this.processModel(t)
|
||||
})
|
||||
})
|
||||
|
||||
return model
|
||||
}
|
||||
}
|
15
src/services/taskAssignee.js
Normal file
15
src/services/taskAssignee.js
Normal file
@ -0,0 +1,15 @@
|
||||
import AbstractService from './abstractService'
|
||||
import TaskAssigneeModel from '../models/taskAssignee'
|
||||
|
||||
export default class TaskAssigneeService extends AbstractService {
|
||||
constructor() {
|
||||
super({
|
||||
create: '/tasks/{task_id}/assignees',
|
||||
delete: '/tasks/{task_id}/assignees/{user_id}',
|
||||
})
|
||||
}
|
||||
|
||||
modelFactory(data) {
|
||||
return new TaskAssigneeModel(data)
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
import AbstractService from "./abstractService";
|
||||
import AbstractService from './abstractService'
|
||||
import TaskRelationModel from '../models/taskRelation'
|
||||
|
||||
export default class TaskRelationService extends AbstractService {
|
||||
|
Reference in New Issue
Block a user