Compare commits

..

No commits in common. "main" and "v1.0.0" have entirely different histories.
main ... v1.0.0

20 changed files with 5375 additions and 4690 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. 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.webpage-demo.ff-admin.de](https://cms.webpage-demo.ff-admin.de).\ Eine Demo dieser Seite finden Sie unter [https://cms.ff-demo.jk-effects.cloud](https://cms.ff-demo.jk-effects.cloud).\
Die Zugangsdaten (Lesebeschränkt) sind: \ Die Zugangsdaten (Lesebeschränkt) sind: \
EMAIL: ff-demo@jk-effects.cloud\ EMAIL: ff-demo@jk-effects.cloud\
PASSWORT: FFDemo1234\ PASSWORT: FFDemo1234\

6061
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

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

View file

@ -35,7 +35,7 @@
"image": { "image": {
"type": "media", "type": "media",
"multiple": false, "multiple": false,
"required": false, "required": true,
"allowedTypes": [ "allowedTypes": [
"images" "images"
], ],

View file

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

View file

@ -28,28 +28,6 @@
"targetField": "title", "targetField": "title",
"required": true "required": true
}, },
"content": {
"pluginOptions": {},
"type": "blocks"
},
"image": {
"type": "media",
"multiple": false,
"required": false,
"allowedTypes": [
"images"
],
"pluginOptions": {}
},
"attachment": {
"type": "media",
"multiple": true,
"required": false,
"allowedTypes": [
"images"
],
"pluginOptions": {}
},
"date": { "date": {
"pluginOptions": {}, "pluginOptions": {},
"type": "datetime", "type": "datetime",

View file

@ -24,11 +24,6 @@
"repeatable": false, "repeatable": false,
"pluginOptions": {}, "pluginOptions": {},
"component": "global.footer" "component": "global.footer"
},
"SEO": {
"type": "component",
"repeatable": false,
"component": "shared.seo"
} }
} }
} }

View file

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

View file

@ -28,19 +28,6 @@
"targetField": "title", "targetField": "title",
"required": true "required": true
}, },
"content": {
"pluginOptions": {},
"type": "blocks"
},
"image": {
"type": "media",
"multiple": false,
"required": false,
"allowedTypes": [
"images"
],
"pluginOptions": {}
},
"attachment": { "attachment": {
"type": "media", "type": "media",
"multiple": true, "multiple": true,
@ -54,6 +41,9 @@
"pluginOptions": {}, "pluginOptions": {},
"type": "datetime", "type": "datetime",
"required": true "required": true
},
"content": {
"type": "blocks"
} }
} }
} }

View file

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

View file

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

View file

@ -2,27 +2,6 @@
* vehicle controller * vehicle controller
*/ */
import { factories } from "@strapi/strapi"; import { factories } from '@strapi/strapi'
export default factories.createCoreController("api::vehicle.vehicle", ({ strapi }) => ({ export default factories.createCoreController('api::vehicle.vehicle');
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

@ -1,14 +0,0 @@
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,47 +2,6 @@
* vehicle service * 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", ({ strapi }) => ({ export default factories.createCoreService('api::vehicle.vehicle');
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

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

View file

@ -1,25 +0,0 @@
{
"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

@ -1,25 +0,0 @@
{
"collectionName": "components_shared_seos",
"info": {
"displayName": "seo",
"icon": "search",
"description": ""
},
"options": {},
"attributes": {
"metaTitle": {
"required": true,
"type": "string",
"maxLength": 60
},
"metaDescription": {
"type": "string",
"required": true,
"minLength": 50
},
"keywords": {
"type": "text",
"regex": "[^,]+"
}
}
}

View file

@ -1,24 +1,26 @@
import type { Schema, Struct } from "@strapi/strapi"; import type { Schema, Struct } from '@strapi/strapi';
export interface DynamicZoneColumnImageText extends Struct.ComponentSchema { export interface DynamicZoneColumnImageText extends Struct.ComponentSchema {
collectionName: "components_dynamic_zone_column_image_texts"; collectionName: 'components_dynamic_zone_column_image_texts';
info: { info: {
description: ""; description: '';
displayName: "Text-Bild-Spalte"; displayName: 'Text-Bild-Spalte';
icon: "bulletList"; icon: 'bulletList';
}; };
attributes: { attributes: {
image: Schema.Attribute.Media<"images"> & Schema.Attribute.Required; image: Schema.Attribute.Media<'images'> & Schema.Attribute.Required;
image_left: Schema.Attribute.Boolean & Schema.Attribute.Required & Schema.Attribute.DefaultTo<true>; image_left: Schema.Attribute.Boolean &
Schema.Attribute.Required &
Schema.Attribute.DefaultTo<true>;
text: Schema.Attribute.Blocks & Schema.Attribute.Required; text: Schema.Attribute.Blocks & Schema.Attribute.Required;
}; };
} }
export interface DynamicZoneDualColumnText extends Struct.ComponentSchema { export interface DynamicZoneDualColumnText extends Struct.ComponentSchema {
collectionName: "components_dynamic_zone_dual_column_texts"; collectionName: 'components_dynamic_zone_dual_column_texts';
info: { info: {
displayName: "Text-Text-Spalte"; displayName: 'Text-Text-Spalte';
icon: "stack"; icon: 'stack';
}; };
attributes: { attributes: {
left_side: Schema.Attribute.Blocks & Schema.Attribute.Required; left_side: Schema.Attribute.Blocks & Schema.Attribute.Required;
@ -26,63 +28,41 @@ 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 { export interface DynamicZoneEmphasiseArticle extends Struct.ComponentSchema {
collectionName: "components_dynamic_zone_emphasise_articles"; collectionName: 'components_dynamic_zone_emphasise_articles';
info: { info: {
description: ""; description: '';
displayName: "Artikel hervorheben"; displayName: 'Artikel hervorheben';
icon: "dashboard"; icon: 'dashboard';
}; };
attributes: { attributes: {
articles: Schema.Attribute.Relation<"oneToMany", "api::article.article">; articles: Schema.Attribute.Relation<'oneToMany', 'api::article.article'>;
base_url: Schema.Attribute.String & Schema.Attribute.Required & Schema.Attribute.DefaultTo<"/artikel">; base_url: Schema.Attribute.String &
Schema.Attribute.Required &
Schema.Attribute.DefaultTo<'/artikel'>;
description: Schema.Attribute.Text; description: Schema.Attribute.Text;
titel: Schema.Attribute.String & Schema.Attribute.Required; titel: Schema.Attribute.String & Schema.Attribute.Required;
}; };
} }
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 { export interface DynamicZoneFullImage extends Struct.ComponentSchema {
collectionName: "components_dynamic_zone_full_images"; collectionName: 'components_dynamic_zone_full_images';
info: { info: {
description: ""; description: '';
displayName: "Voll-Bild"; displayName: 'Voll-Bild';
icon: "dashboard"; icon: 'dashboard';
}; };
attributes: { attributes: {
image: Schema.Attribute.Media<"images"> & Schema.Attribute.Required; image: Schema.Attribute.Media<'images'> & Schema.Attribute.Required;
}; };
} }
export interface DynamicZoneFullText extends Struct.ComponentSchema { export interface DynamicZoneFullText extends Struct.ComponentSchema {
collectionName: "components_dynamic_zone_full_texts"; collectionName: 'components_dynamic_zone_full_texts';
info: { info: {
description: ""; description: '';
displayName: "Voll-Text"; displayName: 'Voll-Text';
icon: "dashboard"; icon: 'dashboard';
}; };
attributes: { attributes: {
text: Schema.Attribute.Blocks & Schema.Attribute.Required; text: Schema.Attribute.Blocks & Schema.Attribute.Required;
@ -90,157 +70,142 @@ export interface DynamicZoneFullText extends Struct.ComponentSchema {
} }
export interface DynamicZoneGallery extends Struct.ComponentSchema { export interface DynamicZoneGallery extends Struct.ComponentSchema {
collectionName: "components_dynamic_zone_galleries"; collectionName: 'components_dynamic_zone_galleries';
info: { info: {
description: ""; description: '';
displayName: "Galerie"; displayName: 'Galerie';
icon: "apps"; icon: 'apps';
}; };
attributes: { attributes: {
images: Schema.Attribute.Media<"images", true> & Schema.Attribute.Required; images: Schema.Attribute.Media<'images', true> & Schema.Attribute.Required;
}; };
} }
export interface GlobalFooter extends Struct.ComponentSchema { export interface GlobalFooter extends Struct.ComponentSchema {
collectionName: "components_global_footers"; collectionName: 'components_global_footers';
info: { info: {
description: ""; description: '';
displayName: "Fu\u00DFzeile"; displayName: 'Fu\u00DFzeile';
icon: "apps"; icon: 'apps';
}; };
attributes: { attributes: {
copyright: Schema.Attribute.String; copyright: Schema.Attribute.String;
designed_developed_by: Schema.Attribute.String; designed_developed_by: Schema.Attribute.String;
links: Schema.Attribute.Component<"shared.link", true>; links: Schema.Attribute.Component<'shared.link', true>;
}; };
} }
export interface GlobalNavbar extends Struct.ComponentSchema { export interface GlobalNavbar extends Struct.ComponentSchema {
collectionName: "components_global_navbars"; collectionName: 'components_global_navbars';
info: { info: {
description: ""; description: '';
displayName: "Navigationsleiste"; displayName: 'Navigationsleiste';
icon: "bold"; icon: 'bold';
}; };
attributes: { attributes: {
logo: Schema.Attribute.Media<"images"> & Schema.Attribute.Required; logo: Schema.Attribute.Media<'images'> & Schema.Attribute.Required;
navbar_items: Schema.Attribute.Component<"items.navbar-items", true>; navbar_items: Schema.Attribute.Component<'items.navbar-items', true>;
}; };
} }
export interface ItemsNavbarItems extends Struct.ComponentSchema { export interface ItemsNavbarItems extends Struct.ComponentSchema {
collectionName: "components_items_left_navbar_items"; collectionName: 'components_items_left_navbar_items';
info: { info: {
description: ""; description: '';
displayName: "Navigations-\u00DCberpunkt"; displayName: 'Navigations-\u00DCberpunkt';
icon: "bulletList"; icon: 'bulletList';
}; };
attributes: { attributes: {
default_active_child: Schema.Attribute.String; default_active_child: Schema.Attribute.String;
name: Schema.Attribute.String; name: Schema.Attribute.String;
navbar_sub_items: Schema.Attribute.Component<"items.navbar-sub-items", true>; navbar_sub_items: Schema.Attribute.Component<
page: Schema.Attribute.Relation<"oneToOne", "api::page.page">; 'items.navbar-sub-items',
true
>;
page: Schema.Attribute.Relation<'oneToOne', 'api::page.page'>;
URL: Schema.Attribute.String; URL: Schema.Attribute.String;
}; };
} }
export interface ItemsNavbarSubItems extends Struct.ComponentSchema { export interface ItemsNavbarSubItems extends Struct.ComponentSchema {
collectionName: "components_items_navbar_sub_items"; collectionName: 'components_items_navbar_sub_items';
info: { info: {
description: ""; description: '';
displayName: "Navigations-Unterpunkt"; displayName: 'Navigations-Unterpunkt';
icon: "bulletList"; icon: 'bulletList';
}; };
attributes: { attributes: {
name: Schema.Attribute.String & Schema.Attribute.Required; name: Schema.Attribute.String & Schema.Attribute.Required;
page: Schema.Attribute.Relation<"oneToOne", "api::page.page">; page: Schema.Attribute.Relation<'oneToOne', 'api::page.page'>;
URL: Schema.Attribute.String & Schema.Attribute.Required; URL: Schema.Attribute.String & Schema.Attribute.Required;
}; };
} }
export interface SharedHero extends Struct.ComponentSchema { export interface SharedHero extends Struct.ComponentSchema {
collectionName: "components_shared_heroes"; collectionName: 'components_shared_heroes';
info: { info: {
description: ""; description: '';
displayName: "hero"; displayName: 'hero';
icon: "rocket"; icon: 'rocket';
}; };
attributes: { attributes: {
banner: Schema.Attribute.Media<"images"> & Schema.Attribute.Required; banner: Schema.Attribute.Media<'images'> & Schema.Attribute.Required;
title: Schema.Attribute.String & Schema.Attribute.Required; title: Schema.Attribute.String & Schema.Attribute.Required;
}; };
} }
export interface SharedLink extends Struct.ComponentSchema { export interface SharedLink extends Struct.ComponentSchema {
collectionName: "components_shared_links"; collectionName: 'components_shared_links';
info: { info: {
description: ""; description: '';
displayName: "Link"; displayName: 'Link';
icon: "link"; icon: 'link';
}; };
attributes: { attributes: {
target: Schema.Attribute.Enumeration<["_blank", "_self", "_parent", "_top"]> & target: Schema.Attribute.Enumeration<
['_blank', '_self', '_parent', '_top']
> &
Schema.Attribute.Required & Schema.Attribute.Required &
Schema.Attribute.DefaultTo<"_self">; Schema.Attribute.DefaultTo<'_self'>;
text: Schema.Attribute.String & Schema.Attribute.Required; text: Schema.Attribute.String & Schema.Attribute.Required;
URL: Schema.Attribute.String & Schema.Attribute.Required; URL: Schema.Attribute.String & Schema.Attribute.Required;
}; };
} }
export interface SharedList extends Struct.ComponentSchema { export interface SharedList extends Struct.ComponentSchema {
collectionName: "components_shared_lists"; collectionName: 'components_shared_lists';
info: { info: {
description: ""; description: '';
displayName: "Inhaltsauswahl"; displayName: 'Inhaltsauswahl';
icon: "apps"; icon: 'apps';
}; };
attributes: { attributes: {
enable_detail: Schema.Attribute.Boolean & Schema.Attribute.Required & Schema.Attribute.DefaultTo<false>; enable_detail: Schema.Attribute.Boolean &
lookup: Schema.Attribute.Relation<"oneToOne", "api::collection-lookup.collection-lookup">; Schema.Attribute.Required &
Schema.Attribute.DefaultTo<false>;
lookup: Schema.Attribute.Relation<
'oneToOne',
'api::collection-lookup.collection-lookup'
>;
}; };
} }
export interface SharedSeo extends Struct.ComponentSchema { declare module '@strapi/strapi' {
collectionName: "components_shared_seos";
info: {
description: "";
displayName: "seo";
icon: "search";
};
attributes: {
keywords: Schema.Attribute.Text;
metaDescription: Schema.Attribute.String &
Schema.Attribute.Required &
Schema.Attribute.SetMinMaxLength<{
minLength: 50;
}>;
metaTitle: Schema.Attribute.String &
Schema.Attribute.Required &
Schema.Attribute.SetMinMaxLength<{
maxLength: 60;
}>;
};
}
declare module "@strapi/strapi" {
export module Public { export module Public {
export interface ComponentSchemas { export interface ComponentSchemas {
"dynamic-zone.column-image-text": DynamicZoneColumnImageText; 'dynamic-zone.column-image-text': DynamicZoneColumnImageText;
"dynamic-zone.dual-column-text": DynamicZoneDualColumnText; 'dynamic-zone.dual-column-text': DynamicZoneDualColumnText;
"dynamic-zone.embedding": DynamicZoneEmbedding; 'dynamic-zone.emphasise-article': DynamicZoneEmphasiseArticle;
"dynamic-zone.emphasise-article": DynamicZoneEmphasiseArticle; 'dynamic-zone.full-image': DynamicZoneFullImage;
"dynamic-zone.file-download": DynamicZoneFileDownload; 'dynamic-zone.full-text': DynamicZoneFullText;
"dynamic-zone.full-image": DynamicZoneFullImage; 'dynamic-zone.gallery': DynamicZoneGallery;
"dynamic-zone.full-text": DynamicZoneFullText; 'global.footer': GlobalFooter;
"dynamic-zone.gallery": DynamicZoneGallery; 'global.navbar': GlobalNavbar;
"global.footer": GlobalFooter; 'items.navbar-items': ItemsNavbarItems;
"global.navbar": GlobalNavbar; 'items.navbar-sub-items': ItemsNavbarSubItems;
"items.navbar-items": ItemsNavbarItems; 'shared.hero': SharedHero;
"items.navbar-sub-items": ItemsNavbarSubItems; 'shared.link': SharedLink;
"shared.hero": SharedHero; 'shared.list': SharedList;
"shared.link": SharedLink;
"shared.list": SharedList;
"shared.seo": SharedSeo;
} }
} }
} }

File diff suppressed because it is too large Load diff