Merge pull request #4074 from shoetten/feature/stack-dragndrop
Improve stack drag and drop behavior
This commit is contained in:
@@ -53,9 +53,11 @@
|
|||||||
<Container lock-axix="y"
|
<Container lock-axix="y"
|
||||||
orientation="horizontal"
|
orientation="horizontal"
|
||||||
:drag-handle-selector="dragHandleSelector"
|
:drag-handle-selector="dragHandleSelector"
|
||||||
|
@drag-start="draggingStack = true"
|
||||||
|
@drag-end="draggingStack = false"
|
||||||
@drop="onDropStack">
|
@drop="onDropStack">
|
||||||
<Draggable v-for="stack in stacksByBoard" :key="stack.id">
|
<Draggable v-for="stack in stacksByBoard" :key="stack.id">
|
||||||
<Stack :stack="stack" />
|
<Stack :stack="stack" :dragging="draggingStack" />
|
||||||
</Draggable>
|
</Draggable>
|
||||||
</Container>
|
</Container>
|
||||||
</div>
|
</div>
|
||||||
@@ -100,6 +102,7 @@ export default {
|
|||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
draggingStack: false,
|
||||||
loading: true,
|
loading: true,
|
||||||
newStackTitle: '',
|
newStackTitle: '',
|
||||||
}
|
}
|
||||||
@@ -117,7 +120,7 @@ export default {
|
|||||||
return this.$store.getters.stacksByBoard(this.board.id)
|
return this.$store.getters.stacksByBoard(this.board.id)
|
||||||
},
|
},
|
||||||
dragHandleSelector() {
|
dragHandleSelector() {
|
||||||
return this.canEdit ? null : '.no-drag'
|
return this.canEdit ? '.stack__title' : '.no-drag'
|
||||||
},
|
},
|
||||||
isEmpty() {
|
isEmpty() {
|
||||||
return this.stacksByBoard.length === 0
|
return this.stacksByBoard.length === 0
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
<div class="stack">
|
<div class="stack">
|
||||||
<div v-click-outside="stopCardCreation"
|
<div v-click-outside="stopCardCreation"
|
||||||
class="stack__header"
|
class="stack__header"
|
||||||
:class="{'stack__header--add': showAddCard }"
|
:class="{'stack__header--add': showAddCard}"
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
:aria-label="stack.title">
|
:aria-label="stack.title">
|
||||||
<transition name="fade" mode="out-in">
|
<transition name="fade" mode="out-in">
|
||||||
@@ -41,7 +41,10 @@
|
|||||||
@keydown.enter="startEditing(stack)">
|
@keydown.enter="startEditing(stack)">
|
||||||
{{ stack.title }}
|
{{ stack.title }}
|
||||||
</h3>
|
</h3>
|
||||||
<form v-else @submit.prevent="finishedEdit(stack)">
|
<form v-else-if="editing"
|
||||||
|
v-click-outside="cancelEdit"
|
||||||
|
@submit.prevent="finishedEdit(stack)"
|
||||||
|
@keyup.esc="cancelEdit">
|
||||||
<input v-model="copiedStack.title"
|
<input v-model="copiedStack.title"
|
||||||
v-focus
|
v-focus
|
||||||
type="text"
|
type="text"
|
||||||
@@ -142,7 +145,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
import ClickOutside from 'vue-click-outside'
|
||||||
import { mapGetters, mapState } from 'vuex'
|
import { mapGetters, mapState } from 'vuex'
|
||||||
import { Container, Draggable } from 'vue-smooth-dnd'
|
import { Container, Draggable } from 'vue-smooth-dnd'
|
||||||
|
|
||||||
@@ -164,8 +167,14 @@ export default {
|
|||||||
NcModal,
|
NcModal,
|
||||||
ArchiveIcon,
|
ArchiveIcon,
|
||||||
},
|
},
|
||||||
|
directives: {
|
||||||
|
ClickOutside,
|
||||||
|
},
|
||||||
props: {
|
props: {
|
||||||
|
dragging: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false,
|
||||||
|
},
|
||||||
stack: {
|
stack: {
|
||||||
type: Object,
|
type: Object,
|
||||||
default: undefined,
|
default: undefined,
|
||||||
@@ -265,6 +274,10 @@ export default {
|
|||||||
this.modalArchivAllCardsShow = false
|
this.modalArchivAllCardsShow = false
|
||||||
},
|
},
|
||||||
startEditing(stack) {
|
startEditing(stack) {
|
||||||
|
if (this.dragging) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
this.copiedStack = Object.assign({}, stack)
|
this.copiedStack = Object.assign({}, stack)
|
||||||
this.editing = true
|
this.editing = true
|
||||||
},
|
},
|
||||||
@@ -274,6 +287,9 @@ export default {
|
|||||||
}
|
}
|
||||||
this.editing = false
|
this.editing = false
|
||||||
},
|
},
|
||||||
|
cancelEdit() {
|
||||||
|
this.editing = false
|
||||||
|
},
|
||||||
async clickAddCard() {
|
async clickAddCard() {
|
||||||
this.stateCardCreating = true
|
this.stateCardCreating = true
|
||||||
try {
|
try {
|
||||||
@@ -374,7 +390,7 @@ export default {
|
|||||||
margin: 6px;
|
margin: 6px;
|
||||||
padding: 4px 4px;
|
padding: 4px 4px;
|
||||||
|
|
||||||
&:focus {
|
&:focus-visible {
|
||||||
outline: 2px solid var(--color-border-dark);
|
outline: 2px solid var(--color-border-dark);
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user