Skip to content
This repository has been archived by the owner on Mar 19, 2024. It is now read-only.

Commit

Permalink
feat: minor changes
Browse files Browse the repository at this point in the history
  • Loading branch information
MartinKanera committed Feb 26, 2021
1 parent 766cc33 commit fdae71d
Show file tree
Hide file tree
Showing 7 changed files with 191 additions and 30 deletions.
19 changes: 15 additions & 4 deletions components/admin-project/admin-project.vue
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
img.profile-picture(:src='profilePicture', width='48')
.flex.justify-between.flex-1(class='lg:justify-between')
.flex.flex-col.justify-center
span.text-ps-green.font-bold.text-lg {{ displayName }}
span.text-ps-green.font-bold.text-lg {{ displayName }}{{ year === 0 ? "" : ` - ${year}` }}
span.text-ps-white {{ title }}
.flex.flex-col.text-ps-white.items-end(class='lg:flex-row lg:mr-4 lg:items-center')
span(class='lg:mr-4') posudky: {{ reviews.length }}/
Expand Down Expand Up @@ -35,8 +35,10 @@
ps-text-field.mt-4.text-ps-white(v-if='displayPicker', v-model='projectToUpdate.deadlineDate', type='datetime-local', name='project-deadline', label='Termín odevzdání projektu')
.flex.flex-col
span.text-ps-green.text-lg(v-if='reviews.length > 0') Odevzdaná hodnocení
span(v-for='review in reviewsView') {{ review.displayName }} -
a.ml-1(:href='review.publicUrl') {{ review.fileName }}
.flex.flex-col(v-for='reviews in reviewsView')
span {{ reviews.displayName }}
span(v-for='review in reviews.reviews')
a.ml-1(:href='review.publicUrl') {{ review.fileName }}
.flex.justify-between.mt-4
ps-btn(error, @click='returnProject', :loading='returnBtnLoading', :disabled='returnBtnLoading || !submittedDate') Vrátit projekt
ps-btn(@click='updateProject', :loading='btnLoading', :disabled='btnLoading') Uložit změny
Expand Down Expand Up @@ -115,6 +117,10 @@ export default defineComponent({
type: String,
required: true,
},
year: {
type: Number,
default: 0,
},
},
// { projectId, currentYear, opponentId, publicProject, reviews, studentId, submittedDate, teacherId, title, displayName, profilePicture, teachers }
setup({ projectId, opponentId, publicProject, teacherId, title, teachers, reviews, deadlineDate }) {
Expand Down Expand Up @@ -179,14 +185,19 @@ export default defineComponent({
})
).data;
console.log(reviewsData);
const strippedReviews = reviewsData.filter((reviews: any) => reviews.teacherId !== '');
// @ts-ignore
reviewsView.value = reviewsData.map((review) => {
reviewsView.value = strippedReviews.map((review) => {
return {
...review,
// @ts-ignore
displayName: teachers.find((teacher) => review.teacherId === teacher.id || review.opponentId === teacher.id)?.data()?.displayName,
};
});
console.log(reviewsView.value);
} catch (e) {
console.error(e);
}
Expand Down
27 changes: 15 additions & 12 deletions components/reviews-list/reviews-list.vue
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<template lang="pug">
.reviews-list(v-if='reviews.length > 0')
span.text-ps-green.text-lg Posudky
span.text-ps-green.text-lg Učitelé
.my-1.flex.items-center(v-for='(teacher, index) in reviews', :key='index')
img.profile-picture(:src='teacher.profilePicture', :width='52')
.teacher-review-info
Expand All @@ -17,10 +17,12 @@ import firebase from 'firebase/app';
import 'firebase/firestore';
type ReviewRaw = {
filePath: String;
fileName: String;
publicUrl: String;
teacherId: String;
teacherId: string;
reviews: Array<{
filePath: String;
fileName: String;
publicUrl: String;
}>;
};
type ReviewDisplay = {
Expand Down Expand Up @@ -51,18 +53,19 @@ export default defineComponent({
const reviewsRaw = response.data;
if (reviewsRaw.length === 0) return;
const teachersIds = [...new Set(reviewsRaw.map((review: ReviewRaw) => review.teacherId).filter((teacherId: string) => teacherId !== ''))];
const teachersIds = reviewsRaw.map((review: ReviewRaw) => review.teacherId);
const teachersDocs = (await firebase.firestore().collection('users').where(firebase.firestore.FieldPath.documentId(), 'in', teachersIds).get()).docs;
reviews.value = teachersDocs.map((teacher) => {
const currentReviews: Array<ReviewRaw> = reviewsRaw.filter((review: ReviewRaw) => review.teacherId === teacher.id);
// @ts-ignore
reviews.value = teachersIds.map((teacherId) => {
const currentReviews: ReviewRaw = reviewsRaw.find((review: ReviewRaw) => review.teacherId === teacherId);
const teacherDoc = teachersDocs.find((doc) => doc.id === teacherId);
return {
displayName: teacher.data()?.displayName,
profilePicture: teacher.data()?.profilePicture,
reviews: currentReviews,
displayName: teacherDoc?.data().displayName,
profilePicture: teacherDoc?.data().profilePicture,
reviews: currentReviews.reviews,
};
});
} catch (e) {
Expand Down
8 changes: 6 additions & 2 deletions components/teacher-project/teacher-project.vue
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
.flex.items-center
img.border-2.border-solid.border-ps-green.rounded-full(:src='profilePicture', width='48')
.ml-2
span.text-ps-green.font-bold.block {{ displayName }}
span.text-ps-green.font-bold.block {{ displayName }}{{ year === 0 ? "" : ` - ${year}` }}
span.text-ps-white {{ projectTitle }}
.actions.justify-self-end
nuxt-link(:to='`/project/${url}`')
Expand All @@ -25,7 +25,7 @@
span.text-lg.text-ps-green {{ displayName }}
span.mt-4.mb-1.text-ps-white Nahraj posudky
ps-drag-drop(v-model='reviewsFiles', tile, multiple, accept='.pdf,.xlsx', :disabled='pastDeadline || !unreviewed', :draggable='false')
ps-btn.self-end(v-if='reviewsFiles.length > 0', @click='uploadReviews', :disabled='uploading', :loading='uploading') Odeslat posudek
ps-btn.mt-2.self-end(v-if='reviewsFiles.length > 0', @click='uploadReviews', :disabled='uploading', :loading='uploading') Odeslat posudek
span.mt-8.text-ps-green Odevzdané posudky:
.text-ps-white.flex.items-center.justify-between(v-for='review in uploadedReviews')
.flex
Expand Down Expand Up @@ -115,6 +115,10 @@ export default defineComponent({
type: String,
required: true,
},
year: {
type: Number,
default: 0,
},
},
setup(props) {
const mainStore = useMainStore();
Expand Down
2 changes: 1 addition & 1 deletion components/ui/tabs/tabs.sass
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
.nav
@apply flex flex-col

@screen md
@screen lg
@apply flex-row


Expand Down
10 changes: 7 additions & 3 deletions pages/admin.vue
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,9 @@
:displayName='project.displayName',
:profilePicture='project.profilePicture',
:teachers='teachers',
:url='project.url'
:deadlineDate='project.deadlineDate',
:url='project.url',
:year='project.year'
)
ps-tab(:active='selectedTab == "žáci"')
ps-student.mt-4(
Expand Down Expand Up @@ -141,6 +143,7 @@ type Project = {
profilePicture: String;
deadlineDate: String | null;
url: String;
year: String;
};
type Teacher = {
Expand Down Expand Up @@ -230,6 +233,7 @@ export default defineComponent({
profilePicture: userData?.profilePicture,
deadlineDate: formatDate(projectData?.deadlineDate),
url: projectData?.url,
year: (projectData?.currentYear as firebase.firestore.Timestamp).toDate().getFullYear(),
};
});
};
Expand Down Expand Up @@ -378,7 +382,7 @@ export default defineComponent({
firebase
.firestore()
.collection('projects')
.where('currentYear', '<', currentSchoolYear.value)
.where('currentYear', '!=', currentSchoolYear.value)
.orderBy('currentYear', 'desc')
.limit(10)
.onSnapshot(async (snapshots) => {
Expand Down Expand Up @@ -407,7 +411,7 @@ export default defineComponent({
firebase
.firestore()
.collection('projects')
.where('currentYear', '<', currentSchoolYear.value)
.where('currentYear', '!=', currentSchoolYear.value)
.orderBy('currentYear', 'desc')
.startAfter(lastOfAll)
.limit(10)
Expand Down
121 changes: 118 additions & 3 deletions pages/students.vue
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
:profilePicture='proposal.profilePicture',
:proposalRef='proposal.proposalRef'
)
ps-tabs(:tabs='extern ? ["oponent"] : ["studenti", "předpřipravená zadání", "oponent"]', :selected='selectedTab', @selected='setTab')
ps-tab(v-if='!extern', :active='selectedTab == "studenti"')
ps-tabs(:tabs='extern ? ["oponent"] : ["aktuální projekty", "ostatní projekty", "předpřipravená zadání", "oponent"]', :selected='selectedTab', @selected='setTab')
ps-tab(v-if='!extern', :active='selectedTab == "aktuální projekty"')
.flex.justify-between(v-if='projects.length > 0')
span.text-2xl.text-ps-white.font-medium Moji studenti
.flex.flex-col.mt-4.flex-wrap.justify-between(class='lg:flex-row')
Expand Down Expand Up @@ -47,6 +47,22 @@
:submitted='true',
:url='project.url'
)
ps-tab(v-if='!extern', :active='selectedTab == "ostatní projekty"')
.flex.flex-col.mt-4.flex-wrap.justify-between(class='lg:flex-row')
ps-teacher-project(
v-for='project in otherProjects',
:key='project.projectId',
:projectId='project.projectId',
:projectTitle='project.projectTitle',
:displayName='project.displayName',
:profilePicture='project.profilePicture',
:reviews='project.reviews',
:pastDeadline='pastDeadline',
:teacher='project.teacher',
:opponent='project.opponent',
:url='project.url',
:year='project.year'
)
ps-tab(v-if='!extern', :active='selectedTab == "předpřipravená zadání"')
.flex.flex-col.justify-between(class='md:flex-row')
span.text-2xl.text-ps-white.font-medium Předpřipravené projekty
Expand Down Expand Up @@ -104,6 +120,7 @@ type Project = {
teacher: Boolean;
opponent: Boolean;
url: String;
year: String;
};
type PremadeProject = {
Expand All @@ -119,10 +136,13 @@ export default defineComponent({
setup() {
const mainStore = useMainStore();
const selectedTab = ref(mainStore.state.user.extern ? 'oponent' : 'studenti');
const selectedTab = ref(mainStore.state.user.extern ? 'oponent' : 'aktuální projekty');
const setTab = (tab: string) => {
selectedTab.value = tab;
if (tab === 'ostatní projekty') {
window.onscroll = otherLazyLoad;
}
};
const listeners: Array<Function> = [];
Expand Down Expand Up @@ -238,10 +258,13 @@ export default defineComponent({
teacher: projectDoc.data()?.teacherId === mainStore.state.user.id,
opponent: projectDoc.data()?.opponentId === mainStore.state.user.id,
url: projectDoc.data()?.url,
year: '',
};
});
}),
);
fetchOtherProjects();
} catch (_) {}
// add snapshot listener for submitted projects
Expand Down Expand Up @@ -275,6 +298,7 @@ export default defineComponent({
teacher: projectDoc.data()?.teacherId === mainStore.state.user.id,
opponent: projectDoc.data()?.opponentId === mainStore.state.user.id,
url: projectDoc.data()?.url,
year: '',
};
});
}),
Expand Down Expand Up @@ -334,6 +358,7 @@ export default defineComponent({
teacher: projectDoc.data()?.teacherId === mainStore.state.user.id,
opponent: projectDoc.data()?.opponentId === mainStore.state.user.id,
url: projectDoc.data()?.url,
year: '',
};
});
}),
Expand Down Expand Up @@ -377,6 +402,95 @@ export default defineComponent({
projectModal();
};
// add snapshot listener for other projects
const otherProjects = ref([] as Array<Project>);
let lastOther: any = null;
const fetchOtherProjects = () => {
listeners.push(
firebase
.firestore()
.collection('projects')
.where('teacherId', '==', mainStore.state.user.id)
.where('currentYear', '!=', currentYear.value)
.orderBy('currentYear', 'desc')
.limit(10)
.onSnapshot(async (snapshots) => {
const projectDocs = snapshots.docs;
const studentIds = snapshots.docs.map((projectDoc) => projectDoc.data().studentId);
const studentsColection = await inArray(firebase.firestore().collection('users'), studentIds);
lastOther = projectDocs[projectDocs.length - 1];
const projects = projectDocs.map((projectDoc) => {
const currentStudent = studentsColection.find((studentDoc) => studentDoc.id === projectDoc.data().studentId);
return {
projectId: projectDoc.id,
projectTitle: projectDoc.data().title,
displayName: currentStudent?.data().displayName,
profilePicture: currentStudent?.data().profilePicture,
reviews: (projectDoc.data()?.reviews ?? []).filter((review: any) => review.teacherId === mainStore.state.user.id),
teacher: projectDoc.data()?.teacherId === mainStore.state.user.id,
opponent: projectDoc.data()?.opponentId === mainStore.state.user.id,
url: projectDoc.data()?.url,
year: (projectDoc.data()?.currentYear as firebase.firestore.Timestamp).toDate().getFullYear(),
};
});
projects.forEach((project: any) => {
otherProjects.value = otherProjects.value.filter((currentProject) => currentProject.projectId !== project.projectId);
otherProjects.value.push(project);
});
}),
);
};
const otherLazyLoad = () => {
if (!(window.innerHeight + Math.ceil(window.pageYOffset) >= document.body.offsetHeight) || !lastOther) return;
console.log('Bottom of other projects');
listeners.push(
firebase
.firestore()
.collection('projects')
.where('teacherId', '==', mainStore.state.user.id)
.where('currentYear', '!=', currentYear.value)
.orderBy('currentYear', 'desc')
.startAfter(lastOther)
.limit(10)
.onSnapshot(async (snapshots) => {
const projectDocs = snapshots.docs;
const studentIds = snapshots.docs.map((projectDoc) => projectDoc.data().studentId);
const studentsColection = await inArray(firebase.firestore().collection('users'), studentIds);
lastOther = projectDocs[projectDocs.length - 1];
const projects = projectDocs.map((projectDoc) => {
const currentStudent = studentsColection.find((studentDoc) => studentDoc.id === projectDoc.data().studentId);
return {
projectId: projectDoc.id,
projectTitle: projectDoc.data().title,
displayName: currentStudent?.data().displayName,
profilePicture: currentStudent?.data().profilePicture,
reviews: (projectDoc.data()?.reviews ?? []).filter((review: any) => review.teacherId === mainStore.state.user.id),
teacher: projectDoc.data()?.teacherId === mainStore.state.user.id,
opponent: projectDoc.data()?.opponentId === mainStore.state.user.id,
url: projectDoc.data()?.url,
year: (projectDoc.data()?.currentYear as firebase.firestore.Timestamp).toDate().getFullYear(),
};
});
projects.forEach((project: any) => {
otherProjects.value = otherProjects.value.filter((currentProject) => currentProject.projectId !== project.projectId);
otherProjects.value.push(project);
});
}),
);
};
// Unsubscribe all snapshot listeners
onBeforeUnmount(() => {
listeners.forEach((listener) => listener());
Expand All @@ -398,6 +512,7 @@ export default defineComponent({
opponentProjects,
pastDeadline,
extern: mainStore.state.user.extern,
otherProjects,
};
},
});
Expand Down
Loading

0 comments on commit fdae71d

Please sign in to comment.