141 lines
5.6 KiB
Vue
141 lines
5.6 KiB
Vue
<template>
|
|
<Fluid>
|
|
<div class="flex mt-6">
|
|
<div class="card flex flex-col gap-4 w-full">
|
|
<div>
|
|
<h2 class="text-3xl font-bold mb-4">Upload New Code Repository</h2>
|
|
</div>
|
|
<form @submit.prevent="submitForm" class="p-fluid">
|
|
<div class="flex flex-col gap-4">
|
|
<div class="flex flex-col gap-2">
|
|
<label for="repoName">Repo Name</label>
|
|
<InputText id="repoName" v-model="formData.repoName" placeholder="Enter Repo Name" required class="w-full" />
|
|
</div>
|
|
<div class="flex flex-col gap-2">
|
|
<label for="branch">Branch</label>
|
|
<InputText id="branch" v-model="formData.branch" placeholder="Enter Branch" required class="w-full" />
|
|
</div>
|
|
<div class="flex flex-col gap-2">
|
|
<label for="commitId">CommitID</label>
|
|
<InputText id="commitId" type="text" v-model="formData.commitId" required class="w-full" />
|
|
</div>
|
|
<div class="col-12 mb-4">
|
|
<span class="p-float-label">
|
|
<label for="repoPath">Repo Path</label>
|
|
<InputText id="repoPath" v-model="formData.repoPath" required class="w-full" />
|
|
</span>
|
|
</div>
|
|
<div class="flex flex-col gap-2">
|
|
<label for="defaultChunkSize">Default Chunk Size</label>
|
|
<InputNumber id="defaultChunkSize" v-model="formData.defaultChunkSize" required class="w-full" />
|
|
</div>
|
|
<div class="flex flex-col gap-2">
|
|
<label for="minChunkSize">Min Chunk Size</label>
|
|
<InputNumber id="minChunkSize" v-model="formData.minChunkSize" required class="w-full" />
|
|
</div>
|
|
<div class="flex flex-col gap-2">
|
|
<label for="maxNumberOfChunks">Max Number of Chunks</label>
|
|
<InputNumber id="maxNumberOfChunks" v-model="formData.maxNumberOfChunks" required class="w-full" />
|
|
</div>
|
|
<div class="flex flex-col gap-2">
|
|
<label for="minChunkSizeToEmbed">Min Chunk Size to Embed</label>
|
|
<InputNumber id="minChunkSizeToEmbed" v-model="formData.minChunkSizeToEmbed" required class="w-full" />
|
|
</div>
|
|
</div>
|
|
<Button type="submit" label="Submit" :disabled="isSubmitting" :fluid="false" class="p-button-rounded p-button-lg mt-4" />
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</Fluid>
|
|
</template>
|
|
|
|
<script setup>
|
|
import axios from 'axios';
|
|
import { ref } from 'vue';
|
|
import { useRouter } from 'vue-router';
|
|
import { useToast } from 'primevue/usetoast';
|
|
import InputText from 'primevue/inputtext';
|
|
import InputNumber from 'primevue/inputnumber';
|
|
import Button from 'primevue/button';
|
|
|
|
const toast = useToast();
|
|
const router = useRouter();
|
|
const isSubmitting = ref(false);
|
|
|
|
const formData = ref({
|
|
repoName: '',
|
|
branch: '',
|
|
commitId: '',
|
|
repoPath: '',
|
|
defaultChunkSize: 1988,
|
|
minChunkSize: 200,
|
|
maxNumberOfChunks: 1988,
|
|
minChunkSizeToEmbed: 20
|
|
});
|
|
|
|
const submitForm = async () => {
|
|
if (isSubmitting.value) return; // Prevent duplicate submissions
|
|
|
|
isSubmitting.value = true;
|
|
|
|
const formDataToSend = new FormData();
|
|
|
|
formDataToSend.append('repoName', formData.value.repoName);
|
|
formDataToSend.append('branch', formData.value.branch);
|
|
formDataToSend.append('commitId', formData.value.commitId);
|
|
formDataToSend.append('repoPath', formData.value.repoPath);
|
|
formDataToSend.append('defaultChunkSize', formData.value.defaultChunkSize);
|
|
formDataToSend.append('minChunkSize', formData.value.minChunkSize);
|
|
formDataToSend.append('maxNumberOfChunks', formData.value.maxNumberOfChunks);
|
|
formDataToSend.append('minChunkSizeToEmbed', formData.value.minChunkSizeToEmbed);
|
|
|
|
try {
|
|
const response = await axios.post('/fe-api/ks_git_repos/uploadRepo', formDataToSend);
|
|
console.log('Submit successful:', response.data);
|
|
toast.add({ severity: 'success', summary: 'Success', detail: 'Repository submitted successfully', life: 3000 });
|
|
|
|
// Redirect to desktop.vue
|
|
router.push({ name: 'ks-git-repos' });
|
|
} catch (error) {
|
|
console.error('Submit failed:', error);
|
|
toast.add({ severity: 'error', summary: 'Error', detail: 'Submission failed', life: 3000 });
|
|
}
|
|
};
|
|
</script>
|
|
|
|
<style scoped>
|
|
.card-container {
|
|
max-width: 800px;
|
|
margin: 2rem auto;
|
|
padding: 0 1rem;
|
|
}
|
|
|
|
:deep(.p-card) {
|
|
background: linear-gradient(45deg, #45a049, #4caf50);
|
|
transform: translateY(-2px);
|
|
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
|
|
}
|
|
|
|
:deep(.p-button:hover) {
|
|
background: linear-gradient(45deg, #45a049, #4caf50);
|
|
transform: translateY(-2px);
|
|
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
|
|
}
|
|
|
|
:deep(.p-inputtext:focus) {
|
|
box-shadow: 0 0 0 2px rgba(76, 175, 80, 0.2);
|
|
}
|
|
|
|
:deep(.p-dropdown:focus) {
|
|
box-shadow: 0 0 0 2px rgba(76, 175, 80, 0.2);
|
|
}
|
|
|
|
:deep(.p-inputnumber-input:focus) {
|
|
box-shadow: 0 0 0 2px rgba(76, 175, 80, 0.2);
|
|
}
|
|
|
|
.mt-4 {
|
|
margin-top: 1rem;
|
|
}
|
|
</style>
|