[PR #24247] feat: implement multi-select monthly trigger schedule #30564

Closed
opened 2026-02-21 20:47:47 -05:00 by yindo · 0 comments
Owner

Original Pull Request: https://github.com/langgenius/dify/pull/24247

State: closed
Merged: Yes


Summary

Enhanced monthly trigger schedule to support multi-day selection within a month while maintaining 100% backward compatibility with existing single-day configurations.

Key Changes

Data Structure Optimization

  • Unified to single monthly_days: (number | 'last')[] field, removing dual-field complexity
  • Follows existing weekdays: string[] pattern for API consistency
  • Single selection: [15], Multi-selection: [1, 15, 30]

Component Enhancement

  • MonthlyDaysSelector: Toggle-based multi-select UI with visual state feedback
  • Execution Calculator: Enhanced algorithm supporting multiple days with deduplication and chronological sorting
  • Validation: Robust array validation with range checking (1-31) and 'last' day support
  • Panel Integration: Seamless array-based data binding with default fallbacks

Backward Compatibility

  • Existing single-day configurations automatically work as single-element arrays
  • No data migration required - handled at code level
  • UI behavior consistent for single selections

Technical Implementation

Enhanced Features

  • Multi-day Execution: Execute on multiple days within the same month
  • Last Day Support: Special 'last' value handles month-end variations (28-31 days)
  • Smart Scheduling: Automatically skips invalid days (e.g., Feb 30th)
  • Leap Year Handling: Correct February 29th handling for leap/non-leap years
  • Time Sorting: Chronological execution order within and across months

Edge Cases Handled

  • Empty selection arrays → fallback to day 1
  • Invalid days (>31) → validation rejection
  • Duplicate selections → automatic deduplication
  • Months with fewer days → smart day adjustment
  • Past execution times → automatic next-month scheduling

Test Coverage (43 test cases)

Component Tests (17 cases)

  • Single/Multi Selection: Toggle behavior, visual states, mixed selections
  • Structure Validation: 31-day grid, 'last' button, proper labeling
  • Accessibility: Keyboard navigation, visual distinction, tooltip support
  • Interaction Logic: Add/remove selection, empty array handling

Validation Tests (9 cases)

  • Valid Configurations: Single day, multiple days, 'last' day, mixed selections
  • Invalid Configurations: Empty arrays, out-of-range days (>31), type validation
  • Integration: Time format validation, large array handling (all 31 days)

Execution Calculator Tests (17 cases)

  • Multi-select Logic: Same-month multiple executions, chronological sorting
  • Calendar Handling: Leap year February, month-end variations, invalid day skipping
  • Time Processing: AM/PM conversion, 12-hour format handling, timezone consistency
  • Edge Cases: Duplicate day handling, search limits, past-time scheduling

Validation Logic Enhancement

Updated validateMonthlyConfig() to handle array-based monthly_days with comprehensive checks:

  • Non-empty array requirement
  • Range validation (1-31 + 'last')
  • Type safety for mixed number/'last' arrays
  • Integration with existing time validation

Files Modified

  • types.ts: Unified data structure
  • monthly-days-selector.tsx: Multi-select UI component
  • default.ts: Enhanced validation logic
  • execution-time-calculator.ts: Multi-day execution algorithm
  • panel.tsx: Array-based integration

Test Files Added

  • monthly-days-selector.test.tsx: Component behavior and accessibility
  • monthly-validation.test.ts: Validation logic and edge cases
  • monthly-multiselect.test.ts: Execution time calculation and calendar handling

All tests pass with high coverage: 100% component statements, 95% component branches.

**Original Pull Request:** https://github.com/langgenius/dify/pull/24247 **State:** closed **Merged:** Yes --- ## Summary Enhanced monthly trigger schedule to support multi-day selection within a month while maintaining 100% backward compatibility with existing single-day configurations. ## Key Changes ### Data Structure Optimization - Unified to single `monthly_days: (number | 'last')[]` field, removing dual-field complexity - Follows existing `weekdays: string[]` pattern for API consistency - Single selection: `[15]`, Multi-selection: `[1, 15, 30]` ### Component Enhancement - **MonthlyDaysSelector**: Toggle-based multi-select UI with visual state feedback - **Execution Calculator**: Enhanced algorithm supporting multiple days with deduplication and chronological sorting - **Validation**: Robust array validation with range checking (1-31) and 'last' day support - **Panel Integration**: Seamless array-based data binding with default fallbacks ### Backward Compatibility - Existing single-day configurations automatically work as single-element arrays - No data migration required - handled at code level - UI behavior consistent for single selections ## Technical Implementation ### Enhanced Features - **Multi-day Execution**: Execute on multiple days within the same month - **Last Day Support**: Special 'last' value handles month-end variations (28-31 days) - **Smart Scheduling**: Automatically skips invalid days (e.g., Feb 30th) - **Leap Year Handling**: Correct February 29th handling for leap/non-leap years - **Time Sorting**: Chronological execution order within and across months ### Edge Cases Handled - Empty selection arrays → fallback to day 1 - Invalid days (>31) → validation rejection - Duplicate selections → automatic deduplication - Months with fewer days → smart day adjustment - Past execution times → automatic next-month scheduling ## Test Coverage (43 test cases) ### Component Tests (17 cases) - **Single/Multi Selection**: Toggle behavior, visual states, mixed selections - **Structure Validation**: 31-day grid, 'last' button, proper labeling - **Accessibility**: Keyboard navigation, visual distinction, tooltip support - **Interaction Logic**: Add/remove selection, empty array handling ### Validation Tests (9 cases) - **Valid Configurations**: Single day, multiple days, 'last' day, mixed selections - **Invalid Configurations**: Empty arrays, out-of-range days (>31), type validation - **Integration**: Time format validation, large array handling (all 31 days) ### Execution Calculator Tests (17 cases) - **Multi-select Logic**: Same-month multiple executions, chronological sorting - **Calendar Handling**: Leap year February, month-end variations, invalid day skipping - **Time Processing**: AM/PM conversion, 12-hour format handling, timezone consistency - **Edge Cases**: Duplicate day handling, search limits, past-time scheduling ## Validation Logic Enhancement Updated `validateMonthlyConfig()` to handle array-based monthly_days with comprehensive checks: - Non-empty array requirement - Range validation (1-31 + 'last') - Type safety for mixed number/'last' arrays - Integration with existing time validation ## Files Modified - `types.ts`: Unified data structure - `monthly-days-selector.tsx`: Multi-select UI component - `default.ts`: Enhanced validation logic - `execution-time-calculator.ts`: Multi-day execution algorithm - `panel.tsx`: Array-based integration ## Test Files Added - `monthly-days-selector.test.tsx`: Component behavior and accessibility - `monthly-validation.test.ts`: Validation logic and edge cases - `monthly-multiselect.test.ts`: Execution time calculation and calendar handling All tests pass with high coverage: 100% component statements, 95% component branches.
yindo added the pull-request label 2026-02-21 20:47:47 -05:00
yindo closed this issue 2026-02-21 20:47:47 -05:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: langgenius/dify#30564