Compare commits

..

11 commits
v1.0.1 ... main

18 changed files with 2480 additions and 4092 deletions

View file

@ -8,7 +8,7 @@ Dieses Projekt, `ff-webpage-cms`, ist ein Content-Management-System (CMS) basier
Die Administrationsöberfläche ermöglicht die Verwaltung von Seiten und deren Inhalten wie Artikel, Termine, Einsätz oder Fahrzeuge. Seiten können auch über vordefinierte Schemata erstellt werden.
Eine Demo dieser Seite finden Sie unter [https://cms.ff-demo.jk-effects.cloud](https://cms.ff-demo.jk-effects.cloud).\
Eine Demo dieser Seite finden Sie unter [https://cms.webpage-demo.ff-admin.de](https://cms.webpage-demo.ff-admin.de).\
Die Zugangsdaten (Lesebeschränkt) sind: \
EMAIL: ff-demo@jk-effects.cloud\
PASSWORT: FFDemo1234\

6039
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,6 @@
{
"name": "webpage-cms",
"version": "1.0.1",
"version": "1.1.0",
"private": true,
"description": "A Strapi application",
"scripts": {
@ -12,11 +12,11 @@
},
"dependencies": {
"@offset-dev/strapi-calendar": "^1.0.0",
"@strapi/plugin-color-picker": "^5.1.1",
"@strapi/plugin-documentation": "^5.1.1",
"@strapi/plugin-graphql": "^5.1.1",
"@strapi/plugin-users-permissions": "5.1.1",
"@strapi/strapi": "5.1.1",
"@strapi/plugin-color-picker": "5.8.0",
"@strapi/plugin-documentation": "5.8.0",
"@strapi/plugin-graphql": "5.8.0",
"@strapi/plugin-users-permissions": "5.8.0",
"@strapi/strapi": "5.8.0",
"mysql2": "3.9.8",
"react": "^18.0.0",
"react-dom": "^18.0.0",

View file

@ -35,19 +35,25 @@
"image": {
"type": "media",
"multiple": false,
"allowedTypes": ["images"],
"required": false,
"allowedTypes": [
"images"
],
"pluginOptions": {}
},
"attachment": {
"type": "media",
"multiple": true,
"required": false,
"allowedTypes": ["images"],
"allowedTypes": [
"images"
],
"pluginOptions": {}
},
"date": {
"pluginOptions": {},
"type": "date"
"type": "date",
"required": true
}
}
}

View file

@ -18,9 +18,9 @@
"unique": true
},
"collection": {
"type": "string",
"required": true,
"unique": true
"type": "enumeration",
"enum": ["events", "vehicles", "articles", "operations"],
"required": true
},
"image_item": {
"type": "boolean",

View file

@ -35,19 +35,25 @@
"image": {
"type": "media",
"multiple": false,
"allowedTypes": ["images"],
"required": false,
"allowedTypes": [
"images"
],
"pluginOptions": {}
},
"attachment": {
"type": "media",
"multiple": true,
"required": false,
"allowedTypes": ["images"],
"allowedTypes": [
"images"
],
"pluginOptions": {}
},
"date": {
"pluginOptions": {},
"type": "date"
"type": "datetime",
"required": true
}
}
}

View file

@ -16,9 +16,12 @@
"type": "media",
"multiple": false,
"required": true,
"allowedTypes": [
"images"
]
"allowedTypes": ["images"]
},
"hide_backdrop": {
"type": "boolean",
"default": false,
"required": true
},
"content": {
"type": "dynamiczone",

View file

@ -35,19 +35,25 @@
"image": {
"type": "media",
"multiple": false,
"allowedTypes": ["images"],
"required": false,
"allowedTypes": [
"images"
],
"pluginOptions": {}
},
"attachment": {
"type": "media",
"multiple": true,
"required": false,
"allowedTypes": ["images"],
"allowedTypes": [
"images"
],
"pluginOptions": {}
},
"date": {
"pluginOptions": {},
"type": "date"
"type": "datetime",
"required": true
}
}
}

View file

