You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

271 lines
9.2 KiB

<template lang="pug">
div(v-cloak="")
section.hero.project-image
div.container
div.columns
div.column.is-10.is-offset-1
h1.title.is-1.has-text-white Hello, {{ username | title }}.
h2.subtitle.is-4.has-text-white I hope you are having a great day!
p(v-if="isSuperuser")
a.button.is-medium.is-primary(v-on:click="isActive = !isActive") Create Project
div.modal(v-bind:class="{ 'is-active': isActive }")
div.modal-background
div.modal-card
header.modal-card-head
p.modal-card-title Create Project
button.delete(aria-label="close", v-on:click="isActive = !isActive")
section.modal-card-body
div.field
label.label Project Name
div.control
input.input(v-model="projectName", type="text", required, placeholder="Project name")
p.help.is-danger {{ projectNameError }}
div.field
label.label Description
div.control
textarea.textarea(v-model="description", required, placeholder="Project description")
p.help.is-danger {{ descriptionError }}
div.field
label.label Project Type
div.control
select(v-model="projectType", name="project_type", required)
option(value="", selected="selected") ---------
option(value="DocumentClassification") document classification
option(value="SequenceLabeling") sequence labeling
option(value="Seq2seq") sequence to sequence
option(value="Speech2text") speech to text
p.help.is-danger {{ projectTypeError }}
div.field
label.checkbox
input(
v-model="randomizeDocumentOrder"
name="randomize_document_order"
type="checkbox"
style="margin-right: 0.25em;"
required
)
| Randomize document order per user
div.field
label.checkbox
input(
v-model="collaborativeAnnotation"
name="collaborative_annotation"
type="checkbox"
style="margin-right: 0.25em;"
required
)
| Share annotations across all users
div.field(v-if="projectType === 'DocumentClassification'")
label.checkbox
input(
v-model="singleClassClassification"
name="single_class_classification"
type="checkbox"
style="margin-right: 0.25em;"
required
)
| Single-class classification
footer.modal-card-foot.pt20.pb20.pr20.pl20.has-background-white-ter
button.button.is-primary(v-on:click="create()") Create
button.button(v-on:click="isActive = !isActive") Cancel
div.modal(v-bind:class="{ 'is-active': isDelete }")
div.modal-background
div.modal-card
header.modal-card-head
p.modal-card-title Delete Project
button.delete(aria-label="close", v-on:click="isDelete = !isDelete")
section.modal-card-body Are you sure you want to delete project?
footer.modal-card-foot.pt20.pb20.pr20.pl20.has-background-white-ter
button.button.is-danger(v-on:click="deleteProject()") Delete
button.button(v-on:click="isDelete = !isDelete") Cancel
section.hero
div.container
div.columns
div.column.is-10.is-offset-1
div.card.events-card
header.card-header
p.card-header-title {{ items.length }} Projects
div.field.card-header-icon
div.control
div.select
select(v-model="selected")
option(selected) All Project
option Text Classification
option Sequence Labeling
option Seq2seq
option Speech to text
div.card-table
div.content
table.table.is-fullwidth
tbody
tr(v-for="project in selectedProjects", v-bind:key="project.id")
td.pl15r
div.thumbnail-wrapper.is-vertical
img.project-thumbnail(
v-bind:src="project.image"
alt="Project thumbnail"
)
div.dataset-item__main.is-vertical
div.dataset-item__main-title
div.dataset-item__main-title-link.dataset-item__link
a.has-text-black(v-bind:href="'/projects/' + project.id")
| {{ project.name }}
div.dataset-item__main-subtitle {{ project.description }}
div.dataset-item__main-info
span.dataset-item__main-update updated
span {{ project.updated_at | daysAgo }}
td.is-vertical
span.tag.is-normal {{ project.project_type }}
td.is-vertical(v-if="isProjectAdmin.get(project.id)")
a(v-bind:href="'/projects/' + project.id + '/docs'") Edit
td.is-vertical(v-if="isProjectAdmin.get(project.id)")
a.has-text-danger(v-on:click="setProject(project)") Delete
</template>
<script>
import { title, daysAgo } from './filter';
import { defaultHttpClient } from './http';
export default {
filters: { title, daysAgo },
data: () => ({
items: [],
isActive: false,
isDelete: false,
project: null,
selected: 'All Project',
projectName: '',
description: '',
projectType: '',
descriptionError: '',
projectTypeError: '',
projectNameError: '',
username: '',
isSuperuser: false,
singleClassClassification: false,
randomizeDocumentOrder: false,
collaborativeAnnotation: false,
isProjectAdmin: null,
}),
computed: {
selectedProjects() {
return this.items.filter(item => this.selected === 'All Project' || this.matchType(item.project_type));
},
},
created() {
Promise.all([
defaultHttpClient.get('/v1/projects'),
defaultHttpClient.get('/v1/me'),
]).then(([projects, me]) => {
this.items = projects.data;
this.username = me.data.username;
this.isSuperuser = me.data.is_superuser;
this.isProjectAdmin = new Map(this.items.map((project) => {
const isProjectAdmin = project.current_users_role.is_project_admin;
return [project.id, isProjectAdmin];
}));
});
},
methods: {
deleteProject() {
defaultHttpClient.delete(`/v1/projects/${this.project.id}`).then(() => {
this.isDelete = false;
const index = this.items.indexOf(this.project);
this.items.splice(index, 1);
});
},
setProject(project) {
this.project = project;
this.isDelete = true;
},
matchType(projectType) {
if (projectType === 'DocumentClassification') {
return this.selected === 'Text Classification';
}
if (projectType === 'SequenceLabeling') {
return this.selected === 'Sequence Labeling';
}
if (projectType === 'Seq2seq') {
return this.selected === 'Seq2seq';
}
if (projectType === 'Speech2text') {
return this.selected === 'Speech to text';
}
return false;
},
create() {
const payload = {
name: this.projectName,
description: this.description,
project_type: this.projectType,
single_class_classification: this.singleClassClassification,
randomize_document_order: this.randomizeDocumentOrder,
collaborative_annotation: this.collaborativeAnnotation,
guideline: 'Please write annotation guideline.',
resourcetype: this.resourceType(),
};
defaultHttpClient.post('/v1/projects', payload)
.then((response) => {
window.location = `/projects/${response.data.id}/docs/create`;
})
.catch((error) => {
this.projectTypeError = '';
this.projectNameError = '';
this.descriptionError = '';
if ('resourcetype' in error.response.data) {
this.projectTypeError = error.response.data.resourcetype;
}
if ('name' in error.response.data) {
this.projectNameError = error.response.data.name[0];
}
if ('description' in error.response.data) {
this.descriptionError = error.response.data.description[0];
}
});
},
resourceType() {
if (this.projectType === 'DocumentClassification') {
return 'TextClassificationProject';
}
if (this.projectType === 'SequenceLabeling') {
return 'SequenceLabelingProject';
}
if (this.projectType === 'Seq2seq') {
return 'Seq2seqProject';
}
if (this.projectType === 'Speech2text') {
return 'Speech2textProject';
}
return '';
},
},
};
</script>