From dd1603027c0c6cc5cd1ecbb173080d07052a0ceb Mon Sep 17 00:00:00 2001 From: Zsolt Tasnadi Date: Tue, 5 May 2026 22:31:31 +0200 Subject: [PATCH] frontend refact --- apps/frontend/src/App.vue | 2 +- apps/frontend/src/api/event.api.ts | 9 ++ apps/frontend/src/api/git.api.ts | 37 ++++++ apps/frontend/src/api/member.api.ts | 9 ++ apps/frontend/src/api/software.api.ts | 16 +++ apps/frontend/src/api/wiki.api.ts | 102 +++++++++++++++ apps/frontend/src/api/youtube.api.ts | 34 +++++ apps/frontend/src/components/.keep | 0 apps/frontend/src/config.ts | 3 - .../src/{components => layout}/AppLayout.vue | 0 apps/frontend/src/lib/dateFormat.ts | 20 +++ .../src/lib/interfaces/event.interface.ts | 4 + .../src/lib/interfaces/git.interface.ts | 17 +++ .../src/lib/interfaces/member.interface.ts | 6 + .../src/lib/interfaces/software.interface.ts | 25 ++++ .../src/lib/interfaces/wiki.interface.ts | 17 +++ .../src/lib/interfaces/youtube.interface.ts | 6 + apps/frontend/src/main.ts | 2 +- .../blog/BlogIndexPage.vue} | 75 +---------- .../blog/BlogShowPage.vue} | 79 ++---------- .../catalog/CatalogIndexPage.vue} | 31 +---- .../catalog/CatalogShowPage.vue} | 64 +++------- .../code/CodeIndexPage.vue} | 68 ++-------- .../contact/ContactPage.vue} | 0 .../HomeView.vue => page/home/HomePage.vue} | 119 ++++++------------ .../howtos/HowtosIndexPage.vue} | 64 ++-------- .../team/TeamIndexPage.vue} | 18 ++- apps/frontend/src/router/blog.router.ts | 6 + apps/frontend/src/router/catalog.router.ts | 6 + apps/frontend/src/router/code.router.ts | 5 + apps/frontend/src/router/contact.router.ts | 5 + apps/frontend/src/router/home.router.ts | 6 + apps/frontend/src/router/howtos.router.ts | 5 + apps/frontend/src/router/index.router.ts | 24 ++++ apps/frontend/src/router/index.ts | 20 --- apps/frontend/src/router/team.router.ts | 5 + apps/frontend/src/utils/dateFormat.ts | 22 ---- 37 files changed, 465 insertions(+), 466 deletions(-) create mode 100644 apps/frontend/src/api/event.api.ts create mode 100644 apps/frontend/src/api/git.api.ts create mode 100644 apps/frontend/src/api/member.api.ts create mode 100644 apps/frontend/src/api/software.api.ts create mode 100644 apps/frontend/src/api/wiki.api.ts create mode 100644 apps/frontend/src/api/youtube.api.ts delete mode 100644 apps/frontend/src/components/.keep delete mode 100644 apps/frontend/src/config.ts rename apps/frontend/src/{components => layout}/AppLayout.vue (100%) create mode 100644 apps/frontend/src/lib/dateFormat.ts create mode 100644 apps/frontend/src/lib/interfaces/event.interface.ts create mode 100644 apps/frontend/src/lib/interfaces/git.interface.ts create mode 100644 apps/frontend/src/lib/interfaces/member.interface.ts create mode 100644 apps/frontend/src/lib/interfaces/software.interface.ts create mode 100644 apps/frontend/src/lib/interfaces/wiki.interface.ts create mode 100644 apps/frontend/src/lib/interfaces/youtube.interface.ts rename apps/frontend/src/{views/BlogView.vue => page/blog/BlogIndexPage.vue} (74%) rename apps/frontend/src/{views/BlogPostView.vue => page/blog/BlogShowPage.vue} (62%) rename apps/frontend/src/{views/CatalogView.vue => page/catalog/CatalogIndexPage.vue} (87%) rename apps/frontend/src/{views/CatalogItemView.vue => page/catalog/CatalogShowPage.vue} (70%) rename apps/frontend/src/{views/CodeView.vue => page/code/CodeIndexPage.vue} (67%) rename apps/frontend/src/{views/ContactView.vue => page/contact/ContactPage.vue} (100%) rename apps/frontend/src/{views/HomeView.vue => page/home/HomePage.vue} (85%) rename apps/frontend/src/{views/HowtosView.vue => page/howtos/HowtosIndexPage.vue} (76%) rename apps/frontend/src/{views/TeamView.vue => page/team/TeamIndexPage.vue} (84%) create mode 100644 apps/frontend/src/router/blog.router.ts create mode 100644 apps/frontend/src/router/catalog.router.ts create mode 100644 apps/frontend/src/router/code.router.ts create mode 100644 apps/frontend/src/router/contact.router.ts create mode 100644 apps/frontend/src/router/home.router.ts create mode 100644 apps/frontend/src/router/howtos.router.ts create mode 100644 apps/frontend/src/router/index.router.ts delete mode 100644 apps/frontend/src/router/index.ts create mode 100644 apps/frontend/src/router/team.router.ts delete mode 100644 apps/frontend/src/utils/dateFormat.ts diff --git a/apps/frontend/src/App.vue b/apps/frontend/src/App.vue index f26afbb..ab8dba0 100644 --- a/apps/frontend/src/App.vue +++ b/apps/frontend/src/App.vue @@ -5,6 +5,6 @@ diff --git a/apps/frontend/src/api/event.api.ts b/apps/frontend/src/api/event.api.ts new file mode 100644 index 0000000..cdece0c --- /dev/null +++ b/apps/frontend/src/api/event.api.ts @@ -0,0 +1,9 @@ +import type { Event } from '../lib/interfaces/event.interface' + +const index = async (): Promise => { + const res = await fetch('/api/events') + if (!res.ok) throw new Error(`HTTP ${res.status}`) + return res.json() +} + +export default { index } diff --git a/apps/frontend/src/api/git.api.ts b/apps/frontend/src/api/git.api.ts new file mode 100644 index 0000000..a86c4d6 --- /dev/null +++ b/apps/frontend/src/api/git.api.ts @@ -0,0 +1,37 @@ +import type { GiteaRepo, Commit } from '../lib/interfaces/git.interface' + +const BASE = import.meta.env.VITE_GIT_BASE || 'https://git.teletype.hu/api/v1' +const TOKEN = import.meta.env.WEBAPP_GITEA_TOKEN + +function buildHeaders() { + return { 'Authorization': `token ${TOKEN}`, 'Accept': 'application/json' } +} + +const repos = async (): Promise => { + if (!TOKEN) throw new Error('Gitea API token (WEBAPP_GITEA_TOKEN) is not configured.') + const res = await fetch(`${BASE}/repos/search?q=&private=false&limit=50`, { headers: buildHeaders() }) + if (!res.ok) throw new Error(`Gitea API responded with status ${res.status}`) + const data = await res.json() + return data.data || [] +} + +const commits = async (owner: string, name: string, htmlUrl: string): Promise => { + try { + const res = await fetch(`${BASE}/repos/${owner}/${name}/commits?limit=10&page=1`, { headers: buildHeaders() }) + if (!res.ok) return [] + const data = await res.json() + if (!Array.isArray(data)) return [] + return data.map((c: any): Commit => ({ + sha: c.sha, + message: c.commit?.message ?? '', + author: { name: c.commit?.author?.name ?? 'Unknown', email: c.commit?.author?.email ?? '' }, + date: c.commit?.author?.date ?? c.created, + url: c.html_url, + repo: { owner, name, html_url: htmlUrl }, + })) + } catch { + return [] + } +} + +export default { repos, commits } diff --git a/apps/frontend/src/api/member.api.ts b/apps/frontend/src/api/member.api.ts new file mode 100644 index 0000000..b5c7921 --- /dev/null +++ b/apps/frontend/src/api/member.api.ts @@ -0,0 +1,9 @@ +import type { Member } from '../lib/interfaces/member.interface' + +const index = async (): Promise => { + const res = await fetch('/api/members') + if (!res.ok) throw new Error(`HTTP ${res.status}`) + return res.json() +} + +export default { index } diff --git a/apps/frontend/src/api/software.api.ts b/apps/frontend/src/api/software.api.ts new file mode 100644 index 0000000..9ed5303 --- /dev/null +++ b/apps/frontend/src/api/software.api.ts @@ -0,0 +1,16 @@ +import type { SoftwareEntry } from '../lib/interfaces/software.interface' + +const index = async (): Promise => { + const res = await fetch('/api/software') + if (!res.ok) throw new Error(`HTTP ${res.status}`) + const json = await res.json() + return json.softwares +} + +const highlighted = async (): Promise => { + const res = await fetch('/api/software/highlighted') + if (!res.ok) return null + return res.json() +} + +export default { index, highlighted } diff --git a/apps/frontend/src/api/wiki.api.ts b/apps/frontend/src/api/wiki.api.ts new file mode 100644 index 0000000..68f7756 --- /dev/null +++ b/apps/frontend/src/api/wiki.api.ts @@ -0,0 +1,102 @@ +import type { WikiPage, WikiPageWithContent, WikiPageContent } from '../lib/interfaces/wiki.interface' + +const BASE = import.meta.env.VITE_WIKI_BASE || 'https://wiki.teletype.hu' +const TOKEN = import.meta.env.WEBAPP_WIKIJS_TOKEN + +function buildHeaders(): Record { + const h: Record = { 'Content-Type': 'application/json', 'Accept': 'application/json' } + if (TOKEN) h['Authorization'] = `Bearer ${TOKEN}` + return h +} + +async function gql(query: string): Promise { + const res = await fetch(`${BASE}/graphql`, { + method: 'POST', + headers: buildHeaders(), + body: JSON.stringify({ query }), + }) + const json = await res.json() + if (json.errors) throw new Error(json.errors.map((e: any) => e.message).join(', ')) + return json.data +} + +const listBlogPages = async (): Promise => { + const data = await gql(`{ + pages { + list(orderBy: CREATED, orderByDirection: DESC, tags: ["blog"]) { + id path title description updatedAt createdAt locale + } + } + }`) + const pages: any[] = data?.pages?.list ?? [] + + const pagesWithContent = await Promise.all(pages.map(async (p: any) => { + try { + const contentData = await gql(`{ pages { single(id: ${p.id}) { content } } }`) + return { ...p, content: contentData?.pages?.single?.content ?? '' } + } catch { + return { ...p, content: '' } + } + })) + + return pagesWithContent.map((p: any): WikiPageWithContent => ({ + id: p.id, + path: p.path, + title: p.title || p.path, + description: p.description ?? '', + content: p.content ?? '', + updatedAt: p.updatedAt, + createdAt: p.createdAt, + locale: p.locale, + })) +} + +const getBlogPage = async (slug: string): Promise => { + const data = await gql(`{ + pages { + list(orderBy: CREATED, orderByDirection: DESC, tags: ["blog"]) { + id path + } + } + }`) + const pages: any[] = data?.pages?.list ?? [] + + const matched = pages.find((p: any) => { + const pageSlug = p.path.startsWith('blog/') ? p.path.replace('blog/', '') : p.path + return pageSlug === slug + }) + + if (!matched) return null + + const singleData = await gql(`{ + pages { + single(id: ${matched.id}) { + id path title description render updatedAt createdAt locale + } + } + }`) + return singleData?.pages?.single ?? null +} + +const listHowtoPages = async (): Promise => { + const data = await gql(`{ + pages { + list(orderBy: UPDATED, orderByDirection: DESC, tags: ["howto"]) { + id path title description updatedAt createdAt locale + } + } + }`) + const pages: any[] = data?.pages?.list ?? [] + return pages.map((p: any): WikiPage => ({ + id: p.id, + path: p.path, + title: p.title || p.path, + description: p.description ?? '', + updatedAt: p.updatedAt, + createdAt: p.createdAt, + locale: p.locale, + })).slice(0, 30) +} + +export { BASE as WIKI_BASE } +export default { listBlogPages, getBlogPage, listHowtoPages } diff --git a/apps/frontend/src/api/youtube.api.ts b/apps/frontend/src/api/youtube.api.ts new file mode 100644 index 0000000..b84f4d3 --- /dev/null +++ b/apps/frontend/src/api/youtube.api.ts @@ -0,0 +1,34 @@ +import type { YoutubeVideo } from '../lib/interfaces/youtube.interface' + +const API_KEY = import.meta.env.YOUTUBE_API_KEY +const CHANNEL_ID = import.meta.env.YOUTUBE_CHANNEL_ID + +const latestVideo = async (): Promise => { + if (!API_KEY || !CHANNEL_ID) return null + + const searchRes = await fetch( + `https://www.googleapis.com/youtube/v3/search?key=${API_KEY}&channelId=${CHANNEL_ID}&part=snippet&order=date&maxResults=1&type=video` + ) + if (!searchRes.ok) throw new Error(`API error: ${searchRes.status}`) + const searchData = await searchRes.json() + + if (!searchData.items?.length) throw new Error('No videos found on this channel.') + + const item = searchData.items[0] + const videoId = item.id.videoId + + const statsRes = await fetch( + `https://www.googleapis.com/youtube/v3/videos?key=${API_KEY}&id=${videoId}&part=statistics` + ) + const statsData = await statsRes.json() + const views = statsData.items?.[0]?.statistics?.viewCount ?? null + + return { + id: videoId, + title: item.snippet.title, + publishDate: item.snippet.publishedAt, + viewCount: views ? views.toString() : '', + } +} + +export default { latestVideo } diff --git a/apps/frontend/src/components/.keep b/apps/frontend/src/components/.keep deleted file mode 100644 index e69de29..0000000 diff --git a/apps/frontend/src/config.ts b/apps/frontend/src/config.ts deleted file mode 100644 index 8b0e9b7..0000000 --- a/apps/frontend/src/config.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const GAMES_BASE = '' -export const WIKI_BASE = import.meta.env.VITE_WIKI_BASE || 'https://wiki.teletype.hu' -export const GIT_BASE = import.meta.env.VITE_GIT_BASE || 'https://git.teletype.hu/api/v1' diff --git a/apps/frontend/src/components/AppLayout.vue b/apps/frontend/src/layout/AppLayout.vue similarity index 100% rename from apps/frontend/src/components/AppLayout.vue rename to apps/frontend/src/layout/AppLayout.vue diff --git a/apps/frontend/src/lib/dateFormat.ts b/apps/frontend/src/lib/dateFormat.ts new file mode 100644 index 0000000..3a1fc82 --- /dev/null +++ b/apps/frontend/src/lib/dateFormat.ts @@ -0,0 +1,20 @@ +export const DATETIME_FORMAT = 'YYYY-MM-DD HH:mm' +export const DATE_FORMAT = 'YYYY-MM-DD' + +export function formatDateTime(dateStr: string | Date): string { + const d = new Date(dateStr as string) + const year = d.getFullYear() + const month = String(d.getMonth() + 1).padStart(2, '0') + const day = String(d.getDate()).padStart(2, '0') + const hours = String(d.getHours()).padStart(2, '0') + const minutes = String(d.getMinutes()).padStart(2, '0') + return `${year}-${month}-${day} ${hours}:${minutes}` +} + +export function formatDate(dateStr: string | Date): string { + const d = new Date(dateStr as string) + const year = d.getFullYear() + const month = String(d.getMonth() + 1).padStart(2, '0') + const day = String(d.getDate()).padStart(2, '0') + return `${year}-${month}-${day}` +} diff --git a/apps/frontend/src/lib/interfaces/event.interface.ts b/apps/frontend/src/lib/interfaces/event.interface.ts new file mode 100644 index 0000000..8dbf727 --- /dev/null +++ b/apps/frontend/src/lib/interfaces/event.interface.ts @@ -0,0 +1,4 @@ +export interface Event { + name: string + date: string +} diff --git a/apps/frontend/src/lib/interfaces/git.interface.ts b/apps/frontend/src/lib/interfaces/git.interface.ts new file mode 100644 index 0000000..39fab6a --- /dev/null +++ b/apps/frontend/src/lib/interfaces/git.interface.ts @@ -0,0 +1,17 @@ +export interface GiteaRepo { + owner: { login: string } + name: string + description: string + language?: string + html_url: string + updated_at: string +} + +export interface Commit { + sha: string + message: string + author: { name: string; email: string } + date: string + url: string + repo: { owner: string; name: string; html_url: string } +} diff --git a/apps/frontend/src/lib/interfaces/member.interface.ts b/apps/frontend/src/lib/interfaces/member.interface.ts new file mode 100644 index 0000000..e47454c --- /dev/null +++ b/apps/frontend/src/lib/interfaces/member.interface.ts @@ -0,0 +1,6 @@ +export interface Member { + nick: string + real_nick: string + motto: string + avatar_filename: string +} diff --git a/apps/frontend/src/lib/interfaces/software.interface.ts b/apps/frontend/src/lib/interfaces/software.interface.ts new file mode 100644 index 0000000..43b56b3 --- /dev/null +++ b/apps/frontend/src/lib/interfaces/software.interface.ts @@ -0,0 +1,25 @@ +export interface Release { + version: string + htmlFolderPath?: string + cartridgePath?: string + sourcePath?: string + docsFolderPath?: string + UpdatedAt: string +} + +export interface Software { + name: string + title: string + desc: string + status: string + author: string + platform: string + license?: string + story?: string + externalLinks?: { label: string; url: string }[] +} + +export interface SoftwareEntry { + software: Software + releases: Release[] +} diff --git a/apps/frontend/src/lib/interfaces/wiki.interface.ts b/apps/frontend/src/lib/interfaces/wiki.interface.ts new file mode 100644 index 0000000..1cb2a4a --- /dev/null +++ b/apps/frontend/src/lib/interfaces/wiki.interface.ts @@ -0,0 +1,17 @@ +export interface WikiPage { + id: number + path: string + title: string + description: string + updatedAt: string + createdAt: string + locale: string +} + +export interface WikiPageWithContent extends WikiPage { + content: string +} + +export interface WikiPageContent extends WikiPage { + render: string +} diff --git a/apps/frontend/src/lib/interfaces/youtube.interface.ts b/apps/frontend/src/lib/interfaces/youtube.interface.ts new file mode 100644 index 0000000..768222e --- /dev/null +++ b/apps/frontend/src/lib/interfaces/youtube.interface.ts @@ -0,0 +1,6 @@ +export interface YoutubeVideo { + id: string + title: string + publishDate: string + viewCount: string +} diff --git a/apps/frontend/src/main.ts b/apps/frontend/src/main.ts index b2cd227..ce61e4d 100644 --- a/apps/frontend/src/main.ts +++ b/apps/frontend/src/main.ts @@ -1,5 +1,5 @@ import { createApp } from 'vue' -import { router } from './router' +import { router } from './router/index.router' import App from './App.vue' import './styles/global.css' diff --git a/apps/frontend/src/views/BlogView.vue b/apps/frontend/src/page/blog/BlogIndexPage.vue similarity index 74% rename from apps/frontend/src/views/BlogView.vue rename to apps/frontend/src/page/blog/BlogIndexPage.vue index 8d413d3..2820a5a 100644 --- a/apps/frontend/src/views/BlogView.vue +++ b/apps/frontend/src/page/blog/BlogIndexPage.vue @@ -76,24 +76,11 @@ diff --git a/apps/frontend/src/views/ContactView.vue b/apps/frontend/src/page/contact/ContactPage.vue similarity index 100% rename from apps/frontend/src/views/ContactView.vue rename to apps/frontend/src/page/contact/ContactPage.vue diff --git a/apps/frontend/src/views/HomeView.vue b/apps/frontend/src/page/home/HomePage.vue similarity index 85% rename from apps/frontend/src/views/HomeView.vue rename to apps/frontend/src/page/home/HomePage.vue index ef6058a..ccadaa1 100644 --- a/apps/frontend/src/views/HomeView.vue +++ b/apps/frontend/src/page/home/HomePage.vue @@ -53,7 +53,7 @@
▶ Play in Browser @@ -186,19 +186,17 @@ diff --git a/apps/frontend/src/router/blog.router.ts b/apps/frontend/src/router/blog.router.ts new file mode 100644 index 0000000..d9dd68d --- /dev/null +++ b/apps/frontend/src/router/blog.router.ts @@ -0,0 +1,6 @@ +import type { RouteRecordRaw } from 'vue-router' + +export const blogRouter: RouteRecordRaw[] = [ + { path: '/blog', name: 'blogIndex', component: () => import('../page/blog/BlogIndexPage.vue') }, + { path: '/blog/:slug(.*)', name: 'blogShow', component: () => import('../page/blog/BlogShowPage.vue') }, +] diff --git a/apps/frontend/src/router/catalog.router.ts b/apps/frontend/src/router/catalog.router.ts new file mode 100644 index 0000000..9c21ec6 --- /dev/null +++ b/apps/frontend/src/router/catalog.router.ts @@ -0,0 +1,6 @@ +import type { RouteRecordRaw } from 'vue-router' + +export const catalogRouter: RouteRecordRaw[] = [ + { path: '/catalog', name: 'catalogIndex', component: () => import('../page/catalog/CatalogIndexPage.vue') }, + { path: '/catalog/:name', name: 'catalogShow', component: () => import('../page/catalog/CatalogShowPage.vue') }, +] diff --git a/apps/frontend/src/router/code.router.ts b/apps/frontend/src/router/code.router.ts new file mode 100644 index 0000000..1ee6764 --- /dev/null +++ b/apps/frontend/src/router/code.router.ts @@ -0,0 +1,5 @@ +import type { RouteRecordRaw } from 'vue-router' + +export const codeRouter: RouteRecordRaw[] = [ + { path: '/code', name: 'codeIndex', component: () => import('../page/code/CodeIndexPage.vue') }, +] diff --git a/apps/frontend/src/router/contact.router.ts b/apps/frontend/src/router/contact.router.ts new file mode 100644 index 0000000..2b5cac3 --- /dev/null +++ b/apps/frontend/src/router/contact.router.ts @@ -0,0 +1,5 @@ +import type { RouteRecordRaw } from 'vue-router' + +export const contactRouter: RouteRecordRaw[] = [ + { path: '/contact', name: 'contact', component: () => import('../page/contact/ContactPage.vue') }, +] diff --git a/apps/frontend/src/router/home.router.ts b/apps/frontend/src/router/home.router.ts new file mode 100644 index 0000000..62427e7 --- /dev/null +++ b/apps/frontend/src/router/home.router.ts @@ -0,0 +1,6 @@ +import type { RouteRecordRaw } from 'vue-router' +import HomePage from '../page/home/HomePage.vue' + +export const homeRouter: RouteRecordRaw[] = [ + { path: '/', name: 'home', component: HomePage }, +] diff --git a/apps/frontend/src/router/howtos.router.ts b/apps/frontend/src/router/howtos.router.ts new file mode 100644 index 0000000..d186cea --- /dev/null +++ b/apps/frontend/src/router/howtos.router.ts @@ -0,0 +1,5 @@ +import type { RouteRecordRaw } from 'vue-router' + +export const howtosRouter: RouteRecordRaw[] = [ + { path: '/howtos', name: 'howtosIndex', component: () => import('../page/howtos/HowtosIndexPage.vue') }, +] diff --git a/apps/frontend/src/router/index.router.ts b/apps/frontend/src/router/index.router.ts new file mode 100644 index 0000000..412700f --- /dev/null +++ b/apps/frontend/src/router/index.router.ts @@ -0,0 +1,24 @@ +import { createRouter, createWebHistory } from 'vue-router' +import { homeRouter } from './home.router' +import { blogRouter } from './blog.router' +import { catalogRouter } from './catalog.router' +import { codeRouter } from './code.router' +import { contactRouter } from './contact.router' +import { howtosRouter } from './howtos.router' +import { teamRouter } from './team.router' + +export const router = createRouter({ + history: createWebHistory(), + routes: [ + ...homeRouter, + ...blogRouter, + ...catalogRouter, + ...codeRouter, + ...contactRouter, + ...howtosRouter, + ...teamRouter, + ], + scrollBehavior() { + return { top: 0 } + }, +}) diff --git a/apps/frontend/src/router/index.ts b/apps/frontend/src/router/index.ts deleted file mode 100644 index 5417731..0000000 --- a/apps/frontend/src/router/index.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { createRouter, createWebHistory } from 'vue-router' -import HomeView from '../views/HomeView.vue' - -export const router = createRouter({ - history: createWebHistory(), - routes: [ - { path: '/', component: HomeView }, - { path: '/blog', component: () => import('../views/BlogView.vue') }, - { path: '/blog/:slug(.*)', component: () => import('../views/BlogPostView.vue') }, - { path: '/catalog', component: () => import('../views/CatalogView.vue') }, - { path: '/catalog/:name', component: () => import('../views/CatalogItemView.vue') }, - { path: '/code', component: () => import('../views/CodeView.vue') }, - { path: '/contact', component: () => import('../views/ContactView.vue') }, - { path: '/howtos', component: () => import('../views/HowtosView.vue') }, - { path: '/team', component: () => import('../views/TeamView.vue') }, - ], - scrollBehavior() { - return { top: 0 } - } -}) diff --git a/apps/frontend/src/router/team.router.ts b/apps/frontend/src/router/team.router.ts new file mode 100644 index 0000000..7f09737 --- /dev/null +++ b/apps/frontend/src/router/team.router.ts @@ -0,0 +1,5 @@ +import type { RouteRecordRaw } from 'vue-router' + +export const teamRouter: RouteRecordRaw[] = [ + { path: '/team', name: 'teamIndex', component: () => import('../page/team/TeamIndexPage.vue') }, +] diff --git a/apps/frontend/src/utils/dateFormat.ts b/apps/frontend/src/utils/dateFormat.ts deleted file mode 100644 index c9ef195..0000000 --- a/apps/frontend/src/utils/dateFormat.ts +++ /dev/null @@ -1,22 +0,0 @@ -// Központi dátum formátum konfiguráció -// A formátum megváltoztatásához csak itt kell módosítani. -export const DATETIME_FORMAT = 'YYYY-MM-DD HH:mm'; -export const DATE_FORMAT = 'YYYY-MM-DD'; - -export function formatDateTime(dateStr: string | Date): string { - const d = new Date(dateStr as string); - const year = d.getFullYear(); - const month = String(d.getMonth() + 1).padStart(2, '0'); - const day = String(d.getDate()).padStart(2, '0'); - const hours = String(d.getHours()).padStart(2, '0'); - const minutes = String(d.getMinutes()).padStart(2, '0'); - return `${year}-${month}-${day} ${hours}:${minutes}`; -} - -export function formatDate(dateStr: string | Date): string { - const d = new Date(dateStr as string); - const year = d.getFullYear(); - const month = String(d.getMonth() + 1).padStart(2, '0'); - const day = String(d.getDate()).padStart(2, '0'); - return `${year}-${month}-${day}`; -}