= {
},
},
},
+ {
+ key: 'isAllowTaskSplitting',
+ type: 'checkbox',
+ templateOptions: {
+ label: T.GCF.SCHEDULE.L_IS_ALLOW_TASK_SPLITTING,
+ },
+ },
+ {
+ key: 'taskPlacementStrategy',
+ type: 'select',
+ templateOptions: {
+ label: T.GCF.SCHEDULE.L_TASK_PLACEMENT_STRATEGY,
+ required: true,
+ options: [
+ {
+ label: T.GCF.SCHEDULE.TASK_PLACEMENT_STRATEGY_DEFAULT,
+ value: 'DEFAULT',
+ },
+ {
+ label: T.GCF.SCHEDULE.TASK_PLACEMENT_STRATEGY_SHORTEST_FIRST,
+ value: 'SHORTEST_FIRST',
+ },
+ {
+ label: T.GCF.SCHEDULE.TASK_PLACEMENT_STRATEGY_LONGEST_FIRST,
+ value: 'LONGEST_FIRST',
+ },
+ {
+ label: T.GCF.SCHEDULE.TASK_PLACEMENT_STRATEGY_OLDEST_FIRST,
+ value: 'OLDEST_FIRST',
+ },
+ {
+ label: T.GCF.SCHEDULE.TASK_PLACEMENT_STRATEGY_NEWEST_FIRST,
+ value: 'NEWEST_FIRST',
+ },
+ {
+ label: T.GCF.SCHEDULE.TASK_PLACEMENT_STRATEGY_BEST_FIT,
+ value: 'BEST_FIT',
+ },
+ ],
+ },
+ },
],
};
diff --git a/src/app/features/config/global-config.model.ts b/src/app/features/config/global-config.model.ts
index 3f7dcd6cff..eabaff4910 100644
--- a/src/app/features/config/global-config.model.ts
+++ b/src/app/features/config/global-config.model.ts
@@ -141,6 +141,14 @@ export type SyncConfig = Readonly<{
localFileSync?: LocalFileSyncConfig;
}>;
+export type TaskPlacementStrategy =
+ | 'DEFAULT'
+ | 'BEST_FIT'
+ | 'SHORTEST_FIRST'
+ | 'LONGEST_FIRST'
+ | 'OLDEST_FIRST'
+ | 'NEWEST_FIRST';
+
export type ScheduleConfig = Readonly<{
isWorkStartEndEnabled: boolean;
workStart: string;
@@ -148,6 +156,8 @@ export type ScheduleConfig = Readonly<{
isLunchBreakEnabled: boolean;
lunchBreakStart: string;
lunchBreakEnd: string;
+ isAllowTaskSplitting: boolean;
+ taskPlacementStrategy: TaskPlacementStrategy;
}>;
export type ReminderConfig = Readonly<{
diff --git a/src/app/t.const.ts b/src/app/t.const.ts
index 43fe778d90..0fa74be018 100644
--- a/src/app/t.const.ts
+++ b/src/app/t.const.ts
@@ -1920,6 +1920,22 @@ const T = {
WORK_START_END_DESCRIPTION: 'GCF.SCHEDULE.WORK_START_END_DESCRIPTION',
WEEK: 'GCF.SCHEDULE.WEEK',
MONTH: 'GCF.SCHEDULE.MONTH',
+ L_IS_ALLOW_TASK_SPLITTING: 'GCF.SCHEDULE.L_IS_ALLOW_TASK_SPLITTING',
+ L_TASK_PLACEMENT_STRATEGY: 'GCF.SCHEDULE.L_TASK_PLACEMENT_STRATEGY',
+ TASK_PLACEMENT_STRATEGY_DEFAULT: 'GCF.SCHEDULE.TASK_PLACEMENT_STRATEGY_DEFAULT',
+ TASK_PLACEMENT_STRATEGY_BEST_FIT: 'GCF.SCHEDULE.TASK_PLACEMENT_STRATEGY_BEST_FIT',
+ TASK_PLACEMENT_STRATEGY_SHORTEST_FIRST:
+ 'GCF.SCHEDULE.TASK_PLACEMENT_STRATEGY_SHORTEST_FIRST',
+ TASK_PLACEMENT_STRATEGY_LONGEST_FIRST:
+ 'GCF.SCHEDULE.TASK_PLACEMENT_STRATEGY_LONGEST_FIRST',
+ TASK_PLACEMENT_STRATEGY_OLDEST_FIRST:
+ 'GCF.SCHEDULE.TASK_PLACEMENT_STRATEGY_OLDEST_FIRST',
+ TASK_PLACEMENT_STRATEGY_NEWEST_FIRST:
+ 'GCF.SCHEDULE.TASK_PLACEMENT_STRATEGY_NEWEST_FIRST',
+ TASK_PLACEMENT_STRATEGY_DEFAULT_HELP:
+ 'GCF.SCHEDULE.TASK_PLACEMENT_STRATEGY_DEFAULT_HELP',
+ TASK_PLACEMENT_STRATEGY_BEST_FIT_HELP:
+ 'GCF.SCHEDULE.TASK_PLACEMENT_STRATEGY_BEST_FIT_HELP',
},
SHORT_SYNTAX: {
HELP: 'GCF.SHORT_SYNTAX.HELP',
diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json
index 8b32c5b77b..1d3a164020 100644
--- a/src/assets/i18n/en.json
+++ b/src/assets/i18n/en.json
@@ -1889,7 +1889,17 @@
"TITLE": "Schedule",
"WORK_START_END_DESCRIPTION": "e.g. 17:00",
"WEEK": "Week",
- "MONTH": "Month"
+ "MONTH": "Month",
+ "L_IS_ALLOW_TASK_SPLITTING": "Allow task splitting across time boundaries",
+ "L_TASK_PLACEMENT_STRATEGY": "Strategy",
+ "TASK_PLACEMENT_STRATEGY_DEFAULT": "Default (Sequential)",
+ "TASK_PLACEMENT_STRATEGY_BEST_FIT": "Best Fit (Experimental)",
+ "TASK_PLACEMENT_STRATEGY_SHORTEST_FIRST": "Shortest Task First",
+ "TASK_PLACEMENT_STRATEGY_LONGEST_FIRST": "Longest Task First",
+ "TASK_PLACEMENT_STRATEGY_OLDEST_FIRST": "Oldest Task First",
+ "TASK_PLACEMENT_STRATEGY_NEWEST_FIRST": "Newest Task First",
+ "TASK_PLACEMENT_STRATEGY_DEFAULT_HELP": "Default: Uses simple sequential placement. Tasks are placed one after another in the order they appear in your task list, starting from the work start time or current time.",
+ "TASK_PLACEMENT_STRATEGY_BEST_FIT_HELP": "Best Fit: Uses best-fit bin packing algorithm to minimize task splitting by placing tasks into gaps between scheduled items. Tasks are sorted by remaining time (shortest first) for optimal gap utilization."
},
"SHORT_SYNTAX": {
"HELP": "Here you can control short syntax options when creating a task
",