This document describes the integration of Break Policies into the Time Planning plugin menu system, including menu seeding configuration and test updates.
- Backend: Added menu entry to
EformTimePlanningPlugin.cs(lines 551-608) - Frontend: Updated Cypress tests to use menu navigation instead of direct URL
- Documentation: Created comprehensive integration guide
- Hash: 9b4e3a2
- Title: Add Break Policies menu entry and update Cypress tests to use menu navigation
- Files: 2 modified (+78/-21 lines)
eFormAPI/Plugins/TimePlanning.Pn/TimePlanning.Pn/EformTimePlanningPlugin.cs
Position 5 (after Timer, before future entries)
new()
{
Name = "Break Policies",
E2EId = "time-planning-pn-break-policies",
Link = "/plugins/time-planning-pn/break-policies",
Type = MenuItemTypeEnum.Link,
Position = 5,
MenuTemplate = new()
{
Name = "Break Policies",
E2EId = "time-planning-pn-break-policies",
DefaultLink = "/plugins/time-planning-pn/break-policies",
Permissions = [],
Translations =
[
new()
{
LocaleName = LocaleNames.English,
Name = "Break Policies",
Language = LanguageNames.English
},
new()
{
LocaleName = LocaleNames.German,
Name = "Pausenrichtlinien",
Language = LanguageNames.German
},
new()
{
LocaleName = LocaleNames.Danish,
Name = "Pausepolitikker",
Language = LanguageNames.Danish
}
]
},
Translations =
[
new()
{
LocaleName = LocaleNames.English,
Name = "Break Policies",
Language = LanguageNames.English
},
new()
{
LocaleName = LocaleNames.German,
Name = "Pausenrichtlinien",
Language = LanguageNames.German
},
new()
{
LocaleName = LocaleNames.Danish,
Name = "Pausepolitikker",
Language = LanguageNames.Danish
}
]
}| Language | Translation | Notes |
|---|---|---|
| English | Break Policies | Standard English term |
| German | Pausenrichtlinien | Literal: "Pause guidelines/policies" |
| Danish | Pausepolitikker | Direct translation of "Break policies" |
- Working hours / Timeregistrering (Position 1)
- Flex (Position 2)
- Registration devices / Registreringsenheder (Position 3)
- Dashboard (Position 4)
- Break Policies / Pausepolitikker (Position 5) ← NEW
Time Planning / Timeregistrering
├── Working hours / Timeregistrering
├── Flex
├── Registration devices / Registreringsenheder
├── Dashboard
└── Break Policies / Pausepolitikker
eform-client/cypress/e2e/plugins/time-planning-pn/o/break-policies.spec.cy.ts
cy.visit('http://localhost:4200/plugins/time-planning-pn/break-policies');
cy.wait(500);const navigateToBreakPolicies = () => {
cy.get('#spinner-animation').should('not.exist');
cy.contains('Timeregistrering').click();
cy.wait(500);
cy.contains('Pausepolitikker').click();
cy.wait(500);
};
// Usage in tests
navigateToBreakPolicies();The test environment uses Danish locale by default, so menu items appear in Danish:
- "Time Planning" → "Timeregistrering"
- "Break Policies" → "Pausepolitikker"
All 7 test scenarios now use the navigation helper:
- ✅ should navigate to break policies page
- ✅ should display break policies list
- ✅ should open create modal
- ✅ should create new break policy
- ✅ should edit break policy
- ✅ should delete break policy
- ✅ should validate required fields
- Discoverability: Users can find Break Policies through menu navigation
- Consistency: Same navigation pattern as other features
- Multi-language: Supports English, German, and Danish
- Intuitive: Grouped under Time Planning with related features
- Realistic: Tests validate actual user navigation path
- Menu Validation: Ensures menu entry is properly configured
- Integration: Catches menu seeding issues early
- Locale Testing: Validates Danish locale works correctly
- DRY: Navigation helper eliminates code duplication
- Maintainable: Single place to update navigation logic
- Readable: Clear test structure and intent
- Reliable: Spinner wait prevents race conditions
| Property | Value | Purpose |
|---|---|---|
| Name | "Break Policies" | Display name (English) |
| E2EId | "time-planning-pn-break-policies" | Test automation selector |
| Link | "/plugins/time-planning-pn/break-policies" | Angular route |
| Type | MenuItemTypeEnum.Link | Menu item type |
| Position | 5 | Display order |
| Permissions | [] | Empty = all users can access |
MenuTemplate:
- Defines the menu item template in the system
- Used for menu generation and management
- Contains DefaultLink and base configuration
Translations:
- Provides localized display names
- Used for rendering menu in different languages
- Must include all supported locales
Both are required for proper menu functionality.
The navigateToBreakPolicies() helper function:
- Waits for spinner to disappear (page loaded)
- Clicks main menu ("Timeregistrering")
- Waits for menu expansion
- Clicks submenu ("Pausepolitikker")
- Waits for page navigation
- Always wait for spinner before interacting
- Use appropriate waits between clicks (500ms)
- Validate URL after navigation
- Test all scenarios with same navigation pattern
If tests fail:
- Check locale setting (should be Danish)
- Verify menu entry was seeded (run activate-plugin first)
- Check menu text matches locale ("Pausepolitikker" for Danish)
- Ensure no timing issues (increase waits if needed)
Other rule entities can follow this pattern:
- PayRuleSet (position 6)
- PayDayTypeRule (position 7)
- PayTierRule (position 8)
- PayTimeBandRule (position 9)
new()
{
Name = "[English Name]",
E2EId = "time-planning-pn-[feature-name]",
Link = "/plugins/time-planning-pn/[route]",
Type = MenuItemTypeEnum.Link,
Position = [number],
MenuTemplate = new()
{
Name = "[English Name]",
E2EId = "time-planning-pn-[feature-name]",
DefaultLink = "/plugins/time-planning-pn/[route]",
Permissions = [],
Translations = [/* 3 languages */]
},
Translations = [/* 3 languages */]
}const navigateTo[Feature]s = () => {
cy.get('#spinner-animation').should('not.exist');
cy.contains('Timeregistrering').click();
cy.wait(500);
cy.contains('[Danish Translation]').click();
cy.wait(500);
};- Name set correctly
- E2EId follows pattern
- Link points to correct route
- Type is Link
- Position is correct
- MenuTemplate configured
- Permissions set (empty = all)
- Translations for all 3 languages
- Both MenuTemplate.Translations and Translations populated
- Navigation helper created
- All test scenarios updated
- Danish menu items used
- Spinner wait added
- Appropriate waits between actions
- Comments updated/removed
- Code follows DRY principle
- Implementation documented
- Benefits explained
- Technical details provided
- Future patterns described
- Troubleshooting guide included
✅ Implementation Complete ✅ Tests Updated and Passing ✅ Documentation Complete ✅ Ready for Production
EformTimePlanningPlugin.cs- Menu seeding configurationbreak-policies.spec.cy.ts- Cypress test navigationbreak-policies.module.ts- Angular modulebreak-policies.routing.ts- Angular routing
- Original Issue: #[issue-number]
- Implementation Guide:
BREAK_POLICY_COMPONENT_IMPLEMENTATION.md - PR: #[pr-number]
- Commit: 9b4e3a2