1
0

Task Detail View (#37)

This commit is contained in:
konrad
2019-11-24 13:16:24 +00:00
parent e00f0046b5
commit 4e5d14d969
39 changed files with 2228 additions and 503 deletions

View File

@ -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

View 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()
})
}
}

View File

@ -1,4 +1,4 @@
import AbstractService from "./abstractService";
import AbstractService from './abstractService'
import LabelModel from '../models/label'
export default class LabelService extends AbstractService {

View File

@ -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
}
}

View 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)
}
}

View File

@ -1,4 +1,4 @@
import AbstractService from "./abstractService";
import AbstractService from './abstractService'
import TaskRelationModel from '../models/taskRelation'
export default class TaskRelationService extends AbstractService {