feat: component om een groep aan te maken
This commit is contained in:
parent
35faf7a80c
commit
05fa69f0c7
2 changed files with 81 additions and 12 deletions
41
frontend/src/components/GroupSelector.vue
Normal file
41
frontend/src/components/GroupSelector.vue
Normal file
|
@ -0,0 +1,41 @@
|
|||
<script setup lang="ts">
|
||||
import { ref, defineProps, defineEmits } from 'vue';
|
||||
import { useI18n } from 'vue-i18n';
|
||||
|
||||
const props = defineProps({
|
||||
students: Array,
|
||||
});
|
||||
const emit = defineEmits(['groupCreated']);
|
||||
const { t } = useI18n();
|
||||
const selectedStudents = ref([]);
|
||||
|
||||
const createGroup = () => {
|
||||
if (selectedStudents.value.length) {
|
||||
emit('groupCreated', selectedStudents.value);
|
||||
selectedStudents.value = []; // Reset selection after creating group
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<v-card-text>
|
||||
<v-combobox
|
||||
v-model="selectedStudents"
|
||||
:items="props.students"
|
||||
:label="t('choose-groups')"
|
||||
variant="solo"
|
||||
clearable
|
||||
multiple
|
||||
hide-details
|
||||
chips
|
||||
append-inner-icon="mdi-magnify"
|
||||
item-title="title"
|
||||
item-value="value"
|
||||
></v-combobox>
|
||||
<v-btn @click="createGroup" color="primary" class="mt-2" size="small">{{ t('create-group') }}</v-btn>
|
||||
</v-card-text>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
|
||||
</style>
|
|
@ -1,25 +1,21 @@
|
|||
<script setup lang="ts">
|
||||
import {useI18n} from "vue-i18n";
|
||||
import {computed, onMounted, ref, watch} from "vue";
|
||||
import GroupSelector from "@/components/GroupSelector.vue";
|
||||
|
||||
const {t, locale} = useI18n();
|
||||
|
||||
const language = ref(locale.value);
|
||||
|
||||
// If this value is set to true, the search bar will display a "loading" animation
|
||||
const loading = ref(false);
|
||||
const searchQuery = ref("");
|
||||
|
||||
// Store all learning paths
|
||||
const allLearningPaths = ref([]);
|
||||
|
||||
// Filtered learning paths that will be displayed in the search bar dropdown
|
||||
const filteredLearningPaths = ref([]);
|
||||
|
||||
// The hruid and title of the currently selected learning path(TODO: use for post req)
|
||||
const selectedLearningPath = ref(null);
|
||||
|
||||
const allClasses = ref(["f", "r"]);
|
||||
const selectedClasses = ref([]);
|
||||
const allStudents = ref([]); // Fetched students from each selected class
|
||||
const groups = ref<string[][]>([]); // Each group is a list of student {names, id's}
|
||||
|
||||
// Fetch all learning paths initially
|
||||
async function fetchAllLearningPaths() {
|
||||
|
@ -63,11 +59,21 @@
|
|||
);
|
||||
});
|
||||
|
||||
const classes = computed(() => ["f", "r"]);
|
||||
|
||||
// Fetch all learning paths on mount
|
||||
onMounted(fetchAllLearningPaths);
|
||||
|
||||
// All students that aren't already in a group
|
||||
const availableStudents = computed(() => {
|
||||
const groupedStudents = new Set(groups.value.flat());
|
||||
return allStudents.value.filter(student => !groupedStudents.has(student));
|
||||
});
|
||||
|
||||
const addGroupToList = (students: string[]) => {
|
||||
if (students.length) {
|
||||
groups.value.push(students);
|
||||
}
|
||||
};
|
||||
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
@ -85,7 +91,6 @@
|
|||
clearable
|
||||
hide-details
|
||||
density="compact"
|
||||
:loading="loading"
|
||||
append-inner-icon="mdi-magnify"
|
||||
item-title="title"
|
||||
item-value="value"
|
||||
|
@ -96,7 +101,7 @@
|
|||
<v-card-text>
|
||||
<v-combobox
|
||||
v-model="selectedClasses"
|
||||
:items="classes"
|
||||
:items="allClasses"
|
||||
:label="t('choose-classes')"
|
||||
variant="solo"
|
||||
clearable
|
||||
|
@ -109,6 +114,29 @@
|
|||
></v-combobox>
|
||||
</v-card-text>
|
||||
|
||||
<v-container>
|
||||
<h3>{{ t('create-groups') }}</h3>
|
||||
|
||||
<GroupSelector
|
||||
:students="availableStudents"
|
||||
@groupCreated="addGroupToList"
|
||||
/>
|
||||
|
||||
<!-- Counter for created groups -->
|
||||
<v-card-text v-if="groups.length">
|
||||
<strong>{{ t('created-groups') }}: {{ groups.length }}</strong>
|
||||
</v-card-text>
|
||||
|
||||
<!-- Display created groups -->
|
||||
<v-card-text v-if="groups.length">
|
||||
<ul>
|
||||
<li v-for="(group, index) in groups" :key="index">
|
||||
{{ group.join(', ') }}
|
||||
</li>
|
||||
</ul>
|
||||
</v-card-text>
|
||||
</v-container>
|
||||
|
||||
</v-container>
|
||||
<v-btn class="mt-2" type="submit" block>Submit</v-btn>
|
||||
</v-form>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue