Added Board models; WIP CreatePage implementation
This commit is contained in:
parent
b6c2c87d7f
commit
86abfe153a
|
|
@ -1,12 +1,38 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import type { Board } from '@/models/board/Board';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
board: Board,
|
||||||
|
}>();
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col">
|
||||||
|
{{ board.name }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<template v-for="category in props.board.categories" :key="category.name">
|
||||||
|
<div class="col">
|
||||||
|
<div class="d-flex">
|
||||||
|
<div>
|
||||||
|
{{ category.name }}
|
||||||
|
</div>
|
||||||
|
<template v-for="boardEntry in category.boardEntries" :key="boardEntry.name">
|
||||||
|
<div>
|
||||||
|
{{ boardEntry.name }}
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
Board View
|
Board View
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import type { Board } from '@/models/board/Board';
|
||||||
|
import { useI18n } from 'vue-i18n';
|
||||||
|
|
||||||
|
const { t } = useI18n();
|
||||||
|
|
||||||
|
const board = defineModel<Board>( { required: true } );
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
Create Panel
|
||||||
|
<div class="row">
|
||||||
|
<div class="col">
|
||||||
|
<div class="form-floating mb-3">
|
||||||
|
<input type="text" id="board-name" class="form-control" v-model="board.name" :placeholder="t('board.name')">
|
||||||
|
<label for="board-name">{{ t( 'board.name' ) }}</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
@ -1,36 +1,37 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
|
import { computed, inject, ref, type Ref } from 'vue';
|
||||||
import { useI18n } from 'vue-i18n';
|
import { useI18n } from 'vue-i18n';
|
||||||
import BoardView from '../blocks/BoardView.vue';
|
|
||||||
import { computed, inject, onMounted, type Ref } from 'vue';
|
|
||||||
import { navbarKey } from '@/services/UtilService';
|
import { navbarKey } from '@/services/UtilService';
|
||||||
import type NavBar from '../blocks/NavBar.vue';
|
import { Board } from '@/models/board/Board';
|
||||||
|
import type NavBar from '@/components/blocks/NavBar.vue';
|
||||||
|
|
||||||
|
import BoardView from '@/components/blocks/BoardView.vue';
|
||||||
|
import CreatePanel from '@/components/blocks/CreatePanel.vue';
|
||||||
|
|
||||||
const { t } = useI18n();
|
const { t } = useI18n();
|
||||||
|
|
||||||
const navbar = inject<Ref<InstanceType<typeof NavBar> | null>>(navbarKey);
|
const navbar = inject<Ref<InstanceType<typeof NavBar> | null>>(navbarKey);
|
||||||
onMounted( () => {
|
|
||||||
console.log(navbar);
|
|
||||||
console.log(navbar?.value?.navElement);
|
|
||||||
})
|
|
||||||
|
|
||||||
function test() {
|
|
||||||
console.log(navbar);
|
|
||||||
console.log(navbar?.value?.navElement);
|
|
||||||
}
|
|
||||||
|
|
||||||
const navbarHeight = computed( () => {
|
const navbarHeight = computed( () => {
|
||||||
return navbar?.value?.navElement?.clientHeight;
|
return navbar?.value?.navElement?.clientHeight;
|
||||||
});
|
});
|
||||||
|
|
||||||
const restHeight = computed( () => {
|
const restHeight = computed( () => {
|
||||||
return { height: `calc(100vh - ${navbarHeight.value}px)`};
|
return { height: `calc(100vh - ${navbarHeight.value}px)`};
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const board = ref<Board>(new Board("New Board"));
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div :style="restHeight">
|
<div :style="restHeight">
|
||||||
<BoardView />
|
<div class="row h-100">
|
||||||
Create Page
|
<div class="col-9 px-0 bg-primary">
|
||||||
|
<BoardView :board="(board as Board)" />
|
||||||
|
</div>
|
||||||
|
<div class="col-3 px-0 bg-secondary">
|
||||||
|
<CreatePanel v-model="(board as Board)" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
import type { BoardEntry } from './BoardEntry';
|
||||||
|
|
||||||
|
export class Answer{
|
||||||
|
constructor(
|
||||||
|
public text: string,
|
||||||
|
public image: URL | undefined,
|
||||||
|
public boardEntry: BoardEntry,
|
||||||
|
id: number | undefined = undefined,
|
||||||
|
){}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,11 @@
|
||||||
|
import type { User } from '../user/User';
|
||||||
|
import type { Category } from './Category';
|
||||||
|
|
||||||
|
export class Board{
|
||||||
|
constructor(
|
||||||
|
public name: string,
|
||||||
|
public categories: Array<Category> = [],
|
||||||
|
public owner: User | undefined = undefined,
|
||||||
|
private id: number | undefined = undefined,
|
||||||
|
){}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
import type { Answer } from './Answer';
|
||||||
|
import type { Category } from './Category';
|
||||||
|
import type { Question } from './Question';
|
||||||
|
|
||||||
|
export class BoardEntry{
|
||||||
|
constructor(
|
||||||
|
public name: string,
|
||||||
|
public category: Category,
|
||||||
|
public answer: Answer,
|
||||||
|
public questions: Array<Question>,
|
||||||
|
id: number | undefined = undefined,
|
||||||
|
){}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
import type { Board } from './Board';
|
||||||
|
import type { BoardEntry } from './BoardEntry';
|
||||||
|
|
||||||
|
export class Category{
|
||||||
|
constructor(
|
||||||
|
public name: string,
|
||||||
|
public description: string,
|
||||||
|
public board: Board,
|
||||||
|
public boardEntries: Array<BoardEntry> = [],
|
||||||
|
id: number | undefined,
|
||||||
|
){}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,12 @@
|
||||||
|
import type { BoardEntry } from './BoardEntry';
|
||||||
|
import type { QuestionType } from './QuestionType';
|
||||||
|
|
||||||
|
export class Question{
|
||||||
|
constructor(
|
||||||
|
public text: string,
|
||||||
|
public questionType: QuestionType,
|
||||||
|
public boardEntry: BoardEntry,
|
||||||
|
public image: URL | undefined,
|
||||||
|
id: number | undefined = undefined,
|
||||||
|
) {}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
export class QuestionType {
|
||||||
|
constructor(
|
||||||
|
public title: string,
|
||||||
|
public description: string,
|
||||||
|
public active: boolean,
|
||||||
|
id: number | undefined = undefined,
|
||||||
|
){}
|
||||||
|
}
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
export type User = {
|
export type User = {
|
||||||
username: string,
|
username: string,
|
||||||
profilePictureFilename: string | undefined,
|
profilePictureFilename: string | undefined,
|
||||||
|
id: number | undefined,
|
||||||
}
|
}
|
||||||
|
|
@ -5,25 +5,22 @@ import { authService } from '@/services/AuthService';
|
||||||
import { AxiosError } from 'axios';
|
import { AxiosError } from 'axios';
|
||||||
|
|
||||||
export const useUserStore = defineStore( 'user', () => {
|
export const useUserStore = defineStore( 'user', () => {
|
||||||
const username = ref( '' );
|
const loggedIn = computed( () => {
|
||||||
const profilePicture = ref<null | string>( null );
|
return user.value !== null;
|
||||||
const loggedIn = ref( false );
|
})
|
||||||
|
const user = ref<User | null>(null);
|
||||||
|
|
||||||
const getUserOutput = computed( () => `${username.value}` );
|
const getUserOutput = computed( () => `${user.value?.username}` );
|
||||||
const pfpSource = computed( () => {
|
const pfpSource = computed( () => {
|
||||||
return profilePicture.value ?? "/src/assets/images/PFP_BearHead.svg"
|
return user.value?.profilePictureFilename ?? "/src/assets/images/PFP_BearHead.svg"
|
||||||
})
|
})
|
||||||
|
|
||||||
function loginUser( user: User ) {
|
function loginUser( userParam: User ) {
|
||||||
username.value = user.username;
|
user.value = userParam;
|
||||||
profilePicture.value = user.profilePictureFilename ?? null;
|
|
||||||
loggedIn.value = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function logoutUser() {
|
function logoutUser() {
|
||||||
username.value = '';
|
user.value = null;
|
||||||
profilePicture.value = null;
|
|
||||||
loggedIn.value = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function getCheckUser(): Promise<User> {
|
function getCheckUser(): Promise<User> {
|
||||||
|
|
@ -43,8 +40,9 @@ export const useUserStore = defineStore( 'user', () => {
|
||||||
|
|
||||||
return {
|
return {
|
||||||
//Refs
|
//Refs
|
||||||
username,
|
// username,
|
||||||
profilePicture,
|
// profilePicture,
|
||||||
|
user,
|
||||||
loggedIn,
|
loggedIn,
|
||||||
userCheckPromise,
|
userCheckPromise,
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue