2019-07-19 15:41:57 +00:00
|
|
|
<template>
|
2019-11-25 13:41:25 +00:00
|
|
|
<div>
|
|
|
|
<h3 v-if="heading && personlist.length">{{ heading }}</h3>
|
|
|
|
<table class="pure-table pure-table-horizontal" v-if="personlist.length">
|
|
|
|
<thead class="thead-dark">
|
|
|
|
<tr>
|
|
|
|
<th scope="col">#</th>
|
2020-01-09 17:42:09 +00:00
|
|
|
<th scope="col">ID</th>
|
2019-11-25 13:41:25 +00:00
|
|
|
<th scope="col">First Name</th>
|
|
|
|
<th scope="col">Last Name</th>
|
|
|
|
<th scope="col">Email</th>
|
2020-01-28 11:13:01 +00:00
|
|
|
<th scope="col">
|
|
|
|
<label for="language">
|
|
|
|
<span>
|
|
|
|
Orcid <i
|
|
|
|
v-tooltip="{ content: messages.orcid, class: 'tooltip-custom tooltip-other-custom' }"
|
|
|
|
class="far fa-lg fa-question-circle"
|
|
|
|
></i>
|
|
|
|
</span>
|
|
|
|
</label>
|
|
|
|
</th>
|
2019-11-25 13:41:25 +00:00
|
|
|
<th></th>
|
|
|
|
</tr>
|
|
|
|
</thead>
|
|
|
|
<draggable
|
|
|
|
v-bind:list="personlist"
|
|
|
|
tag="tbody"
|
|
|
|
v-on:start="isDragging=true"
|
|
|
|
v-on:end="isDragging=false"
|
2019-07-19 15:41:57 +00:00
|
|
|
>
|
2019-11-25 13:41:25 +00:00
|
|
|
<tr
|
|
|
|
v-for="(item, index) in personlist"
|
|
|
|
v-bind:key="item.id"
|
2020-01-09 17:42:09 +00:00
|
|
|
v-bind:class="[item.status==true ? 'activeClass' : 'inactiveClass']"
|
2019-11-25 13:41:25 +00:00
|
|
|
>
|
|
|
|
<td scope="row">{{ index + 1 }}</td>
|
2020-01-28 11:13:01 +00:00
|
|
|
<td>
|
|
|
|
<input
|
2020-01-16 17:28:28 +00:00
|
|
|
v-bind:name="heading+'['+index+'][id]'"
|
2020-01-28 11:13:01 +00:00
|
|
|
class="form-control"
|
|
|
|
v-model="item.id"
|
|
|
|
readonly
|
2020-01-09 17:42:09 +00:00
|
|
|
data-vv-scope="step-1"
|
2020-01-28 11:13:01 +00:00
|
|
|
/>
|
|
|
|
</td>
|
2019-11-25 13:41:25 +00:00
|
|
|
<td>
|
2020-01-28 11:13:01 +00:00
|
|
|
<input
|
2020-01-16 17:28:28 +00:00
|
|
|
v-bind:name="heading+'['+index+'][first_name]'"
|
2019-11-25 13:41:25 +00:00
|
|
|
class="form-control"
|
|
|
|
placeholder="[FIRST NAME]"
|
|
|
|
v-model="item.first_name"
|
|
|
|
v-bind:readonly="item.status==1"
|
|
|
|
v-validate="'required'"
|
|
|
|
data-vv-scope="step-1"
|
|
|
|
/>
|
|
|
|
</td>
|
|
|
|
<td>
|
|
|
|
<input
|
2020-01-28 11:13:01 +00:00
|
|
|
v-bind:name="heading+'['+index+'][last_name]'"
|
2019-11-25 13:41:25 +00:00
|
|
|
class="form-control"
|
|
|
|
placeholder="[LAST NAME]"
|
|
|
|
v-model="item.last_name"
|
|
|
|
v-bind:readonly="item.status==1"
|
|
|
|
v-validate="'required'"
|
|
|
|
data-vv-scope="step-1"
|
|
|
|
/>
|
|
|
|
</td>
|
|
|
|
<td>
|
2020-01-28 11:13:01 +00:00
|
|
|
<!-- v-validate="'required|email'" -->
|
2019-11-25 13:41:25 +00:00
|
|
|
<input
|
2020-01-28 11:13:01 +00:00
|
|
|
v-bind:name="heading+'['+index+'][email]'"
|
2019-11-25 13:41:25 +00:00
|
|
|
class="form-control"
|
|
|
|
placeholder="[EMAIL]"
|
2020-01-28 11:13:01 +00:00
|
|
|
v-model="item.email"
|
2019-11-29 16:33:08 +00:00
|
|
|
v-validate="{required: true, email: true, unique: [personlist, index, 'email']}"
|
2019-11-25 13:41:25 +00:00
|
|
|
v-bind:readonly="item.status==1"
|
|
|
|
data-vv-scope="step-1"
|
|
|
|
/>
|
|
|
|
</td>
|
|
|
|
<td>
|
|
|
|
<input
|
2020-01-28 11:13:01 +00:00
|
|
|
v-bind:name="heading+'['+index+'][identifier_orcid]'"
|
2019-11-25 13:41:25 +00:00
|
|
|
class="form-control"
|
|
|
|
placeholder="[ORCID optional]"
|
|
|
|
v-model="item.identifier_orcid"
|
|
|
|
v-bind:readonly="item.status==1"
|
|
|
|
data-vv-scope="step-1"
|
|
|
|
/>
|
|
|
|
</td>
|
|
|
|
<td>
|
|
|
|
<button
|
|
|
|
class="pure-button button-small is-warning"
|
|
|
|
@click.prevent="removeAuthor(index)"
|
|
|
|
>
|
|
|
|
<i class="fa fa-trash"></i>
|
|
|
|
</button>
|
|
|
|
</td>
|
|
|
|
</tr>
|
|
|
|
</draggable>
|
|
|
|
</table>
|
2019-07-24 07:28:04 +00:00
|
|
|
</div>
|
2019-07-19 15:41:57 +00:00
|
|
|
</template>
|
|
|
|
|
2019-11-25 13:41:25 +00:00
|
|
|
<script lang="ts">
|
2019-07-19 15:41:57 +00:00
|
|
|
import draggable from "vuedraggable";
|
2019-11-25 13:41:25 +00:00
|
|
|
import { Component, Inject, Vue, Prop, Watch } from "vue-property-decorator";
|
2020-01-28 16:59:52 +00:00
|
|
|
import Tooltip from 'vue-directive-tooltip';
|
|
|
|
import 'vue-directive-tooltip/dist/vueDirectiveTooltip.css';
|
|
|
|
Vue.use(Tooltip);
|
2019-11-25 13:41:25 +00:00
|
|
|
|
|
|
|
@Component({
|
|
|
|
components: { draggable }
|
|
|
|
})
|
|
|
|
export default class PersonTable extends Vue {
|
2019-12-20 10:44:40 +00:00
|
|
|
@Inject("$validator") readonly $validator;
|
2019-11-25 13:41:25 +00:00
|
|
|
// inject: {
|
|
|
|
// $validator: "$validator"
|
|
|
|
// },
|
|
|
|
name: "person-table";
|
|
|
|
// components: {
|
|
|
|
// draggable
|
|
|
|
// },
|
|
|
|
|
|
|
|
editable = true;
|
|
|
|
isDragging = false;
|
|
|
|
delayedDragging = false;
|
|
|
|
|
|
|
|
@Prop({ default: true, type: Array })
|
|
|
|
personlist;
|
|
|
|
@Prop(Number)
|
|
|
|
rowIndex;
|
|
|
|
@Prop(String)
|
|
|
|
heading;
|
2020-01-28 11:13:01 +00:00
|
|
|
@Prop({ required: true, type: Array })
|
|
|
|
messages;
|
2019-11-25 13:41:25 +00:00
|
|
|
|
|
|
|
// props: {
|
|
|
|
// personlist: {
|
|
|
|
// type: Array,
|
|
|
|
// required: true
|
|
|
|
// },
|
|
|
|
// rowIndex: {
|
|
|
|
// type: Number
|
|
|
|
// },
|
|
|
|
// heading: String
|
|
|
|
// },
|
|
|
|
|
|
|
|
itemAction(action, data, index) {
|
|
|
|
console.log("custom-actions: " + action, data.full_name, index);
|
2019-07-19 15:41:57 +00:00
|
|
|
}
|
2019-11-25 13:41:25 +00:00
|
|
|
|
|
|
|
removeAuthor(key) {
|
|
|
|
this.personlist.splice(key, 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
onMove({ relatedContext, draggedContext }) {
|
|
|
|
const relatedElement = relatedContext.element;
|
|
|
|
const draggedElement = draggedContext.element;
|
|
|
|
return (!relatedElement || !relatedElement.fixed) && !draggedElement.fixed;
|
|
|
|
}
|
|
|
|
}
|
2019-07-19 15:41:57 +00:00
|
|
|
</script>
|
|
|
|
|
|
|
|
<style>
|
|
|
|
.custom-actions button.ui.button {
|
|
|
|
padding: 8px 8px;
|
|
|
|
}
|
|
|
|
.custom-actions button.ui.button > i.icon {
|
|
|
|
margin: auto !important;
|
|
|
|
}
|
2020-01-28 11:13:01 +00:00
|
|
|
.activeClass {
|
|
|
|
background-color: aquamarine;
|
|
|
|
}
|
|
|
|
.inactiveClass {
|
|
|
|
background-color: orange;
|
|
|
|
}
|
2019-07-19 15:41:57 +00:00
|
|
|
</style>
|