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);
+---
+
+
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
},