From ab4d2bf9f50eb6ebfbfc23a3bc399dc1cb768d36 Mon Sep 17 00:00:00 2001 From: olli Date: Tue, 11 Nov 2025 16:25:54 +0100 Subject: [PATCH] feat: Implement Project Status Management - Added ProjectStatusManagement.vue for managing project statuses with CRUD operations. - Created migration scripts for projects and project_statuses tables. - Defined Project and ProjectStatus entities with necessary fields and relationships. - Implemented repositories for Project and ProjectStatus with custom query methods. - Enhanced API resource configurations for Project and ProjectStatus entities. --- assets/js/components/CrudDataTable.vue | 9 + assets/js/layout/AppMenu.vue | 4 +- assets/js/router.js | 4 + assets/js/views/ContactManagement.vue | 1 + assets/js/views/ProjectManagement.vue | 710 ++++++++++++++++++++ assets/js/views/ProjectStatusManagement.vue | 329 +++++++++ migrations/Version20251111133233.php | 33 + migrations/Version20251111142205.php | 37 + src/Controller/PermissionController.php | 2 +- src/Entity/Contact.php | 4 +- src/Entity/Project.php | 318 +++++++++ src/Entity/ProjectStatus.php | 199 ++++++ src/Repository/ProjectRepository.php | 57 ++ src/Repository/ProjectStatusRepository.php | 45 ++ 14 files changed, 1748 insertions(+), 4 deletions(-) create mode 100644 assets/js/views/ProjectManagement.vue create mode 100644 assets/js/views/ProjectStatusManagement.vue create mode 100644 migrations/Version20251111133233.php create mode 100644 migrations/Version20251111142205.php create mode 100644 src/Entity/Project.php create mode 100644 src/Entity/ProjectStatus.php create mode 100644 src/Repository/ProjectRepository.php create mode 100644 src/Repository/ProjectStatusRepository.php diff --git a/assets/js/components/CrudDataTable.vue b/assets/js/components/CrudDataTable.vue index 52cbf3f..22d6749 100644 --- a/assets/js/components/CrudDataTable.vue +++ b/assets/js/components/CrudDataTable.vue @@ -193,6 +193,10 @@ const props = defineProps({ type: String, default: '' }, + entityNameArticle: { + type: String, + default: '' + }, columns: { type: Array, required: true @@ -308,6 +312,11 @@ const exportItems = computed(() => [ // Computed create button label const createLabel = computed(() => { if (props.entityName) { + // If custom article is provided, use it + if (props.entityNameArticle) { + return `Neu${props.entityNameArticle === 'ein' ? 'es' : 'er'} ${props.entityName}` + } + // Fallback: Simple heuristic return `Neue${props.entityName.endsWith('e') ? 'r' : 'n'} ${props.entityName}` } return 'Neu' diff --git a/assets/js/layout/AppMenu.vue b/assets/js/layout/AppMenu.vue index 540bc10..8f4e812 100644 --- a/assets/js/layout/AppMenu.vue +++ b/assets/js/layout/AppMenu.vue @@ -13,13 +13,15 @@ const model = ref([ { label: 'CRM', items: [ - { label: 'Kontakte', icon: 'pi pi-fw pi-users', to: '/contacts' } + { label: 'Kontakte', icon: 'pi pi-fw pi-users', to: '/contacts' }, + { label: 'Projekte', icon: 'pi pi-fw pi-briefcase', to: '/projects' } ] }, { label: 'Administration', visible: () => authStore.isAdmin, items: [ + { label: 'Projekt-Status', icon: 'pi pi-fw pi-tag', to: '/project-statuses' }, { label: 'Benutzerverwaltung', icon: 'pi pi-fw pi-user-edit', to: '/users' }, { label: 'Rollenverwaltung', icon: 'pi pi-fw pi-shield', to: '/roles' }, { label: 'Einstellungen', icon: 'pi pi-fw pi-cog', to: '/settings' } diff --git a/assets/js/router.js b/assets/js/router.js index 8702bf4..b23b23f 100644 --- a/assets/js/router.js +++ b/assets/js/router.js @@ -1,6 +1,8 @@ import { createRouter, createWebHistory } from 'vue-router'; import Dashboard from './views/Dashboard.vue'; import ContactManagement from './views/ContactManagement.vue'; +import ProjectManagement from './views/ProjectManagement.vue'; +import ProjectStatusManagement from './views/ProjectStatusManagement.vue'; import UserManagement from './views/UserManagement.vue'; import RoleManagement from './views/RoleManagement.vue'; import SettingsManagement from './views/SettingsManagement.vue'; @@ -8,6 +10,8 @@ import SettingsManagement from './views/SettingsManagement.vue'; const routes = [ { path: '/', name: 'dashboard', component: Dashboard }, { path: '/contacts', name: 'contacts', component: ContactManagement }, + { path: '/projects', name: 'projects', component: ProjectManagement }, + { path: '/project-statuses', name: 'project-statuses', component: ProjectStatusManagement, meta: { requiresAdmin: true } }, { path: '/users', name: 'users', component: UserManagement, meta: { requiresAdmin: true } }, { path: '/roles', name: 'roles', component: RoleManagement, meta: { requiresAdmin: true } }, { path: '/settings', name: 'settings', component: SettingsManagement, meta: { requiresAdmin: true } }, diff --git a/assets/js/views/ContactManagement.vue b/assets/js/views/ContactManagement.vue index 2c1f278..89a33c8 100644 --- a/assets/js/views/ContactManagement.vue +++ b/assets/js/views/ContactManagement.vue @@ -4,6 +4,7 @@ ref="tableRef" title="Kontakte" entity-name="Kontakt" + entity-name-article="einen" :columns="contactColumns" data-source="/api/contacts" storage-key="contactTableColumns" diff --git a/assets/js/views/ProjectManagement.vue b/assets/js/views/ProjectManagement.vue new file mode 100644 index 0000000..1f7d3c0 --- /dev/null +++ b/assets/js/views/ProjectManagement.vue @@ -0,0 +1,710 @@ +