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" class="mt-2" :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>
 |