api-client/components/collections/graphql/Collection.vue

237 lines
6.5 KiB
Vue
Raw Normal View History

2021-03-18 14:55:12 +00:00
<template>
2021-07-08 18:12:15 +00:00
<div class="flex flex-col" :class="[{ 'bg-primaryLight': dragging }]">
2021-03-18 14:55:12 +00:00
<div
2021-07-08 18:12:15 +00:00
class="flex items-center group"
2021-03-18 14:55:12 +00:00
@dragover.prevent
@drop.prevent="dropEvent"
@dragover="dragging = true"
@drop="dragging = false"
@dragleave="dragging = false"
@dragend="dragging = false"
>
2021-07-08 18:12:15 +00:00
<span
class="cursor-pointer flex w-10 justify-center items-center truncate"
2021-07-08 18:12:15 +00:00
@click="toggleShowChildren()"
2021-07-03 13:14:58 +00:00
>
2021-08-01 17:33:54 +00:00
<i class="material-icons" :class="{ 'text-green-500': isSelected }">
2021-07-08 18:12:15 +00:00
{{ getCollectionIcon }}
</i>
</span>
<span
class="
cursor-pointer
flex flex-1
2021-07-17 17:40:28 +00:00
min-w-0
py-2
2021-07-17 17:40:28 +00:00
pr-2
2021-07-08 18:12:15 +00:00
transition
2021-07-17 17:40:28 +00:00
group-hover:text-secondaryDark
2021-07-08 18:12:15 +00:00
"
@click="toggleShowChildren()"
2021-07-03 13:14:58 +00:00
>
2021-07-08 18:12:15 +00:00
<span class="truncate"> {{ collection.name }} </span>
</span>
2021-08-15 09:48:04 +00:00
<div class="flex">
<ButtonSecondary
v-tippy="{ theme: 'tooltip' }"
2021-07-08 18:12:15 +00:00
icon="create_new_folder"
2021-08-15 09:48:04 +00:00
:title="$t('folder.new')"
class="hidden group-hover:inline-flex"
2021-07-08 18:12:15 +00:00
@click.native="
$emit('add-folder', {
path: `${collectionIndex}`,
})
2021-07-08 07:30:41 +00:00
"
2021-07-08 18:12:15 +00:00
/>
2021-08-15 09:48:04 +00:00
<span>
<tippy
ref="options"
interactive
trigger="click"
theme="popover"
arrow
>
<template #trigger>
<ButtonSecondary
v-tippy="{ theme: 'tooltip' }"
:title="$t('more')"
icon="more_vert"
/>
</template>
<SmartItem
icon="create_new_folder"
:label="$t('folder.new')"
@click.native="
$emit('add-folder', {
path: `${collectionIndex}`,
})
$refs.options.tippy().hide()
"
/>
<SmartItem
icon="create"
:label="$t('edit')"
@click.native="
$emit('edit-collection')
$refs.options.tippy().hide()
"
/>
<SmartItem
icon="delete"
color="red"
:label="$t('delete')"
@click.native="
confirmRemove = true
$refs.options.tippy().hide()
"
/>
</tippy>
</span>
</div>
2021-07-08 18:12:15 +00:00
</div>
<div v-if="showChildren || isFiltered">
2021-07-08 18:12:15 +00:00
<CollectionsGraphqlFolder
v-for="(folder, index) in collection.folders"
2021-07-13 23:49:08 +00:00
:key="`folder-${index}`"
2021-07-17 17:40:28 +00:00
class="border-l border-dividerLight ml-5"
2021-07-08 18:12:15 +00:00
:picked="picked"
:saving-mode="savingMode"
:folder="folder"
:folder-index="index"
:folder-path="`${collectionIndex}/${index}`"
:collection-index="collectionIndex"
:doc="doc"
:is-filtered="isFiltered"
@add-folder="$emit('add-folder', $event)"
@edit-folder="$emit('edit-folder', $event)"
@edit-request="$emit('edit-request', $event)"
@select="$emit('select', $event)"
/>
<CollectionsGraphqlRequest
v-for="(request, index) in collection.requests"
2021-07-13 23:49:08 +00:00
:key="`request-${index}`"
2021-07-17 17:40:28 +00:00
class="border-l border-dividerLight ml-5"
2021-07-08 18:12:15 +00:00
:picked="picked"
:saving-mode="savingMode"
:request="request"
:collection-index="collectionIndex"
:folder-index="-1"
:folder-name="collection.name"
:folder-path="`${collectionIndex}`"
:request-index="index"
:doc="doc"
@edit-request="$emit('edit-request', $event)"
@select="$emit('select', $event)"
/>
<div
v-if="
collection.folders.length === 0 && collection.requests.length === 0
"
class="
2021-07-17 17:40:28 +00:00
border-l border-dividerLight
flex flex-col
2021-07-08 18:12:15 +00:00
text-secondaryLight
2021-07-17 17:40:28 +00:00
ml-5
2021-07-08 18:12:15 +00:00
p-4
2021-07-17 17:40:28 +00:00
items-center
2021-07-08 18:12:15 +00:00
justify-center
"
>
2021-07-24 16:46:48 +00:00
<i class="opacity-75 pb-2 material-icons">folder_open</i>
<span class="text-center">
2021-08-02 15:27:18 +00:00
{{ $t("empty.collection") }}
2021-07-08 18:12:15 +00:00
</span>
</div>
2021-03-18 14:55:12 +00:00
</div>
<SmartConfirmModal
:show="confirmRemove"
2021-08-02 15:27:18 +00:00
:title="$t('confirm.remove_collection')"
2021-03-18 14:55:12 +00:00
@hide-modal="confirmRemove = false"
@resolve="removeCollection"
/>
</div>
</template>
<script lang="ts">
import Vue from "vue"
import {
removeGraphqlCollection,
moveGraphqlRequest,
} from "~/newstore/collections"
2021-03-18 14:55:12 +00:00
export default Vue.extend({
2021-03-18 14:55:12 +00:00
props: {
picked: { type: Object, default: null },
// Whether the viewing context is related to picking (activates 'select' events)
savingMode: { type: Boolean, default: false },
2021-05-18 16:09:55 +00:00
collectionIndex: { type: Number, default: null },
collection: { type: Object, default: () => {} },
2021-03-18 14:55:12 +00:00
doc: Boolean,
isFiltered: Boolean,
},
data() {
return {
showChildren: false,
dragging: false,
selectedFolder: {},
confirmRemove: false,
}
},
computed: {
isSelected(): boolean {
2021-05-30 02:43:05 +00:00
return (
this.picked &&
this.picked.pickedType === "gql-my-collection" &&
this.picked.collectionIndex === this.collectionIndex
2021-05-30 02:43:05 +00:00
)
},
2021-07-08 18:12:15 +00:00
getCollectionIcon() {
if (this.isSelected) return "check_circle"
else if (!this.showChildren && !this.isFiltered) return "arrow_right"
else if (this.showChildren || this.isFiltered) return "arrow_drop_down"
else return "folder"
},
},
2021-03-18 14:55:12 +00:00
methods: {
pick() {
this.$emit("select", {
picked: {
pickedType: "gql-my-collection",
2021-05-30 02:43:05 +00:00
collectionIndex: this.collectionIndex,
},
})
},
2021-03-18 14:55:12 +00:00
toggleShowChildren() {
if (this.savingMode) {
this.pick()
}
2021-03-18 14:55:12 +00:00
this.showChildren = !this.showChildren
},
removeCollection() {
// Cancel pick if picked collection is deleted
2021-06-16 13:43:07 +00:00
if (
this.picked &&
this.picked.pickedType === "gql-my-collection" &&
this.picked.collectionIndex === this.collectionIndex
) {
this.$emit("select", { picked: null })
}
removeGraphqlCollection(this.collectionIndex)
this.$toast.error(this.$t("deleted").toString(), {
2021-03-18 14:55:12 +00:00
icon: "delete",
})
},
dropEvent({ dataTransfer }: any) {
2021-03-18 14:55:12 +00:00
this.dragging = !this.dragging
const folderPath = dataTransfer.getData("folderPath")
2021-03-18 14:55:12 +00:00
const requestIndex = dataTransfer.getData("requestIndex")
moveGraphqlRequest(folderPath, requestIndex, `${this.collectionIndex}`)
2021-03-18 14:55:12 +00:00
},
},
})
2021-03-18 14:55:12 +00:00
</script>