diff --git a/astro/src/components/web/LastProjects.astro b/astro/src/components/web/LastProjects.astro new file mode 100644 index 0000000..6977253 --- /dev/null +++ b/astro/src/components/web/LastProjects.astro @@ -0,0 +1,64 @@ +--- +import { getLastProjects } from '@/content/projects/projects'; +import { getSettings } from '@/content/settings/settings'; +import CalendarIcon from '@/icons/CalendarIcon.astro'; +import { getImageUrl } from '@/lib/images'; +import { getProjectRoute } from '@/lib/routing'; +import { Image } from 'astro:assets'; + +interface Props { + projects: LastProjectsComponent; +} + +function calculateSizeClasses(amount: number, length: number) { + if (amount === 2 || length <= 2) { + return "lg:w-[45%] w-full"; + } + else { + return "lg:w-[31%] w-full"; + } +} + +const projects = Astro.props.projects; +const settings = await getSettings(); +const lastProjects = await getLastProjects(projects.amount); +const size = calculateSizeClasses(projects.amount, lastProjects.length); + +console.log(lastProjects[0].searchEngine); +--- + +
+
+

{projects.title}

+
+ + {projects.readMoreButtonText} + +
+
+ +
+ { lastProjects.map((project) => ( + + {project.title} +

{project.title}

+
+ +
{project.date}
+
+
+ )) } +
+
diff --git a/astro/src/components/webpage/Webpage.astro b/astro/src/components/webpage/Webpage.astro index 4900ee9..dcdc7c4 100644 --- a/astro/src/components/webpage/Webpage.astro +++ b/astro/src/components/webpage/Webpage.astro @@ -7,6 +7,7 @@ import WallOfText from '../web/WallOfText.astro'; import EquipmentTable from '../web/EquipmentTable.astro'; import Reviews from '../web/Reviews.astro'; import LastBlogs from '../web/LastBlogs.astro'; +import LastProjects from '../web/LastProjects.astro'; interface Props { webpage: WebpageComponent[]; @@ -28,6 +29,7 @@ console.log(Astro.props.webpage); { component.component === "EquipmentTable" && } { component.component === "Reviews" && } { component.component === "LastBlogs" && } + { component.component === "LastProjects" && } )) } diff --git a/astro/src/content/projects/projects.ts b/astro/src/content/projects/projects.ts index 24136fa..6c8815c 100644 --- a/astro/src/content/projects/projects.ts +++ b/astro/src/content/projects/projects.ts @@ -3,6 +3,7 @@ import { createDirectusConnection } from "@/lib/directus"; import { print } from "graphql"; import getProjects from '@/graphql/projects/getProjects.graphql'; import getProjectPost from '@/graphql/projects/getProject.graphql'; +import getLastProjectsQuery from '@/graphql/projects/getLastProjects.graphql'; export async function getAllProjects(settings: GlobalSettings): Promise { const client = await createDirectusConnection(); @@ -24,9 +25,8 @@ export async function getAllProjects(settings: GlobalSettings): Promise { +const client = await createDirectusConnection(); + const result = await client.query(print(getLastProjectsQuery), { + date: formatDate(new Date(), "%Y-%M-%D"), + amount: amount + }); + + let projects: ProjectPost[] = []; + + result["Projects"].forEach((projectRecord: any) => { + let dates: string[] = [ + projectRecord["date_created"], + projectRecord["date_updated"], + projectRecord["search_engine"][0]["date_created"], + projectRecord["search_engine"][0]["date_updated"], + projectRecord["search_engine"][0]["thumbnail"]["created_on"] + ]; + + const project: ProjectPost = { + exists: true, + type: "ProjectPost", + lastModified: new Date(), + title: projectRecord["title"], + content: projectRecord["content"], + date: projectRecord["date"], + url: projectRecord["url"], + searchEngine: { + title: projectRecord["search_engine"][0]["title"], + description: projectRecord["search_engine"][0]["description"], + allowCrawlers: projectRecord["search_engine"][0]["allow_crawler"], + canonical: projectRecord["search_engine"][0]["canonical"], + priority: projectRecord["search_engine"][0]["priority"], + thumbnail: { + url: projectRecord["search_engine"][0]["thumbnail"]["filename_disk"], + height: projectRecord["search_engine"][0]["thumbnail"]["height"], + width: projectRecord["search_engine"][0]["thumbnail"]["width"] + } + }, + tags: [] + }; + + projectRecord["tags"].forEach((tagRecord: any) => { + project["tags"].push({ + text: tagRecord["Tags_id"]["text"], + code: tagRecord["Tags_id"]["code"], + color: tagRecord["Tags_id"]["color"] + }); + + dates.push(tagRecord["Tags_id"]["date_created"]); + dates.push(tagRecord["Tags_id"]["date_updated"]); + }); + + if (dates.filter(e => e !== null).length === 0) { + project.lastModified = new Date(); + } + else { + const sortedDates: string[] = dates.sort((a: string, b: string) => { + return new Date(b).getTime() - new Date(a).getTime(); + }); + + project.lastModified = new Date(sortedDates[0]); + } + + projects.push(project); + }); + + return projects; +} diff --git a/astro/src/graphql/projects/getLastProjects.graphql b/astro/src/graphql/projects/getLastProjects.graphql new file mode 100644 index 0000000..fca621a --- /dev/null +++ b/astro/src/graphql/projects/getLastProjects.graphql @@ -0,0 +1,39 @@ +query getLastProjects($date: String!, $amount: Int!) { + Projects(sort: ["-date", "-date_created"], filter: { status: { _eq: "published" }, date: { _lte: $date } }, limit: $amount) { + id, + date_created, + date_updated, + status, + title, + url, + date, + content, + tags { + Tags_id { + id, + date_created, + date_updated, + text, + code, + color + } + }, + search_engine { + id, + date_created, + date_updated, + title, + description, + thumbnail { + id, + created_on, + filename_disk, + width, + height + }, + canonical, + allow_crawler, + priority + } + } +} diff --git a/astro/src/graphql/projects/getProjects.graphql b/astro/src/graphql/projects/getProjects.graphql index 9adfbe0..292a303 100644 --- a/astro/src/graphql/projects/getProjects.graphql +++ b/astro/src/graphql/projects/getProjects.graphql @@ -27,7 +27,7 @@ query getAllProjects($date: String!) { thumbnail { id, created_on, - filename_download, + filename_disk, width, height },