@ -41,7 +41,9 @@
"dynamic-zone.emphasise-article",
"dynamic-zone.dual-column-text",
"dynamic-zone.column-image-text",
"shared.list"
"shared.list",
"dynamic-zone.file-download",
"dynamic-zone.embedding"
]
}
}

View file

@ -4,7 +4,8 @@
"info": {
"singularName": "vehicle",
"pluralName": "vehicles",
"displayName": "Fahrzeuge"
"displayName": "Fahrzeuge",
"description": ""
},
"options": {
"draftAndPublish": true
@ -34,19 +35,25 @@
"image": {
"type": "media",
"multiple": false,
"allowedTypes": ["images"],
"required": false,
"allowedTypes": [
"images"
],
"pluginOptions": {}
},
"attachment": {
"type": "media",
"multiple": true,
"required": false,
"allowedTypes": ["images"],
"allowedTypes": [
"images"
],
"pluginOptions": {}
},
"date": {
"pluginOptions": {},
"type": "date"
"type": "datetime",
"required": false
}
}
}

View file

@ -2,6 +2,27 @@
* vehicle controller
*/
import { factories } from '@strapi/strapi'
import { factories } from "@strapi/strapi";
export default factories.createCoreController('api::vehicle.vehicle');
export default factories.createCoreController("api::vehicle.vehicle", ({ strapi }) => ({
async distinctYears(ctx) {
try {
const years = await strapi.service("api::vehicle.vehicle").getDistinctYears();
ctx.body = years;
} catch (err) {
ctx.throw(500, err);
}
},
async findByYear(ctx) {
try {
const { year } = ctx.params;
const { page = "1", pageSize = "10" } = ctx.query as { page?: string; pageSize?: string };
const result = await strapi.service("api::vehicle.vehicle").findByYear(year, parseInt(page), parseInt(pageSize));
ctx.body = result;
} catch (err) {
ctx.throw(500, err);
}
},
}));

View file

@ -0,0 +1,14 @@
export default {
routes: [
{
method: "GET",
path: "/custom/vehicle/distinct-years",
handler: "api::vehicle.vehicle.distinctYears",
},
{
method: "GET",
path: "/custom/vehicle/year/:year",
handler: "api::vehicle.vehicle.findByYear",
},
],
};

View file

@ -2,6 +2,47 @@
* vehicle service
*/
import { factories } from '@strapi/strapi';
import { factories } from "@strapi/strapi";
import { parseISO, getYear } from "date-fns";
export default factories.createCoreService('api::vehicle.vehicle');
export default factories.createCoreService("api::vehicle.vehicle", ({ strapi }) => ({
async getDistinctYears() {
const articles = await strapi.query("api::vehicle.vehicle").findMany({
select: ["date"],
});
const years = articles
.map((article) => getYear(parseISO(article.date + "")))
.filter((year, index, self) => self.indexOf(year) === index)
.sort((a, b) => b - a);
return years;
},
async findByYear(year: string, page = 1, pageSize = 10) {
const startOfYear = new Date(`${year}-01-01T00:00:00.000Z`);
const endOfYear = new Date(`${year}-12-31T23:59:59.999Z`);
const articles = await strapi.query("api::vehicle.vehicle").findPage({
filters: {
date: {
$gte: startOfYear,
$lte: endOfYear,
},
publishedAt: {
$ne: null,
},
},
limit: pageSize,
page: page,
orderBy: { date: "desc" },
});
return {
data: articles.results,
meta: {
pagination: articles.pagination,
},
};
},
}));

View file

@ -0,0 +1,16 @@
{
"collectionName": "components_dynamic_zone_embedding",
"info": {
"displayName": "Einbettung"
},
"options": {},
"attributes": {
"title": {
"type": "string",
"required": true
},
"link": {
"type": "string"
}
}
}

View file

@ -0,0 +1,25 @@
{
"collectionName": "components_dynamic_zone_file_download",
"info": {
"displayName": "Datei-Download",
"description": ""
},
"options": {},
"attributes": {
"enable_download": {
"type": "boolean",
"default": true,
"required": true
},
"title": {
"type": "string",
"required": true
},
"file": {
"type": "media",
"multiple": false,
"required": true,
"allowedTypes": ["files", "images"]
}
}
}

