91 lines
2.8 KiB
Vue
91 lines
2.8 KiB
Vue
<template>
|
|
<div>
|
|
<f-select id="connection" v-model="innerConnection" label="Verbindung" name="connection" :options="data"></f-select>
|
|
|
|
<div v-if="innerConnection" class="mt-4">
|
|
<div class="flex space-x-3 items-center bg-zinc-700 rounded-lg mt-3 py-1 px-2">
|
|
<ui-sprite class="w-4 h-4 text-primary-700" src="open-folder"></ui-sprite>
|
|
<div class="text-sm grow" v-text="structure.parent"></div>
|
|
<ui-icon-button icon="undo" @click="emit('input', null)">löschen</ui-icon-button>
|
|
<ui-icon-button icon="undo" @click="updateFiles(getParentDir(structure.parent))">Zurück</ui-icon-button>
|
|
</div>
|
|
<a
|
|
v-for="(file, index) in structure.files"
|
|
:key="index"
|
|
href="#"
|
|
class="flex space-x-3 items-center mt-1 transition duration-200 hover:bg-zinc-600 py-1 px-2 rounded"
|
|
@click.prevent="updateFiles(file.path)"
|
|
>
|
|
<ui-sprite class="w-8 h-8 text-primary-700" src="open-folder"></ui-sprite>
|
|
<span class="grow" :value="file.name">
|
|
{{ file.name }}
|
|
</span>
|
|
<button class="btn btn-primary btn-sm" @click.self.prevent.stop="select(file)">Auswählen</button>
|
|
<ui-sprite class="w-3 h-3 -rotate-90 text-primary-400" src="chevron"></ui-sprite>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup>
|
|
import {ref, watch} from 'vue';
|
|
import {useApiIndex} from '../../composables/useApiIndex';
|
|
|
|
const {reload, data, axios} = useApiIndex('/api/fileshare');
|
|
|
|
const emit = defineEmits(['input']);
|
|
|
|
const props = defineProps({
|
|
value: {
|
|
validator: (v) => typeof v === 'object' || v === null,
|
|
required: true,
|
|
},
|
|
});
|
|
|
|
const innerConnection = ref(props.value === null ? null : props.value.connection_id);
|
|
|
|
const structure = ref({
|
|
parent: props.value === null ? '/' : getParentDir(props.value.resource),
|
|
files: [],
|
|
});
|
|
|
|
function select(file) {
|
|
emit('input', {
|
|
connection_id: innerConnection.value,
|
|
resource: file.path,
|
|
});
|
|
}
|
|
|
|
function getParentDir(dir) {
|
|
if (!dir) {
|
|
return '/';
|
|
}
|
|
return '/' + dir.split('/').slice(1, -1).join('/');
|
|
}
|
|
|
|
watch(innerConnection, () => updateFiles('/'));
|
|
|
|
async function updateFiles(parentDir) {
|
|
console.log(innerConnection);
|
|
if (innerConnection.value === null) {
|
|
structure.value = {
|
|
parent: '/',
|
|
files: [],
|
|
};
|
|
return;
|
|
}
|
|
|
|
const response = await axios.post(`/api/fileshare/${innerConnection.value}/files`, {
|
|
parent: parentDir,
|
|
});
|
|
|
|
structure.value = {
|
|
parent: parentDir,
|
|
files: response.data.data,
|
|
};
|
|
}
|
|
|
|
await reload();
|
|
updateFiles(structure.value.parent);
|
|
</script>
|