diff --git a/apps/web/src/apps/modules/example/full-page/domain/constants/full-page.constants.ts b/apps/web/src/apps/modules/example/full-page/domain/constants/full-page.constants.ts index d001156..7caf90c 100644 --- a/apps/web/src/apps/modules/example/full-page/domain/constants/full-page.constants.ts +++ b/apps/web/src/apps/modules/example/full-page/domain/constants/full-page.constants.ts @@ -19,4 +19,7 @@ export const FullPageModuleConfig: ModuleConfigEntity = { /** Architectural category of the module, used for rendering and routing logic */ moduleCategory: 'FULL_PAGE', + + /** */ + moduleType: 'MASTER_DATA', } as const; diff --git a/apps/web/src/apps/modules/example/single-page/domain/constants/single-page.constants.ts b/apps/web/src/apps/modules/example/single-page/domain/constants/single-page.constants.ts index 895bfd7..663f7fc 100644 --- a/apps/web/src/apps/modules/example/single-page/domain/constants/single-page.constants.ts +++ b/apps/web/src/apps/modules/example/single-page/domain/constants/single-page.constants.ts @@ -19,4 +19,7 @@ export const SinglePageModuleConfig: ModuleConfigEntity = { /** Architectural category of the module, used for rendering and routing logic */ moduleCategory: 'SINGLE_PAGE', + + /** */ + moduleType: 'MASTER_DATA', } as const; diff --git a/packages/ui/src/foundations/enterprise-module/entities/entity.ts b/packages/ui/src/foundations/enterprise-module/entities/entity.ts index 88a72e6..e3fe025 100644 --- a/packages/ui/src/foundations/enterprise-module/entities/entity.ts +++ b/packages/ui/src/foundations/enterprise-module/entities/entity.ts @@ -46,6 +46,7 @@ export type ModuleActionType = (typeof ModuleAction)[keyof typeof ModuleAction] * Defines the architectural category of the module (e.g., routed vs. modal-driven). */ export type ModuleCategoryType = 'SINGLE_PAGE' | 'FULL_PAGE'; +type ModuleType = 'TRANSACTION' | 'MASTER_DATA'; /** * Represents the current operational mode of a form instance. @@ -95,6 +96,7 @@ export interface ModuleConfigEntity { apiUrl: string; tabTitle?: string; moduleCategory: ModuleCategoryType; + moduleType: ModuleType; translationNamespace: string; singlePageFormConfig?: SinglePageConfig; @@ -108,6 +110,7 @@ export interface ModuleConfigEntity { export interface ConfigSlice { config: ModuleConfigEntity; privileges: PrivilegeEntity; + IS_MACOS: boolean; } export interface DataServiceSlice< @@ -187,20 +190,12 @@ export interface EnterpriseFormLifecycleHooks Promise; } -export interface EnterpriseIndexPageConfig { - _data?: E; // Fix unused generic +export interface EnterpriseIndexPageConfig { children?: ReactNode; px?: string | number; py?: string | number; - // customHiddenActions?: (selected: E[], defaultHidden: string[]) => string[]; - // /** Strongly typed event handler to prevent arbitrary string usage for actions. */ - // onCustomActionClick?: (key: ModuleActionType, data?: unknown) => void; - // filterDrawerContent?: ReactNode; - - // registerRefreshCallback?: (callback: () => void) => void; pageHeaderProps?: Omit; - // actions?: PageActionsProps['actions']; customPageActions?: (actions: PageActionsProps['actions']) => PageActionsProps['actions']; onClickCreate?: (key: string) => void; } @@ -227,11 +222,10 @@ export interface EnterpriseDetailPageConfig { children?: ReactNode; showPageHeader?: boolean; useDefaultPadding?: boolean; - customHiddenActions?: (data: E | null, defaultHidden: string[]) => string[]; - onCustomActionClick?: (key: ModuleActionType, data?: unknown) => void; - editMode?: 'FULL' | 'PARTIAL'; - afterGetData?: (data: E) => Promise; + + pageHeaderProps?: Omit; + customPageActions?: (data: E, actions: PageActionsProps['actions']) => PageActionsProps['actions']; } export interface PrivilegeEntity { diff --git a/packages/ui/src/foundations/enterprise-module/hooks/use-index-page.context.ts b/packages/ui/src/foundations/enterprise-module/hooks/use-index-page.context.ts index 46ff3a2..4c48461 100644 --- a/packages/ui/src/foundations/enterprise-module/hooks/use-index-page.context.ts +++ b/packages/ui/src/foundations/enterprise-module/hooks/use-index-page.context.ts @@ -1,20 +1,10 @@ import { createContext, useContext } from 'react'; -import type { BaseEntity } from '@repo/core-api/data-services'; -export interface IndexPageContextValue { - _data?: E; // Fix unused generic - // renderRowActions: (row: E) => React.ReactNode; - // refreshGrid: () => void; - // // State for batch modals - // isConfirmModalOpen: boolean; - // setIsConfirmModalOpen: (open: boolean) => void; - // isDeleteModalOpen: boolean; - // setIsDeleteModalOpen: (open: boolean) => void; -} +export interface IndexPageContextValue {} -export const IndexPageContext = createContext | null>(null); +export const IndexPageContext = createContext(null); -export function useIndexPageContext(): IndexPageContextValue { +export function useIndexPageContext(): IndexPageContextValue { const context = useContext(IndexPageContext); if (!context) { throw new Error('useIndexPageContext must be used within an IndexPageProvider'); diff --git a/packages/ui/src/foundations/enterprise-module/providers/detail-page.provider.tsx b/packages/ui/src/foundations/enterprise-module/providers/detail-page.provider.tsx index e69de29..db13773 100644 --- a/packages/ui/src/foundations/enterprise-module/providers/detail-page.provider.tsx +++ b/packages/ui/src/foundations/enterprise-module/providers/detail-page.provider.tsx @@ -0,0 +1,17 @@ +import { BaseEntity } from '@repo/core-api/data-services'; +import { DetailPageContext } from '../hooks/use-detail-page.context'; +import { EnterpriseDetailPageConfig } from '../entities/entity'; + +export function EnterpriseDetailPageProvider(props: EnterpriseDetailPageConfig) { + const { + children, + showPageHeader, + useDefaultPadding, + editMode, + + pageHeaderProps, + customPageActions, + } = props; + + return ; +} diff --git a/packages/ui/src/foundations/enterprise-module/providers/index-page.provider.tsx b/packages/ui/src/foundations/enterprise-module/providers/index-page.provider.tsx index f945c0c..72f19e4 100644 --- a/packages/ui/src/foundations/enterprise-module/providers/index-page.provider.tsx +++ b/packages/ui/src/foundations/enterprise-module/providers/index-page.provider.tsx @@ -12,23 +12,12 @@ import { } from '../hooks/use-module.context'; import { shortcutsData } from '../../../constants'; -// --------------------------------------------------------------------------- -// Helpers -// --------------------------------------------------------------------------- - -/** Detect macOS / iOS for displaying platform-specific shortcut labels. */ -const IS_MAC = typeof navigator !== 'undefined' && /Mac|iPod|iPhone|iPad/.test(navigator.userAgent); - -// --------------------------------------------------------------------------- -// Component -// --------------------------------------------------------------------------- - -export function EnterpriseIndexPageProvider(props: EnterpriseIndexPageConfig) { +export function EnterpriseIndexPageProvider(props: EnterpriseIndexPageConfig) { const { children, pageHeaderProps, px, py, customPageActions, onClickCreate } = props; const { t } = useEnterpriseModuleTranslationContext(); const navigation = useEnterpriseModuleNavigationContext(); - const { config, privileges } = useEnterpriseModuleConfigContext(); + const { config, privileges, IS_MACOS } = useEnterpriseModuleConfigContext(); const { moduleKey } = config; const { ALLOW_CREATE } = privileges; @@ -50,8 +39,8 @@ export function EnterpriseIndexPageProvider(p /** Platform-aware shortcut label for the Create action. */ const CREATE_SHORTCUT_LABEL = useMemo(() => { const shortcutData = shortcutsData.find((s) => s.key === 'collapse_sidebar'); - return IS_MAC ? shortcutData?.macKeyIcons.join(' ') : shortcutData?.winKeyIcons.join(' '); - }, [IS_MAC]); + return IS_MACOS ? shortcutData?.macKeyIcons.join(' ') : shortcutData?.winKeyIcons.join(' '); + }, [IS_MACOS]); useEffect(() => { function onKeyDown(e: KeyboardEvent) { diff --git a/packages/ui/src/foundations/enterprise-module/providers/module.provider.tsx b/packages/ui/src/foundations/enterprise-module/providers/module.provider.tsx index 3abf4d2..2d69565 100644 --- a/packages/ui/src/foundations/enterprise-module/providers/module.provider.tsx +++ b/packages/ui/src/foundations/enterprise-module/providers/module.provider.tsx @@ -20,6 +20,9 @@ export interface EnterpriseModuleProviderProps { dataServices: BaseRemoteDataServices; } +/** Detect macOS / iOS for displaying platform-specific shortcut labels. */ +const IS_MACOS = typeof navigator !== 'undefined' && /Mac|iPod|iPhone|iPad/.test(navigator.userAgent); + export function EnterpriseModuleProvider(props: EnterpriseModuleProviderProps) { const { children, config, dataServices } = props; const navigate = useNavigate(); @@ -32,6 +35,7 @@ export function EnterpriseModuleProvider(props: Enterprise config, // FIXME => IMPLEMENT PRIVILEGE privileges: defaultPrivileges, + IS_MACOS: IS_MACOS, }; }, [config]);