View file

@ -14,7 +14,7 @@
"name": "Apache 2.0",
"url": "https://www.apache.org/licenses/LICENSE-2.0.html"
},
"x-generation-date": "2025-01-05T16:42:52.145Z"
"x-generation-date": "2025-01-18T10:42:17.897Z"
},
"x-strapi-config": {
"plugins": [
@ -5182,7 +5182,8 @@
"required": [
"title",
"description",
"slug"
"slug",
"date"
],
"type": "object",
"properties": {
@ -5286,7 +5287,8 @@
"required": [
"title",
"description",
"slug"
"slug",
"date"
],
"properties": {
"id": {
@ -6450,7 +6452,13 @@
"type": "string"
},
"collection": {
"type": "string"
"type": "string",
"enum": [
"events",
"vehicles",
"articles",
"operations"
]
},
"image_item": {
"type": "boolean"
@ -6541,7 +6549,13 @@
"type": "string"
},
"collection": {
"type": "string"
"type": "string",
"enum": [
"events",
"vehicles",
"articles",
"operations"
]
},
"image_item": {
"type": "boolean"
@ -6859,7 +6873,13 @@
"type": "string"
},
"collection": {
"type": "string"
"type": "string",
"enum": [
"events",
"vehicles",
"articles",
"operations"
]
},
"image_item": {
"type": "boolean"
@ -6950,7 +6970,8 @@
"required": [
"title",
"description",
"slug"
"slug",
"date"
],
"type": "object",
"properties": {
@ -6991,7 +7012,7 @@
},
"date": {
"type": "string",
"format": "date"
"format": "date-time"
},
"locale": {
"type": "string"
@ -7054,7 +7075,8 @@
"required": [
"title",
"description",
"slug"
"slug",
"date"
],
"properties": {
"id": {
@ -7805,7 +7827,7 @@
},
"date": {
"type": "string",
"format": "date"
"format": "date-time"
},
"createdAt": {
"type": "string",
@ -8128,7 +8150,7 @@
},
"date": {
"type": "string",
"format": "date"
"format": "date-time"
},
"createdAt": {
"type": "string",
@ -9353,6 +9375,175 @@
}
}
},
"DynamicZoneFileDownloadComponent": {
"type": "object",
"properties": {
"id": {
"type": "number"
},
"__component": {
"type": "string",
"enum": [
"dynamic-zone.file-download"
]
},
"enable_download": {
"type": "boolean"
},
"title": {
"type": "string"
},
"file": {
"type": "object",
"properties": {
"id": {
"type": "number"
},
"documentId": {
"type": "string"
},
"name": {
"type": "string"
},
"alternativeText": {
"type": "string"
},
"caption": {
"type": "string"
},
"width": {
"type": "integer"
},
"height": {
"type": "integer"
},
"formats": {},
"hash": {
"type": "string"
},
"ext": {
"type": "string"
},
"mime": {
"type": "string"
},
"size": {
"type": "number",
"format": "float"
},
"url": {
"type": "string"
},
"previewUrl": {
"type": "string"
},
"provider": {
"type": "string"
},
"provider_metadata": {},
"related": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "number"
},
"documentId": {
"type": "string"
}
}
}
},
"folder": {
"type": "object",
"properties": {
"id": {
"type": "number"
},
"documentId": {
"type": "string"
}
}
},
"folderPath": {
"type": "string"
},
"createdAt": {
"type": "string",
"format": "date-time"
},
"updatedAt": {
"type": "string",
"format": "date-time"
},
"publishedAt": {
"type": "string",
"format": "date-time"
},
"createdBy": {
"type": "object",
"properties": {
"id": {
"type": "number"
},
"documentId": {
"type": "string"
}
}
},
"updatedBy": {
"type": "object",
"properties": {
"id": {
"type": "number"
},
"documentId": {
"type": "string"
}
}
},
"locale": {
"type": "string"
},
"localizations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "number"
},
"documentId": {
"type": "string"
}
}
}
}
}
}
}
},
"DynamicZoneEmbeddingComponent": {
"type": "object",
"properties": {
"id": {
"type": "number"
},
"__component": {
"type": "string",
"enum": [
"dynamic-zone.embedding"
]
},
"title": {
"type": "string"
},
"link": {
"type": "string"
}
}
},
"HomepageRequest": {
"type": "object",
"required": [
@ -9361,7 +9552,8 @@
"properties": {
"data": {
"required": [
"backdrop"
"backdrop",
"hide_backdrop"
],
"type": "object",
"properties": {
@ -9376,6 +9568,9 @@
],
"example": "string or id"
},
"hide_backdrop": {
"type": "boolean"
},
"content": {
"type": "array",
"items": {
@ -9475,7 +9670,8 @@
"Homepage": {
"type": "object",
"required": [
"backdrop"
"backdrop",
"hide_backdrop"
],
"properties": {
"id": {
@ -10082,6 +10278,9 @@
}
}
},
"hide_backdrop": {
"type": "boolean"
},
"content": {
"type": "array",
"items": {
@ -10299,6 +10498,9 @@
}
}
},
"hide_backdrop": {
"type": "boolean"
},
"content": {
"type": "array",
"items": {
@ -10416,7 +10618,8 @@
"required": [
"title",
"description",
"slug"
"slug",
"date"
],
"type": "object",
"properties": {
@ -10457,7 +10660,7 @@
},
"date": {
"type": "string",
"format": "date"
"format": "date-time"
},
"locale": {
"type": "string"
@ -10520,7 +10723,8 @@
"required": [
"title",
"description",
"slug"
"slug",
"date"
],
"properties": {
"id": {
@ -11271,7 +11475,7 @@
},
"date": {
"type": "string",
"format": "date"
"format": "date-time"
},
"createdAt": {
"type": "string",
@ -11594,7 +11798,7 @@
},
"date": {
"type": "string",
"format": "date"
"format": "date-time"
},
"createdAt": {
"type": "string",
@ -11709,6 +11913,12 @@
},
{
"$ref": "#/components/schemas/SharedListComponent"
},
{
"$ref": "#/components/schemas/DynamicZoneFileDownloadComponent"
},
{
"$ref": "#/components/schemas/DynamicZoneEmbeddingComponent"
}
]
},
@ -11721,7 +11931,9 @@
"dynamic-zone.emphasise-article": "#/components/schemas/DynamicZoneEmphasiseArticleComponent",
"dynamic-zone.dual-column-text": "#/components/schemas/DynamicZoneDualColumnTextComponent",
"dynamic-zone.column-image-text": "#/components/schemas/DynamicZoneColumnImageTextComponent",
"shared.list": "#/components/schemas/SharedListComponent"
"shared.list": "#/components/schemas/SharedListComponent",
"dynamic-zone.file-download": "#/components/schemas/DynamicZoneFileDownloadComponent",
"dynamic-zone.embedding": "#/components/schemas/DynamicZoneEmbeddingComponent"
}
}
},
@ -11827,6 +12039,12 @@
},
{
"$ref": "#/components/schemas/SharedListComponent"
},
{
"$ref": "#/components/schemas/DynamicZoneFileDownloadComponent"
},
{
"$ref": "#/components/schemas/DynamicZoneEmbeddingComponent"
}
]
},
@ -11839,7 +12057,9 @@
"dynamic-zone.emphasise-article": "#/components/schemas/DynamicZoneEmphasiseArticleComponent",
"dynamic-zone.dual-column-text": "#/components/schemas/DynamicZoneDualColumnTextComponent",
"dynamic-zone.column-image-text": "#/components/schemas/DynamicZoneColumnImageTextComponent",
"shared.list": "#/components/schemas/SharedListComponent"
"shared.list": "#/components/schemas/SharedListComponent",
"dynamic-zone.file-download": "#/components/schemas/DynamicZoneFileDownloadComponent",
"dynamic-zone.embedding": "#/components/schemas/DynamicZoneEmbeddingComponent"
}
}
},
@ -11924,6 +12144,12 @@
},
{
"$ref": "#/components/schemas/SharedListComponent"
},
{
"$ref": "#/components/schemas/DynamicZoneFileDownloadComponent"
},
{
"$ref": "#/components/schemas/DynamicZoneEmbeddingComponent"
}
]
},
@ -11936,7 +12162,9 @@
"dynamic-zone.emphasise-article": "#/components/schemas/DynamicZoneEmphasiseArticleComponent",
"dynamic-zone.dual-column-text": "#/components/schemas/DynamicZoneDualColumnTextComponent",
"dynamic-zone.column-image-text": "#/components/schemas/DynamicZoneColumnImageTextComponent",
"shared.list": "#/components/schemas/SharedListComponent"
"shared.list": "#/components/schemas/SharedListComponent",
"dynamic-zone.file-download": "#/components/schemas/DynamicZoneFileDownloadComponent",
"dynamic-zone.embedding": "#/components/schemas/DynamicZoneEmbeddingComponent"
}
}
},
@ -12058,7 +12286,7 @@
},
"date": {
"type": "string",
"format": "date"
"format": "date-time"
},
"locale": {
"type": "string"
@ -12872,7 +13100,7 @@
},
"date": {
"type": "string",
"format": "date"
"format": "date-time"
},
"createdAt": {
"type": "string",
@ -13195,7 +13423,7 @@
},
"date": {
"type": "string",
"format": "date"
"format": "date-time"
},
"createdAt": {
"type": "string",

View file

@ -26,6 +26,17 @@ export interface DynamicZoneDualColumnText extends Struct.ComponentSchema {
};
}
export interface DynamicZoneEmbedding extends Struct.ComponentSchema {
collectionName: "components_dynamic_zone_embedding";
info: {
displayName: "Einbettung";
};
attributes: {
link: Schema.Attribute.String;
title: Schema.Attribute.String & Schema.Attribute.Required;
};
}
export interface DynamicZoneEmphasiseArticle extends Struct.ComponentSchema {
collectionName: "components_dynamic_zone_emphasise_articles";
info: {
@ -41,6 +52,19 @@ export interface DynamicZoneEmphasiseArticle extends Struct.ComponentSchema {
};
}
export interface DynamicZoneFileDownload extends Struct.ComponentSchema {
collectionName: "components_dynamic_zone_file_download";
info: {
description: "";
displayName: "Datei-Download";
};
attributes: {
enable_download: Schema.Attribute.Boolean & Schema.Attribute.Required & Schema.Attribute.DefaultTo<true>;
file: Schema.Attribute.Media<"files" | "images"> & Schema.Attribute.Required;
title: Schema.Attribute.String & Schema.Attribute.Required;
};
}
export interface DynamicZoneFullImage extends Struct.ComponentSchema {
collectionName: "components_dynamic_zone_full_images";
info: {
@ -203,7 +227,9 @@ declare module "@strapi/strapi" {
export interface ComponentSchemas {
"dynamic-zone.column-image-text": DynamicZoneColumnImageText;
"dynamic-zone.dual-column-text": DynamicZoneDualColumnText;
"dynamic-zone.embedding": DynamicZoneEmbedding;
"dynamic-zone.emphasise-article": DynamicZoneEmphasiseArticle;
"dynamic-zone.file-download": DynamicZoneFileDownload;
"dynamic-zone.full-image": DynamicZoneFullImage;
"dynamic-zone.full-text": DynamicZoneFullText;
"dynamic-zone.gallery": DynamicZoneGallery;

View file

@ -344,7 +344,7 @@ export interface ApiArticleArticle extends Struct.CollectionTypeSchema {
content: Schema.Attribute.Blocks;
createdAt: Schema.Attribute.DateTime;
createdBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & Schema.Attribute.Private;
date: Schema.Attribute.Date;
date: Schema.Attribute.Date & Schema.Attribute.Required;
description: Schema.Attribute.String & Schema.Attribute.Required;
image: Schema.Attribute.Media<"images">;
locale: Schema.Attribute.String & Schema.Attribute.Private;
@ -369,7 +369,8 @@ export interface ApiCollectionLookupCollectionLookup extends Struct.CollectionTy
draftAndPublish: true;
};
attributes: {
collection: Schema.Attribute.String & Schema.Attribute.Required & Schema.Attribute.Unique;
collection: Schema.Attribute.Enumeration<["events", "vehicles", "articles", "operations"]> &
Schema.Attribute.Required;
createdAt: Schema.Attribute.DateTime;
createdBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & Schema.Attribute.Private;
date_list: Schema.Attribute.Boolean & Schema.Attribute.Required & Schema.Attribute.DefaultTo<false>;
@ -402,7 +403,7 @@ export interface ApiEventEvent extends Struct.CollectionTypeSchema {
content: Schema.Attribute.Blocks;
createdAt: Schema.Attribute.DateTime;
createdBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & Schema.Attribute.Private;
date: Schema.Attribute.Date;
date: Schema.Attribute.DateTime & Schema.Attribute.Required;
description: Schema.Attribute.String & Schema.Attribute.Required;
image: Schema.Attribute.Media<"images">;
locale: Schema.Attribute.String & Schema.Attribute.Private;
@ -466,6 +467,7 @@ export interface ApiHomepageHomepage extends Struct.SingleTypeSchema {
>;
createdAt: Schema.Attribute.DateTime;
createdBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & Schema.Attribute.Private;
hide_backdrop: Schema.Attribute.Boolean & Schema.Attribute.Required & Schema.Attribute.DefaultTo<false>;
locale: Schema.Attribute.String & Schema.Attribute.Private;
localizations: Schema.Attribute.Relation<"oneToMany", "api::homepage.homepage"> & Schema.Attribute.Private;
publishedAt: Schema.Attribute.DateTime;
@ -490,7 +492,7 @@ export interface ApiOperationOperation extends Struct.CollectionTypeSchema {
content: Schema.Attribute.Blocks;
createdAt: Schema.Attribute.DateTime;
createdBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & Schema.Attribute.Private;
date: Schema.Attribute.Date;
date: Schema.Attribute.DateTime & Schema.Attribute.Required;
description: Schema.Attribute.String & Schema.Attribute.Required;
image: Schema.Attribute.Media<"images">;
locale: Schema.Attribute.String & Schema.Attribute.Private;
@ -524,6 +526,8 @@ export interface ApiPagePage extends Struct.CollectionTypeSchema {
"dynamic-zone.dual-column-text",
"dynamic-zone.column-image-text",
"shared.list",
"dynamic-zone.file-download",
"dynamic-zone.embedding",
]
>;
createdAt: Schema.Attribute.DateTime;
@ -542,6 +546,7 @@ export interface ApiPagePage extends Struct.CollectionTypeSchema {
export interface ApiVehicleVehicle extends Struct.CollectionTypeSchema {
collectionName: "vehicles";
info: {
description: "";
displayName: "Fahrzeuge";
pluralName: "vehicles";
singularName: "vehicle";
@ -554,7 +559,7 @@ export interface ApiVehicleVehicle extends Struct.CollectionTypeSchema {
content: Schema.Attribute.Blocks;
createdAt: Schema.Attribute.DateTime;
createdBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & Schema.Attribute.Private;
date: Schema.Attribute.Date;
date: Schema.Attribute.DateTime;
description: Schema.Attribute.String & Schema.Attribute.Required;
image: Schema.Attribute.Media<"images">;
locale: Schema.Attribute.String & Schema.Attribute.Private;
@ -707,6 +712,7 @@ export interface PluginReviewWorkflowsWorkflow extends Struct.CollectionTypeSche
Schema.Attribute.Private;
name: Schema.Attribute.String & Schema.Attribute.Required & Schema.Attribute.Unique;
publishedAt: Schema.Attribute.DateTime;
stageRequiredToPublish: Schema.Attribute.Relation<"oneToOne", "plugin::review-workflows.workflow-stage">;
stages: Schema.Attribute.Relation<"oneToMany", "plugin::review-workflows.workflow-stage">;
updatedAt: Schema.Attribute.DateTime;
updatedBy: Schema.Attribute.Relation<"oneToOne", "admin::user"> & Schema.Attribute.Private;