From c701e32b7a40253a2d77cf27add35b0651525a5c Mon Sep 17 00:00:00 2001 From: Nithya Date: Fri, 31 Oct 2025 11:28:32 +0530 Subject: [PATCH 1/2] 989389: Content check in blazor platform --- blazor/gantt-chart/holidays.md | 70 ++-- ...lazor-gantt-chart-custom-schedule-task.PNG | Bin 62258 -> 0 bytes blazor/gantt-chart/images/duration-manual.PNG | Bin 0 -> 3712 bytes blazor/gantt-chart/images/endDate-manual.PNG | Bin 0 -> 1226 bytes .../gantt-chart/images/startDate-manual.PNG | Bin 0 -> 1233 bytes blazor/gantt-chart/predecessor-validation.md | 21 +- blazor/gantt-chart/scheduling-tasks.md | 346 ++++++++++-------- blazor/gantt-chart/splitter.md | 20 +- 8 files changed, 248 insertions(+), 209 deletions(-) delete mode 100644 blazor/gantt-chart/images/blazor-gantt-chart-custom-schedule-task.PNG create mode 100644 blazor/gantt-chart/images/duration-manual.PNG create mode 100644 blazor/gantt-chart/images/endDate-manual.PNG create mode 100644 blazor/gantt-chart/images/startDate-manual.PNG diff --git a/blazor/gantt-chart/holidays.md b/blazor/gantt-chart/holidays.md index f140f5da8e..9c2a413d3e 100644 --- a/blazor/gantt-chart/holidays.md +++ b/blazor/gantt-chart/holidays.md @@ -1,7 +1,7 @@ --- layout: post title: Holidays in Blazor Gantt Chart Component | Syncfusion -description: Checkout and learn here all about Holidays in Syncfusion Blazor Gantt Chart component and much more. +description: Learn how to configure holidays in the Syncfusion Blazor Gantt Chart component for accurate task scheduling with non-working days. platform: Blazor control: Gantt Chart documentation: ug @@ -9,20 +9,37 @@ documentation: ug # Holidays in Blazor Gantt Chart Component -Non-working days in a project can be displayed in the Gantt Chart component using the [GanttHolidays](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttHolidays.html) property. Each holiday can be defined with the following properties: +The Blazor Gantt Chart component supports holidays to define non-working days, such as national holidays or company closures, that impact task scheduling and project timelines. Holidays override regular working time settings like [WorkWeek](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_WorkWeek) or [IncludeWeekend](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_IncludeWeekend), ensuring tasks do not progress during these periods. In the timeline, holidays appear as highlighted backgrounds with descriptive labels, creating visible gaps in taskbars to reflect scheduling adjustments. Custom CSS classes allow distinct styling for different holiday types (e.g., national vs. company holidays), enhancing visual clarity. Properly configured holidays ensure accurate duration calculations, dependency adjustments, and critical path analysis, aligning project timelines with resource availability and regional requirements. -* `From`: Defines start date of the holiday(s). -* `To`: Defines end date of the holiday(s). -* `Label`: Defines the description or label for the holiday. -* `CssClass`: Formats the holidays label in the Gantt chart. +## Understanding holiday effects on tasks -The following code example shows how to display the non-working days in the Gantt Chart component. +Holidays adjust task scheduling to reflect non-working periods: +- **Duration adjustments**: Task durations exclude holidays, extending end dates. For example, a task starting December 20, 2024, skips a December 25-26 holiday, adjusting its completion to account for these days. +- **Dependency management**: Successor tasks shift to maintain relationships (e.g., FS), ensuring no work occurs during holidays. +- **Critical path integration**: Holidays impact slack calculations when using [EnableCriticalPath](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_EnableCriticalPath), as tasks delayed by holidays may become critical. +- **Resource allocation**: Holidays reduce resource availability, pausing task progress during these periods. + +The [ProjectStartDate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_ProjectStartDate) and [ProjectEndDate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_ProjectEndDate) properties provide context for scheduling, ensuring holidays align with the project timeline. + +## Configure holidays + +Holidays are defined using the [GanttHolidays](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttHolidays.html) property, which accepts an array of holiday objects specifying dates, labels, and styling. Holidays take precedence over settings like `WorkWeek` or `IncludeWeekend`, ensuring tasks do not progress during these periods. + +**Holiday configuration properties** +- `From`: Sets the start date of the holiday (e.g., `new Date('2024-12-25')`). +- `To`: Defines the end date for multi-day holidays (optional for single-day holidays). +- `Label`: Provides a descriptive name (e.g., “Christmas Day”) displayed in the timeline. +- `CssClass`: Applies custom CSS classes for styling holiday appearances. + +The following example configures single and multi-day holidays: + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} -```cshtml @using Syncfusion.Blazor.Gantt - + GetTaskCollection() { List Tasks = new List() { - new TaskData() { TaskId = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 04, 21), }, - new TaskData() { TaskId = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentId = 1 }, - new TaskData() { TaskId = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "4", Progress = 40, ParentId = 1 }, - new TaskData() { TaskId = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentId = 1 }, - new TaskData() { TaskId = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 06), EndDate = new DateTime(2022, 04, 21), }, - new TaskData() { TaskId = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 30, ParentId = 5 }, - new TaskData() { TaskId = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, ParentId = 5 }, - new TaskData() { TaskId = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, ParentId = 5 } + new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 04, 08), }, + new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 }, + new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "4", Progress = 40, ParentID = 1 }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 }, + new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 06), EndDate = new DateTime(2022, 04, 08), }, + new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 30, ParentID = 5 }, + new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, ParentID = 5 }, + new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, ParentID = 5 } }; return Tasks; } } - -``` -The following screenshot shows the output of Holidays in Gantt Chart component. +{% endhighlight %} +{% endtabs %} -![Blazor Gantt Chart displays Holidays](images/blazor-gantt-chart-holidays.png) +{% previewsample "https://blazorplayground.syncfusion.com/embed/hjryCZgZfnCCBAeu?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -N> You can refer to our [Blazor Gantt Chart](https://www.syncfusion.com/blazor-components/blazor-gantt-chart) feature tour page for its groundbreaking feature representations. You can also explore our [Blazor Gantt Chart example](https://blazor.syncfusion.com/demos/gantt-chart/default-functionalities) to know how to render and configure the Gantt. \ No newline at end of file +> You can refer to our [Blazor Gantt Chart](https://www.syncfusion.com/blazor-components/blazor-gantt-chart) feature tour page for its groundbreaking feature representations. You can also explore our [Blazor Gantt Chart example](https://blazor.syncfusion.com/demos/gantt-chart/default-functionalities) to know how to render and configure the Gantt. \ No newline at end of file diff --git a/blazor/gantt-chart/images/blazor-gantt-chart-custom-schedule-task.PNG b/blazor/gantt-chart/images/blazor-gantt-chart-custom-schedule-task.PNG deleted file mode 100644 index 9e2da0c3e313bd1b16f3e8b680c09ac0ec92d539..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62258 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 literal 0 HcmV?d00001 diff --git a/blazor/gantt-chart/images/endDate-manual.PNG b/blazor/gantt-chart/images/endDate-manual.PNG new file mode 100644 index 0000000000000000000000000000000000000000..07442b4b0a2ee72b30a2aca1d037840469076459 GIT binary patch literal 1226 zcmeAS@N?(olHy`uVBq!ia0y~yU}OZcS97od$ut?wgFuS0ILO_JVcj{Imp~3nx}&cn z1H;CC?mvmFKt5-IM`SSrgP1A^GkON8d;qG6_jGX#sfc@f^I&fbtAJ~un2M8%UrWUS zz5^}^Oa}@rn5-Gv4ObkU!t(59?Cs@N?p3>gp5FC&_wVK64@?9b9=kB~2{T&wu{^LC zFwTNI{`>!b+yD2^ySJzH>-W_E{QCI#^!@v4>i&A4a9I%3bzpn-=jZLy{p0uVvt#_P z%JlTo#pSm5`1XiS=y2Fs^5On%WtMv!Kc;a^@jm`nHfNSo zOPTNUv;oa$-zUi%A=<@#;$|0@3fGU;&G zTk_=mx7Ww}*ZVhfT=91Qms4N+^AA+Q{?=@J`#pA?|3PW(!v5{Y#hd2utE;UQ`UgsN z8<*QMJxFHg1SPruZ{_3}_b`621*PA=kN5w3oPOZ=dWL_$KlgAPC{$uN-pL@N&Qvgm g2At)4_x#}vKl@6l_uH#_VEMz~>FVdQ&MBb@0G*-kX#fBK literal 0 HcmV?d00001 diff --git a/blazor/gantt-chart/images/startDate-manual.PNG b/blazor/gantt-chart/images/startDate-manual.PNG new file mode 100644 index 0000000000000000000000000000000000000000..417cb5fcbc5eabf247fc2d34f988abeeaa8063de GIT binary patch literal 1233 zcmeAS@N?(olHy`uVBq!ia0y~yU{nIKH*>H7N!`zaPk@siAk7t4P>lw9D`(O{*>^s0qpg|N~Bzk%eu z=>7TU?d#9y{r%6||NZvy=W+h`^Xq?noxYz}s^vxRk57Mpf8OoC|G&1)e;E^wi_#w~ zSeIV*mjW_(9QS;&Rj`UjswLx2_PXSHS)ka4<5P8xK3nS8EWlg+r*G+vJti3fixT_w ze~HYV&c^Fx^5(xy(0@yin5N0~1&$qUOE1JUvnfhVb1DW}ml45r)^t>IG!RHj34eb) ztnE4L4N6DfF6YZ9=fr`M=Z5+7=Osaz=kM=321$#B@9qA|HGhr=DgOTS_xJx_GkAHO zzOdP>%UItl2uk1|EhP6on*~g)Uyj-Mx%c1Sa{PLol`1erGnP8BT;UW9P When `EnablePredecessorOffsetValidation` is enabled, the predecessor offset w ### Auto-link validation -When the connector lines are drawn between tasks, the task date gets validated based on predecessor values. You can restrict this validation on predecessor drawing using the [TaskbarEditing](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEvents-1.html#Syncfusion_Blazor_Gantt_GanttEvents_1_TaskbarEditing) event. You can enable/disable the validation using [EnablePredecessorValidation](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.TaskbarEditingEventArgs-1.html#Syncfusion_Blazor_Gantt_TaskbarEditingEventArgs_1_EnablePredecessorValidation) event argument. By default, `EnablePredecessorValidation` is true. +When connector lines are drawn between tasks, the task dates are validated based on predecessor values. You can restrict this validation when drawing predecessors by using the [TaskbarEditing](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEvents-1.html#Syncfusion_Blazor_Gantt_GanttEvents_1_TaskbarEditing) event. You can enable or disable the validation using the [EnablePredecessorValidation](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.TaskbarEditingEventArgs-1.html#Syncfusion_Blazor_Gantt_TaskbarEditingEventArgs_1_EnablePredecessorValidation) event argument. By default, `EnablePredecessorValidation` is **true**. -In the below code example, the connector line which is connected from task id 2 to task id 3 is rendered at load time. Hence validation happens. Whereas, the connector line from task id 6 to task id 7 is drawn dynamically and validation is restricted here by disabling the `EnablePredecessorValidation` property. +In the following code example, the connector line connected from task ID 2 to task ID 3 is rendered at load time, so validation occurs. However, the connector line from task ID 6 to task ID 7 is drawn dynamically, and validation is restricted by disabling the `EnablePredecessorValidation` property. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -276,4 +277,4 @@ In the below code example, the connector line which is connected from task id 2 {% previewsample "https://blazorplayground.syncfusion.com/embed/rNBICtjghxOULcTL?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -N> [EnablePredecessorValidation](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_EnablePredecessorValidation) API is used to enable/disable validation based on predecessor values both on load time and on edit actions like cell editing, dialog editing, and on predecessor drawing. Whereas, [EnablePredecessorValidation](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.TaskbarEditingEventArgs-1.html#Syncfusion_Blazor_Gantt_TaskbarEditingEventArgs_1_EnablePredecessorValidation) event argument is used to enable/disable validation only on predecessor drawing. \ No newline at end of file +> [EnablePredecessorValidation](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_EnablePredecessorValidation) API is used to enable/disable validation based on predecessor values both on load time and on edit actions like cell editing, dialog editing, and on predecessor drawing. Whereas, [EnablePredecessorValidation](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.TaskbarEditingEventArgs-1.html#Syncfusion_Blazor_Gantt_TaskbarEditingEventArgs_1_EnablePredecessorValidation) event argument is used to enable/disable validation only on predecessor drawing. \ No newline at end of file diff --git a/blazor/gantt-chart/scheduling-tasks.md b/blazor/gantt-chart/scheduling-tasks.md index 4ab4baf79b..f838359c64 100644 --- a/blazor/gantt-chart/scheduling-tasks.md +++ b/blazor/gantt-chart/scheduling-tasks.md @@ -1,35 +1,42 @@ --- layout: post -title: Scheduling Tasks in Blazor Gantt Chart Component | Syncfusion -description: Checkout and learn here all about Scheduling Tasks in Syncfusion Blazor Gantt Chart component and more. +title: Task scheduling in Blazor Gantt Chart Component | Syncfusion +description: Learn here all about Task scheduling in Syncfusion Blazor Gantt Chart component and more. platform: Blazor control: Gantt Chart documentation: ug --- -# Scheduling Tasks in Blazor Gantt Chart Component +# Task scheduling in Blazor Gantt Chart Component -By default, Gantt tasks are validated based on the child tasks with some factors like working time, holidays, weekends, and predecessors. The Gantt provides support for automatic and manual task scheduling modes. It is used to indicate whether the start date and end date of all the tasks will be automatically validated or not. `TaskMode` is the property used to change the schedule mode of a task. +The Gantt provides support for automatic and manual task scheduling modes. It is used to indicate whether the start date and end date of all the tasks will be automatically validated or not. [TaskMode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_TaskMode) is the property used to change the schedule mode of a task. -The Gantt Chart component supports three types of modes. They are: +The Gantt control supports three types of mode. They are: -* `Auto`: All the tasks will be automatically validated. -* `Manual`: All the tasks will be manually validated by the user. -* `Custom`: Tasks will be validated as Auto or Manual based on the value mapped in the data source. +* **Auto**: All the tasks are automatically validate. +* **Manual**: All the tasks are manually validate by the user. +* **Custom**: Both Auto and Manual tasks are render by mapped from data source. -N> The default value of `TaskMode` is `Auto`. +> The default value of [TaskMode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_TaskMode) is **Auto**. ## Automatically scheduled tasks -When the `TaskMode` property is set as `Auto`, the start date and end date of all the tasks in the project will be automatically validated. That is, dates will be validated based on various factors such as working time, holidays, weekends, and predecessors. +When the [TaskMode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_TaskMode) property is set as **Auto**, the start date and end date of all the tasks in the project will be automatically validated. That is, dates are validated based on various factors such as working time, holidays, weekends and predecessors. -```cshtml +In auto scheduling mode, the parent taskbar will be rendered according to the minimum start date and maximum end date of its child records, irrespective of the dates provided to it in the data source. + +If a child task is updated, the parent task’s start and end dates are automatically updated to reflect the changes. The parent task’s progress is also updated based on the progress of its child tasks. Therefore, you cannot edit the parent taskbar's fields such as progress, endDate, as the parent taskbar is generated based on its subtasks. + +The rendering of the parent taskbar in auto-scheduling mode also takes into account the dependencies between tasks. If a child task is dependent on another task, the parent task’s start date and end date will be adjusted accordingly to ensure that the child task is not scheduled to start before its predecessor is completed. + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} @using Syncfusion.Blazor.Gantt - + @@ -42,42 +49,50 @@ When the `TaskMode` property is set as `Auto`, the start date and end date of al } public class TaskData { - public int TaskId { get; set; } + public int TaskID { get; set; } public string TaskName { get; set; } public DateTime StartDate { get; set; } public DateTime? EndDate { get; set; } public string Duration { get; set; } public int Progress { get; set; } - public int? ParentId { get; set; } + public int? ParentID { get; set; } } private static List GetTaskCollection() { List Tasks = new List() { - new TaskData() { TaskId = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 01, 04), EndDate = new DateTime(2022, 01, 17), }, - new TaskData() { TaskId = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 01, 04), Duration = "2", Progress = 30, ParentId = 1, }, - new TaskData() { TaskId = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 01, 04), Duration = "4", Progress = 40, ParentId = 1, }, - new TaskData() { TaskId = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 01, 04), Duration = "1", Progress = 30, ParentId = 1, }, - new TaskData() { TaskId = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 01, 04), EndDate = new DateTime(2022, 01, 17), }, - new TaskData() { TaskId = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 01, 06), Duration = "3", Progress = 30, ParentId = 5, }, - new TaskData() { TaskId = 7, TaskName = "List materials", StartDate = new DateTime(2022, 01, 06), Duration = "3", Progress = 40, ParentId = 5, }, - new TaskData() { TaskId = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 01, 06), Duration = "2", Progress = 30, ParentId = 5, } + new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 01, 04), EndDate = new DateTime(2022, 01, 07), }, + new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 01, 04), Duration = "2", Progress = 30, ParentID = 1, }, + new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 01, 04), Duration = "4", Progress = 40, ParentID = 1, }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 01, 04), Duration = "1", Progress = 30, ParentID = 1, }, + new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 01, 06), EndDate = new DateTime(2022, 01, 10), }, + new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 01, 06), Duration = "3", Progress = 30, ParentID = 5, }, + new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 01, 06), Duration = "3", Progress = 40, ParentID = 5, }, + new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 01, 06), Duration = "2", Progress = 30, ParentID = 5, } }; return Tasks; } } -``` + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/BZrSMNCShfHotWhE?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} ## Manually scheduled tasks -When the `TaskMode` property is set as `Manual`, the start date and end date of all the tasks in the project will be the same as given in the data source. That is, dates will not be validated based on factors such as dependencies between tasks, holidays, weekends, working time. You can restrict this mode in predecessor validation alone. That is, you can automatically validate the dates based on predecessor values by enabling the [ValidateManualTasksOnLinking](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_ValidateManualTasksOnLinking) property. +When the [TaskMode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_TaskMode) property is set as **Manual**, the start date and end date of all the tasks in the project will be same as given in the data source. That is, dates are not validated based on various factors such as dependencies between tasks, holidays, weekends, working time. + +We can restrict this mode in predecessor validation alone. That is, we can automatically validate the dates based on predecessor values by enabling the [ValidateManualTasksOnLinking](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_ValidateManualTasksOnLinking) property. + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} -```cshtml @using Syncfusion.Blazor.Gantt - + @@ -90,43 +105,47 @@ When the `TaskMode` property is set as `Manual`, the start date and end date of } public class TaskData { - public int TaskId { get; set; } + public int TaskID { get; set; } public string TaskName { get; set; } public DateTime StartDate { get; set; } public DateTime? EndDate { get; set; } public string Duration { get; set; } public int Progress { get; set; } - public int? ParentId { get; set; } + public int? ParentID { get; set; } } private static List GetTaskCollection() { List Tasks = new List() { - new TaskData() { TaskId = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 01, 04), EndDate = new DateTime(2022, 01, 08), }, - new TaskData() { TaskId = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 01, 06), Duration = "4", Progress = 30, ParentId = 1, }, - new TaskData() { TaskId = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 01, 06), Duration = "4", Progress = 40, ParentId = 1, }, - new TaskData() { TaskId = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 01, 06), Duration = "3", Progress = 30, ParentId = 1, }, - new TaskData() { TaskId = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 01, 06), EndDate = new DateTime(2022, 01, 07), }, - new TaskData() { TaskId = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 01, 05), Duration = "3", Progress = 30, ParentId = 5, }, - new TaskData() { TaskId = 7, TaskName = "List materials", StartDate = new DateTime(2022, 01, 06), Duration = "3", Progress = 40, ParentId = 5, }, - new TaskData() { TaskId = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 01, 06), Duration = "3", Progress = 30, ParentId = 5, } + new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 01, 01), EndDate = new DateTime(2022, 01, 09), }, + new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 01, 06), Duration = "4", Progress = 30, ParentID = 1, }, + new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 01, 06), Duration = "4", Progress = 40, ParentID = 1, }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 01, 06), Duration = "3", Progress = 30, ParentID = 1, }, + new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 01, 05), EndDate = new DateTime(2022, 01, 08), }, + new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 01, 05), Duration = "3", Progress = 30, ParentID = 5, }, + new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 01, 06), Duration = "3", Progress = 40, ParentID = 5, }, + new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 01, 06), Duration = "3", Progress = 30, ParentID = 5, } }; return Tasks; } } -``` -![Blazor Gantt Chart displays Manual Schedule Task](images/blazor-gantt-chart-manual-schedule-task.png) +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/VtBosNWSLzYVIouF?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} ## Custom -If you want to use some specific task mode for specific tasks, then you can set the `TaskMode` property as `Custom`. So, the scheduling mode for each task will be mapped from the data source field. The `Boolean` property [GanttTaskFields.Manual](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttTaskFields.html#Syncfusion_Blazor_Gantt_GanttTaskFields_Manual) is used to map the manual scheduling mode field from the data source. +When the [TaskMode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_TaskMode) property is set as **Custom**, the scheduling mode for each tasks will be mapped from the data source field. The `Boolean` property [GanttTaskFields.Manual](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttTaskFields.html#Syncfusion_Blazor_Gantt_GanttTaskFields_Manual) is used to map the manual scheduling mode field from the data source. + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} -```cshtml @using Syncfusion.Blazor.Gantt - + @@ -139,13 +158,13 @@ If you want to use some specific task mode for specific tasks, then you can set } public class TaskData { - public int TaskId { get; set; } + public int TaskID { get; set; } public string TaskName { get; set; } public DateTime StartDate { get; set; } public DateTime? EndDate { get; set; } public string Duration { get; set; } public int Progress { get; set; } - public int? ParentId { get; set; } + public int? ParentID { get; set; } public bool IsManual { get; set; } } @@ -153,55 +172,49 @@ If you want to use some specific task mode for specific tasks, then you can set { List Tasks = new List() { - new TaskData() { TaskId = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 01, 04), EndDate = new DateTime(2022, 01, 17), }, - new TaskData() { TaskId = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 01, 04), Duration = "3", Progress = 30, ParentId = 1, IsManual= true , }, - new TaskData() { TaskId = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 01, 04), Duration = "4", Progress = 40, ParentId = 1, IsManual= true }, - new TaskData() { TaskId = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 01, 04), Duration = "3", Progress = 30, ParentId = 1, }, - new TaskData() { TaskId = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 01, 04), EndDate = new DateTime(2022, 01, 17), IsManual= true }, - new TaskData() { TaskId = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 01, 06), Duration = "3", Progress = 30, ParentId = 5, }, - new TaskData() { TaskId = 7, TaskName = "List materials", StartDate = new DateTime(2022, 01, 06), Duration = "3", Progress = 40, ParentId = 5, }, - new TaskData() { TaskId = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 01, 06), Duration = "3", Progress = 30, ParentId = 5, IsManual= true } + new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 01, 04), EndDate = new DateTime(2022, 01, 07), }, + new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 01, 04), Duration = "3", Progress = 30, ParentID = 1, IsManual= true , }, + new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 01, 04), Duration = "4", Progress = 40, ParentID = 1, IsManual= true }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 01, 04), Duration = "3", Progress = 30, ParentID = 1, }, + new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 01, 06), EndDate = new DateTime(2022, 01, 10), IsManual= true }, + new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 01, 06), Duration = "3", Progress = 30, ParentID = 5, }, + new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 01, 06), Duration = "3", Progress = 40, ParentID = 5, }, + new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 01, 06), Duration = "3", Progress = 30, ParentID = 5, IsManual= true } }; return Tasks; } } -``` +{% endhighlight %} +{% endtabs %} -![Blazor Gantt Chart with Custom Scheduled Task](images/blazor-gantt-chart-custom-schedule-task.png) +{% previewsample "https://blazorplayground.syncfusion.com/embed/hjLSCjWyVIMRWTuf?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} ## Unscheduled tasks -Unscheduled tasks are planned for a project without any definite schedule dates. The Gantt Chart component supports rendering the unscheduled tasks. You can create or update the tasks with anyone of start date, end date, and duration values or none. You can enable or disable the unscheduled tasks by using the [AllowUnscheduledTasks](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_AllowUnscheduledTasks) property. The following images represent the various types of unscheduled tasks in Gantt Chart. - -### Start date only - -![Blazor Gantt Chart with Start Date Task](images/blazor-gantt-chart-start-date-task.png) - -### End date only +Unscheduled tasks are planned for a project without any definite schedule dates. The Gantt control supports rendering the unscheduled tasks. You can create or update the tasks with anyone of start date, end date, and duration values or none. You can enable or disable the unscheduled tasks by using the [AllowUnscheduledTasks](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_AllowUnscheduledTasks) property. The following images represent the various types of unscheduled tasks in Gantt. -![Blazor Gantt Chart with End Date Task](images/blazor-gantt-chart-end-date-task.png) +Taskbar state |Auto |Manual +-----|-----|----- +`Start Date Only` | ![Blazor Gantt Chart with Start Date Task](images/blazor-gantt-chart-start-date-task.png) | ![Alt text](images/startDate-manual.png) +`End Date Only` | ![Blazor Gantt Chart with End Date Task](images/blazor-gantt-chart-end-date-task.png) | ![Alt text](images/endDate-manual.png) +`Duration Only` | ![Blazot Gantt Chart with Duration Task](images/blazor-gantt-chart-duration-task.png) | ![Alt text](images/duration-manual.png) +`Milestone`| ![Blazor Gantt Chart with Milestone Task](images/blazor-gantt-chart-milestone-task.png) | ![Blazor Gantt Chart with Milestone Task](images/blazor-gantt-chart-milestone-task.png) -### Duration only - -![Blazot Gantt Chart with Duration Task](images/blazor-gantt-chart-duration-task.png) - -### Milestone - -A milestone is a task that has no start and end dates, but it has a duration value of zero. It is represented as follows. - -![Blazor Gantt Chart with Milestone Task](images/blazor-gantt-chart-milestone-task.png) +> A milestone is a task that has no start and end dates, but it has a duration value of zero. ## Define unscheduled tasks in data source You can define the various types of unscheduled tasks in the data source as follows -```cshtml +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + @using Syncfusion.Blazor.Gantt - + @@ -213,45 +226,49 @@ You can define the various types of unscheduled tasks in the data source as foll } public class TaskData { - public int TaskId { get; set; } + public int TaskID { get; set; } public string TaskName { get; set; } public DateTime? StartDate { get; set; } public DateTime? EndDate { get; set; } public string Duration { get; set; } public int Progress { get; set; } - public int? ParentId { get; set; } + public int? ParentID { get; set; } } private static List GetTaskCollection() { List Tasks = new List() { - new TaskData() { TaskId = 1, TaskName = "Project initiation", Duration = "4", }, - new TaskData() { TaskId = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 01, 04), }, - new TaskData() { TaskId = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 01, 07), }, - new TaskData() { TaskId = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 01, 04), EndDate = new DateTime(2022, 01, 08), Progress = 30, }, - new TaskData() { TaskId = 5, TaskName = "Project estimation", Duration = "0"} + new TaskData() { TaskID = 1, TaskName = "Project initiation", Duration = "4", }, + new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 01, 04), }, + new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 01, 07), }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 01, 04), EndDate = new DateTime(2022, 01, 07), Progress = 30, }, + new TaskData() { TaskID = 5, TaskName = "Project estimation", Duration = "0"} }; return Tasks; } } -``` -![Blazor Gantt Chart displays Unscheduled Task](images/blazor-gantt-chart-unscheduled-tasks.png) +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/LZhSsXMyhygtBxWx?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -N> If the [AllowUnscheduledTasks](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_AllowUnscheduledTasks) property is set to false, then the Gantt Chart component automatically calculates the scheduled date values with a default value of duration 1 and the project start date is considered as the start date for the task. +> If the [AllowUnscheduledTasks](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_AllowUnscheduledTasks) property is set to **false**, then the Gantt Chart Component automatically calculates the scheduled date values with a default value of duration 1 and the project start date is considered as the start date for the task. ## Working time range -In the Gantt Chart component, working hours in a day for a project can be defined by using the [GanttDayWorkingTime](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttDayWorkingTimeCollection.html#Syncfusion_Blazor_Gantt_GanttDayWorkingTimeCollection_DayWorkingTime) property. Based on the working hours, automatic date scheduling and duration validations for a task are performed. +In the Gantt Chart component, working hours for all days of a project can be defined by using the [GanttDayWorkingTime](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttDayWorkingTimeCollection.html#Syncfusion_Blazor_Gantt_GanttDayWorkingTimeCollection_DayWorkingTime) property. Based on the working hours, automatic date scheduling and duration validations for a task are performed. -The following code snippet explains how to define the working time range for the project in Gantt Chart. +The following code snippet explains how to define the working time range for the project in Gantt. + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} -```cshtml @using Syncfusion.Blazor.Gantt - + @@ -270,49 +287,51 @@ The following code snippet explains how to define the working time range for the } public class TaskData { - public int TaskId { get; set; } + public int TaskID { get; set; } public string TaskName { get; set; } public DateTime StartDate { get; set; } public DateTime? EndDate { get; set; } public string Duration { get; set; } public int Progress { get; set; } - public int? ParentId { get; set; } + public int? ParentID { get; set; } } private static List GetTaskCollection() { List Tasks = new List() { - new TaskData() { TaskId = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 01, 04), EndDate = new DateTime(2022, 01, 23), }, - new TaskData() { TaskId = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 01, 04), Duration = "1", Progress = 70, ParentId = 1, }, - new TaskData() { TaskId = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 01, 04), Duration = "1", Progress = 50, ParentId = 1, }, - new TaskData() { TaskId = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 01, 04), Duration = "1", Progress = 50, ParentId = 1, }, - new TaskData() { TaskId = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 01, 04), EndDate = new DateTime(2022, 01, 23), }, - new TaskData() { TaskId = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 01, 06), Duration = "1", Progress = 70, ParentId = 5, }, - new TaskData() { TaskId = 7, TaskName = "List materials", StartDate = new DateTime(2022, 01, 06), Duration = "1", Progress = 50, ParentId = 5, } + new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 01, 04), EndDate = new DateTime(2022, 01, 04), }, + new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 01, 04), Duration = "1", Progress = 70, ParentID = 1, }, + new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 01, 04), Duration = "1", Progress = 50, ParentID = 1, }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 01, 04), Duration = "1", Progress = 50, ParentID = 1, }, + new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 01, 06), EndDate = new DateTime(2022, 01, 06), }, + new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 01, 06), Duration = "1", Progress = 70, ParentID = 5, }, + new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 01, 06), Duration = "1", Progress = 50, ParentID = 5, } }; return Tasks; } } -``` -The following screenshot shows working time range in Gantt Chart component. +{% endhighlight %} +{% endtabs %} -![Blazor Gantt Chart displays Working Time Range](images/blazor-gantt-chart-working-time-range.png) +{% previewsample "https://blazorplayground.syncfusion.com/embed/hNLeWjiyhepokIyz?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -N>* Individual tasks can lie between any time within the defined working time range of the project. -
* The [GanttDayWorkingTime](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttDayWorkingTimeCollection.html#Syncfusion_Blazor_Gantt_GanttDayWorkingTimeCollection_DayWorkingTime) property is used to define the working time for the whole project. +>* Individual tasks can lie between any time within the defined working time range of the project. +>* The [GanttDayWorkingTime](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttDayWorkingTimeCollection.html#Syncfusion_Blazor_Gantt_GanttDayWorkingTimeCollection_DayWorkingTime) property is used to define the working time for the whole project. ## Weekend or non-working days -Non-working days/weekends are used to represent the non-productive days in a project. You can exclude the non-working days in a work week using the `WorkWeek` property in Gantt Chart. +Non-working days/weekend are used to represent the non-productive days in a project. You can define the non-working days in a week using the [WorkWeek](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_WorkWeek) property in Gantt. + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} -```cshtml @using Syncfusion.Blazor.Gantt - + @@ -324,60 +343,64 @@ Non-working days/weekends are used to represent the non-productive days in a pro } public class TaskData { - public int TaskId { get; set; } + public int TaskID { get; set; } public string TaskName { get; set; } public DateTime StartDate { get; set; } public DateTime? EndDate { get; set; } public string Duration { get; set; } public int Progress { get; set; } - public int? ParentId { get; set; } + public int? ParentID { get; set; } } private static List GetTaskCollection() { List Tasks = new List() { - new TaskData() { TaskId = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 01, 04), EndDate = new DateTime(2022, 01, 17), }, - new TaskData() { TaskId = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 01, 04), Duration = "0", Progress = 30, ParentId = 1, }, - new TaskData() { TaskId = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 01, 04), Duration = "4", Progress = 40, ParentId = 1, }, - new TaskData() { TaskId = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 01, 04), Duration = "0", Progress = 30, ParentId = 1, }, - new TaskData() { TaskId = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 01, 04), EndDate = new DateTime(2022, 01, 17), }, - new TaskData() { TaskId = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 01, 06), Duration = "3", Progress = 30, ParentId = 5, }, - new TaskData() { TaskId = 7, TaskName = "List materials", StartDate = new DateTime(2022, 01, 06), Duration = "3", Progress = 40, ParentId = 5, }, - new TaskData() { TaskId = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 01, 06), Duration = "0", Progress = 30, ParentId = 5, } + new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 01, 04), EndDate = new DateTime(2022, 01, 09), }, + new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 01, 04), Duration = "0", Progress = 30, ParentID = 1, }, + new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 01, 04), Duration = "4", Progress = 40, ParentID = 1, }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 01, 04), Duration = "0", Progress = 30, ParentID = 1, }, + new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 01, 06), EndDate = new DateTime(2022, 01, 10), }, + new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 01, 06), Duration = "3", Progress = 30, ParentID = 5, }, + new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 01, 06), Duration = "3", Progress = 40, ParentID = 5, }, + new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 01, 06), Duration = "0", Progress = 30, ParentID = 5, } }; return Tasks; } } -``` -![Changing Work Week Schedule in Blazor Gantt Chart](images/blazor-gantt-chart-change-work-week.png) +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/hjBSsjsoByxMWadO?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -N> By default, Saturdays and Sundays are considered as non-working days/weekend in a project. -
In the Gantt Chart component, you can make weekend as working day by setting the `IncludeWeekend` property to `true`. +> By default, Saturdays and Sundays are considered as non-working days/weekend in a project. +> In the Gantt control, you can make weekend as working day by setting the [IncludeWeekend](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_IncludeWeekend) property to **true**`. ## Duration unit -In Gantt Chart, the tasks’ duration value can be measured by the following duration units, +In Gantt Chart, the task's duration value can be measured by the following duration units, * Day * Hour * Minute -In Gantt Chart, you can define the duration unit for the whole project by using the [GanttTaskFields.DurationUnit](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_DurationUnit) property. When you define the value for this property, this unit will be applied for all tasks that do not have a duration unit value. And each task in the project can be defined with different duration units and the duration unit of a task can be defined in the following ways, +In Gantt, we can define duration unit for whole project by using [GanttTaskFields.DurationUnit](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_DurationUnit) property, when we defines the value for this property, this unit will be applied for all task which don't has duration unit value. And each task in the project can be defined with different duration units and the duration unit of a task can be defined by the following ways, -* Using `GanttTaskFields.DurationUnit` property, to map the duration unit data source field. +* Using `DurationUnit` property, to map the duration unit data source field. * Defining the duration unit value along with the duration field in the data source. ### Mapping the duration unit field -The following code snippet explains the mapping of duration unit data source field to the Gantt Chart component using the `GanttTaskFields.DurationUnit` property. +The below code snippet explains the mapping of duration unit data source field to the Gantt control using the [GanttTaskFields.DurationUnit](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_DurationUnit) property. + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} -```cshtml @using Syncfusion.Blazor.Gantt - + @@ -390,14 +413,14 @@ The following code snippet explains the mapping of duration unit data source fie public class TaskData { - public int TaskId { get; set; } + public int TaskID { get; set; } public string TaskName { get; set; } public DateTime StartDate { get; set; } public DateTime EndDate { get; set; } public string Duration { get; set; } public int Progress { get; set; } public string DurationUnit { get; set; } - public int? ParentId { get; set; } + public int? ParentID { get; set; } } @@ -405,33 +428,37 @@ The following code snippet explains the mapping of duration unit data source fie { List Tasks = new List() { - new TaskData() { TaskId = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 01, 04), EndDate = new DateTime(2022, 01, 17), }, - new TaskData() { TaskId = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 01, 04), Duration = "4", Progress = 70, ParentId = 1, DurationUnit = "day" }, - new TaskData() { TaskId = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 01, 04), Duration = "4", Progress = 50, ParentId = 1, DurationUnit = "hour" }, - new TaskData() { TaskId = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 01, 04), Duration = "480", Progress = 30, ParentId = 1, DurationUnit = "minute" }, - new TaskData() { TaskId = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 01, 04), EndDate = new DateTime(2022, 01, 17), }, - new TaskData() { TaskId = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 01, 06), Duration = "3", Progress = 30, ParentId = 5, DurationUnit = "hour" }, - new TaskData() { TaskId = 7, TaskName = "List materials", StartDate = new DateTime(2022, 01, 06), Duration = "3", Progress = 40, ParentId = 5, DurationUnit = "day" }, - new TaskData() { TaskId = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 01, 06), Duration = "0", Progress = 30, ParentId = 5, } + new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 01, 04), EndDate = new DateTime(2022, 01, 07), }, + new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 01, 04), Duration = "4", Progress = 70, ParentID = 1, DurationUnit = "day" }, + new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 01, 04), Duration = "4", Progress = 50, ParentID = 1, DurationUnit = "hour" }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 01, 04), Duration = "480", Progress = 30, ParentID = 1, DurationUnit = "minute" }, + new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 01, 06), EndDate = new DateTime(2022, 01, 10), }, + new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 01, 06), Duration = "3", Progress = 30, ParentID = 5, DurationUnit = "hour" }, + new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 01, 06), Duration = "3", Progress = 40, ParentID = 5, DurationUnit = "day" }, + new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 01, 06), Duration = "0", Progress = 30, ParentID = 5, } }; return Tasks; } } -``` -![Blazor Gantt Chart with Duration Unit](images/blazor-gantt-chart-duration-units.png) +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/VNBoCNsehHsMykiH?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -N> The default value of the `DurationUnit` property is `day`. +> The default value of the [GanttTaskFields.DurationUnit](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_DurationUnit) property is `day`. ### Defining duration unit along with duration field -Duration units for the tasks can also be defined along with the duration values. The following code snippet explains the duration unit for a task along with duration value, +Duration units for the tasks can also be defined along with the duration values, the below code snippet explains the duration unit for a task along with duration value. + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} -```cshtml @using Syncfusion.Blazor.Gantt - + @@ -444,13 +471,13 @@ Duration units for the tasks can also be defined along with the duration values. public class TaskData { - public int TaskId { get; set; } + public int TaskID { get; set; } public string TaskName { get; set; } public DateTime StartDate { get; set; } public DateTime EndDate { get; set; } public string Duration { get; set; } public int Progress { get; set; } - public int? ParentId { get; set; } + public int? ParentID { get; set; } } @@ -458,22 +485,23 @@ Duration units for the tasks can also be defined along with the duration values. { List Tasks = new List() { - new TaskData() { TaskId = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 01, 04), EndDate = new DateTime(2022, 01, 17), }, - new TaskData() { TaskId = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 01, 04), Duration = "3days", Progress = 70, ParentId = 1, }, - new TaskData() { TaskId = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 01, 04), Duration = "12hours", Progress = 50, ParentId = 1, }, - new TaskData() { TaskId = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 01, 04), Duration = "1800minutes", Progress = 30, ParentId = 1, }, - new TaskData() { TaskId = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 01, 04), EndDate = new DateTime(2022, 01, 17), }, - new TaskData() { TaskId = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 01, 06), Duration = "480minutes", Progress = 30, ParentId = 5, }, - new TaskData() { TaskId = 7, TaskName = "List materials", StartDate = new DateTime(2022, 01, 06), Duration = "3days", Progress = 40, ParentId = 5, }, + new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 01, 04), EndDate = new DateTime(2022, 01, 07), }, + new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 01, 04), Duration = "3days", Progress = 70, ParentID = 1, }, + new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 01, 04), Duration = "12hours", Progress = 50, ParentID = 1, }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 01, 04), Duration = "1800minutes", Progress = 30, ParentID = 1, }, + new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 01, 06), EndDate = new DateTime(2022, 01, 10), }, + new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 01, 06), Duration = "480minutes", Progress = 30, ParentID = 5, }, + new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 01, 06), Duration = "3days", Progress = 40, ParentID = 5, }, }; return Tasks; } } -``` -![Blazor Gantt Chart with Duration Units](images/blazor-gantt-chart-duration-unit.png) +{% endhighlight %} +{% endtabs %} -N> The edit type of the duration column in Gantt Chart is string, to support editing the duration field along with duration units. +{% previewsample "https://blazorplayground.syncfusion.com/embed/LNheMDCeVHrVxHgU?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} +> The edit type of the duration column in Gantt Chart is string, to support editing the duration field along with duration units. -N> You can refer to our [Blazor Gantt Chart](https://www.syncfusion.com/blazor-components/blazor-gantt-chart) feature tour page for its groundbreaking feature representations. You can also explore our [Blazor Gantt Chart example](https://blazor.syncfusion.com/demos/gantt-chart/default-functionalities?theme=bootstrap5) to know how to render and configure the Gantt. \ No newline at end of file +> You can refer to our [Blazor Gantt Chart](https://www.syncfusion.com/blazor-components/blazor-gantt-chart) feature tour page for its groundbreaking feature representations. You can also explore our [Blazor Gantt Chart example](https://blazor.syncfusion.com/demos/gantt-chart/default-functionalities?theme=bootstrap5) to know how to render and configure the Gantt. \ No newline at end of file diff --git a/blazor/gantt-chart/splitter.md b/blazor/gantt-chart/splitter.md index 0d32efe542..0816fe6b77 100644 --- a/blazor/gantt-chart/splitter.md +++ b/blazor/gantt-chart/splitter.md @@ -1,7 +1,7 @@ --- layout: post title: Splitter in Blazor Gantt Chart Component | Syncfusion -description: Checkout and learn here all about Splitter in Syncfusion Blazor Gantt Chart component and much more details. +description: Learn how to configure the splitter in the Syncfusion Blazor Gantt Chart component for flexible TreeGrid and Chart panel sizing. platform: Blazor control: Gantt Chart documentation: ug @@ -9,15 +9,13 @@ documentation: ug # Splitter in Blazor Gantt Chart Component -## Splitter +The splitter in the Blazor Gantt Chart component divides the TreeGrid (task data table) and Chart (timeline with taskbars) panels, enabling flexible width allocation for project visualization. Configured via the [GanttSplitterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttSplitterSettings.html) property, the splitter supports pixel or percentage-based positioning, column-based alignment, and predefined view modes. The [SetSplitterPosition](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_SetSplitterPositionAsync_System_Int32_) method adjusts positioning dynamically, while the [SplitterResizeStart](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEvents-1.html#Syncfusion_Blazor_Gantt_GanttEvents_1_SplitterResizeStart), [SplitterResizing](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEvents-1.html#Syncfusion_Blazor_Gantt_GanttEvents_1_SplitterResizing), and [SplitterResized](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEvents-1.html#Syncfusion_Blazor_Gantt_GanttEvents_1_SplitterResized) events handle resize interactions. The splitter includes ARIA labels for accessibility, ensuring screen reader compatibility, and adapts to responsive designs, though narrow screens may limit visible columns or timeline segments. By default, both panels are visible with equal width. -Gantt Chart component consists of both Tree Grid part and Chart part. Splitter is used to resize the Tree Grid section from the Chart section. You can change the position of the Splitter when loading the Gantt Chart component using the [SplitterSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttSelectionSettings.html) property. The following list defines possible values for this property: +## Configure splitter position -| **Splitter Properties** | **Description** | -| --- | --- | -| `GanttSplitterSettings.Position` | This property denotes the percentage of the Tree Grid section’s width to be rendered and this property supports both pixels and percentage values | -| `GanttSplitterSettings.ColumnIndex` | This property defines the splitter position as column index value | -| `GanttSplitterSettings.View` | * `Default`: Shows Grid side and Gantt Chart side.
* `Grid`: Shows Grid side alone in Gantt Chart.
* `Chart`: Shows chart side alone in Gantt Chart. | +Set the splitter position using [GanttSplitterSettings.Position](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttSplitterSettings.html#Syncfusion_Blazor_Gantt_GanttSplitterSettings_Position) with pixel (e.g., "300px") or percentage (e.g., "30%") values to define the TreeGrid pane width, or align to a column edge with [GanttSplitterSettings.ColumnIndex](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttSplitterSettings.html#Syncfusion_Blazor_Gantt_GanttSplitterSettings_ColumnIndex). + +The following example sets a percentage-based splitter position. This configuration allocates 80% width to the TreeGrid panel. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -71,11 +69,11 @@ Gantt Chart component consists of both Tree Grid part and Chart part. Splitter i {% previewsample "https://blazorplayground.syncfusion.com/embed/rtBIWNNaArlKXynp?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -## Change splitter position dynamically +## Adjust splitter position dynamically -In Gantt Chart, you can change the splitter position dynamically by using `SetSplitterPositionAsync` method. You can change the splitter position by passing value and type parameter to `SetSplitterPositionAsync` method. Type parameter will accept one of the following values 'Position', 'ColumnIndex', 'ViewType'. +Change the splitter position using the [SetSplitterPositionAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_SetSplitterPositionAsync_System_Int32_) method with pixel, percentage, or column index values, triggered by events like window resizing or button clicks. -The following code example shows how to use this method. +The following example adjusts the splitter dynamically: {% tabs %} {% highlight razor tabtitle="Index.razor" %} From 7955291c9c2c5f1a7e7cb1fa75a2d63b45a21693 Mon Sep 17 00:00:00 2001 From: NithyaSivaprakasam <103498896+NithyaSivaprakasam@users.noreply.github.com> Date: Fri, 31 Oct 2025 11:43:57 +0530 Subject: [PATCH 2/2] Enhance description for Gantt Chart task scheduling Updated the description to provide more details about task scheduling features. --- blazor/gantt-chart/scheduling-tasks.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/blazor/gantt-chart/scheduling-tasks.md b/blazor/gantt-chart/scheduling-tasks.md index f838359c64..976ee17d5a 100644 --- a/blazor/gantt-chart/scheduling-tasks.md +++ b/blazor/gantt-chart/scheduling-tasks.md @@ -1,7 +1,7 @@ --- layout: post title: Task scheduling in Blazor Gantt Chart Component | Syncfusion -description: Learn here all about Task scheduling in Syncfusion Blazor Gantt Chart component and more. +description: Learn task scheduling in Syncfusion Blazor Gantt Chart including automatic, manual, custom, and unscheduled tasks, milestones, and duration units. platform: Blazor control: Gantt Chart documentation: ug @@ -504,4 +504,4 @@ Duration units for the tasks can also be defined along with the duration values, > The edit type of the duration column in Gantt Chart is string, to support editing the duration field along with duration units. -> You can refer to our [Blazor Gantt Chart](https://www.syncfusion.com/blazor-components/blazor-gantt-chart) feature tour page for its groundbreaking feature representations. You can also explore our [Blazor Gantt Chart example](https://blazor.syncfusion.com/demos/gantt-chart/default-functionalities?theme=bootstrap5) to know how to render and configure the Gantt. \ No newline at end of file +> You can refer to our [Blazor Gantt Chart](https://www.syncfusion.com/blazor-components/blazor-gantt-chart) feature tour page for its groundbreaking feature representations. You can also explore our [Blazor Gantt Chart example](https://blazor.syncfusion.com/demos/gantt-chart/default-functionalities?theme=bootstrap5) to know how to render and configure the Gantt.