208 lines
12 KiB
TypeScript
208 lines
12 KiB
TypeScript
import { GenericPageData } from '../../pageInterface';
|
|
import { FaTable, FaPlus } from 'react-icons/fa';
|
|
import { createProjectsTableHook, createParzellenTableHook } from '../../../../hooks/usePekTables';
|
|
import { getUserDataCache } from '../../../../utils/userCache';
|
|
|
|
export const pekTablesPageData: GenericPageData = {
|
|
id: 'pek-tables',
|
|
path: 'start/real-estate/pek-tables',
|
|
name: 'Projektmanagement',
|
|
description: 'Projektmanagement mit Tabellen',
|
|
|
|
// Parent page
|
|
parentPath: 'start.real-estate',
|
|
|
|
// Visual
|
|
icon: FaTable,
|
|
title: 'Projektmanagement',
|
|
subtitle: 'Datenverwaltung',
|
|
|
|
// Header buttons
|
|
headerButtons: [
|
|
{
|
|
id: 'create-project',
|
|
label: 'Neues Projekt',
|
|
variant: 'primary',
|
|
size: 'lg',
|
|
icon: FaPlus,
|
|
formConfig: {
|
|
fields: [], // Will be generated from attributes via generateEditFieldsFromAttributes
|
|
popupTitle: 'Neues Projekt erstellen',
|
|
popupSize: 'large',
|
|
createOperationName: 'handleProjectCreate',
|
|
multiStep: true // Enable multi-step form with Step 1 (label) and Step 2 (parcel selection)
|
|
},
|
|
disabled: (hookData: any) => {
|
|
if (!hookData?.permissions) return { disabled: false };
|
|
const hasCreate = hookData.permissions.create !== 'n' && hookData.permissions.view;
|
|
return { disabled: !hasCreate, message: 'No permission to create projects' };
|
|
}
|
|
}
|
|
],
|
|
|
|
// Content sections
|
|
content: [
|
|
{
|
|
id: 'projektmanagement-layout',
|
|
type: 'columns',
|
|
columnsConfig: {
|
|
columns: [
|
|
{
|
|
id: 'main-column',
|
|
width: '3fr',
|
|
content: [
|
|
{
|
|
id: 'tables-tabs',
|
|
type: 'tabs',
|
|
tabsConfig: {
|
|
tabs: [
|
|
{
|
|
id: 'projects',
|
|
label: 'Projekte',
|
|
content: [
|
|
{
|
|
id: 'projects-table',
|
|
type: 'table',
|
|
tableConfig: {
|
|
hookFactory: createProjectsTableHook,
|
|
searchable: true,
|
|
filterable: true,
|
|
sortable: true,
|
|
resizable: true,
|
|
pagination: true,
|
|
pageSize: 10,
|
|
emptyMessage: 'Noch keine Projekte erstellt, erstelle jetzt dein erstes Projekt!',
|
|
actionButtons: [
|
|
{
|
|
type: 'edit',
|
|
title: 'common.edit',
|
|
idField: 'id',
|
|
operationName: 'handleProjectUpdate',
|
|
loadingStateName: 'editingProjects',
|
|
fetchItemFunctionName: 'fetchProjectById',
|
|
disabled: (hookData: any) => {
|
|
if (!hookData?.permissions) return { disabled: false };
|
|
const hasUpdate = hookData.permissions.update !== 'n' && hookData.permissions.view;
|
|
return { disabled: !hasUpdate, message: 'No permission to edit projects' };
|
|
}
|
|
},
|
|
{
|
|
type: 'delete',
|
|
title: 'common.delete',
|
|
idField: 'id',
|
|
operationName: 'handleDelete',
|
|
loadingStateName: 'deletingProjects',
|
|
disabled: (hookData: any) => {
|
|
if (!hookData?.permissions) return { disabled: false };
|
|
const hasDelete = hookData.permissions.delete !== 'n' && hookData.permissions.view;
|
|
return { disabled: !hasDelete, message: 'No permission to delete projects' };
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
id: 'parzellen',
|
|
label: 'Parzellen',
|
|
content: [
|
|
{
|
|
id: 'parzellen-table',
|
|
type: 'table',
|
|
tableConfig: {
|
|
hookFactory: createParzellenTableHook,
|
|
searchable: true,
|
|
filterable: true,
|
|
sortable: true,
|
|
resizable: true,
|
|
pagination: true,
|
|
pageSize: 10,
|
|
emptyMessage: 'Noch keine Parzellen erstellt, erstelle jetzt dein erstes Projekt und füge eine Parzelle hinzu!',
|
|
actionButtons: [
|
|
{
|
|
type: 'view',
|
|
title: 'common.view',
|
|
idField: 'id',
|
|
nameField: 'label',
|
|
operationName: 'handleParzelleView',
|
|
loadingStateName: 'viewingParzellen',
|
|
disabled: (hookData: any) => {
|
|
if (!hookData?.permissions) return { disabled: false };
|
|
const hasRead = hookData.permissions.read !== 'n' && hookData.permissions.view;
|
|
return { disabled: !hasRead, message: 'No permission to view parzellen' };
|
|
}
|
|
},
|
|
{
|
|
type: 'edit',
|
|
title: 'common.edit',
|
|
idField: 'id',
|
|
operationName: 'handleParzelleUpdate',
|
|
loadingStateName: 'editingParzellen',
|
|
fetchItemFunctionName: 'fetchParzelleById',
|
|
disabled: (hookData: any) => {
|
|
if (!hookData?.permissions) return { disabled: false };
|
|
const hasUpdate = hookData.permissions.update !== 'n' && hookData.permissions.view;
|
|
return { disabled: !hasUpdate, message: 'No permission to edit parzellen' };
|
|
}
|
|
},
|
|
{
|
|
type: 'delete',
|
|
title: 'common.delete',
|
|
idField: 'id',
|
|
operationName: 'handleDelete',
|
|
loadingStateName: 'deletingParzellen',
|
|
disabled: (hookData: any) => {
|
|
if (!hookData?.permissions) return { disabled: false };
|
|
const hasDelete = hookData.permissions.delete !== 'n' && hookData.permissions.view;
|
|
return { disabled: !hasDelete, message: 'No permission to delete parzellen' };
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|
|
]
|
|
}
|
|
],
|
|
defaultTabId: 'projects'
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
id: 'sidebar-column',
|
|
width: '1fr',
|
|
content: []
|
|
}
|
|
],
|
|
gap: '1rem'
|
|
}
|
|
}
|
|
],
|
|
|
|
// Page behavior
|
|
persistent: false,
|
|
preload: false,
|
|
preserveState: true,
|
|
moduleEnabled: true,
|
|
|
|
// Sidebar
|
|
order: 11,
|
|
|
|
// Privilege checker: deny access for "user" role
|
|
privilegeChecker: async () => {
|
|
const userData = getUserDataCache();
|
|
const roleLabels = Array.isArray(userData?.roleLabels) ? userData.roleLabels : [];
|
|
// Deny access if user has "user" role
|
|
return !roleLabels.includes('user');
|
|
},
|
|
|
|
// Lifecycle hooks
|
|
onActivate: async () => {
|
|
if (import.meta.env.DEV) console.log('PEK Tables page activated');
|
|
},
|
|
onDeactivate: async () => {
|
|
if (import.meta.env.DEV) console.log('PEK Tables page deactivated');
|
|
}
|
|
};
|
|
|