From 11a0cd41c77de23fa8514308b90cabb5c890c8b8 Mon Sep 17 00:00:00 2001 From: Nithya Date: Tue, 4 Nov 2025 18:25:22 +0530 Subject: [PATCH 1/2] 989389: Restored and updated content post revert in dev branch Signed-off-by: Nithya --- blazor-toc.html | 3 +- blazor/gantt-chart/cell-selection.md | 8 +- blazor/gantt-chart/criticalpath.md | 36 +- blazor/gantt-chart/customize-pdf-export.md | 1430 +++++++++++++++++ blazor/gantt-chart/data-markers.md | 28 +- blazor/gantt-chart/deleting-tasks.md | 16 +- blazor/gantt-chart/editing-tasks.md | 286 ++-- blazor/gantt-chart/event-markers.md | 61 +- blazor/gantt-chart/header-and-footer.md | 206 +++ .../open-add-edit-dialog-dynamically.md | 35 +- .../blazor-gantt-chart-combine-cells.png | Bin 30256 -> 0 bytes .../blazor-gantt-chart-event-markers.png | Bin 41281 -> 0 bytes .../images/blazor-gantt-chart-month-mode.png | Bin 37203 -> 0 bytes .../blazor-gantt-chart-open-edit-dialog.png | Bin 87489 -> 0 bytes blazor/gantt-chart/images/cell-edit.png | Bin 0 -> 29451 bytes blazor/gantt-chart/images/editing-dialog.png | Bin 0 -> 38540 bytes .../gantt-chart/images/user-interaction.png | Bin 0 -> 37572 bytes blazor/gantt-chart/labels.md | 53 +- blazor/gantt-chart/managing-tasks.md | 129 +- blazor/gantt-chart/pdf-export.md | 1230 +------------- blazor/gantt-chart/splitter.md | 2 +- blazor/gantt-chart/taskbar-editing.md | 110 +- blazor/gantt-chart/template-pdf-export.md | 378 ----- blazor/gantt-chart/tool-bar.md | 203 +-- .../gantt-chart/top-tier-and-bottom-tier.md | 177 +- blazor/gantt-chart/zooming.md | 196 ++- 26 files changed, 2483 insertions(+), 2104 deletions(-) create mode 100644 blazor/gantt-chart/customize-pdf-export.md create mode 100644 blazor/gantt-chart/header-and-footer.md delete mode 100644 blazor/gantt-chart/images/blazor-gantt-chart-combine-cells.png delete mode 100644 blazor/gantt-chart/images/blazor-gantt-chart-event-markers.png delete mode 100644 blazor/gantt-chart/images/blazor-gantt-chart-month-mode.png delete mode 100644 blazor/gantt-chart/images/blazor-gantt-chart-open-edit-dialog.png create mode 100644 blazor/gantt-chart/images/cell-edit.png create mode 100644 blazor/gantt-chart/images/editing-dialog.png create mode 100644 blazor/gantt-chart/images/user-interaction.png delete mode 100644 blazor/gantt-chart/template-pdf-export.md diff --git a/blazor-toc.html b/blazor-toc.html index 0752c13315..5eb0193b2a 100644 --- a/blazor-toc.html +++ b/blazor-toc.html @@ -3132,7 +3132,8 @@
  • Excel Export
  • PDF Export
  • Timezone
  • diff --git a/blazor/gantt-chart/cell-selection.md b/blazor/gantt-chart/cell-selection.md index 484e6b0311..b346f2282f 100644 --- a/blazor/gantt-chart/cell-selection.md +++ b/blazor/gantt-chart/cell-selection.md @@ -13,7 +13,7 @@ Cell selection in the Gantt Chart component enables interactive selection of spe ## Single cell selection -Single cell selection in the Gantt chart is enabled by setting [GanttSelectionSettings.Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttSelectionSettings.html#Syncfusion_Blazor_Gantt_GanttSelectionSettings_Mode) to **Cell** and [selectionSettings.type](https://ej2.syncfusion.com/angular/documentation/api/gantt/selectionSettings/#type) to **Single**. This allows selecting only one cell at a time. +Single cell selection in the Gantt chart is enabled by setting [GanttSelectionSettings.Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttSelectionSettings.html#Syncfusion_Blazor_Gantt_GanttSelectionSettings_Mode) to **Cell** and [SelectionSettings.Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttSelectionSettings.html#Syncfusion_Blazor_Gantt_GanttSelectionSettings_Type) to **Single**. This allows selecting only one cell at a time. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -70,7 +70,7 @@ Single cell selection in the Gantt chart is enabled by setting [GanttSelectionSe ## Multiple cell selection -Multiple cell selection in the Gantt Chart is enabled by setting [selectionSettings.mode](https://ej2.syncfusion.com/angular/documentation/api/gantt/selectionSettings/#mode) to **Cell** and [selectionSettings.type](https://ej2.syncfusion.com/angular/documentation/api/gantt/selectionSettings/#type) to **Multiple**. This allows selecting multiple cells at a time by holding the Ctrl key while clicking on each desired cell. +Multiple cell selection in the Gantt Chart is enabled by setting [selectionSettings.mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttSelectionSettings.html#Syncfusion_Blazor_Gantt_GanttSelectionSettings_Mode) to **Cell** and [SelectionSettings.Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttSelectionSettings.html#Syncfusion_Blazor_Gantt_GanttSelectionSettings_Type) to **Multiple**. This allows selecting multiple cells at a time by holding the Ctrl key while clicking on each desired cell. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -194,7 +194,7 @@ Select a specific cell in the Gantt Chart by calling the [SelectCellAsync](http ## Customize cell selection action -You may customize cell selection behavior in the Gantt Chart using [cellSelecting](https://ej2.syncfusion.com/angular/documentation/api/gantt/events/#cellselecting), [cellSelected](https://ej2.syncfusion.com/angular/documentation/api/gantt/events/#cellselected), [cellDeselecting](https://ej2.syncfusion.com/angular/documentation/api/gantt/events/#celldeselecting), and [cellDeselected](https://ej2.syncfusion.com/angular/documentation/api/gantt/events/#celldeselected) events. +You may customize cell selection behavior in the Gantt Chart using [CellSelecting](https://blazor.syncfusion.com/documentation/gantt-chart/events#cellselecting), [CellSelected](https://blazor.syncfusion.com/documentation/gantt-chart/events#cellselected), [CellDeselecting](https://blazor.syncfusion.com/documentation/gantt-chart/events#celldeselecting), and [CellDeselected](https://blazor.syncfusion.com/documentation/gantt-chart/events#celldeselected) events. The following sample demonstrates selection is canceled in the `cellSelecting` event when the **TaskName** is **Perform Soil test**. @@ -301,4 +301,4 @@ The following sample demonstrates selection is canceled in the `cellSelecting` e - [Accessibility in Blazor Gantt Chart](https://blazor.syncfusion.com/documentation/gantt-chart/accessibility) - [Blazor Gantt Chart Feature Tour](https://www.syncfusion.com/blazor-components/blazor-gantt-chart) -- [Blazor Gantt Chart Example](https://blazor.syncfusion.com/demos/gantt-chart/default-functionalities?theme=bootstrap5) +- [Blazor Gantt Chart Example](https://blazor.syncfusion.com/demos/gantt-chart/default-functionalities?theme=bootstrap5) \ No newline at end of file diff --git a/blazor/gantt-chart/criticalpath.md b/blazor/gantt-chart/criticalpath.md index 0ecca35627..95c5e1a9a7 100644 --- a/blazor/gantt-chart/criticalpath.md +++ b/blazor/gantt-chart/criticalpath.md @@ -1,19 +1,45 @@ --- layout: post title: Critical Path in Blazor Gantt Chart Component | Syncfusion -description: Checkout and learn here all about critical path in Syncfusion Blazor Gantt Chart component and much more details. +description: Learn here all about Critical path in Syncfusion Blazor Gantt Chart component and much more details. platform: Blazor -component: Gantt Chart +component: Critical path documentation: ug --- # Critical Path in Blazor Gantt Chart component -The critical path in a project is indicated by a single task or a series of tasks. If a task in critical path is delayed, the entire project will be delayed. A task is considered to be critical if any delay to this task would affect the project end date. +The critical path represents the longest sequence of dependent tasks that determines the minimum project duration. Tasks on the critical path have zero or negative [SlackValue](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttCriticalPathSettings.html#Syncfusion_Blazor_Gantt_GanttCriticalPathSettings_SlackValue) (float), meaning any delay in these tasks directly impacts the overall project completion date. The Blazor Gantt Chart component automatically calculates and highlights critical tasks in red with emphasized dependency connector lines when the [EnableCriticalPath](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_EnableCriticalPath) property is enabled. Critical path analysis helps identify which tasks require immediate attention and cannot be delayed without affecting project deadlines. -The critical path can be enabled in the Gantt Chart by using the built-in toolbar button or by setting the [EnableCriticalPath](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_EnableCriticalPath) property to true in the [SfGantt](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html) component. +## Understanding critical path calculation -The following code example shows how to display the critical path in the Gantt control: +The component uses Critical Path Method (CPM) principles to identify critical tasks through a comprehensive calculation process that analyzes task dependencies, timing relationships, and slack values to determine which tasks have no scheduling flexibility. A task becomes critical when it has zero or negative slack, meaning any delay (even by a minute) shifts the entire project end date. This occurs because critical tasks are linked through dependencies, creating a chain reaction where delays propagate across the dependency network, ultimately affecting the project completion date. + +**Project end date determination**: The calculation begins by determining the overall project end date. If the [ProjectEndDate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_ProjectEndDate) property is provided, it uses that value as the project completion reference. If `ProjectEndDate` is not specified, the component automatically calculates the project end date by examining all task end dates in the data source to find the latest completion point. This reference point determines how much delay each task can tolerate without affecting project completion. + +**Slack value calculation**: For each task, the component calculates slack by measuring the time difference between the task's end date and the project end date. Slack represents how much time a task can be delayed without affecting the project completion: +- **Zero slack**: The task must finish exactly on time. Any delay will push back the project end date, making it critical +- **Negative slack**: The task is already behind schedule or creates scheduling conflicts. This occurs when a task's end date is beyond the project end date, or when dependency relationships create impossible timing constraints. + +**Parent-Child task relationships**: In projects with hierarchical tasks, the critical path calculation focuses on dependencies rather than the parent-child structure used for task organization. For example, if Task 1.1 (a child task) depends on Task 2 (a parent task), only the tasks directly linked by the dependency are evaluated for criticality based on their timing. A parent task like Task 2 being critical does not automatically make its child tasks (e.g., Task 2.1, Task 2.2) critical, nor does a critical child task imply a critical parent. The component evaluates each task’s slack independently, ensuring that only tasks with zero or negative slack, driven by their dependency constraints, are marked as critical. This distinction allows precise identification of critical tasks without conflating organizational hierarchy with scheduling dependencies. + +**Dependency-based analysis**: The component analyzes different dependency relationship types to determine slack impacts: +- **Finish-to-Start**: When a predecessor task ends after its successor should start, negative slack results from the timing conflict +- **Start-to-Start**: When a predecessor starts after its successor should start, the component calculates negative slack based on scheduling impossibility +- **Finish-to-Finish** and **Start-to-Finish**: These relationships can also produce negative slack when timing conflicts exist between connected tasks +- **Offset and scheduling mode handling**: When dependencies include time offsets (e.g., "+2 days" or "-1 hour"), the component adjusts slack calculations by factoring in the offset duration. The calculation differs for automatically scheduled versus manually scheduled tasks: automatic tasks use forward and backward pass algorithms to compute slack, while manual tasks compare their end dates directly against the project completion date. + +**Progress consideration**: The component considers task completion progress. Only tasks with less than 100% progress can be marked as critical, since completed tasks cannot cause future delays. Tasks that end on or beyond the project end date automatically become critical regardless of their dependency relationships, as they directly determine the project completion timing. + +## Critical path setup and configuration + +The Critical Path feature in the Blazor Gantt component highlights tasks that directly impact the overall project completion date. To enable this functionality, ensure that the data source must contain tasks with valid start dates, end dates, and task dependencies properly mapped through the [Dependency](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttTaskFields.html#Syncfusion_Blazor_Gantt_GanttTaskFields_Dependency) field in [TaskFields](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttTaskFields.html). + +Enable critical path display by setting [EnableCriticalPath](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_EnableCriticalPath) to **true**, or add the `CriticalPath` option to the [Toolbar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_Toolbar) array to allow interactive toggling. The [GetCriticalTasks](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_Toolbar) method retrieves all tasks identified as critical at runtime. + +The critical path recalculates automatically when task properties change, including start and end dates, duration modifications, dependency updates, or progress adjustments. This ensures the visualization remains accurate throughout project management workflows. + +The following example demonstrates enabling critical path analysis: {% tabs %} {% highlight razor tabtitle="Index.razor" %} diff --git a/blazor/gantt-chart/customize-pdf-export.md b/blazor/gantt-chart/customize-pdf-export.md new file mode 100644 index 0000000000..50f00114bf --- /dev/null +++ b/blazor/gantt-chart/customize-pdf-export.md @@ -0,0 +1,1430 @@ +--- +layout: post +title: Customize PDF exporting in Blazor Gantt Chart component | Syncfusion +description: Learn here all about Customize PDF exporting in Syncfusion Blazor Gantt Chart component and much more. +platform: Blazor +control: Customize pdf export +documentation: ug +--- + +# To customize PDF export + +Customizing PDF export in the Blazor Gantt Chart component allows tailoring exported documents for specific needs, using [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html) to adjust file names, page orientation, size, columns, headers, footers, timelines, and templates. Ensuring focused content like selected rows or styled taskbars and [AllowPdfExport](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_AllowPdfExport) enabled. Use [PdfExporting](https://blazor.syncfusion.com/documentation/gantt-chart/events#pdfexporting) and [PdfExported](https://blazor.syncfusion.com/documentation/gantt-chart/events#pdfexported) events for pre-export and post-export modifications, and [PdfQueryTaskbarInfo](https://blazor.syncfusion.com/documentation/gantt-chart/events#pdfquerytaskbarinfo) for taskbar styling. + +## Customize file name + +Set the exported PDF file name using the [FileName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_FileName) property in [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html), such as **ProjectSchedule.pdf**, for personalized document naming. + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + +@using Syncfusion.Blazor.Gantt +@using Syncfusion.Blazor.Navigations + + + + + + + +@code { + private List TaskCollection { get; set; } + private SfGantt Gantt; + private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; + protected override void OnInitialized() + { + this.TaskCollection = GetTaskCollection(); + } + public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) + { + if (args.Item.Id == "PdfExport") + { + GanttPdfExportProperties exportProperties = new GanttPdfExportProperties(); + exportProperties.FileName = "ProjectSchedule.pdf"; + await Gantt.ExportToPdfAsync(exportProperties); + } + } + + public class TaskData + { + 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 string Predecessor { get; set; } + } + + public static List GetTaskCollection() + { + List Tasks = new List() + { + 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, Predecessor = "2" }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, + 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; + } +} + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/BjBSCZNAhALZXWKG?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +## How to change the page orientation + +You can customize the page orientation of the exported PDF document in the Blazor Gantt chart by using the [PageOrientation](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_PageOrientation) property in the [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html) class. +This property allows you to choose between [Portrait](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PageOrientation.html#Syncfusion_Blazor_Grids_PageOrientation_Portrait) (default) and [Landscape](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PageOrientation.html#Syncfusion_Blazor_Grids_PageOrientation_Landscape) orientations based on your layout requirements. Use `Portrait` for documents that require more vertical space, and `Landscape` when you need to fit more columns or wider taskbars. + +The following code snippet demonstrates how to set the page orientation to `Landscape` for the exported PDF document: + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + +@using Syncfusion.Blazor.Gantt +@using Syncfusion.Blazor.Navigations + + + + + + + +@code { + private List TaskCollection { get; set; } + private SfGantt Gantt; + private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; + protected override void OnInitialized() + { + this.TaskCollection = GetTaskCollection(); + } + public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) + { + if (args.Item.Id == "PdfExport") + { + GanttPdfExportProperties exportProperties = new GanttPdfExportProperties(); + exportProperties.PageOrientation = Syncfusion.Blazor.Grids.PageOrientation.Landscape; + await Gantt.ExportToPdfAsync(exportProperties); + } + } + + public class TaskData + { + 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 string Predecessor { get; set; } + } + + public static List GetTaskCollection() + { + List Tasks = new List() + { + 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, Predecessor = "2" }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, + 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; + } +} + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/BtVyMjNgBzDbCnDU?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +## Customize page size + +Page size can be customized for the exported document using the [PageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfPageSize.html) property in [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html). +The supported page sizes are: + +* Letter +* Note +* Legal +* A0 to A9 +* B0 to B5 +* Archa +* Archb +* Archc +* Archd +* Arche +* Flsa +* HalfLetter +* Letter11x17 +* Ledger + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + +@using Syncfusion.Blazor.Gantt +@using Syncfusion.Blazor.Navigations + + + + + + + +@code { + private List TaskCollection { get; set; } + private SfGantt Gantt; + private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; + protected override void OnInitialized() + { + this.TaskCollection = GetTaskCollection(); + } + public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) + { + if (args.Item.Id == "PdfExport") + { + GanttPdfExportProperties exportProperties = new GanttPdfExportProperties(); + exportProperties.PageSize = Syncfusion.Blazor.Grids.PdfPageSize.A4; + await Gantt.ExportToPdfAsync(exportProperties); + } + } + + public class TaskData + { + 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 string Predecessor { get; set; } + } + + public static List GetTaskCollection() + { + List Tasks = new List() + { + 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, Predecessor = "2" }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, + 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; + } +} + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/BNhyiZZKhzLBWLhu?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +## Export current view records + +The PDF export functionality allows you to export only the records that are currently visible on the Gantt chart to a PDF document. This can be achieved by enabling the [IsCurrentViewExport](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.PdfExportEventArgs.html#Syncfusion_Blazor_Gantt_PdfExportEventArgs_IsCurrentViewExport) boolean property in the [PdfExporting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEvents-1.html#Syncfusion_Blazor_Gantt_GanttEvents_1_PdfExporting) event. + +> Exporting current view records is only applicable when the virtualization feature is enabled, and it does not retain the state of collapsed rows during export. + +The following code demonstrates how to use the `PdfExporting` event to export the current view data of the Gantt chart to a PDF document: + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + +@using Syncfusion.Blazor.Gantt +@using Syncfusion.Blazor.Navigations + + + + + + + + + + + + + + + + + + + + +@code { + private SfGantt Gantt { get; set; } + private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; + private List TaskCollection { get; set; } + protected override void OnInitialized() + { + this.TaskCollection = VirtualData.GetTreeVirtualData(30); + } + public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) + { + if (args.Item.Id == "PdfExport") + { + await Gantt.ExportToPdfAsync(); + } + } + public void PdfExportingHandler(PdfExportEventArgs args) + { + args.IsCurrentViewExport = true; + } + public class VirtualData + { + public static List GetTreeVirtualData(int count) + { + List DataCollection = new List(); + Random rand = new Random(); + var x = 0; + int duration = 0; + DateTime startDate = new DateTime(2000, 1, 5); + DateTime endDate = new DateTime(2000, 1, 12); + string[] assignee = { "Allison Janney", "Bryan Fogel", "Richard King", "Alex Gibson" }; + string[] reporter = { "James Ivory", "Jordan Peele", "Guillermo del Toro", "Gary Oldman" }; + for (var i = 1; i <= count / 5; i++) + { + var name = rand.Next(0, 100); + TaskData Parent = new TaskData() + { + ID = ++x, + TaskName = "Task " + x, + StartDate = startDate, + EndDate = startDate.AddDays(26), + Duration = "20", + Assignee = "Mark Bridges", + Reporter = "Kobe Bryant", + Progress = 50, + }; + DataCollection.Add(Parent); + for (var j = 1; j <= 4; j++) + { + startDate = startDate.AddDays(j == 1 ? 0 : duration + 2); + duration = 5; + DataCollection.Add(new TaskData() + { + ID = ++x, + TaskName = "Task " + x, + StartDate = startDate, + EndDate = startDate.AddDays(5), + Duration = duration.ToString(), + Assignee = assignee[j - 1], + Reporter = reporter[j - 1], + Progress = 50, + ParentID = Parent.ID, + }); + } + } + return DataCollection; + } + } + public class TaskData + { + public int ID { get; set; } + public string TaskName { get; set; } + public DateTime? StartDate { get; set; } + public DateTime? EndDate { get; set; } + public string Duration { get; set; } + public string Assignee { get; set; } + public string Reporter { get; set; } + public int Progress { get; set; } + public int? ParentID { get; set; } + public string Predecessor { get; set; } + } +} + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/hjhyWjtqBfpHsisd?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +## How to export Gantt chart with custom timeline range + +The PDF export functionality allows you to export a specific timeline range of the Gantt chart to a PDF document. To define the custom range, set the [RangeStart](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.PdfExportEventArgs.html#Syncfusion_Blazor_Gantt_PdfExportEventArgs_RangeStart) and [RangeEnd](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.PdfExportEventArgs.html#Syncfusion_Blazor_Gantt_PdfExportEventArgs_RangeEnd) properties within the [PdfExporting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEvents-1.html#Syncfusion_Blazor_Gantt_GanttEvents_1_PdfExporting) event. + +The `RangeStart` property specifies the start date, and the `RangeEnd` property specifies the end date of the timeline range to be exported. + +The following code demonstrates how to use the `PdfExporting` event to export a custom timeline range of the Gantt chart to a PDF document: + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + +@using Syncfusion.Blazor.Gantt +@using Syncfusion.Blazor.Navigations + + + + + + + + + + + + + + + + + + + + +@code { + private SfGantt Gantt { get; set; } + private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; + private List TaskCollection { get; set; } + protected override void OnInitialized() + { + this.TaskCollection = VirtualData.GetTreeVirtualData(30); + } + public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) + { + if (args.Item.Id == "PdfExport") + { + await Gantt.ExportToPdfAsync(); + } + } + public void PdfExportingHandler(PdfExportEventArgs args) + { + args.RangeStart = new DateTime(2000, 1, 14); + args.RangeEnd = new DateTime(2000, 05, 12); + } + public class VirtualData + { + public static List GetTreeVirtualData(int count) + { + List DataCollection = new List(); + var x = 0; + int duration = 0; + DateTime startDate = new DateTime(2000, 1, 5); + DateTime endDate = new DateTime(2000, 1, 12); + string[] assignee = { "Allison Janney", "Bryan Fogel", "Richard King", "Alex Gibson" }; + string[] reporter = { "James Ivory", "Jordan Peele", "Guillermo del Toro", "Gary Oldman" }; + for (var i = 1; i <= count / 5; i++) + { + TaskData Parent = new TaskData() + { + ID = ++x, + TaskName = "Task " + x, + StartDate = startDate, + EndDate = startDate.AddDays(26), + Duration = "20", + Assignee = "Mark Bridges", + Reporter = "Kobe Bryant", + Progress = 50, + }; + DataCollection.Add(Parent); + for (var j = 1; j <= 4; j++) + { + startDate = startDate.AddDays(j == 1 ? 0 : duration + 2); + duration = 5; + DataCollection.Add(new TaskData() + { + ID = ++x, + TaskName = "Task " + x, + StartDate = startDate, + EndDate = startDate.AddDays(5), + Duration = duration.ToString(), + Assignee = assignee[j - 1], + Reporter = reporter[j - 1], + Progress = 50, + ParentID = Parent.ID, + }); + } + } + return DataCollection; + } + } + public class TaskData + { + public int ID { get; set; } + public string TaskName { get; set; } + public DateTime? StartDate { get; set; } + public DateTime? EndDate { get; set; } + public string Duration { get; set; } + public string Assignee { get; set; } + public string Reporter { get; set; } + public int Progress { get; set; } + public int? ParentID { get; set; } + public string Predecessor { get; set; } + } +} + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/rtByWjjUrpHrtFIB?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +## Export hidden columns + +PDF export provides an option to export hidden columns of Gantt by defining the [IncludeHiddenColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_IncludeHiddenColumn) to **true**. + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + +@using Syncfusion.Blazor.Gantt +@using Syncfusion.Blazor.Navigations + + + + + + + + + + + + + + + +@code { + private List TaskCollection { get; set; } + private SfGantt Gantt; + private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; + protected override void OnInitialized() + { + this.TaskCollection = GetTaskCollection(); + } + public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) + { + if (args.Item.Id == "PdfExport") + { + GanttPdfExportProperties exportProperties = new GanttPdfExportProperties(); + exportProperties.IncludeHiddenColumn = true; + await Gantt.ExportToPdfAsync(exportProperties); + } + } + + public class TaskData + { + 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 string Predecessor { get; set; } + } + + public static List GetTaskCollection() + { + List Tasks = new List() + { + 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, Predecessor = "2" }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, + 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; + } +} + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/VtreCNXgVTcKHkcY?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +## Customize column width in exported PDF document + +To customize column widths in the exported PDF document, set the [Width](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttColumn.html#Syncfusion_Blazor_Gantt_GanttColumn_Width) property for each column using the [Columns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html#Syncfusion_Blazor_Gantt_GanttPdfExportProperties_Columns) property of the [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html) class. + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + +@using Syncfusion.Blazor.Gantt +@using Syncfusion.Blazor.Grids +@using Syncfusion.Blazor.Navigations +@using Syncfusion.PdfExport + + + + + + + + + + + + + + + +@code { + private List TaskCollection { get; set; } + private SfGantt Gantt; + private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; + protected override void OnInitialized() + { + this.TaskCollection = GetTaskCollection(); + } + public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) + { + if (args.Item.Id == "PdfExport") + { + GanttPdfExportProperties exportProperties = new GanttPdfExportProperties(); + exportProperties.Columns = new List() + { + new GanttColumn(){ Field = "TaskID", HeaderText = "Task Id", Width = "200" }, + new GanttColumn(){ Field = "TaskName", HeaderText = "Task Name", Width = "250"}, + new GanttColumn(){ Field = "StartDate", HeaderText = "Start Date", Width = "150"}, + }; + await Gantt.ExportToPdfAsync(exportProperties); + } + } + + public class TaskData + { + 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 string Predecessor { get; set; } + } + + public static List GetTaskCollection() + { + List Tasks = new List() + { + 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, Predecessor = "2" }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, + 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; + } +} + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/LtBostXgrIjeKZvL?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +## How to export Gantt chart with specific columns + +### Through property + +The PDF export functionality enables you to export only specific columns from the Gantt chart, rather than exporting all columns by default. To achieve this, set the [Columns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html#Syncfusion_Blazor_Gantt_GanttPdfExportProperties_Columns) property of the [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html) class. This allows you to tailor the exported PDF to include only the columns that are relevant to your needs. + +The following code snippet demonstrates how to configure the `Columns` property to export specific columns from the Gantt chart to a PDF document: + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + +@using Syncfusion.Blazor.Gantt +@using Syncfusion.Blazor.Grids +@using Syncfusion.Blazor.Navigations +@using Syncfusion.PdfExport + + + + + + + + + + + + + + + +@code { + private List TaskCollection { get; set; } + private SfGantt Gantt; + private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; + protected override void OnInitialized() + { + this.TaskCollection = GetTaskCollection(); + } + public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) + { + if (args.Item.Id == "PdfExport") + { + GanttPdfExportProperties exportProperties = new GanttPdfExportProperties(); + exportProperties.Columns = new List() + { + new GanttColumn(){ Field = "TaskID", HeaderText = "Task Id", Width = "100" }, + new GanttColumn(){ Field = "TaskName", HeaderText = "Task Name", Width = "200"}, + new GanttColumn(){ Field = "StartDate", HeaderText = "Start Date", Width = "150"}, + }; + await Gantt.ExportToPdfAsync(exportProperties); + } + } + + public class TaskData + { + 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 string Predecessor { get; set; } + } + + public static List GetTaskCollection() + { + List Tasks = new List() + { + 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, Predecessor = "2" }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, + 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; + } +} + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/hXhIiXZAVoCQueAU?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +### Through event + +The PDF export functionality allows you to export only specific columns from the Gantt chart, rather than exporting all columns by default. This can be achieved by using the `Columns` argument in the [PdfExporting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEvents-1.html#Syncfusion_Blazor_Gantt_GanttEvents_1_PdfExporting) event. + +The following code demonstrates how to use the `PdfExporting` event to export specific columns of the Gantt chart to a PDF document, + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + +@using Syncfusion.Blazor.Gantt +@using Syncfusion.Blazor.Grids +@using Syncfusion.Blazor.Navigations +@using Syncfusion.PdfExport + + + + + + + + + + + + + + + +@code { + private List TaskCollection { get; set; } + private SfGantt Gantt; + private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; + protected override void OnInitialized() + { + this.TaskCollection = GetTaskCollection(); + } + public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) + { + if (args.Item.Id == "PdfExport") + { + await Gantt.ExportToPdfAsync(); + } + } + public void PdfExportingHandler(PdfExportEventArgs args) + { + args.Columns = new List() + { + new GanttColumn(){ Field = "TaskID", HeaderText = "Task Id", Width = "100" }, + new GanttColumn(){ Field = "TaskName", HeaderText = "Task Name", Width = "200"}, + new GanttColumn(){ Field = "StartDate", HeaderText = "Start Date", Width = "150"}, + }; + } + + public class TaskData + { + 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 string Predecessor { get; set; } + } + + public static List GetTaskCollection() + { + List Tasks = new List() + { + 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, Predecessor = "2" }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, + 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; + } +} + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/hXVoCjXAVSBmCcUQ?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +## Customizing taskbar appearance + +You can customize the appearance of taskbars in the exported PDF document using either properties or events, based on your requirements. + +### Through property + +The PDF export functionality allows you to customize the appearance of taskbars in the exported PDF document using the [TaskbarColor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.PdfGanttStyle.html#Syncfusion_Blazor_Gantt_PdfGanttStyle_TaskbarColor) property in the [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html) class. This property lets you define custom colors for different types of taskbars, including: + +* Parent Taskbars +* Child Taskbars +* Milestones +* Critical Paths +* Manual Taskbars +* Baselines + +The following code snippet demonstrates how to customize taskbar colors in the exported PDF document: + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + +@using Syncfusion.Blazor.Gantt +@using Syncfusion.Blazor.Grids +@using Syncfusion.Blazor.Navigations +@using Syncfusion.PdfExport + + + + + + + + + + + + + + +@code { + private List TaskCollection { get; set; } + private SfGantt Gantt; + private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; + protected override void OnInitialized() + { + this.TaskCollection = GetTaskCollection(); + } + public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) + { + if (args.Item.Id == "PdfExport") + { + GanttPdfExportProperties pdfExport = new GanttPdfExportProperties(); + pdfExport.Style = new PdfGanttStyle(); + pdfExport.Style.TaskbarColor = new PdfTaskbarColor(); + pdfExport.Style.TaskbarColor.ParentTaskbarColor = new PdfColor(220, 118, 51); + pdfExport.Style.TaskbarColor.ParentProgressColor = new PdfColor(203, 67, 53); + pdfExport.Style.TaskbarColor.ChildProgressColor = new PdfColor(35, 155, 86); + pdfExport.Style.TaskbarColor.ChildTaskbarColor = new PdfColor(130, 224, 170); + pdfExport.Style.TaskbarColor.CriticalPathTaskbarColor = new PdfColor(173, 121, 64); + pdfExport.Style.TaskbarColor.CriticalPathProgressColor = new PdfColor(145, 76, 0); + pdfExport.Style.TaskbarColor.BaselineColor = new PdfColor(179, 38, 30); + pdfExport.Style.TaskbarColor.MilestoneColor = new PdfColor(141, 124, 187); + await Gantt.ExportToPdfAsync(pdfExport); + } + } + + public class TaskData + { + public int TaskID { get; set; } + public string TaskName { get; set; } + public DateTime? BaselineStartDate { get; set; } + public DateTime? BaselineEndDate { 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 static List GetTaskCollection() + { + List Tasks = new List() + { + new TaskData() { TaskID = 1, TaskName = "Project initiation", BaselineStartDate = new DateTime(2021, 04, 02), BaselineEndDate = new DateTime(2021, 04, 04), StartDate = new DateTime(2021, 04, 02), EndDate = new DateTime(2021, 04, 08) }, + new TaskData() { TaskID = 2, TaskName = "Identify site location", StartDate = new DateTime(2021, 04, 02), EndDate = new DateTime(2021, 04, 02), Duration = "0", BaselineStartDate = new DateTime(2021, 04, 02), BaselineEndDate = new DateTime(2021, 04, 02), Progress = 30, ParentID = 1 }, + new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2021, 04, 02), Duration = "5", Progress = 40, BaselineStartDate = new DateTime(2021, 04, 02), BaselineEndDate = new DateTime(2021, 04, 06), ParentID = 1 }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2021, 04, 08), Duration = "0", EndDate = new DateTime(2021, 04, 08), BaselineStartDate = new DateTime(2021, 04, 08), BaselineEndDate = new DateTime(2021, 04, 08), Progress = 30, ParentID = 1 }, + new TaskData() { TaskID = 5, TaskName = "Project initiation", StartDate = new DateTime(2021, 04, 02), EndDate = new DateTime(2021, 04, 08) }, + new TaskData() { TaskID = 6, TaskName = "Identify site location", StartDate = new DateTime(2021, 04, 02), Duration = "2", Progress = 30, ParentID = 5, BaselineStartDate = new DateTime(2021, 04, 02), BaselineEndDate = new DateTime(2021, 04, 02) }, + new TaskData() { TaskID = 7, TaskName = "Perform soil test", StartDate = new DateTime(2021, 04, 02), Duration = "4", Progress = 40, ParentID = 5, BaselineStartDate = new DateTime(2021, 04, 02), BaselineEndDate = new DateTime(2021, 04, 03) }, + new TaskData() { TaskID = 8, TaskName = "Soil test approval", StartDate = new DateTime(2021, 04, 02), Duration = "5", Progress = 30, ParentID = 5, BaselineStartDate = new DateTime(2021, 04, 02), BaselineEndDate = new DateTime(2021, 04, 04) } + }; + return Tasks; + } +} + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/BXVyijDKBofOIgSk?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +### Through event + +The PDF export functionality allows you to customize the appearance of taskbars in the exported PDF document using the [PdfQueryTaskbarInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEvents-1.html#Syncfusion_Blazor_Gantt_GanttEvents_1_PdfQueryTaskbarInfo) event. This event provides flexibility to format various taskbar types, including parent taskbars, individual taskbars, and milestone templates. + +The following code snippet demonstrates how to use the `PdfQueryTaskbarInfo` event to customize taskbar appearance in the exported PDF document: + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + +@using Syncfusion.Blazor.Gantt +@using Syncfusion.Blazor.Grids +@using Syncfusion.Blazor.Navigations +@using Syncfusion.PdfExport + + + + + + + + + + + + + + + +@code { + private List TaskCollection { get; set; } + private SfGantt Gantt; + private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; + protected override void OnInitialized() + { + this.TaskCollection = GetTaskCollection(); + } + public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) + { + if (args.Item.Id == "PdfExport") + { + await Gantt.ExportToPdfAsync(); + } + } + public void PdfQueryTaskbarInfoHandler(PdfQueryTaskbarInfoEventArgs args) + { + if (args.Data.TaskID == 3) + { + args.TaskbarStyle.Color = new PdfTaskbarColor(); + args.TaskbarStyle.Color.ChildProgressColor = new Syncfusion.PdfExport.PdfColor(103, 80, 164); + args.TaskbarStyle.Color.ChildTaskbarColor = new Syncfusion.PdfExport.PdfColor(141, 124, 187); + } + if (args.Data.TaskID == 4) + { + args.TaskbarStyle.Color = new PdfTaskbarColor(); + args.TaskbarStyle.Color.MilestoneColor = new Syncfusion.PdfExport.PdfColor(103, 80, 164); + } + + } + public class TaskData + { + 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 string Predecessor { get; set; } + } + + public static List GetTaskCollection() + { + List Tasks = new List() + { + 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, Predecessor = "2" }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, + 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; + } +} + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/VDheittqhyxNSXIj?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +## Exporting with templates + +### Exporting with column template + +The PDF export functionality allows for advanced customization of Gantt chart columns, including the inclusion of images, background colors, and custom text. This can be achieved using the [PdfQueryCellInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEvents-1.html#Syncfusion_Blazor_Gantt_GanttEvents_1_PdfQueryCellInfo) event. By handling this event, you can define how individual cells in the Gantt chart are rendered in the exported PDF. + +The following code snippet demonstrates how to use the `PdfQueryCellInfo` event to export Gantt columns with custom text and different cell background colors, + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + +@using Syncfusion.Blazor.Gantt +@using Syncfusion.Blazor.Grids +@using Syncfusion.Blazor.Navigations +@using Syncfusion.PdfExport + + + + + + + + + + + + + + + +@code { + private List TaskCollection { get; set; } + private SfGantt Gantt; + private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; + protected override void OnInitialized() + { + this.TaskCollection = GetTaskCollection(); + } + public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) + { + if (args.Item.Id == "PdfExport") + { + await Gantt.ExportToPdfAsync(); + } + } + public void PdfQueryCellInfoHandler(Syncfusion.Blazor.Gantt.PdfQueryCellInfoEventArgs args) + { + if (args.Column.Field == "TaskName" && args.Data.TaskID == 5) + { + args.Cell.Value = "Updated Value"; + args.Cell.CellStyle = new PdfElementStyle() + { + FillBackgroundColor = "Orange", + Font = new PdfGridFont() + { + FontFamily = PdfFontFamily.TimesRoman, + FontSize = 6, + FontStyle = PdfFontStyle.Italic, + IsTrueType = false, + TextColor = "Red", + TextHighlightColor = "Green" + } + }; + args.Cell.CellStyle.Border = new Syncfusion.Blazor.Grids.PdfBorder() + { + Color = "Black", + DashStyle = Syncfusion.Blazor.Grids.PdfDashStyle.Dot, + Width = 0.1 + }; + } + } + public class TaskData + { + 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 string Predecessor { get; set; } + } + + public static List GetTaskCollection() + { + List Tasks = new List() + { + 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, Predecessor = "2" }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, + 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; + } +} + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/VDLejELSpVTlPVsF?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +### Exporting with column header template + +The PDF export functionality allows to export header template that include `images` and `text` to an PDF document using [PdfColumnHeaderQueryCellInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEvents-1.html#Syncfusion_Blazor_Gantt_GanttEvents_1_PdfColumnHeaderQueryCellInfo) event. + +In the following sample, header template with images and text are exported to PDF using [HeaderTemplate](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttColumn.html#Syncfusion_Blazor_Gantt_GanttColumn_HeaderTemplate) properties in the `PdfColumnHeaderQueryCellInfo` event. + +> PDF Export supports base64 string to export the images. + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + +@using Syncfusion.Blazor.Gantt +@using Syncfusion.Blazor.Grids +@using Syncfusion.PdfExport +@using System.Net.Http +@using System.IO +@inject HttpClient Http + + + + + + +
    + + @((context as GridColumn).HeaderText) +
    +
    +
    + + +
    + + @((context as GridColumn).HeaderText) +
    +
    +
    +
    + +
    +@code{ + private List TaskCollection { get; set; } + private SfGantt Gantt; + private List toolbarItem = new List() { + new Syncfusion.Blazor.Navigations.ToolbarItem() { + Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" + } + }; + + public PdfImage image; + protected override async Task OnInitializedAsync() + { + TaskCollection = GetTaskCollection(); + var imageBytes = await Http.GetByteArrayAsync("https://cdn.syncfusion.com/content/images/landing-page/yes.png"); + using var imageStream = new MemoryStream(imageBytes); + image = PdfImage.FromStream(imageStream); + } + + + public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) + { + if (args.Item.Id == "PdfExport") + { + await Gantt.ExportToPdfAsync(); + } + } + + public void PdfHeaderQueryCellInfoHandler(Syncfusion.Blazor.Gantt.PdfHeaderQueryCellInfoEventArgs args) + { + args.Cell.CellStyle = new PdfElementStyle(){ Image = image }; + } + + public class TaskData + { + 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? Parent_Id { get; set; } + + } + + public static List 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, Parent_Id = 1}, + new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "4", Progress = 40, Parent_Id = 1}, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, Parent_Id =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, Parent_Id =5}, + new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, Parent_Id =5}, + new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, Parent_Id =5} + + }; + return Tasks; + } +} + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/VtresXgMqlBQjXfl?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +### Exporting with task label template + +The PDF export functionality allows to export task label template that include `images` and `text` to an PDF document using [PdfQueryTaskbarInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEvents-1.html#Syncfusion_Blazor_Gantt_GanttEvents_1_PdfQueryTaskbarInfo) event. + +In the following sample, task label template with images and text are exported to PDF using [LabelSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.PdfQueryTaskbarInfoEventArgs-1.html#Syncfusion_Blazor_Gantt_PdfQueryTaskbarInfoEventArgs_1_LabelSettings) properties in the [PdfQueryTaskbarInfoEventArgs](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.PdfQueryTaskbarInfoEventArgs-1.html) event. + +> PDF Export supports base64 string to export the images. + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + +@using Syncfusion.Blazor.Gantt +@using Syncfusion.Blazor.Grids +@using Syncfusion.Blazor.Navigations +@using Syncfusion.PdfExport +@using System.Net.Http +@using System.IO + + + + + + + + + + + + + + + @{ + if ((context as TaskData).TaskID == 5) + { +
    + + @((context as TaskData).TaskName) +
    + } + } +
    + + @if ((context as TaskData).TaskID == 2) + { +
    + Updated Value +
    + } + else + { +
    + @((context as TaskData).TaskName) +
    + } +
    + + @if ((context as TaskData).TaskID == 3) + { +
    + -@((context as TaskData).Progress)% +
    + } + else + { +
    + @((context as TaskData).Progress)% +
    + } +
    +
    + +
    + +@code { + private List TaskCollection { get; set; } + private SfGantt Gantt; + private List toolbarItem = new List() + { + new Syncfusion.Blazor.Navigations.ToolbarItem() + { + Text = "PDF Export", + TooltipText = "PDF Export", + Id = "PdfExport", + PrefixIcon = "e-pdfexport" + } + }; + + public static PdfImage image; + + protected override async Task OnInitializedAsync() + { + this.TaskCollection = GetTaskCollection(); + + using var httpClient = new HttpClient(); + var imageBytes = await httpClient.GetByteArrayAsync("https://cdn.syncfusion.com/content/images/landing-page/yes.png"); + var imageStream = new MemoryStream(imageBytes); + image = PdfImage.FromStream(imageStream); + } + + public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) + { + if (args.Item.Id == "PdfExport") + { + await Gantt.ExportToPdfAsync(); + } + } + + public void PdfQueryTaskbarInfoHandler(PdfQueryTaskbarInfoEventArgs args) + { + if (args.Data.TaskID == 2) + { + args.LabelSettings.LeftLabelValue = "Updated Value"; + } + else + { + args.LabelSettings.LeftLabelValue = args.Data.TaskName; + } + + if (args.Data.TaskID == 5) + { + args.LabelSettings.RightLabel = new PdfElementStyle() { Image = image }; + } + else + { + args.LabelSettings.RightLabelValue = args.Data.TaskName; + } + + if (args.Data.TaskID == 3) + { + args.LabelSettings.TaskbarLabelValue = $"-{args.Data.Progress}%"; + } + else + { + args.LabelSettings.TaskbarLabelValue = $"{args.Data.Progress}%"; + } + } + + public class TaskData + { + 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 string Predecessor { get; set; } + } + + public static List GetTaskCollection() + { + return 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, Predecessor = "2" }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, + 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 } + }; + } +} + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/LtLyNOhefKeOHrhh?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +### Best practices for exporting PDF with templates + +- **Optimize PdfQueryCellInfo event usage**: Use the `PdfQueryCellInfo` event to customize individual cell appearances efficiently. Minimize complex logic to maintain performance. + +- **Utilize PdfColumnHeaderQueryCellInfo effectively**: Apply the `PdfColumnHeaderQueryCellInfo` event for custom header styles and content, focusing on clarity and readability. +- **Accessibility and clarity**: Keep header elements simple and accessible. Use straightforward text and icons to convey column purposes clearly. + +- **Efficient use of PdfQueryTaskbarInfo**: Utilize the `PdfQueryTaskbarInfo` event to apply label customizations based on task data conditions for effective communication of task statuses. +- **Consistent label styling**: Ensure consistent theme across labels with uniform font styles, colors, and sizes. + +### Image handling across events +- **Base64 and MemoryStream**: Convert images to Base64 strings, then use `MemoryStream` to convert them to `PdfImage`. This avoids reliance on potentially inaccessible web links. +- **Height and width management**: Scale images to fit designated areas to prevent default resizing that reflects cell or row heights. Maintain a professional PDF layout. +- **Compression and optimization**: Compress images prior to Base64 conversion to reduce file size while maintaining quality, optimizing the final PDF document size. + +### Troubleshooting PDF export + +1. **Customizations not appearing in PDF** + - **Check event handler**: Ensure that the `PdfQueryTaskbarInfo` event is correctly implemented and bound in your code. Double-check the event handler's logic to verify that conditions for customization are being met. + - **Data matching**: Ensure that the task data (like `TaskID`) used in the event matches the data in the task collection. Mismatches can prevent customizations from applying. + +2. **Images not displaying** + - **Image URL**: Verify that the image URLs are correct and accessible. Ensure that external images are hosted on a server with public access rights. + - **Supported formats**: Use compatible image formats such as JPG, PNG, or GIF. Unsupported formats may not render correctly in a PDF. + +3. **Performance issues** + - **Optimize resources**: Large images or complex styling may slow down the PDF export process. Consider optimizing image size and simplifying styles. + +4. **Color code customization** + - **Use valid color codes**: You can use HEX (`#RRGGBB`), or standard color names like `red`, `blue`, etc. Ensure all color codes or names used are supported and valid. + - **Consistency across styles**: Maintain consistent use of color codes in the styles to avoid unexpected color changes or conflicts during PDF rendering. \ No newline at end of file diff --git a/blazor/gantt-chart/data-markers.md b/blazor/gantt-chart/data-markers.md index cd2f1e074d..7d342143c0 100644 --- a/blazor/gantt-chart/data-markers.md +++ b/blazor/gantt-chart/data-markers.md @@ -9,18 +9,30 @@ documentation: ug # Data Markers in Blazor Gantt Chart Component -[Data markers](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttIndicator.html) are a set of events used to represent the schedule events for a task. Data markers are defined in data source as array of objects, and this value is mapped to the Gantt Chart component using the `GanttTaskFields.Indicators` property. You can represent more than one data marker in a task. +Data markers are visual indicators that highlight significant events, milestones, or important dates within individual project tasks. These markers provide immediate visual context about critical moments in task timelines, enabling effective identification of key dates and tracking of important events at the task level. Understanding data markers implementation ensures effective project visualization and milestone tracking throughout project development cycles. -Data markers can be defined using the following properties: +Data markers utilize specific properties to define their appearance, positioning, and interactive behavior within task timelines: -* `Date` : Defines the date of indicator. -* `IconClass` : Defines the icon class of indicator. -* `Name` : Defines the name of indicator. -* `Tooltip` : Defines the tooltip of indicator. +**Date specification**: The [Date](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttIndicator.html#Syncfusion_Blazor_Gantt_GanttIndicator_Date) property establishes the exact timeline position where the marker appears. This date value determines marker placement relative to the task's start and end dates, ensuring accurate event representation. -N> Data Marker `Tooltip` will be rendered only if tooltip property has value. +**Visual styling**: The [IconClass](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttIndicator.html#Syncfusion_Blazor_Gantt_GanttIndicator_IconClass) property defines the CSS class that controls marker visual appearance. This property enables custom styling through icon fonts, background images, or CSS-based graphics to distinguish different marker types. -The following code example demonstrates how to implement data markers in the Gantt chart. +**Identification**: The [Name](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttIndicator.html#Syncfusion_Blazor_Gantt_GanttIndicator_Name) property provides unique identification for each marker. This name serves as an internal reference and can be used for programmatic marker manipulation or event handling. + +**Interactive content**: The [Tooltip](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttIndicator.html#Syncfusion_Blazor_Gantt_GanttIndicator_Tooltip) property supplies descriptive text that displays when users hover over markers. This property enhances user experience by providing detailed context about marker significance and related event information. + +**Tooltip Rendering Requirements**: Data marker tooltips render only when the tooltip property contains valid content values. Empty or undefined tooltip properties result in no tooltip display, maintaining clean visual presentation for markers without additional descriptions. + +## Data mapping and configuration properties + +Data markers represent schedule events for specific tasks through visual indicators positioned at designated dates within task timelines. The component renders markers as icon-based elements that display at precise timeline locations, providing instant visual reference for important task-related events. + +**Data structure requirements**: Data markers are defined in the data source as arrays of objects containing marker specifications. Each marker object includes date information, visual styling, identification details, and optional tooltip content for enhanced user interaction. + +**Mapping configuration**: The marker array connects to the Gantt component through the [GanttTaskFields.Indicators](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttTaskFields.html#Syncfusion_Blazor_Gantt_GanttTaskFields_Indicators) property mapping. This configuration establishes the relationship between data source marker definitions and component rendering logic. + +**Multiple marker support**: Tasks can display multiple data markers simultaneously, allowing comprehensive event tracking within individual task contexts. Each marker maintains independent configuration while sharing the same task timeline space. +The following implementation demonstrates comprehensive data marker integration within a Gantt chart, showcasing multiple markers per task with varied styling and tooltip configurations: {% tabs %} {% highlight razor tabtitle="Index.razor" %} diff --git a/blazor/gantt-chart/deleting-tasks.md b/blazor/gantt-chart/deleting-tasks.md index 02c2dee7e0..cc115c69af 100644 --- a/blazor/gantt-chart/deleting-tasks.md +++ b/blazor/gantt-chart/deleting-tasks.md @@ -1,17 +1,19 @@ --- layout: post title: Deleting tasks in Blazor Gantt Chart Component | Syncfusion -description: Checkout and learn here all about Deleting tasks in Syncfusion Blazor Gantt Chart component and more. +description: Learn how to delete tasks dynamically in the Syncfusion Blazor Gantt Chart component using toolbar or programmatic methods for efficient project management. platform: Blazor -control: Gantt Chart +control: Deleting tasks documentation: ug --- # Deleting Tasks in Blazor Gantt Chart Component -## Deleting Tasks +Deleting tasks in the Blazor Gantt Chart component streamlines project management by removing tasks, such as outdated milestones or subtasks, using the toolbar or programmatic methods. Enabled by setting the [GanttEditSettings.AllowDeleting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditSettings.html#Syncfusion_Blazor_Gantt_GanttEditSettings_AllowDeleting) property to **true** and tasks can be deleted after selecting a row, ensuring seamless updates to dependencies and critical path calculations. A confirmation dialog, activated via [GanttEditSettings.ShowDeleteConfirmDialog](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditSettings.html#Syncfusion_Blazor_Gantt_GanttEditSettings_ShowDeleteConfirmDialog), prompts to verify deletions, preventing accidental removals. The [DeleteRecordAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_DeleteRecordAsync_System_Nullable_System_Int32__) method allows programmatic deletion, requiring a selected record with valid `GanttTaskFields` mappings (e.g., id, name). Ensure tasks are selected and `GanttTaskFields` are properly configured to avoid issues during deletion. -A task delete option in the Gantt Chart component can be enabled by enabling the [GanttEditSettings.AllowDeleting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditSettings.html#Syncfusion_Blazor_Gantt_GanttEditSettings_AllowDeleting) property. Tasks can be deleted by clicking the delete toolbar item or using the `[DeleteRecordAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_DeleteRecordAsync_System_Nullable_System_Int32__) method. You can call this method dynamically on any custom actions like button click. The following code example shows how to enable the delete option in the Gantt Chart component. +## Delete tasks via toolbar + +Enable task deletion through the toolbar by setting [GanttEditSettings.AllowDeleting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditSettings.html#Syncfusion_Blazor_Gantt_GanttEditSettings_AllowDeleting) to **true**. Select a row and click the toolbar’s **Delete** icon to remove the task, with an optional confirmation dialog if [GanttEditSettings.ShowDeleteConfirmDialog](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditSettings.html#Syncfusion_Blazor_Gantt_GanttEditSettings_ShowDeleteConfirmDialog) is enabled. This method is ideal for quickly removing tasks like completed activities. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -73,11 +75,9 @@ A task delete option in the Gantt Chart component can be enabled by enabling the N> You should set the `AllowDeleting` value to `true` to delete the record dynamically. -## Delete confirmation message - -Delete confirmation message is used to get confirmation from users before deleting a task. This confirmation message can be enabled by setting the [GanttEditSettings.ShowDeleteConfirmDialog](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditSettings.html#Syncfusion_Blazor_Gantt_GanttEditSettings_ShowDeleteConfirmDialog) property to true. +## Delete tasks with confirmation dialog -The following code snippet explains how to enable the delete confirmation message in Gantt Chart. +Enable a confirmation dialog for task deletion by setting [GanttEditSettings.ShowDeleteConfirmDialog](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditSettings.html#Syncfusion_Blazor_Gantt_GanttEditSettings_ShowDeleteConfirmDialog) to **true**, alongside [GanttEditSettings.AllowDeleting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditSettings.html#Syncfusion_Blazor_Gantt_GanttEditSettings_AllowDeleting) . After selecting a row, deleting via the toolbar or [DeleteRecordAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_DeleteRecordAsync_System_Nullable_System_Int32__) method prompts a dialog to confirm the action, ensuring intentional removals. This is useful for critical tasks where accidental deletion must be avoided. {% tabs %} {% highlight razor tabtitle="Index.razor" %} diff --git a/blazor/gantt-chart/editing-tasks.md b/blazor/gantt-chart/editing-tasks.md index 047ec69f5b..64d9fc1dd9 100644 --- a/blazor/gantt-chart/editing-tasks.md +++ b/blazor/gantt-chart/editing-tasks.md @@ -1,33 +1,28 @@ --- layout: post title: Editing tasks in Blazor Gantt Chart Component | Syncfusion -description: Checkout and learn here all about Editing tasks in Syncfusion Blazor Gantt Chart component and more. +description: Learn to dynamically edit tasks in Syncfusion Blazor Gantt Chart using cell, dialog, taskbar, or code-based methods for seamless project updates. platform: Blazor -control: Gantt Chart +control: Editing tasks documentation: ug --- # Editing tasks in Blazor Gantt Chart Component -The editing feature can be enabled in the Gantt Chart component by enabling the [GanttEditSettings.AllowEditing](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditSettings.html#Syncfusion_Blazor_Gantt_GanttEditSettings_AllowEditing) and [GanttEditSettings.AllowTaskbarEditing](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditSettings.html#Syncfusion_Blazor_Gantt_GanttEditSettings_AllowTaskbarEditing) properties. +Editing tasks in the Blazor Gantt Chart component enables dynamic project updates, such as modifying task durations, names, or dependencies, using cell editing, dialog, taskbar interactions, or programmatic methods. Enable editing by setting [GanttEditSettings.AllowEditing](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditSettings.html#Syncfusion_Blazor_Gantt_GanttEditSettings_AllowEditing) and [GanttEditSettings.AllowTaskbarEditing](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditSettings.html#Syncfusion_Blazor_Gantt_GanttEditSettings_AllowTaskbarEditing) to **true**, ensuring task data aligns with [TaskFields](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttTaskFields.html) mappings (e.g., id, name, startDate). Cell editing allows direct updates in the TreeGrid pane, dialog editing provides a comprehensive interface, taskbar dragging adjusts durations or dates, and connector lines manage dependencies via drag-and-drop. Use the [GanttEditSettings.Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditSettings.html#Syncfusion_Blazor_Gantt_GanttEditSettings_Mode) property to control editing behavior (**Auto** or **Dialog**). Customize dialog fields with [AddDialogFields](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttAddDialogFields.html#Syncfusion_Blazor_Gantt_GanttAddDialogFields_AddDialogFields) and [EditDialogFields](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditDialogFields.html#Syncfusion_Blazor_Gantt_GanttEditDialogFields_EditDialogFields) for tailored forms. The [UpdateRecordByIDAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_UpdateRecordByIDAsync__0_) method enables programmatic updates, except for task IDs. Ensure valid data to prevent issues and maintain dependency integrity. -The following editing options are available to update the tasks in the Gantt chart: -* Cell -* Dialog -* Taskbar +## Edit tasks via cell editing -## Cell editing +Enable cell editing by setting [GanttEditSettings.AllowEditing](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditSettings.html#Syncfusion_Blazor_Gantt_GanttEditSettings_AllowEditing) to **true**, [GanttEditSettings.Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditSettings.html#Syncfusion_Blazor_Gantt_GanttEditSettings_Mode) to **Auto**. Double-click a TreeGrid cell to edit fields like task name or duration directly, ideal for quick updates. Ensure `GanttTaskFields` mappings are valid for seamless editing. -By setting the edit mode to auto using the [GanttEditSettings.Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditSettings.html#Syncfusion_Blazor_Gantt_GanttEditSettings_Mode) property, the tasks can be edited by double-clicking the Tree Grid cells. +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} -The following code example shows you how to enable the cell editing in Gantt Chart component. - -```cshtml @using Syncfusion.Blazor.Gantt - + - + @code{ @@ -39,49 +34,49 @@ The following code example shows you how to enable the cell editing in Gantt Cha 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 static List 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; } } -``` -N> When the edit mode is set to `Auto`, double-clicking on the Tree Grid side changes the cells to editable mode. Double-clicking on the chart side opens the edit dialog for editing the task details. +{% endhighlight %} +{% endtabs %} -double click action on Tree Grid or chart side +{% previewsample "https://blazorplayground.syncfusion.com/embed/hNBeCNiDVodpLcuW?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -![Blazor Gantt Chart displays Editing in Chart](images/blazor-gantt-chart-editing-in-chart.png) +N> When the edit mode is set to `Auto`, double-clicking on the Tree Grid side changes the cells to editable mode. Double-clicking on the chart side opens the edit dialog for editing the task details. -{% previewsample "https://blazorplayground.syncfusion.com/embed/VZrKZcibioUFqasP?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} +## Edit tasks via dialog -## Dialog editing +Enable dialog editing by setting [GanttEditSettings.AllowEditing](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditSettings.html#Syncfusion_Blazor_Gantt_GanttEditSettings_AllowEditing) to **true** and [GanttEditSettings.Mode](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditSettings.html#Syncfusion_Blazor_Gantt_GanttEditSettings_Mode) to **Dialog**. Double-click a row on the TreeGrid or chart side to open a dialog for editing task details, such as start date or dependencies, suitable for comprehensive updates. In **Auto** mode, double-clicking the chart side opens the dialog, while the TreeGrid side enables cell editing. -Modify the task details through the edit dialog by setting the `GanttEditSettings.Mode` as `Dialog`. +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} -```cshtml @using Syncfusion.Blazor.Gantt - + @@ -95,50 +90,54 @@ Modify the task details through the edit dialog by setting the `GanttEditSetting 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 static List 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; } } -``` + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/LNBeMDWXLyuhTais?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} N> In dialog editing mode, the edit dialog appears when the Tree Grid or Gantt chart sides are double-clicked. -![Dialog Editing in Blazor Gantt Chart](images/blazor-gantt-chart-dialog-editing.png) +## Sections or tabs in Dialog -### Sections or tabs in Dialog +Customize the edit dialog by defining tabs with [GanttAddDialogFields](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttAddDialogFields.html) and [GanttEditDialogFields](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditDialogFields.html), using the [GanttAddDialogField.Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttAddDialogField.html#Syncfusion_Blazor_Gantt_GanttAddDialogField_Type) and [GanttEditDialogField.Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditDialogField.html#Syncfusion_Blazor_Gantt_GanttEditDialogField_Type) property (e.g., General, Dependency). This organizes fields into tabs for focused editing, such as task details or dependencies. -In the Gantt Chart dialog, you can define the required tabs or editing sections using the [GanttAddDialogFields](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttAddDialogFields.html) and [GanttEditDialogFields](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditDialogFields.html) properties. Every tab is defined using the `GanttAddDialogField.Type` or `GanttEditDialogField.Type` property. +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} -```cshtml - @using Syncfusion.Blazor.Gantt +@using Syncfusion.Blazor.Gantt - - + @@ -168,13 +167,13 @@ In the Gantt Chart dialog, you can define the required tabs or editing sections public class TaskInfoModel { - 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 string Notes { get; set; } public string Predecessor { get; set; } } @@ -186,8 +185,8 @@ In the Gantt Chart dialog, you can define the required tabs or editing sections public class AssignmentModel { public int PrimaryId { get; set; } - public int TaskId { get; set; } - public int ResourceId { get; set; } + public int TaskID { get; set; } + public int ResourceID { get; set; } } public static List GetResourceCollections() @@ -206,12 +205,12 @@ In the Gantt Chart dialog, you can define the required tabs or editing sections { List assignments = new List() { - new AssignmentModel(){ PrimaryId=1, TaskId = 2, ResourceId=1}, - new AssignmentModel(){ PrimaryId=2, TaskId = 3, ResourceId=2}, - new AssignmentModel(){ PrimaryId=3, TaskId = 3, ResourceId=3}, - new AssignmentModel(){ PrimaryId=4, TaskId = 6, ResourceId=4}, - new AssignmentModel(){ PrimaryId=5, TaskId = 8, ResourceId=1}, - new AssignmentModel(){ PrimaryId=6, TaskId = 8, ResourceId=5} + new AssignmentModel(){ PrimaryId=1, TaskID = 2, ResourceID=1}, + new AssignmentModel(){ PrimaryId=2, TaskID = 3, ResourceID=2}, + new AssignmentModel(){ PrimaryId=3, TaskID = 3, ResourceID=3}, + new AssignmentModel(){ PrimaryId=4, TaskID = 6, ResourceID=4}, + new AssignmentModel(){ PrimaryId=5, TaskID = 8, ResourceID=1}, + new AssignmentModel(){ PrimaryId=6, TaskID = 8, ResourceID=5} }; return assignments; } @@ -220,43 +219,43 @@ In the Gantt Chart dialog, you can define the required tabs or editing sections { List Tasks = new List() { - new TaskInfoModel() { TaskId = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 04, 21), }, - new TaskInfoModel() { TaskId = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, Notes = "Measure the total property area alloted for construction", ParentId = 1 }, - new TaskInfoModel() { TaskId = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "4", Predecessor = "2", Notes = "Obtain an engineered soil test of a plot where construction is planned from an engineer or company specializing in soil testing", ParentId = 1 }, - new TaskInfoModel() { TaskId = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, Predecessor = "3", ParentId = 1 }, - new TaskInfoModel() { TaskId = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 06), EndDate = new DateTime(2022, 04, 21), }, - new TaskInfoModel() { TaskId = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 30, Predecessor = "4", Notes = "Develop floor plans and obtain a materials list for estimations", ParentId = 5 }, - new TaskInfoModel() { TaskId = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Predecessor = "6", Notes = "", ParentId = 5 }, - new TaskInfoModel() { TaskId = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Predecessor = "7", Notes = "", ParentId = 5 } + new TaskInfoModel() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 04, 08), }, + new TaskInfoModel() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, Notes = "Measure the total property area alloted for construction", ParentID = 1 }, + new TaskInfoModel() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "4", Predecessor = "2", Notes = "Obtain an engineered soil test of a plot where construction is planned from an engineer or company specializing in soil testing", ParentID = 1 }, + new TaskInfoModel() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, Predecessor = "3", ParentID = 1 }, + new TaskInfoModel() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 11), EndDate = new DateTime(2022, 04, 18), }, + new TaskInfoModel() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 11), Duration = "3", Progress = 30, Predecessor = "4", Notes = "Develop floor plans and obtain a materials list for estimations", ParentID = 5 }, + new TaskInfoModel() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 14), Duration = "3", Predecessor = "6", Notes = "", ParentID = 5 }, + new TaskInfoModel() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 18), Duration = "0", Predecessor = "7", Notes = "", ParentID = 5 } }; return Tasks; } } -``` -Tabs in Edit or Add Dialog +{% endhighlight %} +{% endtabs %} -![Adding New DialogTabs in Blazor Gantt Chart](images/blazor-gantt-chart-add-dialogtab.png) +{% previewsample "https://blazorplayground.syncfusion.com/embed/rNVSWZiDBQDQDzvd?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} - +### Limit fields in general tab -### Limiting data fields in general tab +Restrict fields in the dialog’s General tab using [GanttAddDialogFields](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttAddDialogFields.html) and [GanttEditDialogFields](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditDialogFields.html) with the [GanttAddDialogField.Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttAddDialogField.html#Syncfusion_Blazor_Gantt_GanttAddDialogField_Type) and [GanttEditDialogField.Type](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditDialogField.html#Syncfusion_Blazor_Gantt_GanttEditDialogField_Type) properties set to **General** and [Fields](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditDialogField.html#Syncfusion_Blazor_Gantt_GanttEditDialogField_Fields) specifying visible fields (e.g., TaskName, Duration). This streamlines editing by showing only relevant fields. -In the Gantt Chart dialog, you can make only specific data source fields visible for editing by using the `GanttAddDialogFields` and `GanttEditDialogFields` properties. The data fields are defined with `GanttEditDialogField.Type` and `GanttEditDialogField.Fields` properties. +> You can also define the custom fields in the add/edit dialog General tab using the `Fields` property. -`Note:` You can also define the custom fields in the add/edit dialog General tab using the `Fields` property. +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} -```cshtml - @using Syncfusion.Blazor.Gantt +@using Syncfusion.Blazor.Gantt - - + @@ -264,12 +263,12 @@ In the Gantt Chart dialog, you can make only specific data source fields visible + Fields="@(new string[]{ "TaskID", "TaskName", "Duration" })"> + Fields="@(new string[]{ "TaskID", "TaskName", "Duration" })"> @@ -283,13 +282,13 @@ In the Gantt Chart dialog, you can make only specific data source fields visible public class TaskInfoModel { - 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 string Notes { get; set; } public string Predecessor { get; set; } } @@ -298,40 +297,46 @@ In the Gantt Chart dialog, you can make only specific data source fields visible { List Tasks = new List() { - new TaskInfoModel() { TaskId = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 04, 21), }, - new TaskInfoModel() { TaskId = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, Notes = "Measure the total property area alloted for construction", ParentId = 1 }, - new TaskInfoModel() { TaskId = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "4", Predecessor = "2", Notes = "Obtain an engineered soil test of a plot where construction is planned from an engineer or company specializing in soil testing", ParentId = 1 }, - new TaskInfoModel() { TaskId = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, Predecessor = "3", ParentId = 1 }, - new TaskInfoModel() { TaskId = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 06), EndDate = new DateTime(2022, 04, 21), }, - new TaskInfoModel() { TaskId = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 30, Predecessor = "4", Notes = "Develop floor plans and obtain a materials list for estimations", ParentId = 5 }, - new TaskInfoModel() { TaskId = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Predecessor = "6", Notes = "", ParentId = 5 }, - new TaskInfoModel() { TaskId = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Predecessor = "7", Notes = "", ParentId = 5 } + new TaskInfoModel() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 04, 08), }, + new TaskInfoModel() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, Notes = "Measure the total property area alloted for construction", ParentID = 1 }, + new TaskInfoModel() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "4", Predecessor = "2", Notes = "Obtain an engineered soil test of a plot where construction is planned from an engineer or company specializing in soil testing", ParentID = 1 }, + new TaskInfoModel() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, Predecessor = "3", ParentID = 1 }, + new TaskInfoModel() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 11), EndDate = new DateTime(2022, 04, 18), }, + new TaskInfoModel() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 30, Predecessor = "4", Notes = "Develop floor plans and obtain a materials list for estimations", ParentID = 5 }, + new TaskInfoModel() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Predecessor = "6", Notes = "", ParentID = 5 }, + new TaskInfoModel() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Predecessor = "7", Notes = "", ParentID = 5 } }; return Tasks; } } -``` -The following screenshot show the output of above code example. +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/LNLSWXiyWEIoOWHT?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +## Edit task dependencies -![Blazor Gantt Chart with Custom Fields](images/blazor-gantt-chart-custom-fields.png) +Enable dependency editing by mapping the [GanttTaskFields.Dependency](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttTaskFields.html#Syncfusion_Blazor_Gantt_GanttTaskFields_Dependency) property in `GanttTaskFields`, setting [GanttEditSettings.AllowEditing](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditSettings.html#Syncfusion_Blazor_Gantt_GanttEditSettings_AllowEditing) and [GanttEditSettings.AllowTaskbarEditing](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditSettings.html#Syncfusion_Blazor_Gantt_GanttEditSettings_AllowTaskbarEditing) to **true**. Update dependencies via: +- **Mouse interactions**: Drag connector points on taskbars to create or modify links. -## Task dependencies + ![Updating task dependency with mouse drag and drop action](images/user-interaction.png) -In the Gantt Chart component, you can update the dependencies between tasks and link the tasks interactively. The task dependencies can be mapped from the data source using the [GanttTaskFields.Dependency](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttTaskFields.html#Syncfusion_Blazor_Gantt_GanttTaskFields_Dependency) property. +- **Dialog**: Edit the Dependency tab in the edit dialog. -You can update the task dependencies using the following ways: + ![Updating task dependency in dialog Dependency tab](images/editing-dialog.png) -* Edit dialog: Create or remove the task dependencies using the `Dependency` tab in the edit dialog. -* Cell editing: Create or remove the task links using cell editing. +- **Cell editing**: Update the dependency field in the TreeGrid. Ensure valid dependency strings to avoid circular references. -The following code example demonstrates how to enable task dependency editing in the Gantt chart using the `EditSettings` property. + ![Updating task dependency via cell editing in TreeGrid](images/cell-edit.png) + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} -```cshtml @using Syncfusion.Blazor.Gantt - + @@ -345,49 +350,49 @@ The following code example demonstrates how to enable task dependency editing in 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 Predecessor { get; set; } - public int? ParentId { get; set; } + public int? ParentID { get; set; } } public static List GetTaskCollection() { List Tasks = new List(); - Tasks.Add(new TaskData() { TaskId = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 04, 21), }); - Tasks.Add(new TaskData() { TaskId = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentId = 1 }); - Tasks.Add(new TaskData() { TaskId = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "4", Progress = 40, Predecessor = "2", ParentId = 1 }); - Tasks.Add(new TaskData() { TaskId = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, Predecessor = "3", ParentId = 1 }); - Tasks.Add(new TaskData() { TaskId = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 06), EndDate = new DateTime(2022, 04, 21), }); - Tasks.Add(new TaskData() { TaskId = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 30, Predecessor = "4", ParentId = 5 }); - Tasks.Add(new TaskData() { TaskId = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, Predecessor = "6", ParentId = 5 }); - Tasks.Add(new TaskData() { TaskId = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, Predecessor = "7", ParentId = 5 }); + Tasks.Add(new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 04, 08), }); + Tasks.Add(new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 }); + Tasks.Add(new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "4", Progress = 40, Predecessor = "2", ParentID = 1 }); + Tasks.Add(new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, Predecessor = "3", ParentID = 1 }); + Tasks.Add(new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 11), EndDate = new DateTime(2022, 04, 18), }); + Tasks.Add(new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 30, Predecessor = "4", ParentID = 5 }); + Tasks.Add(new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, Predecessor = "6", ParentID = 5 }); + Tasks.Add(new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, Predecessor = "7", ParentID = 5 }); return Tasks; } } -``` -Updating with cell Edit or Dialog +{% endhighlight %} +{% endtabs %} -![Dialog Editing in Blazor Gantt Chart](images/blazor-gantt-chart-edit-dialog.png) +{% previewsample "https://blazorplayground.syncfusion.com/embed/LXBIWDWeiYcZSwrs?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} - +## Edit tasks programmatically -## Update task values using method +Update tasks programmatically using the [UpdateRecordByIDAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_UpdateRecordByIDAsync__0_) method, specifying the task ID and updated data. This method supports automation, such as updating durations via a button, but cannot modify the task ID. Ensure `GanttTaskFields` mappings are valid for successful updates. -Tasks' value can be dynamically updated by using the [UpdateRecordByIDAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_UpdateRecordByIDAsync__0_) method. You can call this method on any custom action. The following code example shows how to use this method to update a task. +> Using the `UpdateRecordByIDAsync` method, you cannot update the task ID value. -N> Using the `UpdateRecordByIDAsync` method, you cannot update the task ID value. +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} -```cshtml @using Syncfusion.Blazor.Gantt - + @@ -396,7 +401,7 @@ N> Using the `UpdateRecordByIDAsync` method, you cannot update the task ID value public SfGantt Gantt; public void UpdateRecord() { - this.Gantt.UpdateRecordByIDAsync(new TaskData() { TaskId = 3, TaskName = "Updated by ID value", Progress = 60}); + this.Gantt.UpdateRecordByIDAsync(new TaskData() { TaskID = 3, TaskName = "Updated by ID value", Progress = 60}); } private List TaskCollection { get; set; } protected override void OnInitialized() @@ -406,30 +411,37 @@ N> Using the `UpdateRecordByIDAsync` method, you cannot update the task ID value 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 static List 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; } } -``` -![Updating Record in Blazor Gantt Chart](images/blazor-gantt-chart-update-record.png) +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/BjBoiXWysOvZYpeG?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +## See also +- [How to add new tasks?](https://blazor.syncfusion.com/documentation/gantt-chart/adding-new-tasks) +- [How to manage task dependencies?](https://blazor.syncfusion.com/documentation/gantt-chart/task-dependencies) +- [How to configure critical path?](https://blazor.syncfusion.com/documentation/gantt-chart/criticalpath) \ No newline at end of file diff --git a/blazor/gantt-chart/event-markers.md b/blazor/gantt-chart/event-markers.md index a56aa9c057..1a274bdf67 100644 --- a/blazor/gantt-chart/event-markers.md +++ b/blazor/gantt-chart/event-markers.md @@ -3,7 +3,7 @@ layout: post title: Event Markers in Blazor Gantt Chart Component | Syncfusion description: Checkout and learn here all about Event Markers in Syncfusion Blazor Gantt Chart component and more. platform: Blazor -control: Gantt Chart +control: Eventmarkers documentation: ug --- @@ -11,11 +11,35 @@ documentation: ug The event markers in the Gantt Chart component is used to highlight the important events in a project. Event markers can be initialized by using the [GanttEventMarkers](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEventMarkers.html) property, and you can define date and label for the event markers using the `Day` and `Label` properties. You can also customize it using the `CssClass` properties. The following code example shows how to add event markers in the Gantt Chart component. -```cshtml +Event markers highlight significant project events by displaying vertical timeline indicators that span across the entire Gantt chart. These markers identify critical dates, milestones, deadlines, or important project events that affect multiple tasks or the overall project timeline, providing visual reference points for project-wide activities. + +Understanding event markers implementation enables effective visualization of project-critical dates and enhances timeline awareness across all project phases. + +Event markers utilize specific properties to define their positioning, appearance, and identification within the project timeline: + +**Date positioning**: The [Day](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEventMarker.html#Syncfusion_Blazor_Gantt_GanttEventMarker_Day) property establishes the exact timeline date where the marker appears. This date value determines marker placement across the entire vertical timeline, ensuring accurate project event representation. + +**Descriptive labeling**: The [Label](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEventMarker.html#Syncfusion_Blazor_Gantt_GanttEventMarker_Label) property provides descriptive text that identifies the marker's purpose or significance. Labels enhance user understanding by clearly indicating what project event the marker represents. + +**Visual customization**: The [CssClass](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEventMarker.html#Syncfusion_Blazor_Gantt_GanttEventMarker_CssClass) property enables custom styling through CSS class applications. This property allows distinctive visual treatment for different marker types, supporting color coding, styling variations, and brand consistency. + +## Event marker configuration + +Event markers render as vertical lines positioned at specific dates across the entire Gantt timeline, distinguishing them from data markers which appear within individual task rows. This project-wide visibility ensures critical dates remain prominent regardless of the current view or task focus. + +**Timeline integration**: Event markers integrate seamlessly with the Gantt timeline, appearing as vertical indicators that extend from the top to the bottom of the chart area. This comprehensive visibility ensures important dates remain visible during scrolling, zooming, or filtering operations. + +**Multiple marker support**: The component supports multiple event markers simultaneously, allowing comprehensive tracking of various project-critical dates within the same timeline view. Each marker maintains independent configuration while sharing the common timeline space. + +The following implementation demonstrates event marker integration within a Gantt chart, showcasing timeline-wide event highlighting: + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + @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; } @@ -64,13 +88,14 @@ The event markers in the Gantt Chart component is used to highlight the importan border-left: 2px red dotted; } -``` -![Blazor Gantt Chart with Event Markers](images/blazor-gantt-chart-event-markers.png) +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/BNVoiXhJTzbnRpdT?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} ## See also * [Display Striplines in Blazor Gantt](https://www.syncfusion.com/forums/175385/display-striplines-in-blazor-gantt) - -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. +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 diff --git a/blazor/gantt-chart/header-and-footer.md b/blazor/gantt-chart/header-and-footer.md new file mode 100644 index 0000000000..b03b2c2ae6 --- /dev/null +++ b/blazor/gantt-chart/header-and-footer.md @@ -0,0 +1,206 @@ +--- +layout: post +title: Customizing PDF Headers and Footers in Blazor Gantt Chart Component | Syncfusion +description: Learn how to customize headers and footers in PDF exports of the Syncfusion Blazor Gantt Chart component with text, lines, page numbers, and images. +platform: Blazor +control: header and footer of PDF exporting +documentation: ug +--- + +# Header and footer of PDF exporting in Blazor Gantt Chart component + +Customizing headers and footers in PDF exports of the Blazor Gantt Chart component allows adding text, lines, page numbers, and images to enhance document professionalism for projects. Use [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html) with [Header](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_Header) and [Footer](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_Footer) to define content arrays, specifying `Type` (e.g., Text, Line), `Value`, `Position`, `Style`, or `Src` for images with `Base64` encoding. + +## Write a text in header and footer + +Customize text in headers or footers using the [Header](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_Header) and [Footer](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_Footer) properties in [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html). Set `Type` to **Text**, define `Value` for the text, `Position` for x/y coordinates, and `Style` for color or font size. + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + +@using Syncfusion.Blazor.Gantt +@using Syncfusion.Blazor.Grids +@using Syncfusion.Blazor.Navigations + + + + + + + +@code { + private List TaskCollection { get; set; } + private SfGantt Gantt; + private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; + public List HeaderContent = new List + { + new PdfHeaderFooterContent() { Type = ContentType.Text, Value = "Gantt Chart PDF Export Header", Position = new PdfPosition() { X = 0, Y = 50 }, Style = new PdfContentStyle() { TextBrushColor = "#000000", FontSize = 13 } } + }; + public List FooterContent = new List + { + new PdfHeaderFooterContent() { Type = ContentType.Text, Value = "Gantt Chart PDF Export Footer", Position = new PdfPosition() { X = 0, Y = 350 }, Style = new PdfContentStyle() { TextBrushColor = "#000000", FontSize = 13 } } + }; + protected override void OnInitialized() + { + this.TaskCollection = GetTaskCollection(); + } + public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) + { + if (args.Item.Id == "PdfExport") + { + GanttPdfExportProperties exportProperties = new GanttPdfExportProperties(); + PdfHeader Header = new PdfHeader() + { + FromTop = 0, + Height = 100, + Contents = HeaderContent + }; + PdfFooter Footer = new PdfFooter() + { + FromBottom = 250, + Height = 100, + Contents = FooterContent + }; + exportProperties.Header = Header; + exportProperties.Footer = Footer; + await Gantt.ExportToPdfAsync(exportProperties); + } + } + + public class TaskData + { + 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 string Predecessor { get; set; } + } + + public static List GetTaskCollection() + { + List Tasks = new List() + { + 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, Predecessor = "2" }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, + 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; + } +} + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/rDhyiDXArUzpgPqb?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +## Draw a line in header and footer + +Customize lines in headers or footers using the [Header](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_Header) and [Footer](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_Footer) properties in [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html). Set `type` to **Line**, define `points` for start/end coordinates, `pageNumberType` for position, and `style` for color, width, or dash style. + +Supported line styles are, + +* Dash +* Dot +* DashDot +* DashDotDot +* Solid + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + +@using Syncfusion.Blazor.Gantt +@using Syncfusion.Blazor.Grids +@using Syncfusion.Blazor.Navigations + + + + + + + +@code { + private List TaskCollection { get; set; } + private SfGantt Gantt; + private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; + public List HeaderContent = new List + { + new PdfHeaderFooterContent() { Type = ContentType.Line, Points = new PdfPoints() { X1 = 0, Y1 = 4, X2 = 685, Y2 = 4 }, Style = new PdfContentStyle() { PenColor = "#000080", DashStyle = PdfDashStyle.Solid } } + }; + public List FooterContent = new List + { + new PdfHeaderFooterContent() { Type = ContentType.Line, Points = new PdfPoints() { X1 = 0, Y1 = 350, X2 = 685, Y2 = 350 }, Style = new PdfContentStyle() { PenColor = "#000080", DashStyle = PdfDashStyle.Solid } } + }; + protected override void OnInitialized() + { + this.TaskCollection = GetTaskCollection(); + } + public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) + { + if (args.Item.Id == "PdfExport") + { + GanttPdfExportProperties exportProperties = new GanttPdfExportProperties(); + PdfHeader Header = new PdfHeader() + { + FromTop = 0, + Height = 100, + Contents = HeaderContent + }; + PdfFooter Footer = new PdfFooter() + { + FromBottom = 250, + Height = 100, + Contents = FooterContent + }; + exportProperties.Header = Header; + exportProperties.Footer = Footer; + await Gantt.ExportToPdfAsync(exportProperties); + } + } + + public class TaskData + { + 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 string Predecessor { get; set; } + } + + public static List GetTaskCollection() + { + List Tasks = new List() + { + 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, Predecessor = "2" }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, + 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; + } +} + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/BZBIWtXKVKPSwLAW?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +## See also +- [How to export to PDF?](https://blazor.syncfusion.com/documentation/gantt-chart/pdf-export) +- [How to manage task dependencies?](https://blazor.syncfusion.com/documentation/gantt-chart/task-dependencies) \ No newline at end of file diff --git a/blazor/gantt-chart/how-to/open-add-edit-dialog-dynamically.md b/blazor/gantt-chart/how-to/open-add-edit-dialog-dynamically.md index ba09a7a540..7564f693af 100644 --- a/blazor/gantt-chart/how-to/open-add-edit-dialog-dynamically.md +++ b/blazor/gantt-chart/how-to/open-add-edit-dialog-dynamically.md @@ -1,7 +1,7 @@ --- layout: post title: Open Add Edit Dialog in Blazor Gantt Chart Component | Syncfusion -description: Learn here all about Open Add Edit Dialog Dynamically in Syncfusion Blazor Gantt Chart component and more. +description: Learn how to open add and edit dialogs programmatically in the Syncfusion Blazor Gantt Chart component for efficient task creation and modification. platform: Blazor control: Gantt Chart documentation: ug @@ -11,12 +11,14 @@ documentation: ug Gantt Chart add and edit dialogs can be opened dynamically by using [OpenAddDialog](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.Action.html#Syncfusion_Blazor_Gantt_Action_OpenAddDialog) and [OpenEditDialog](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.Action.html#Syncfusion_Blazor_Gantt_Action_OpenEditDialog) methods. The following code example shows how to open add and edit dialog on separate button click actions. -```cshtml +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + @using Syncfusion.Blazor.Gantt - + @@ -39,31 +41,32 @@ Gantt Chart add and edit dialogs can be opened dynamically by using [OpenAddDial 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 List SubTasks { 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 = "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, 23), }, - new TaskData() { TaskId = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 01, 04), Duration = "3", Progress = 30, ParentId = 5 }, - new TaskData() { TaskId = 7, TaskName = "List materials", StartDate = new DateTime(2022, 01, 04), Duration = "3", Progress = 40, ParentId = 5 }, - new TaskData() { TaskId = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 01, 04), 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 = "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, 06), }, + new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 01, 04), Duration = "3", Progress = 30, ParentID = 5 }, + new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 01, 04), Duration = "3", Progress = 40, ParentID = 5 }, + new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 01, 04), Duration = "0", Progress = 30, ParentID = 5 } }; return Tasks; } } -``` -## Demonstration image for dialogue -![Opening Edit Dialog in Blazor Gantt Chart](../images/blazor-gantt-chart-open-edit-dialog.png) \ No newline at end of file +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/VXLeCtANAbQtiBAd?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} \ No newline at end of file diff --git a/blazor/gantt-chart/images/blazor-gantt-chart-combine-cells.png b/blazor/gantt-chart/images/blazor-gantt-chart-combine-cells.png deleted file mode 100644 index 2a338984c1f555165d78378309e54f2dcb3512c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30256 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 SSx3M@ap)c~(9G4i;QPN@st!{C diff --git a/blazor/gantt-chart/images/blazor-gantt-chart-event-markers.png b/blazor/gantt-chart/images/blazor-gantt-chart-event-markers.png deleted file mode 100644 index 4721e6cb6bf22eeaef53c29a21de3a7dc19c135a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41281 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 b+99qfEfgC3&5;$n2So0+qSWVGk9__w^9|fu diff --git a/blazor/gantt-chart/images/blazor-gantt-chart-month-mode.png b/blazor/gantt-chart/images/blazor-gantt-chart-month-mode.png deleted file mode 100644 index 3b04dd2196cfb18b8d37874cb23542c4de63fe08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37203 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�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 V8$7See1!gZPDA%}-pR|s{|mB{2sHoz diff --git a/blazor/gantt-chart/images/blazor-gantt-chart-open-edit-dialog.png b/blazor/gantt-chart/images/blazor-gantt-chart-open-edit-dialog.png deleted file mode 100644 index 9fafe04d1373b064941442ca1a041b007b560a3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87489 zcmdSBbx<5z7YCR?0wg#I?(Xg$+}(B1;2H*(5Q2MfcXx-uf&_O42G?MNyTg)~_rBe# z{co$bYPYMVx_WNkp4-RI@0>fK%8F9R@A2Nhdi4rfMp|6;)vLGWuU^5@Ai%wRQ}p&* z?#t=*7gZ_ISCwM~doLGnEJPGUUcIV`Mtm@S`*QuxQCjEAt5;Z*e?G5eR4Gngy?QQ? z5f@Q+H#}HI)K}lh;65RC`;GGL>(^`=nh0_V=RSzhig3j_B?%O&UT@`1XKKfhZ$xgG$!PKNBLI~9kTx&^d`!Q{~Hzwf|1fRf^K_v?h4qT@)agamT62ppi#VtiP|9 z>mS5uK1e4%Ax=R?CTFrN`j=X6A z$P+xGu!$HNarrRu=B7H`g;;w7@}!RMTPl^-Rt~>6!SsucNU_>?8_wb_Wxrs1^&Hv@ zw!bC;e04^FpJUHUI*@cAYB3&^#HskV#UITp#R^Q(!v@}|pMaReZHg}Tt&YNDF?-gaAW=79_YA9A3@$vhDd@vrpbzQ{ka$i^kG(`nl z#ki2Yv*N`asEQHF^v%H$9~Tm2_}mhFfn4}l!pIXyczpQNKOA>JD(2z#;ztLpYSeLe zB4ZZGX`yCD++TgNbgWC`cRQlubZ9&{u;qmR9u!o{dv3`ob8}-N^k6a4n|#bMz~Ce@ z@NqBLley=Y0;N`LvI>ClY2$ zJU6^0FH8$W#0C?vnD!xYLUfMDsTt3dd?PvuTm0c5%Ds$+{uFq zu1MaxbTLT@fg|9u;#0y%){f6y!}vd~os~!~`Dw{@L#n)*r*G$IBQM3q$Nw<1zV1z;AWb3&>mS5cSNU&rK8v-XY3l@)M#~ z%m{O`pBZTW5jtXG5s`xPhWnCodC%%UrRA7dT2HJ+9svEIK{i0=WkXqKH}D6kNso8j z>#;4gqDb6aY`Jd_y5A%MsY~q9St?=TJ^p87!DsT(J6U>ZI_N2CSAe5 zrZ!+c!;V%jHi#SmkP6(F?`1}i$W|a%W!fQYn#AACgU!!^7IMa$k(@62+(7Gmc-%MG z?A4ooa?>D;B^cDl+tG;i%{$aMtXj;uoxEYPfMlCnB794y_gq$;<#zT=V!S*Mgjt`7 z|2BM!IWY%k47DWQ-3ZK88hQ3|Z~A&9$o$4Fzo>j*K?{R;XHXFXun4!eG_i{U%SA+-@d zROrph*w2)_yB&xfkJoJ%WQJv-Om)2C`*(+v8Gmvfr_=Y&!+7hK7o53SW1Snv)V8du ze5(f>GCZD+%pEInU&#eMn8_D(hf=3Smz3oQIb@__tB-BGY3+J`MTmlV;YoUx!oA6N zw2IEPE=CzL@PmJON^{T-dDt90aFtdaS5+|)?_rOx^{&4;SaDM}L|yhc<^kgiiCtV* zYzYeo0VC%UOEsC_AUBC^V?PJGb<+5c_uA`jT{-%tYH1-L(+tb^Ho;(P3Quk{HdAEYq5@<-NLr=1TM&tih3`4B>}W^J zb)DF?1q}Z=k0VRD`Jp9wGa0exX2%xJ5+6&7!h5-t0}7X!23zwxB3lnP?5Kk6yg{W4 zd}wG;dC%O{5mA182|I47Y=0)BUiH5F`!fgBgnPCNTToOFv3*x2SQS|KWE4G7yoZ(+ z7>?(%YM$GS>4$H4Z-j~h82Pk})&Kyn8x}JRd{XVEo@+aguSbR+7))(!w!*jEjwG)Nhkkb6omBQ;tGcb<}fDcvZ!$octa3v7>6FXmqrjcJgk_k1tos zHB1PXlrUQ6G)AnWWN)A{7Lng_f?^}?(Byu9jqa))@Zn4?+8EM0byeiH0$50!dVsbR zl(=a|C0Vd@Ky8G0-PHIn`oN-JJmFUsonFb9kDXxl_qD3}R9!p$Ol9nI*x3XJR~bu* zV${kKpixwWSBc?bT-$a<#o<{gc>SDxmwCoTlXup0lPd8D4&SyzwNt++lq4=6=CxYz3k^-dh4TU2K+9R} zCG>Q$9d3w?-o8k*sh{0LZwt(*E9%&ujrRyNEe=J+R%pF%tuW3EdRYA~oqKQHuIKCe zCuG8FTn{A$coqh-7VVRAX|&9`*N>Ou###Szdvf^@r7^xe6kLV6DVZT$INpjX;!OR` zz8YdEb{3gNLxk~-*4Qv3uaE52l@r+z+IO9@tS%_L$(HZCB6)n&&Q$dSVK1?iDzWgc zH0h;VR*Yf)?3A*TkxfK2{JaZJK3{E2)oW@|kAy9~p`rAKVjdvw?SzT;Z!@6Y;(g}~ zAV~8I%wmVERGc4yreG@(s-oJxL|VVyo6 zxWLMsG92b{=?Nl1ltyW2c<%} zd&3R<&^_4f0^7lvcIjD;*KtQZxf4W62{ zxqn{97)j1gr;ZD5A`xc9pT`Y!Bw(*O#K{#xgcnx7AJo4<>S#I;lGluefTf9-Iy`Xq zN+8+DsZ&=%hy7(}c#-&pGWWM$h((Q;RlHMFTDs8~9}_`FBfm2*tLB^j*nhqow}aN% zH;_}$MaD+bCG`2=C^CbEUsEE-j=n%XKSCcC)djd!NppjZ#Ah_r@rW+ztfMgu#P-hY znYCW{sZ+}{sin&6`#f_{W%qNFH6>VKPh3N zw6i()i-E?Dt>7`uQ{KLP$>SMB_V6TC;~vi^L;}vKmAB2Qk6a1jFQd12RMR8YT((wc zyVKvSzUT_YDTQQ@1J%73pZL-%W3S>jJ}i@Roj`=gU3D*g>^dmghqJb@gk!z^k$0 zca->zK<8yN`zVPCiFg3V%5(*-8=k24pj>8 zIBsDjXSkzu@dA3Drv<^8wV|sDc~=dlE`CvqjJ#S#T$xa5+T!n;&ktvrAq~RX(GB6b z5tXftbc6suSEN)BNw082qta`gNj^{xX>mpCTb1klbX%TES6LL4cyJdJ+XLc*CjihDuzRlj-r;eJBY4|?a34V~p#h|M*ovJ2&r z31sgf21xv0T(7^MqRlMRPPLx%qC@%BM{#2s4c_G>=E&A_%xLDwA6@5S(FVI2_4oHp z8Rv)U#8e(^qI_F7uXljiYyMuW^JP>gI_vSkVmW^+WQxC|0Ta&yhZo$t)3fs7HM(^N z@x}iAs{JQ11KcxCTxnk4SFNsuYC_n{d!sv2r8Yz0f!5BXP^HjtY=QedSa2Muo7a|X zJ6M)pIp(_$v27pmb2aW_2hZ1D7vv#mE7al|=E}Poe(!8sBe!wb!>b#29kslFfzzhu zss#HaZYPn<)t!)IN2n{QNa38(&YC^?ufJV+eabn3QRA&Sq<{HAQ4e;iZnG2tLsja$pm-4L(*PIJkp%V0oc3`@AMPHWm7!rX>7{B`~CbBA>7&c zcG2~qyCY6!pp|kAPj2tmP7(8KH}a86`h!RGrfr>a1DtS2Vb*qxTdg=p_i+^4+hO7@ zcpr0@yG?)PU=WC8B$be!u>nQqUQuK^FBthMVi&sE6}&y{cQNqH^%jp_Xfx_>&bF)A z3@b7(YgrkVmSDijq3)yGTtfkm1a+jVXz!GqTj)|8ONK-ZDMr=+n>8R|_1xzPnr@Xj zCmQ!`oDxTMrv|6LpJnF)6~&j@;A>nib<0<8FnrIZld65AD8+I?Yi8r$e%0PByasxm zPJFeb{36(CS_Z9D|41sA$&2w?GF9a2M!?BYwZ~9J`{_pwRte#B`TE%iY*c#%UYkv9 zR-ri%%jbFVmZ#whqAQ`2NP!Oxm10&jd{SliLJ`+SLDs`Z=8Ev9HDXN9)7#1WfKPx+ zP-V=O+ipC34YVccWZG{o!49b=|tQiA5p@l2Q?_&aXW2_&Pn%CM9g5_7M0_Y!)W)Y;0;eDRt{MGcYX(k`B@NZU>X8l z=;Ha-&78v4l{Yz_HQl`vAZ1*Lf}pOKZ&e^XeqYeakeV=hSSH3HISVaNMG|Di;*kk1 z-U%%e4hn-bEO%74lm$p<`pVKU{8jQz2vWx?)k>y5wM>uQ)E^uRg3Gl-?twsbCmI zv=@ZlB>gLYN9J4E<$pZ<*3U#geRs%X^PLolrtg#=)(C^eZ(xsw#8)bW>HZ+sWd%_M+_NoAq`qA=(?=V; zRiV74VAJ@vXN&?LbAeClDJ8DttXw#+ozZ%UMLvit)52Qm^ufdd2RhR8x8V`)mF0DC z-fksAVWp3$cyv>qIE931U7dNb#yOr?XcP+jEN#|?7`6n^yMP4{o#k8YU_@LhUF6vp zh>1R}=5P~sfCYWGV>&%Jm<~0IFD_3jxkZ%5g{m5$-;9aO_WCAeISzj|}oPMSj#o$uat@dsd=DD=jI z%*^LQ5ehX~r_?eI(yxgeyx&^MrLC7yb)6TtY?Br||G8)578<4_)Pz z?xZfZ&FQTv$&;@96@FlbmW0_+a(G7)HRgj!)!=f6&R(J0&^@?^JXV`F_eo;{>48rL zhKRMG1Jj!`{M-3sto#IGrg)$$_R6Z0EXo`BIg7`oHlD<$Cd2Gn>6?B)F{Y} zhc-iF-5L%GV0SQ}B_Bj--SH62qvD2tG|o3ld+;N=?qWXuB`k{k7dK<6`@bWb@-_oY zMFPFUenMQfA^T6kZa#2VkLF2Bp4J;-Sw>FZrw9}-3Ys@zo%Snx`4MsquZkJ5P}Q9! zEQ_%@@T|hz-#^;6H#X;14MsN(HgSc2m79=Onu8>Ys;R<5CY0T+IHt}vYMw0WK=xhq zWny>ORmMuuF!57-%bhU87H~l81f8S~#Hz!=Prs*jB#7Mag6*Fg(IRZZ=2D)@Yi|6@)Ro~6C3cVx}E)R>Y^U`JL844|MLxsDVZ9vl%PAME5s&?vC~L zX)gDD19vO(y^R&Y1-#!_{CYflFG+rs0-APbTYUUp@)Q3VZK2W5eg5|s7xng}e+vS5 zmIvEo8Lcv-X^i}>?X;Sfmc^;;1t=-~*Ccr#5jvkq_u##EvbCvE3>|Ix0*7y>j-MqR zBBD`ZVAC3pNRxSZ-!LgODeIJr7&~F6KTw&>{^+l^1ly%cPfF8spkGIxC?}H7d5}n?nGA1@qW|9!nBJ# zoP~aA*fJ)kzQ}+qgxUeyb*zt(p|QS>BJ|Lqx)?p}z*JI^ zWS&!@5kSowwO}_Pl(7y|7DLZS(=W)f4!<`(7ho~v#ML<7=7pRybd_-IeZ@IiWzuhU z6d8TZ{&__COGb*D5N>T?_%n`t1|N~XP^04nR}Ps}xmSXBx)^z%@$4h2=^$(k!X*dM zS;?TFKlu3TS6upy--n*{BMprF49s8OAF1>$Lu0N6H13<#Ss-LGWjA{BjH+4@l@g zh)C3*rzWW4tb6xx)m+KiE^OebrZop5bv$s7Ab=vJE$XUoHTp@C75H3ayF@8XUj8DP zKEx;A-`|dY#gF`h^R`*#AcXZpz*?aqn?$8vF6{c`R78-h`D(}`?TQ{j)_p!`Dt(dL zQ@082-$aN*(~efoP1vAJ5OUAGR*)jtIylG2XnwBLjlj9PhtN>&;x4!UB$~uvp4%+MEGSW7W0LE{~I%t zK>8Qq`Da?}XrV%y?o8Xfi_$PNEp6-v6*rKlDBqv*Wku!xS-vbBXEewCL@u{+`@aVT z7-W5`Maqt)JoWx}rDVBYB3U5j;^I=3FaNtu{2Iw zii3`hOqCnOUHA-rBqQ)UWTzOsmC=5jvVAjj%dZfAHd4ovkQ`MWw)iyw5vGUQcza|J z!AZ?xa#}k_WZ^bkdU#OEBS4*G^cWk%pVmnYeQzg!1gzH}AuZPu5-*P|Yn@gABX#rr zJ1L(lmx)v}&H1iPiIn}BOuFKrXioC#JpQ_h8ag*8Ob?P)K>_+!stZM-zKEjzTf71? zer~{b33)D|&X#>qalxro2n4w2bvi~GnU3mZ1e+*<95ZfXK=eZ~<5yrg8JPRE;z}MG z<4l@U-s2j$1UFQd889HOXeF51T9PzsVsAh*nP|Rok#a6QjCH=)MaiOHdaeKt+y-Z~ zYh#l^Q=Tep;GvuqnL~1OEr&So3v3UDuvsmdRc(uFC_aRSdS0eE(DW&?YH+9dL+UvY zv~!7S{wrSw^)2FTjFi15%k7c|pY~k<+5zFm7*zw(iI;{V{t+X-{o1oTs~>#KmWc_%r&o3H4?!9JMvMU1;?WaTN*BQ%~U8UHBYh1M;9 zXuZK%LF5$azH5`ONq4Diq@J$sFf@-+I(2QbpCm&wQMC$Hm>Cu9x6#F8U{Hx>`C}|3 zS!w8LWxBE7L7e1&QP@_x??T8e8UE$u6Wv`)y zwUlWY&$p!{vl{cH+M8up=ip+tAfH5{1V_)a##rkwTysv9Nvz<1NG$*L0d=%5g4T4+ zFp;T3iXDm=W+Y4pCsKKaIN||Q&-btbA<6j^&mGNaSk$Fjd zVG#a~Y(AcJDL=ONv5Wwp1=+V$hc#JaSbNOvJYEVA<3#C9`p?EZyp|5AI&%|8_Q{>y z8+oKatwq#}O!g|K`1<&@hfJ|%s-v)z%*^&dzK*6BsB&cp3 zJ&ED;)S7Xq=l9osWMrT`T|K=>3bn0Sgb;g6}?f6DBzCko5LNDW5g5J2F){kcZRgMm zmc|fOYFMG(Thi0<#kZ16&6%$&1{V8`7I@5k2m=aDwsBb7F*QnXX~1;1XSF6bHy&Lo zLrTd!M7~k7Ev5q$@|)M7S0R4*5XU>{(r%eTq0840xxaI)4oV0p!`0<= z;P!o=D^S3OFZD(#B?`eKlP+JMUKPq-Vn5vSqjbC9XgmJO(?g`KGE+g~tbvcx;WJwq z)5j{>NsZnh8FZb40j)4d`wAy zIHUab-a-Y5#> z8*5q~ui-l$@a}u}^C9t^_ayGk@B}Wvx_6_uRyS06+GEi;!my@3GnX|@Vx}T=wGu$! zFk&7xaxlGYjMK^cvn?hRNu#OqtK)a@X?XhW>D1SR+E&CNgL& zJ^21TgerRE*7D?x=6c~yR-N@vxs`-i0V#10tm2t#uU1bG-gux|0i?d1rY2HwakUHj z!(sgiPjkIQ>s&}%zDU9RsFhWQtA-c$y$~4&8vE6P)aII87HqFSyAY}JwLN~I$ zs&Tz8E@hxX*|&JuUW4QsD&u{%ZfFKBHHUNVSPrcKq;~D@;a4(l_Jm2UnlLNQ${ zZb)={w~a1{`=6-tacGW_{;tHUK$_1HeM@!B_qTWX^JKXDEhX)vCFKSfu(lOCPs7nz z48^b{Pc+($F1Yn;BSMsfE+}A5HuGaBuAcLqqakVmBaikWRV0zGZtFBGk zqw&tiHjI88?R3CP!WU!DHOvgCIU88pLQR$>zHaZb{w~hL`SA58ljibo5Za_c4y)W9 z(kdG88@CDZVllW*b)lI=KP5+od?u~0Cwwb`DY;J5V-#_ix<`r;QfNlnlvZr30qjWK zmnFyh{mLIcC^8A6N9=89Q za}a%WVK)BL0SU(gkoVGUvGh5OMQEN)Bx63uh&oyfZrrEbJ8P76VK*8uX2TkJ7Z~0w z*4GC+sb&)IEK}n-oG8QS(>YhJxEO91%xNb);PY8QBEODrN-EN$sQOEivoZ6W)JWfV zW2m&vmsJ=H=kOLn>#ve0edQ(Sgbw>t(_4SY)Ma%c%8AyB@&%@zh8aw9XbW?dY3slk zuQ&f>gyUm;J)U$wiIx71nv_d@Otw^oIx~I_vx2uF0kNA5Ov1_`EjyKM_~2?Y(qFQf z6mKF2Eo1@@Ez?|N>Hv#U{s@z}+it2RLi#t%I`TD0oNQi6O*_y!4vVNJdi^arlCQN; z_wNo^x|sTViZh0fNn4zZ%fo;AKy&@8N?>rQuQxK9xJ=LCi8t#W`(vE*I_|^k*H=!! z$F&3Vgn}KF)~%GK+^H&=3#=rF$GF-b_sgO#6xz36&|XO%aiht{yai?!yMvJRiXzTHa+;(?`EnV7h?9*-`j|vsN7kc=?R(8ZuXGoR%`an^C zI<>3^XvVWq_@+yyt!am6B(+fUL?OvhY>%T!$z4J2n(t3*>i}8AvM1RO(o@G|Er8n8 zX{P>2L*m9#|Kh2_56L63VOkQHX(IPGHd%(@Z|y2-C?r?wHbM0Zi+h(6<}9Nu$W9Ke zZy|GSe3^=_aMLfi+k7zLDiq#~+IR-4edBtaDJTu(?LV2%l=H-n$kDF0e=W)TQqhA( z83CPlfLh^{ic?R!EQhYVs#nLo=#Sx$IZSPQ{`yUCYv?41g_TuDcqZSpNq4*hL`?`J zEG)~?5~*ri*M(_3;tP$)mE5a4_*R|lE>Q2x=v!_3gRd^TiJ(Eeuql03Q;!EK$X~u$ zKQ`DSD4n5V!cvhDrw%CDa+Cu1C=D@oz%2JF0lk{x`i#0ZQH{T`)$P7g_C0HSsvVIP zEJY0dY49AS`3R9Ki3}z`Kq^f6N5$A*7Q~FX3z)`oNuO1$YI~{wx^1M+TB-u*a1{3) z3HMOk+ChWn(q6x`3=JTsz|T~M(41NdIWvt+p+l{Vt-Ge~M%Om@(nG{% z7T8ehe$C9d#P!>LY@_XF<(o^dqI<=Y2~H83V*AcWxhd~f9|Kqcey(?A9cRcwe6vI` z4cBSkG|DVUm4&4zD9k3f?%N^UxIai84pIttZ-BN!K$6PK2iIxLm&BsP(Hc^8WuGixyV{_{-6=hXJLP7n1u!BoohYlBmHt&2na*44( zv)?PKhJd7$DD?&c^5DkD?8>Tg%X_DNL2&D%NomWQUv{Vy(A3FGFg<%_+Zuj;rIp&d zA)AGwgaqgc&#TuRD0W*5-F0(cq?t+f`QJt}MvHx|4AcUsDo}MS#4Y)D?J^j!RC*$y z+e>aYTn1(xxrrLm(&@QOYki`Cweusc*n$ zVUV1heDuj#O0PV7k8P|VNsJ!qA0%p)zfV+7=`+?IRD7?cAvHd;bGlJ8{GzZg+snXx8%>tE7SSYR(Rg% zERq=^0w0r_lv;s$ko5||HbLMj=|2*_YbMi|$gJw1V}c8d{0AU0GuY5%T+V8vXWBS- zdkX7pd(vwA@(Cgv_^+QgI46Up_7Eb{(;N<4)`}~Zy315{Rp?A@hA^W+3w&;p&r&NY<(^f9a zaboNo*imFszIV+mFsS8;OgIWpZ&%;0$L7V`PMfE9=9W8{PMYhtQCX~`^P_Zu5Zr!Y zrh_?`W8CFEamqI28+zH?{^-F4^i|2{QQkB3r#r2ZN)HQcMeLGaD5mJ;HoLUCxDA{) zpa`&y?0#O~#xRdZq59Z0ev_kklxFS1Fm?=+y_{uxWVamcK)jqF3nN=`g^+UsTk3{t zJlNWa_V#_LMEg=q^fWaSJ-amU_5O+*(*!_ja{ z@;8Cg@{CzeGb+GW)%~dM?~@>AftQ@)3nVb4T&W7>lLVV3S|%$ z(nq@Y5*d^F$fLB6HVghg(Tz9z%Jy}`;)=kaMlQWlx0&NN*R&x>%C#@5rGMe4mJ&BI zxd=g)T(Z~uAGx^KQ+&?uTMd3a9o{>$}9V%gfrncul$Fu6+Qv_IPs?ZneRfaf81eBFHEYyGo% z_X5ibzg6#xl~>k}M(ls!oth!2uDeHbiK)+o2H`8_J#x_dI@m?OLaxt*-Cp-qz{;L< z!ga7C{#jjnzi%71rymB)Qh5N5cun^J~Z&R=Gl$;8uIV&d&ASDwt({Crz~>S$l~3dkdz+I!`e#9h-VmQtVm zym{3;fUWQ9_>Lf8KDx4}ub{?SZdTRocVgK-WqXo76}ksIq>h~b&4@S5xDZ~jqeH`1 z!V5M?X0cJzF!d{a#m!M>J<=Ywma2un0iGbjvMpux@ogR{KB_pQFP_bIwA9x$kc$QL zcO~CfHk$Q-wlJS0xAq;Il`k?=Gc?znb+2jm%A@PirL$u6Zn%0wsw%B z7T^UZ8G$VKrJfR=MZ8hGAMs%z@_{;y5Fb~~o^S9QQ&2H`6VO}izBPNh>^e#?-C`f- zYqk$>hRn;myHJe#f=(5iV)K01&-DDrF6mLSY5_VfK5l?Fquid!XxGCgs})j#FV`2u zW+esjeX8h`H<%XckgTe-sbc10npw`EG??B7hAphT_JsWGV3HMFaz%bc9NNLJ!s=a#>a}b za(MhCe$5cx5MSUL$sKdDLh4@bPBcCLH7kUo+=ek4Qh$x|MYqJ2v#P|(O|DEwu2=l< z-y&T_&M8+A4{9~_TMYDAi4eXO91H69qBPeY?VsQ!5<9@RN?1XoMeQF!rc(AsbMfxt zo^CUhUqg;CbB{QSG7IcEAfLWm>7};_64h-k+|yI%dg1Tu4sUQCu1zO>Dr)J{G~L>6 z^8?H_Ff*WkF#nSvL_lqn8>wH z9uW#~pzk?7`F478Sb7aZ1}dtqY+qz!fWxg@+VpDo4nRB+AhbGgsGLw*z z<#{gph$z8SY)9=U(;dq?7>bFz6rCjMlI1@2gAxZg~9@*)1tzOLhKtFnS?+- zpkD@;rt-OiT1!pE#lghd5R6Mf$N9LQCHDHAZDnj->V_-?+yzDFmv8@&AlG+#IJ40HB)A&C|B<$hPvxDP2UJ|_b|4_v54@LIvCe*YF zg-5H)i^OuMJzfM?37|tp#rG_{8dK50}}YvmJ#a!j*Fd??=#G!lG*9hAnr>F8XKGw4y;d@9zD)I z#_YDn)42)fAhs??ArWC_oTv}z%cG?>(6z2luhCUHO$_9~UO}&wOkb<@)PA1pnw^!r z>nx}k0V^kABNgrAMBzj2L6j^sHu2oK*o7X3F$ z$gov+=HJ#`2z#7-3>4}qd_J_{LUWcD}G+iT=zU+AP5DT74 zrR%%OZCr$-vFvh7k^8A|cbz1|hu4{Y&hHA}E|jpVuPvR@7pwM%M9>PmVOU{85zsGF zOPKi#TAq}JH6ovgP<}TLO#k;TA39%`Nea*JUFR6_aF~@o*qd{^9W5!mZ2n7hpVGEy zxM4bd|6XF&hQfsWkwkds-t`^Zk1xtr+DvnE-A*CcqJ3|&X~|&&H~iNdfG1%%(O*f2 z7+k8R`KuPdWJN>Btadv;o&;WpWD1EsE=J}Tp#Or5Z4CH}@i<<5RHV-AnGd%b=+Hrx za`3wWH8!1<$*qQS3(NkT?=@+TMtsXLwSRTk-{CO6W^2tvN9cpLu>*Gx5}@!&`??Gu z?i%dvc+V4`_}<{{+B)%^hanjv2C$8_FjL*; z08zbDKIzS5@ImGFRBk^o0?;CjNF^ ze(Uq44x_-?jzoqJ5V;PYv#_jAg~dx-=(Z5|gkkw|LtWshs~SAtr$fMO-gP9^4GOH`?fDl{O4J}YU*&-j+&QqceGK>j0qzvUN={Seo6XRB$T-QuC}M}5&*9e$$8WVgJXntq(r#CMn#xogFxO8kmwrZ^ z04L?F3xM)Xc@+OvPp`4mIzJ!}N9+v>xCL}U>(DD&xHa{606cav7t zZDa14eP0ig87OO|21m&CpUga&sh8Dd=i&jaHM0y3Y)ESG(?skNdc#m`SA|8K1C4+h%?`Q2U?Q?pJH-;=?bCLBB3pbAt8M{6!5A zSLD1-`)nN6Gz=CJ$`xN#CY@TDn;9g`G`s}OvB5zy@%u_;KY}xMFt`3)j)ST%Jzild z%2rS(^JQF#b5FirP(d6e5-8i&Lnkv8HvIy|Ksbnhp8gm<4R18z z;)fU)u?y<`ke@Yb)kcHX0_VR4+7qj`YXj8o>$>W40j=ch znZ)>zE{7$YF|9(R$Lt1w&A(%s`ghOsk;0MvM$;ymyL8Xh@As%~TJEKT!#x#@dws~m zmvKhg+lPBA%!3$kTFQ+DFfAzs&=6)ApZlwi9C#1<sSaC@@7gL=5SQRGAXj3yT8)`<|ojGzN8$$R4!>&$_VdJgioUb{)G zmo&`NoD!Eo(OO>Tnsz!RlO&bD-0vHjdPnK^Cc>HowoDu714elav#~IALf4a0YMdU; z%H_5G6IUX&PV~rxJr{1@rWXEy+Ej9PsZKuy+V+}5c7pcYeZ6V?>FtPsB0fnlWv7fb znoa4k7WNI&3@{)^MAs7?Pw$mo16+SJKy~;&)CWycNqM#Ph9asce&9HAL7pO0Q}4T% zk^}|*&=g_r^IJ>kuyXu<;ojMu`M)A?%zAaNEbJiNxdaw)OY6GMW_Bm{oWvM;&oXID ztwMc;5MkrDo0Ri2q{NQV3US;wXw;$2pZlp1yQCq?ajJb=lO1oSeCtJgXH7#A^t`#r zcjgpt+X2g|Uy)8`*w@iC(dLhe>#UCwX;WZ%hj>I+xlQ~%TYkn0t_?jUCB@yLOL zoaz`A*Tmdyx?_A91k`5fQ!kSu`#>Pdy6=y0nFD}(C^R_)c_gFl=E}P{imc7)XrKO; zEKe@YwE2}XFvAIMqFtL1VWoKCf=&@HofZV90J9h6v99z1;ec8} zE;!sHP4)HlTbKQp!HgA*?u%}94}5={I6zGg)elnD4Gjr#k&y~TIZS)eh%c7ZSVMuZ zONE2Pg{>T&k^e#NFd04-0p z@lV}IWU5fH6Z5hU zcyWFwpRj884^B+9H;A28!>rr`2|dkZ2><&mIBL^QMBwJ#mf-E-T$~5oKYu1Lzz_t8 z0Xg+J`+#m;{_Pw;vNL#81QSEHkayUC{LKJcNfE%gaGU*M3f!{TDe(8s;%oUw zMUG3onxan9cT$66nO`Mq z{pRnwbpTsHPO<;=$@u#13%+zw6|?OM$lfpflmv;~Kf7DTjt9&KGjDGV4_D_y{ot1} zz_CQK%y7BSxltE!0r+3xyZyyj?bAh3?rX&bv*peI5=_pkzNAm(vTv-@@b_m} zLDRlY!quc$Cqyty_L|??HIP4vH1PG1)Z3GtbcXv&1AbN(LH?Q$Ggc6s;5FNyRHeAz z^Q@pmIC}j7v(iJ4P@4)`{F$N;{Qi$9z~x&My;{wJYvX{` z=F?>45Ru0|554`h4@Y;)otG*EzdNftS7C?k zxs&-hcnquYj8gwlRIkwaw!ZWA`zOq~GaR&ooU!5^z^4C!A6#nwttVS2>qhtPb|-Ds z_=D6-S2JG@w(t3?i5nY|e3tE{_vvPJq%IWb3qw0J0*j4@nze(p z6UW3%zkWwPyqBbi#U9Q=&mGIhc-bPbPe0{={pxn=3GIA!;SGT&mb=I2dzYF+eoZ(1 z{)nvls&V1}gSoeis_XBzgR$W5uEBy!@Bj(!7Tn!}yIXJzPH>0d?(XjH8r=P0J&^qG zbDws+9k=gjJGwvc<-lR@^|Q6+nse?ErCHV3P{Y_4FlY0h=e&L+oSs=;+7njADiNZj zWlKgA`Ni{I0T2AU>8IfIFW}?E7Lm_xk8542b3@BppI@i$G=U95i!0B%L79e^<&R#e zrvT&~y~aeD;Wpt$3J=dhu5$vLR>3Fa1e!%|c~589m|Cs%!i40k z=UW+}m$WBM+=+G9MN0nTLxe<7{)Okrq$vfU8ROw*42foFoay#1*aG>KQd%=gP|GVh z9HnffiSX_e%4bh^5D+>SI6k^S$Z<_zy@uKT#4e6{5BJX7nSZyM zcwO##miQcZ!u9K&8|?b6TP~5(i*oEa=02`&A!{47coJzmiLXu8yZpVO8F^6E4&xx( z^J}B5N=rR;r4x{g95_a|ef1ZV{g$4a$2$qbmb&~8Wka-zy&hgrk0 z<+9hO3<%MdTn8*V5Zezq4l8-ho)Px6lc8}sChm!-%^0qBkMW++kJgd4Of=E`hqVi_ zQkOnZA~Zf*`kaG+AP@4JQ#UN{JWL&5zB5Wc?~3uMzjH42`(eBKt~YbbE(IQ>QO`Id zvHAi?GhNH5d>iKpT}(M37wf$8b0x$Z4zk(!c(_x7pYr$!=deARgp*Z$fKJD;#<5f( zqZsAICkBHaG8>^k!=F(Wiux7!NsnKqV5rzdQ zh<9`zHuh9-cTv?ED~-pkVD2e})ko-b(tQO>lW~e$pnRt4J@1yS5bO9DrI0~;U$_d7 zl8H^ZyPE?>cfq}QbGNI8;&K?SDbB8p2YHd7ck3%p1(9pSUB_NxiTqyCp}jX&*wIw+F^w9rijEh8?sEP@OSPJ=T+K!w@`@Ais*9?oew! zhFGFs{qunPXg;bFCSM>l90ZA#Sdp>6(HTJ5S;xQbEtSkp-vzM+&mp00@LKoC91daE zA0uPwA(!!If(vEn>!21WAV9n{VPhZhtgk7>;pR&%h0+ONyYFaRCKi<-&S|BtEZnlc z5KNE_c2}n%FJ-{7YE#Pv^zNxOgs5L#*QrC4SQUaQ>36%L7nIfHq~Y_~`MXee*iYPA zibtuL@Y~nO(rKQBfE4XPDW{W1K)v#PqexIpFhG@`+KXE|kbe*yy(UzoMW|l;_RvW= z5x@f7YkrCk#L@x`@lz3mQhM;aJa}cbF5D^r+4@+%PnKG)VnMw>@1!yebckUvE16)b zY9#bx+$=aoT`d3a$QfSsQzdeTLD}U+ul(9<;6#}m-JwB}MlQZid&??F*FQA&nlaz$ zw_#)LfPW%(W3ZPS$9P>7dx+&g5kUOj+I8xVIEW&Ty;$`lPo|vZJ6BJvv!|88t_=9# zrIVL^bK)}$9e`0TpTb0lyuAf6p)h&;ZD8Q^&+DL_(4CM#^I-M49*dVv5_u;YK4n8H zwWtHN5j6#?$n@M`rOvFKDq`Q0w_BMdE)7fwSHKn9L)*&Ikj(c9eI2t#v|NX2s7F2e^@9S4tQUIC#}$|sPEUZn2dI+}#CY4FEMNzhfzD}2|G2{$Mbyiw z;exmGr^fozdvclA+ngrCj8G~aK>)AZ%+yjJb@F@-BskV*9=87%M9Q&GK82H|iyP&!xN@!HH@|rblrZ!qs+$SCNU$!AxTnh|E1#~(=Xx|? zY`;I67ctMFjBRDHH5@Qa@w7@)W z%^kqKWqbf1=>BINT*hf3x*vOBm5qU}!6e{SPEc=aCXL+ExADvaRQ@wse57~MPa~8PO9uCXD1Xj=ap{%3|}EnkLI| z2MQ~WSE8%gJAJK88k^YD16$=f>f(&H!lLnsjQ;G#2qe;7r+Ep)eE;|y?X$r|2tS0y zagOP#fVXuG4TQd+j_Uy1Iu?`99KJ(BBugc;1vfFe<^GE!zfz(m)RzGXtc{iiuLDm?=`Y4r%uG%9 zSz{H7xMJn)?5cPkiSImIe!k5~!D*IF>5`c(A9b}YP*sn{R%4+q|I`GxS?g{!Hgq01 zb#?Xmg@pluE(3l2DN_?#n8v@Q>|!qhuvS9&r(pP7Y0(pd6_H}oG~yn9Af^f0*W+b+ z;fL*y_I=$O{#;p2-MjnzoemB;c)(Bj5P1GgPVs+0M(|$|Z+s{;TR+~XM+y!yIWx6T zY$XjtxQ@9Z>TZk2G;Gez6{1J$idUizwv9@Vx03+I&wg0sqVn$}uU_2MQ0f3nN^W&- z7ZWmab#=V?#h^?&9kLyv2A*o4JIcZCdQVhIgok9HUc+C=_jMsT#ef(6Gela1mcSuG z?NI8<)HMUvSe5F5ZIlc#f4=^N4i7dh&ac$bQCxPGF}S^O1Nf_w2>%g#575_R>FxTT z>Qw&k2KN8>e{;0k9bL)!Ju*A)j3;N_ z)ab^ytSEaXgawye6I&R;jC?-;E*uR&r+utN1|FbN!xCE-8IS#Vkze(;80@we{La$K0LL&}L#N8cQ!50eIeRVTRAv@oCHhK%(q(&60@ z@}OC(M>AUNLrj0eNnU3cM{l)pIN`dI(s50lOMJR@bb12 za%&Lt4exZWy7v=VsIf}{UKhw7gP!qWhI8vkiI~R@GJKp(h#4y_Z zHu#RMDr1og`D=G{>x)v(v>3u2evq&gL$rkEA02IH>Y_fi;Ub2U z|7#xFdk5kiZ5Sv=7TaN2j~2&%5u5DmSE=HbKwa{rMW z4ki)x9|ml{3(9={mWamF(z0V$bO4khK3OwJ@6L9yxT6Baao;B_cltRR@J_$+1$R>H zTvL3+*tokXxqCFA7+mQ@;kJOy16mF$&QiNSZ}f2}j#oITTXcvW&DUb}mBrV!XeXvZ ziaj{#?V9E?Xe5ACz>}}3E&R7M3FH>y7TZim6AA12pS`xnK2g%+mSji9)^BhL30kQn#DS42ewhTp&!n zr^L^xWeb*dXnZT=l(|7b-pkZ6(>KA+1wD219 zJhJi6bc{VDAS`pmy(v17@&niih?XAUWvxa(*sQunV-`&8&w8qJtG1y$9T;iBNW{Y` zq+Djnw?(_o>i3~p_J%rHxCrgQynheV)N2)C;+jpbALJV8T-gtYGTwpvnp17+3GA%z z&bX6*SaRNil~3*#sM$m*AzH7#{?Wv6W@9Jl;!>k#LV_}d!miQQ((vg^r^rA)p2E9PP!@tf*y-;DCuav1YpmaS#J#Eq%ez8--}lbr$ocL zsA$ELKUoFp@R8BA=Z*!a+zRPGta53j_sJq%-KMi^^bPklBH#gKfz`@ZAF~QMkQ#m_ zSRd^1etY@`;!5?0l2R{!f|_RPeH*_$hZ0DZHZ+=%jm6jJd}V*_q`a!DvGT zUO647Gwf=QFk7;ps6?LIhtn(qzKC+~)uMe+O zVEP}`tsGxtk#8k)Bs8sR9R!+vU5r~~7nwOG*<@unL~!Fe^ql2rU2h)O$GMMfcMi_? zxmZ&93uZc#(mdlIkQDP81?nYcG@l@skTkzk+`gw(sl*-QdEwEz%dB3(o6{B3u=1;n z=jQ!;dI>&loWKpj0*&?R%y5h%k|HpQe(SS>R~jhZoSi9IdbP>v9PP`@^pAYCOuuDv zuyl1Mlf;cR_?;iPf zGRt+_z$~W(*WW*KSolhm&l%CiH)fHsp;UgqvBMpc<6pP3cLF~ME8P*~X7J(5{JZxn zpu8JQwz3~-&S`DoaW$243A)Zn+v)Z2g_92~+v)HpP#pOu#PFq9>gQUy2t;HsGaDwL zNV+t)N%PC0C9OehBM5~17HX&@xgv}6gzq3As65&i7e7}QmBb95VAmK;uu&s@I8^(1 z0Ixq1x6k1$nH{mWzfpUAfA^=y0VFbKH?dPm*i$wL>7I1TSr^uSUsX8 zG*SV$C{(#%c%^Xhms>HKB152jgKuM2xqpF4XYcA8)dMU~c%h>p$@7u6GMr5kCuXyr zhGvG85!3Prm1_@ObLCf~fLe+#x%c8W8jFaA$)oH2t0m4JODJC-Ao*DhMt+Tlez~<@ z0=T>Xo!mhHBw+d4vd!tp#Ku#BTtPx#Feu*JU^mcjdL^)ZWa#XviPSiQjT+{1$fnbC z1bz4MH?bJc`k_2YiU5V~1e%QQz;`j9Z`yEQwVEq$;> z<9D89=wbB+&_m_nUK1$OJm2UWdcxuPT3#ZeKS?8yX{A?XI+dpcv>pcbBc0tEi}VEz zt@oOl9+Ah?*h`EHr-;K5?8?Neq#U@{MD{A)K10YTxl-dpB+{Pa(~ zXK%G2dq(@s!a~>Bm=X!$PnWXdeIhQ9g|LeE$`i|_jlwWVPMX30r?6N#1mYA2GUPuw z=mE^1JjHO&`7?;r2mUz@|9mW>*t0Lnl@L~}4w`t@j@k|Qh4xSM_tJVYXyy1W!aU&_ z+O9~oR_jqOvzm3w{&9&znP_Hnh1Ij(&GM*$9QxihdW2)y>RjQ)p+3EJ10 zSsXtq%BpHEDV6eFU0BBi_R330NaVkkT$b^HZzb21e5Z%E;+9WfFNl5s*k{562;3hR zMLy<+?a$`zlnFk?whmx#F+p$z7G?e=C3Ht`iBx4p#Xc)*JcNRPK;EER7m%*^CXQ=b zU5;w!9`ae^E7->QL2%d2gxV*L&th{VnD+NZJ6^Hel^H>}1+SEmjMWuMd~O@~o{B%& zS|iq*lGv#xZlZm%;sAQ3rke@9FZ%DFw!i&pP0Eo^4+`+JYiHWG<8@E#&v({*vzWK& z(CO3{d)wr0Vc+nMQime3k-rOjMd%H?{2TNCsd@Z=*pmw>A~b(m*&zXv{CG=B29>{8 zWO_zF``yh=W`zM8;{Aqt^OGOQ<>)Wu%`8ph1Jfh!MYWW)Yo3)x#xry-CH}TX{bsl3 z(trgL-O;z>?ac64;9S%(Ckv>ZL;|N~7~IK3=;o87=ml~;%;whwC94@|QD4VX5rGrD3N?1+ZGwCBWE`!(HOf&?Cf4gR*Ht<9%#8CP3=v|Wi~l{DjO8+s{XxtjP_HwT1l9afs^&>UA15L)N z`!IP;QQ~a?g9_N+!q1%9`i!aNv1ReNt?lX4B@)>&*9R5J`-mJ*ry91tPMpFULnY(3 z`-GHfVX34o^ykEy{`fkYL1FbP)8E^g@7WOXxqLaRjC2l{%C=;@?&v)0ZNNRxmZ$Ez zti1f4*k9hsZIM>Eo$|Wdt^WXs{~7VD(l=bhpnCzB>u*l0N~W{DV|cPA3jjD5DJA_A)vZ9&V{rcY!^=I(1sv=QCwgP6nv>Txf-URX z#%>#cE}r-K6KAk{Z_VLB%CR6{tuiz7(r=6*uV)dyj_2=PwlvxV6?AQYW3Qooclk=5 z$ix@+wwLr;Vp~<0cdM?u9u4Ul6)EI2a~u9%cc%GB(OPxnrIXz-k&?e63A^F+S2lT*S&Rw|PPEGmOW>_aAo zfWW>o^V#XkJ*=6TdBt7kyC7^9++PV(JKlxR%LhP<(FE<&zP3kqv{D0&uA`q*J3HK5 zT$?j(t>G{CQ-`)*^#H;0+sLw3ACMQ_M0TeL)~mqeBAUudyPWHL&Q<^gsJ?LE(9=%H z32rwp^3dY*x$*6=-|(N17yG|qXW+Sph6TmNUqnTbH3AYX$<0HY_vUJkiO3ijv`+x* z;e1bZ%UH*4&zF4tF4}9Eck5k|vPw#&tzT>|u2hTFTG74kw@!ENUv{06%Wb+`zbenI zFKtoIG!WONtkiCy2?~exHd(cPU{D@@NqBks#8#{wIAuIWve936upAOS$xQ2Yh4Q%T z^@#U;-pA1IW1xH5`czO-)W_g;Gj?~)@S=FapiFCZsr?+(4&v2-7kH3_3#3E7U6t@} z(^b;i*4{TYHI*xG+yRQ%@{(OL>j5;gz8+%WR|1p8paBmfgO;UK5t-T)z3Ulh!%mUO zPNCIRK~$pCi-*N!sP6C`RgL-goA@%)y+!*6wlu9eNZwT~GwSUVOw8d(5$kbl&USU> zwbj(lA0z^drk!_)hop__$aH!__utPa%zkxFbqQ!mOW3ifsn5Ss9DrAU^xs98o0~gT z@<5umf4oBuMe8syG$oK)NJZO7T_-t0L)AWuRJ&E;^fF75o1+!K+Y}#1j^ywdc;B%w zAV$C<4dHLc+F<*f>=(#Q=hinmW>b_2%5H_3U0C?kp-<|3xVu{vK@FS$PHoTRp4XRN zQGKB~b3ySHM2}DUk3$TeKpTIBZQH-GqJ4`M{2d|zECYiKXMvhmk^Wk-w6yfyK%|#< zo%TyxZMD%1tb>_I(&yka&JNd}kQ_Z*@zhF`Eb0Cl-Ne6% z*rGuB)-s_HV0yz-PGx0fbK;Y%o*HNFT<1h6rXsbSrBkQeH+?iu+nyRHc0#Tu)@pUW zs>~r#)07o-pT6vl*|NjZ#M5<{zdVFIHZt%%aX(+Jz4%XTkj-%ZsRjRu|N15~#N}@9 z)@+ITeCs94^qkYTiA4e{D~1Mh?`a8BVeN;3UAOWRpkS}R0?kZpjFXdda0MSdA$HSs z7NMp()r9<^lkX9|?eY3lRzbZe9@mLX#P4u{{cLX&szUck?Rz9_%$)iaw_DLh{PNo0 z8bg)vwWT2_90XEifY1 zn^&AEGHpJat|HF&Nd84FTu3WSudXt`MPTapc?tEOT*tNbUlYOSgiq;fsJIe8;?*GL z_=z|Qh4N;z=}&nOkM3a~T0i+!1yh$Jr1}!GJLnOa7F}BJUy0%K+Cm4)q{PL0Ar8!0 zW)$>dp745FTd8vjZ49uVt)A%Bi-_nXu2%npcdD4Q*h{vod5;4@u_|Rbq9Y`y8tDIw zfMTxVJV^o#WjMHhuAVopXFrdB6?fF87@JZ~{#}FvS5;FZBzeVgud5vxN!W+wcDpe@ zFm)kNOP{CFsl4`neWY%!%SS*&R$V<5BN8Z1jHiwE%XM^gw3Yoj?6kMX1gtfr5v@aZ zn(Hi@mced+IhZpVUI=pbtI4U7kFk@!$F@<>pZO?@o&1}7TEvoxMs4wg+Zr0zG?hL# zcgu>%^F34)SzlQ1XKoxFMB%`4Q<>uuC!e9=D{Lf=8-eNS0eV=!h&FKiui#ce8t0q1wUlR^K)y}5G+-tc$3 z6>ejy=%iqgJT1uCOZqaYdpAyhER}%BP*(2I===T4+RuPygo1$lYtf}D45*K*;%IJRBEo(!N&$A*`6}R1L*6MP zwQZ{qk)^s&39Mqzof86dR0yP38UnRDYiB)iq)hqtmgGZEEon0m?FCty&byaW zCa^z4#-%CMKFagDKoO-^^%TH#ZJ2E$36x;qrnG56=KnYkf?-^RcNATB9!}&H;+k8k ztI;Pa8+7z?tq}j|D5S<`N|5|zb8)Un;bo|S$|~-rp$!V(?M$R-aoJ9k=Bl$`0McWS zO^KLtpQ@ENKQ+-89CPAqC@rTDPmX=em1}-!=zWIn1g5-QFd9#rz1h+fA70)L;f* zLHHJFT%=o&M^a=O40i1S;mpsBH5@cJO{MCI2xz|$sN`CAVv>vc{MA|`|leW9G8o^kz5)X@+U}A0&>i{|j zM~k#dLPVeghE^S6RfWk27cI7F;6)C^`(I8Kc6LLg(7fy1oZGmk#Hveo!;2@GZNlLU zydj+^AB#y#`I~YI+AHhG*78+PlkMJVaeD8fJz)RFHW!j`(ijMrChRjPt7zHWSrzwz6s2`Jh>FY?-8H15<4<`pSoE8@(!T9$|9(1;4nqR5};Il+-Jjst%no&?c zf`=+ubhBIv=+5PIM1=|iN{=%;i-d2|W0|)DGG|O!tF#w-8!bt@5giGdkW7_)&(mDT zmYIM3`f@U;dx>YId&#|2u77LkZueDf4%X@phb`~qm->t?^1^#JN;I$jip_sLN(hMn z+(f))=ZS?|)Yk)_y}()Bnhm-W*7o{#N|h1Zsp)Uy;&K>O5DcwAIF&6fUU;SB*)J8D zO?nxS7H*!k@T(Sju8g&do&tl|iID@Ls(bdn|r^F=PS<5%aYh9<{PgtzXb7h7E{9b64gkoG%rGi z);m%yXImztpABgi0nYt&PEwP&kT-w(dnV<&va_g#Q|B|3eLws_hBc~i;Ygh$&)auF z({)KX62djeWJJwq2M*_xCVHTF5hu?I^QQc&A&#B;&H(Yp^DY%bY(JhxJ@2RlB@Tba z<$hN5WRp+kL1xdRl;ZldzHNg?B`vI`oZ84Xn=KA+G4c}Q7g)FVSdEV3(yLahM79$% zGGDocU7EaLT+$L)H~GnjV$39?{sV);{%X7Wy#@dtBbA3WJ4a(*zt&Iv=X{e3O)b$} zMg<#`vK1>humQ1NE!7$xXXrjcS}&swHdZb`zZu3 z90U!rfkY{^ZQtl;caJNCnT2)cj%xj*Pi%h}TcQ5S(#Z@>{ExUvUA7jB6IW zKFxnhdCJFIEC@eO`Y;-flrluAc1Cou2`|63C}5UYr=VoC>sJ{fnM4u|GjsK!ccxmE zN%A6ib17LLiTq-3XH4G@rC*qZg_DsR&QaCJyq}?&*irWhB7#X*-JW=)P2s^xfbAdG zN@(jK{wvWP5*=w>ltkhZkYm8{Lah`0#{Wou5yI=3y6;y{ zw#z?w@ZD&Z#N8O6nO(5hP}7Zwn)#mI@z)oXksO+T7!aHc|KR-Q@<|Gywjl`M4|LDT z%_F(DrT=hPB( zjiqzW>czp`(3!U#Z7kaXg_Ye+_|OB7)Q0_qb{P(l}=?2P|q$8XO&@8W$926|>r zGmL}$1@w*2 zbYtHfgfW3ePU)VVuLj-V}p-Q0-s-($JxrK{YaT!Uk4u&u2mH z(fLaHa^I*l%qzEVB?nEvuL1Ro6}kkNVf*#KW38&f@da)y}6lwVkH^heYET2;Ym z_AIYi3yy;dXa*kiRZl!#IV`~;MFF7r(P9T6z<|W=VnSO}U2TtxoA>*-kxRY9o!bTT zL*aEDa5YZv0Y?T5J4KU35)VRSZyVTy6FdA6LTnS0;(VPKz$kMFVKOjldkv z9&OXykBHXm&rJMJ3djlq>`Jgwp_AD3_06~H)6^cdK!l}4)}u6o{^^+kMPS5wKwX{R zmyeT<7JVH&?S|X-v~DKM0S=y!*im9xMW6ytD;^zgr>c3ceiyG-V-wEg5=F6s4gC_o8gf+$JulAx6O*;lYy=G`UG+~bN#&`IiY_TZ_-4^P zj#(ack)=Vn$p46DsHedPlNazL)h+nYN%}_kZyNAX1pl}B5v)_RG0ymro#ykx?W&uM z7R8?mY(+iIe07l~cIPG*m^`(9oDw*a+DNbS$Uw0?}&j8HI%BmSu;M&6d zqkxG9_P}Jc0id3jmtK|WAHrUh*da6~7M`1k%o2QTz(g{*VNdB%X64l)_DQG3H5mcDb}C~tGBy&~9AI1LFUea0 zu0(Cdz%Mxgg&$NC)fc0P@Twt5)^-CD#%giYd8PO#ovshQHdY-()r#O_p_yJPeS7JI z?JN2PW-7wh6+bfg(Avs?=5UbXrqm(kqJ1PickH%O!4>?aCPyNiTvTGPa@Di?=3&B{ z1i+cZZj7m+sbPJs7Qc){2bBKg-rWN>^IxvezC%E5jnvhy1FmTu#BaqVhR*VpwY#1! ziMk7ds00P2+PBPSH-=iYH*SuX4m5xkBX$?|Ogs(%_}OB0hDe!og2)l8Hot%X$gf|O zHoac1K2XRclQ8W16SWvrOT4qW?RQgu34kJWSJ4VceA#V#d~GKv?gE36bpo`N0d@HK zP=1{a@qUMml+g$li0X8fC(+`swO}ksV}33g6>&-;(8z()YSV=rkP3}n9`@wZ>cP6* zT+bzCh3XdF?MLqxhGgFHuAuI;siT$6wYpaPkp0&R5=@XEiPzz-*(L>kJJb@@g)Qps=ySBpDnH3IX&!-d6`MU)K^zR z_HCxhJ(eEscD>wjPMfcl@41dAcZT{0<<*8lZru-$ovbf2q)an+%z{TT$;szIbG|$3)oH&B z=}h_ADxcRDnLvl4*jHrcGp^%l)`d~L$ivvo{mY~^Vt+dbu2VT}A1UVbgjM#1vjmnO9zvLU#8^|;5sp58#{R7r z+SnY*(d@<0%0=5E^B)F7ZcoRInJ3))H85-I$pZP-YKsBe=C8Q2!zxmAFDybd;%VPp zVB7HoZ_``D4?hQNr2>}!>I%hL`S*b&Pzjg2w(w!UKG?%mVev+kZx69-Z}6zIb4cwFB?7f#jch$(U-b~*T41Rz|RCu>6}@jX1k4Y%-V zY2`&&5+vnrEPgE7c5x6yR%$ld0KeRcuTw5F>Zdd7aa(Iv4P!Az2nk}+ z--b#6o-scw-EJ-KBi(9iYcI;{#27yU?WdaAU!CG|%K1zV-F4ewzDD9lVr@y~_hj*+Ten{!0f7oX%YqITl(>e7}&b@*d zbkEu8(`U(07(oF`=GJ?YqH26H zB(z3{cTjws!514$iEPyH(psx$6RCQ2l{RNv$D;iZ!ZJy|^A(;Z^v&-_ykM!R-6|Zc zm~o%F4@r@ONDc6x;G3ozy>#Rh8?P2u@_$Srdz-jCQIZV*g22(^b6+|4F;rB()jbS! zv*D`KS}~4cTrAN@yG=c&3_oG1YJdzZe8Oz9<_b{vdh>#xPRmz%D$8OyQEehXUc^_%nlvu1dm6&aODJ(sdbmXNtNIk{$R6E&k` zx@W6I8oloTFk^cqHPMNC*ght!S8R=A#6tAxKNSvO_qOnqfBeg%X9GtB^62xPbF;<# zw%nrSP6&O3fUK$m|EirSoUkyR3iGh= zp*vy>+#OkC0v-!!%d8EFLYl{@x`Q1;V7%S8KhW#GkW{ozRorlD@{J7wN+Xf{Z(PA5 zv=o~P3WkLBdD2TvcA3PLtEsBW`MlQl1eQOR67>+h@-jpCK9xJXC?N*e z&~8fP$ZQD(lX$q*e#EO}nUbQIPzL5kC=THpUqTE0W`#^~u&Keg*duh8C^e1`Qyl&W2tfJt&x_ z`_=IqmG6w9y;yQ&k=W$G#veGmw$UE8clZu_J`*hXr;u4@1OusvbCHVxVNfzUsB(); zZDiXbE~zVO)^(k}D2Q-~mSCabU^OzFGNdY6j_Nq@=dDanIbvT25DHLWlKU{!5c}?a;l5^Q{6I=Va0UKi7*@Y-RH@il?+J$49(;jrLprKMe1WYk&Ckjc2F<{}Vq zeYNzV0fd(%w4xz++}#q?dp-Njr(4U?z4nn6uw!ee_#`zl=9tfXWHYW{Te*@}H*PE& z6^_<758>K$2^7xe#S$;unTyxTA*%xFMArYp^rX_MoccfHqiEP~r!(rmq?JgOr+@aI ziA^%gjhtla5LQ=MLP8R%X8lG_!_ML5yRr4li2FPsKUhUhB|qL{QtiW-&0YY5u*_xr zEIUqmTg$tpR?+rziJw%ZtYO0Da+)NbwBPl%t@SNLKOv)%5a#85c4>Rc%pxRzH`obR zhE2#qO>UI6teT{v@!i(uak-PxF{c`hweReCNxkB!NMBTZOu!{|qjsXDxVDs#$m5xO zlss3bAd;Q1-m6yV0r=>o%!VD{m)n8HsoY+f$GYkPmY7)CLZ`Y~byjP=4@B-kIiUk) z!8>8lFuhN9CovBhD-ScRh^KDHiw@tOme@FuYQrIGel&rK`7@#`_K`_t#6aHi|`ElE| zt1H9bY;A#z(UN?Y7uk=$&M0=*h;-is%<-EWT$$xPyvQWYG(Em$Xm7Qqt!??;;7{4` zl&|`I$Edbu-B-fb^$o-q8~NpW0IIwBne6uus1Zbq;TESY{&RIFLV8+G7D1+rzY0q` zh_v0{Ue23dEF@lT4wbjB%jN;6Rjg3T3{l;Z3 zhZTVFcB_HcLz6P2)duO&VhdCh3X1LFVx_GgCWHs^?5+sIBmW8RhH=}SQ?bW|>AlCx zlX6?{frHE-668Zi?=CXx6Dpz%|13 z4DWw}aL%7FW;w^^cu;l|QQ^>8Uf^83dIqND?nt1-haNd!0cs6=AJIW(q|I59iQ@sZ zvY#a({6{v`!!k4`l^cPrJ_#`i^*t(W=R(c(o*&~sF~Xq-&#ux@kMYh)^~JH6WlWD0nk z1+KkdrKz;Q{+uh_2xnjGjLPmiy8=*F>|V;89kIx4{2tMZq5I}$es{+IXmN=7c(L}3 z@$qBL#e*l{9t#*pNZ$LsQZa;jle9HjaX z^}PMk%?&zVhTMJ=w~)A2vmEzI9Cb(huItraoRv?pP$HT`0u`QKc^@o%AWbL7r5o34 zl^*1?Lm2dSBTD9fW>r^~J6#Lw2!=f(S76ObCXAjK8T5N_%u75-?x(E_`&5XyD3YJ|YYA4cswFtUFYzr;-rU#RUI?g68{F$! z;t}DJ$9>Hx|6XDU71IOvd$We`QJC<+*~N98o$tlCVVSW7Fi7!uVEhs!H2HWW0z?OB zrFg~<$6g+w+@A+T&TiPQhe6gidXPw1KGjUQXL-%7J>AUJJD-F-dY1@5wf5eodnu(E z&j1ttxn&}+be_|zdeaM@EDdetL!E<<^a26v3kWh>hYU^wQ)L>BL2a!!#$k~Wdi=ou zR1gR(VaU?GL0IS5$gb~H(H-lY!w&w|4Ft&vVm@_o7-wmAg3K>R5qNlN7D zzAEMtb)9D!u>v4Sa_UeN9*D!juR+X4x30)Fu|NuYc~W>CVMfk`H3YrYoCELfI?4(O z{jsKIJnff0&dv-ytw6d`b$m!a`){=S50)OQ(c% zOLup7U6gcpcXyqo_y5`ZzW3R0o_+S2ulS&Av0|<oi~yZ!GjfX@R+dq#?vHt9jA3YYAAW!kPD>hyvuci(u6ewUAtP> z+2j>Ue?dqYwJ9u;ckO4ohUKUt@!bAvKSGe*e{z3pV;DOvoep@fkIrqj<{dO!-HCEo z9VqD_U*$VJQ|jfQo7(qOpFhJax?O%I+b8)~?IITUt5kS<`8A%#452$Zb1~H1UZSXk zREN_PNs>dM^8`R}Rx!sn~*S!Vmj1S8v)M)fpe4K!psny-*p zBNK`+__K|Ok@^L6L&o>=`whb3u=l-IVyR1u#R(m zT%E1qn!S_m_<0uvx#vRjmoaA>A7_blr^1cBnxdqS+2*xFSjkmscihyZO$Akq$?lG^C!Ph`1R0t&*$NMs4S~n z^cHODpneCZ9?f%joQ2&cs;;;%R2;9H7y?!x1kzUQDp5g!g0u$qbjsDgU z8>8D}SaU+M%0#KExcXbeR7um*fnyW+X8K6EuF;}SctTkL$o|GJvUX$3!5Cu0K+Op# zt39UQq_S`zvmgXPLrxBMoQ;+_?MB>2kS|7Dws}Vh!UJ(71$6^+=*tD#Z^iI-zlEo8 znBc*2!sUuWIrq-faUhj$hUB%)oQF>5|qV`PxGxZ81$F}etCe!t8x_^6U!cVFp^4m zxViZIBi!J4`hm>V)s=0le$Sf*=|3w!U~;u_7_@2K27vD7!G`CLt~L9kC{jKZ4SWV$ zM`IXFa@T((dHxy9@BiY||N6T@l0pAdh5`h_`j1q;-@jJ?{u_t=xs^*F*QVhRiP4U^ zG3^#WJyfL#2{(xymJGc0W2@1Q0-l?b{S)h_PoI+i{bm%nHDtpubDjzdIT;Q_g@l$u z6B`o8e?cj?xOR$h#_w(H7xRs~%mS#XobldR7JMsr6v8&eRO{O zGw_)3k`Gvvmx+n~Q9egbd!=nIFqd>uBRV=1MX^!K##W9_v6U&Oye}qXKg@XE;7HC+ z^2D<^>82%UJX27bK^z-9m0wmASXM_t>vp9`!bD`TU|5iX+|onHhw3WSb^(tpsj&@?GW;hDD@Fs8I5xnuWg8U)@Koi*9g6W?*qm zY>qn6QJbx2I;T*Jky*k>R>3uH;q9KQ&|S zQ%R#-9C`2w7WkI(n+#;H$NzpSx;4Dpp`@i&P9HlHTE2aPN84Ci;r&qOa-emy?))v~ z-sDD6OUpN2+l45C?@k0rFhQ7)%(2e~ja=Hu))T&dCHmYs@UdnS!hCfNm>p#sNJLcwcs+usyA|l8{gs)ku zLZyrVhuZdh&*yMaQ&F)p5E1yGh+15)V|Z0~@9RJCy~o%Yi7kq-=K)kru5f@UU!xR} zBN4AHYgMOav&Xq*IQ1`kNE4+ZsUxQ5V$g8BIM5+If+B^2f-<~)AH7@gVf$Z`%RkFz zV0ULNce%-3xTohn6 zHQ(8Km`TcolcV*pWXonKr$twm;*ydnW6i~gHr@x3?zEu3-eHZk-QDkj#Pw*`*N*2E zUahw(cP#?hnBt=xbP8-ki5?%eR~)ztW4Jt<9Em)aT9IlXp8lwBdN(A9{mNv#9FTg0 zwOd!pBHC+H-DKs|5P?orpy;&L>UL~tOXycvNd4{Jft&5yJ$8ff1-;8q_nFI6Y`meB z+7Tb${i!cP+Z}mB3g6KMDiLR4oJo)e38#C0Gu?jqbDmDQT0vlbQ~pUpRF}<5%Y`B2 zjh1nx-R2p8ez6Rpm(9>u%7X@-f-==w)`brsGb@5AoKRebI3k^)*ij{>ne^_RqW@fS zSksxo5cw;|WTlyuK)`Oh0;_x}**eQII?bT=e#v(CK*ICl>|0`D`gkV)#YYgw>|Ei^ zybMgV-AG!GOxrgBF;jf<#_mv5p|ixwOVobFIQhMB2C zqT1YSxeLwWk|y}`WTgs&qO$VZ70_zZ7=%(@Tl;el?ViSB7I6#Da=sD;74;gz^|Xa( zuBFB6xlpGA_vMEA;(1vc0TD4E+V=w-DzYD-=`&PBZ(9;U!u`(I2fn?ojonkO_O6V5 zS-?{dBOt(Ezq|Z>Wy>M~KAFPn;QRSmlh;-APaLU<{+ltMBopm`Yz!nbR156vEFxd@F~f;Ndv2MsV(#%z zIy8PwTI>~B^@F?M0(B>Y^sJALe6spvbRSAv&hboqXKm+HmfNR^nl{f8IrN$jy$Q2u zn_Lc1w>*pke?dV>g(vp!aU0CPRaH}CJ8Im-r*nQq!tI)k zoEhp$C?ALIfK?WV;9ghF3j$@dSSV@$Ccb}kH12h2N#eh)41cU%lmIe>EjBVCOh(zA zN@l$~c!+lEqe{x6yx}Z9vc2$e#E~Z{CD5ef)&C{B&P)cX4X# zQ@Jiu*`Mz_+i1rwO`SgabnntR)*;|g?NRFgtGFL4DIo>~zs3cm+I){-#h@?9EIxZIoSEg=^(XKU!J;!I46p(U2`P0^`2YKGVA)czS8?~CPHDG@}52QG22R_?&#m#UMHp6mc zZFTAuyKW||lZvvoC)5Wt;$GjIr4RAAeUh}?4&zrGo*-g3P!{?-W^|7j4@)aqWx`Nz z=+|-u?sXiPM7|;}+e zmA?K0ha&W=je-6bJlk_4Q5!Xd0}3IfZ&0aRi|bYAk)4sAs%m~mG~O5s+v9d39@96I zz_d-xklV$j8eoiS>`}NB8NGKa)!7$9TUjR$^CKrLPz^UX{9?<+Zg2#Z)UK zFnSgv*9OnzHfMf;V}X8pvRm{>?Z?pdtZ->T&PZ)v>ItwzJv$guZ~s!y&Yc z=yRU)N|1K_x`;kqRLE*5m;`c(sP6%i`o0@`aB|>FkSAkmJ0yhe*s;hBp7(2s zdPpwL`w$$1v7Qk8`4B~cg4Knnn+d1om+)t;M{C-kcI%_Ni^}6hha~4Ej$-vY#O;8>^=Z(ZEGFbu#Wjtev%BZw7f>!+x0Hn_L}TQ z_R-%X5vG?M7D^C^J^|WYC>W7X;6b)SZs&Zl-(s7KkI#MS=<$*HaheZ8rLtw79?6nW z&#laq_q{X>Yj;c`+h*w{EK zpO_{j*BnnOBQH~(FVep}nlCo($~9jtzm&hMVk9mL#OE6q$gli@@`iKMgNM5vxJ1wF zs~4@aCJTC1<$MIdCKcy{O2gW927NO9TR#;Pw%i|Q<#sa&166dq2+(++s}Gqxc-Tq@ z%z^T}7W`k|(qi*)m-1pDBwE(SlmcU{MiRy-PqGm;nj$Pd9xp_9b&=arSoeEbqn~LC zzZWt8w^_f0Sq@)bEc1hX^s_-6p+3SUeO}xq%qXnu3AANP=9ZV~wzK~Ahpo?wjRN*` zW88|!s@NHXB1@(-X`-A633zzLt*ruD>MlpI4nceJX66Tm?KNa@+T3 zOYRUngu|5=cez|M^cLT`lSN;z=4KOqqDE9D(5PUDxmb)Aaig;8+XdV`bS z;M+GKrFH_VHU{V+$J*LTk$NUj5S=Fiqd(wWy>oA=o`{a%{TPqsefwLW!+Gb2O8Irs z=qBH?`vfvR`bwh#JD+x|{B$yK?Qnmu9hp*5`k7z*43_UfAG@%qaB4iXvU0S45S!@m zXc7~YX`YO58`Pd>OyX42U48HBO!~N;OwYN*VezK8qd zF>3h_LE1fN^v&?;p0}vvVFbP@RmNLruQJm>QeWh4--r(;-7rdt@siEFKOYPsF)f3U zgSQ##u9%Q1BXzHPrl55`#o%jxUY~Cs%GygtOXyYE*&04`(g406GP1k`5Q8_8V?+|M z8@(Md+|kwQ4j^wKLwXZhZg#{qIW;x#%gyZv5wAQPy4Ryi)(}Gx+5Bh;x8r*@dI8jT zYl zIgCL0+%}yYz6GFpaqdXf*b%gjb=6=4^6*rSfW|8+DTzM7fBPZ>PKSfJ?dqLZpXQ{0 z&OSUVYWgNDoP#{sNEs1oK#DgH1Q>}pe?LjMARZe~U}j58D&g9L*C1aX8YFmoXQj9o zQa1CevhXV>2El@%pDAGVN=0E%P7vDE!q;CW7?RKWvAo*hNxTA__-^rJp4Zgyvr~BO zxZq&xyjI!x)1T|Do|ic6$O&X94>a%h32sg1#9cIy#mVL+m{fE7d*%~`-oTHUDnjF5wqAx zGVCPmVNziWB}HQEcz!sDvEfo6E`mR4f?w8t+GLuXR+(HI9c}X)A7@@HnUv#EnPhh# zp}lL_s$qW#ZR2TE!PU1ChHq z@@h)KSZ5SbsnPH&&&$rb9ZPuZu8M(|;Xs|Cah&k*=&TM%$LD$7AQTrDm%AJ|a`wk2 zYgje^is64;_4v_3u^?C-2=dxHC~NhLTqPw8{n0f_P}fhKe>2jCbkcf9?H+SoRn@@3 zy+*?D42Wa_#88yOVuN`ZvU><&F^ICrVnH}<&a35-UF`*c)BY^A4`@VD4>#LwaS+nW zEkYJ8UpUlA&g4)Dad2uibg=8CP2a-Hb6~MAN8EZve?GLWi%oG4)6BFAvi@~%kpz?8 zqbj~3wy(D^5f3f=E37MQ0T((0z)b*6>{ZzBjXR=AscX8Tj)c=u*q@~BM>gDO6i3+f zUJBcxL+pLE1O-vf<-iCEc}QdI=AcFwSOi%%$WcHa6f>B8*oWHM=1|oZlFg(vMcbHosGN|1i_i zEmf3V++3mQbiAocu@gXU)0xRXlfHj&u;tzpf^D1n-^#iC%}E}HrakMI@&}WoTmt9o znAJ?LIKSQvN}zOuXhS*RKcHhw@Zj?}WX@|IYE)saSaSMw4>2b+HFgebB_8farYHKf z5Gd=--FNjLRCkER-j`^GTBzl|qne%k^U(e^=-|NI>PpnL79l-7pH3&SH;I-)1YxhN z@tNV#_|Nd-7Fp1cwy7pOBu+0kkgO+2jVE^q+v5!G_F3jLPGESRCb7&I=4y-BZ9f0| zSy6zqDx%0=e-qAJ5)DID2+c?87Z$JHZQwyxAir-{e$ld83-gYqAXRKobEU==PWr=d z{T-P!o$inrDv7BD3uP@k;%Vi$ecnQj2K*J0*I$>Ip*?d%(Bn5?Ue*MxPjcu#r)Iz5 zq*#x1SVj@Za$hyv%|o!;s(Hr^XYl3WGYj#aFl!Hf&~gPVfzx5Hm0X}T2OpL&F5&82 zA5@F|L{v~pW%^54)wM6iA^F$X5@An$z zh)bk`H7a<0-%&@o*yGk(taz8$E@cwWQRY`oaN~gDkMnNX%uHLm#z{w`6%t2U) z?jEJ}`v%6!S|3p$da_#Z@>A@L^5J*+(G)DXTZe-(Gv3%E9K|k31DYm*ielilNI@>*B(4;`F5ue z7Bnp^ub02UxWooG*?Ir|=ntv2wKZFOh5lg%A77#>3M{!BhtlTCK@U{N8m?dpnvn#)b{;zw8LOlF!jJVxX!5j4SHS{RrgK9svFeYE8Q!G8Y{Sh-9( z{8{&!50BaPunqb5pvRY$V3;OF)_28?h0!rI=`8+xeap2 zj|~c%*>&l zuhl4S^qyukqU6bN|E2#082yjHSNTN{fBpJUpm9lch;U=f);g5S{~?I8o^ul0ArT(^ z?8>(J;Y_^v9*lO~L;k)@D1bVdCZeyj#5CUqRq(b`IDy;XbtwTm6#G&O44U+Xw~Gz( z^bsR^*f*NISKt=CB+`OV{@yTxz=KX6QZFm2@SeCM{QMidP&Z-DhEQ~i9u#iUY`)rtOm3$;~aL+0px$c^;(|T?&GX6dsZl01>u>{Qor6O6B8pb(a|56*wz$2zwjiVx7Wut)X{Gbwd>T~W84F{t6kQhmU}pz(#)i@A$V1%fULQ%X?}d@B zcmmqDeLEZX2WoeM0`2v(M;&F&Uqc?NGc&Rz^6<{^4b&INZ%xaBPOM}5N2iNN zs0EkzXg~HI_l@W%zXz#n72|t3Hx;ovaJb%5ilB*7O-c|jwhy*PyhA;`#FEGZl?|*v ztsWQS>hY=M4n&(<^Fqv5W<*f8m335MEb_E(+VvoOvG3`%7CdnBIb;1c82ch+UwW6j zYN2!WIx@);W>s8_6{miEVn9k1tC+1b$7;PN`>GZ4PsuUg0WYS75T%Es7ECeDOTM;^ z5!SEmKuf!}OYE2NBfbt=cq}T21_Lckq=(F>B#u{#l~EXfJc6VnL-1aKc6>Cr&s_F{ z-NL-?>fwV;pQ=}Vf(j(9-3?&5im=mHePao%84sB0%gX4!E|xmn-ge2Ho}HJSS_r|g zopAYd>l>SJhp=sI(E64Qt1h$)Cj!-+W3xLh0?l`|Y#iDp&FCtJtd`p&CU*Fd79;zk5m%4lYDa+b3308L`){0i@++$Kwu^AuGN$gM8hAgYg>|tQe|oU^G-R z+^)G@s9*GX(9w-p7+OlVcYtdvG`Yn{>BdQI7fE00H?rhg1_;`nw0ha7)3~7-=`M)d zctNk1u96*3R)%brs9v81&L)n1iI9_EK*nE|X^0AC#&0@=)#zgC{K{H$FQ!-)!|2EV z43p*wnf(Nxp&v=pF$A}4V5GP9lj5|yvjL%PjSKm#3JSu4e$^F$dr?p;Muyq*U8~~G z8lMe&?E+`LB9NpPONPh0?>O22VDb`n*f73BSF@=ZIT13{F|KK+6RT##@kU!YF6Z&& z)gbvE0dl$H=TQD1lT)9>WHR)8+jYGXrQZub(y4$+Ifduug9J{eg9nsT7Q>Vl45D^; zkSBJAdVC?z{N&ovWJrw0$i9^-(43HMe2qqKN`Vl3sq>u82*cc-EU z1#c|n>Z33h5O7W{X!Mi3#e0yq z;`NF=%Di&SZjRnB`hodM-2EiSI>7$QYst3KOb^s{#&lm(7Zy&r0rN`B*CbhTiQEy; zxYtINKtqnrDrZj*fGqotAP`a=2X<8DWE|~5&Jm(~h2I-cc+O))@H`O~p|JLcu6WbI zLt^5;y?s5!lTQz&cdE2q0FOqhRi^OGbdmUQ7fw;=$*1VhmbM=D5(zOLM`3FC5l=jyhdnZ^{vX|?x4A9gn!Y(bA@t^? zE#lt>V`v>82*29}Vqh=W|7M#sd~YUGZ2K{liCnbIxahpO{rz^nOi;)2Td*-tfZi`} z&3e#hTC^;BuvhI7lk2N|Bpcgm745b`(KTQjw;9?om72!JueEXCoy z=COA%R0?s0bqmFf+dRc3cov_sc`ne`ZBthHc@T~ty)*2t$^!zeNG6SPK}YuQqzQR_ zy3X<eQV!bP(o~3Vz|Ebq;0-QXbSI6F@@G+;F?sw3K;bN)ZIe? zB4@)Qiv{-&%Ec|U5jAau>TR>bvi~@Qrg6dci8=}nyu7Luj(AiB&rJkL^a~10Vc1rV zqqjIy-eEFqSBZ(LI}wgW`N^qgca8;pJ^z{9 zo{uD$X^+yz(MRo3k8r3=NJ>t5!-h@a`fM7%!&Mp$vU@ z1LVtQcDL?DEi{Lg9_r|s9izqflI1cvBkO7?%lOXd0m8tpv>6lCF&7fJ!ljiX4UmlaygEoE3=_E@F)b$M9zg(?(yrX_ z2L_)ze-k37EeHO|#smU=$rWQ{VTr!Dmi{-N9}ZlG4hL>Z(3U<$L=luFp_x=v%4ltV z<)0IqU!3osQ$zyyBhgR8DBLfPjkKuJmgqa97saO-+;vIUcg)Ooa?2CY-XHSTuJHxe zGMXO2uwb{&f;v`6Wo48n7t)+RDjs7ogV62oMj7;gLWh1)iC70pZvvmME8kD|-dmf7 zF(h^@o1^=r9LUKf{HU&;=!f83U45PPGfm)KM!WtoCTg(2l1-uc^m=ts*1NL`Fa(_a z^o7DFs}%`06Q9ED82a?UZ48%)U-OZT%x<{xs*cnBTDMGt_>#hk$KmSXfAs!fm+4zw z=F*e1kYzI@Cr&u@4vER)NV4zk=hI%d8eBwO&Un8&Q-n!&mlu^%c&K4Rm(ncAWV$_^ zz|$_k0NnC%@O-pQKi5gbK^|H_k#=L0cIh+1+dkG8T4^xl!4SPri3DS5G8@u_$c=!D zv~CR_fw@xL80^ENZ?dwAJ{L7LKzdg8omY;)ar@WApnM5{+UfoE&CUTu zd_i07$A!4t&cP8P(napwv6MiyRD+8@Wm&QOJh|Onm!3!(BcRNz6~e)eMTJy3N_`|J z96K;C1P6}22UsOVyX{5Po}8W4A^KsVNg=XzPxW96{4U0u0>mVqGCHaVk#0z;D2WY4 zTAJ=WF|~b^Nzng7Ww}1=j$Y;6-@9_^ROtI_<`tyUQGN{`_f(?#k)QtoAO!f=vn4kN zvEq%dZCVu9?`a||fbB;e;zrD{Z~<@&x^jDa+ZITYxbFQYxAliE@nxcPV`a8~?OgIV z8~g_rvty#9DRufUe;jbiqxJqs(Ec;}|8QHGs7AiOHPYKBO2o8CXZ=YZslYC|^Z+UJ zXJlIb+vY?6x2Uhb`PzS-AN1dV#r_Wu`(GKezvPhJnon*p1G#)=wtK?4LgM zGc#G$|B}qqTvX1z4{+stu^cvQp#Rr(?rZ<=u^{B#j76OPFI>>SqSee}@Y#9~^RAg? zDI#QF22@_i&;ALqcl$mpwoXK(TPU#=z|#NyrTz2t0G9v%cSi63@Uj2jI4px$BA&kG z*Ro~R`na97W3|eOmYdnny7i4=v3*_-zJyj2)GtSqO_TmgpyRyQ*|?15shJ5lOJZ#V zVkW2$_Y3*{M6}$PC#9j@Cn%xl#J2vm8Cm4~#5UkoJPhltx~ZQb6Aw}2=7a&R`LI9A zdKia1%wF?MjZ2To1`qibl;hz#RuFHU1*tY*?R_}zp1^uXvqYy^|GSxrl8VNPb|#gZ zb9SI1qaY(AV@}hnu&gZp0-Hv;-yuoe!GX2ba>e^(=IOg{AZk`_E?jsxDjt_10?x7< z8o4$<6i~mFkDtyjF6y3lh}Rd!H+vSRD86X6feO?C^pi z|0c=S&aP*6EUV(Q6&8XW5lrL!)l3>VX~KY-wT5GJ@)C(&o9n)PtrOkylz=C zuSozn3M~K?(bwEc<#6tSAdcr6Ce3v_f|8b2J{=0b+T$$8OLutw#3o}6(wq??MAD;m zf%EIvFIhTMA}a<4HLoSH*>W4KZ93H;_UDUQvTuok>oFb9!Y7?xr+MxpMqmCE7UYd_vfN?0eVT*IsN>5Z43$16E6Qh4;lv0aa{f2nTW6zDj0$3?gaO@hwSaC%u<_d)#)S{cWjMP|Y$` zQ`^L({(Iv+&4UV=E85Id%@aiih1X3&aochAOWl%fTQ}l)-k{3r1w*UZVtg%gPb;tz z{LYKuUiP{p%P13v&rw*4Jm3~M2>OI}Q3JQCq2SbI9VHyzz)rH~(* z*~Thnkf7Zpd3EIgt)?5$w^Lo7^Hag{idtn7K&PoOg5E{+T9FIK?KL(w_WlPITpO|Q z*+6z}H*C+=)?3RZwEm$Xc@lu~Y-Ij3buenAa7U>$0-K`)qsG(HLZzYbunysnt}K&d zdkmIvx#ieA>2ZG8Dj@CcXAc|9+Y+ya+@h$q@Obifhf03QX<&KX zJJc>E$a+$ew2n-;P)E|oj3ldul(67JYQ3u}Nw^KGv6RjewiSczB4q%=aG=HJ+{!er zMd5)C(0jaHJ7tp{ZTyK$$ZwA)B5${KO`H0J!DaNe7pAd8eok9@Gf}GHM^?I+cRu4X^c*sfdVWQFWQBXnO>GK057zs>7vvb(H zi(UwYNx>CUoPshZAE!-V#fd7YG9!9fVvmP~Z+J^sQzUbi( z89}+4>za3gX96QfFPe=$$XA99)3%Vf*wn6QnHMNwVPVzhJ(1Jh2@#L(`k2X2w63=p zDV)(Iai50wD6T))>b#9ByKQFTFX=B}_n800bKftxdva95hjcDK@&u2%-h-Rg=e6?i z>LK&mpwnUFcbSz=v3iTLmiUIe%TqPyle)Sz;meE1BNdCH{odLW5~g7nXk^KA4G|2wUlnBS96a?YF>bMUh|Z4C5_lQU;K&cfZ!cKnE)ISqalfO_s9 zuYhJqp5A`8k@x#IJKpj&?uRCaxu{#mE8>qhDS_s)35#hCrkK**X`j_Sy!@`~6sG6C zr)}d#YRRI)w=p8)ucF-Wd93NJe8DTHyP^yg>1I#1X)dO?M?)6=b$+v^rx1J@jmUu! z55KcYT7PZ!`RR_B@kGwMij4IXnYdt5No`~TiC%errV~2DAa>)!bOABJ;6Be`xVVqM zN>F7pfh#t6ZL$DnGeIrOWE76Dc;7eDyVbgi_UlN2`3ov-tEY)? zIPTGur^nEqVrH0LB)Oz1dfpFrq6t3CQyagz%4bpt?`zWRxb95#Z!|Xw~p7IcvzTxE3%;;J?3N6OmR20WE!9Y7eAatW%!T`41{5FxeJ; z%R}0ysPfY%(@3y$nZy*a0zu+8#FH zqN)XwvA9qYR$RW@$nzx@ZBzEVfvZ0_P?2(3N5w`(g7uPfPAWK!6ZlR6H~LF0J{_#4 z2Ft&>wN1{l%A9v6M}e!JHKN>!q0}|S;1N8Vht!09Cl?f(u>wlM(R?8rBe*xNt{{$n zTy0Rh9T!T$S%qlRs=t7?QoWFDZ7niqpX1t2mvH_Ge!xKca{PWJD%2#rbxUqJ}~vuqg5aVi&7r^$nd65 z(vBMTsdNxsX?oMde8^ z{ifs6?WAK;_UPJ2R|h??-cM5X7Df1bT_x&)egoZT6uUvMbz2;CrA4vG$e2UW(4jBY z#g5)MDVP(iW+NHkqPXE~gt3}GIWUED?a{od9Ur`_kb{uq4qvJg=TL#Uz(O2DM^({V z?{Zyl4EY`ixRC%xcVbbPb|hueNq5c|kokee(B*63hgUC|bkme?*Oh;!Eg+X~) zqkAOL2(g5St2fzW;8o9*b)j_$ELa$tFf-+|^2{V9g%|(EfmLe{u8zkKgTC;r`fSy- zdVru|HO)VYiEezar+5CbEF**XMe{xrnJpx`Gkepp`F@@NXdC6?dp_lrOym*cbDSZn z8%*Ol@Cu47z=VTEi#fpTm|cPd@0QpZZSY$)lgr5GNhQ)UT-jS&M^cnU(7E8D(YgNW z`Cj}xDOx|Hu@R2j@koAu!>1scf=0*Lm6GCw#(LA_6W`qmJagS~eT4y|#r|8r6=o4m zCcdDdVwQS2&JKs8rG?$rP~u7u9^KcO=lcundY5b3yIG<-|E}RFY!a_V&1V$t{mnF> zmt_JDj7Gu-a*J$zcnJmgY$KnSMLuc~5Or6ncHWEL&I@@WOIKIj$L5BFU55tm zb*@Q8C^lZ%OCeLuP!{uB>0t;4KKMV>QCf*`H?eS0TH%;gq2-V6;SUj8*v zruln&A!Bvg6!4E`oxBLkuBkX7@&;R5Cr}2xohl5C+kZ-Pyx;$nCS!{H@6DL4nQMs= z2tx}5T-8D?JQ$7q(5&gIr}eR=^a~S6%})FY6S=m zpg32*kU>VKOpc3a-O1M~gfFZWPQiw{sP6(Yj=7*V(=1OF+0ZV#f*2#n;~$%DrZneO z6my4PG`>G-!mHjRcLlY&3YdU-k3C{tO7h(ZrcyfwOt$LhBRX#xTdJYswDI_6)nN^>aruIsf+0=d;Wwa&M6@~ngp@NZ=UuAydWw;`$A9B zfJU|`ok?uVV=0QVRlNjfK@J@Hq`-qqXxA?~#+t~S2o97qI69Z^KvnWL+AGvkR7~Fh zaJxxLH6w1YzIK}Thld-3^kw_QF!J5RG#%O%T0yesZ0q^4L zuhe~CTuwx2`}%ZVf`;7;q7qaB8spmd>p~i`=#XDh*5PoUw9Kyuw!ASea8@fc1a&o3 ze3Q=gH&aGFYubNg^J;_RzB*s1oo`^?47z&-ECILG)w>72vS4i;RlnQ}iimB8TzbKj z`e4m65M|TZ4hgyw?Yot-XSmQr;Lj@F2}QIf-P1KNt%?VzFe@VFi8 ztFW0cQd`E1dSRsE6kdKl+d*OGFFn4TgD`9j+!QG6RZ`#rIme{ksr%<9s}1-qx6lf) zYVLcXWPJ;|vKywt!p3)riHYZL0$Rnnvt>4+Pj&~N%7h+11l20fHnCT#JzNY_ZuN87 z!QtnzL?yc^(*sq+$yhB`0kw`yC%jJFq0ir+Z%}Ex7OQnp144Ly0qnr~8%}!(n?&tD zFO@;lX^@9DVaC4Et`{Z@;mjwr0(BbnVuH0JXA>-45XY-=*TV*Eet}A4%9lC`^EhZW z`706`)ultu>vu``IK)-eIjn2(PJyX=0?whwI1;Z4K6%F7AB|r#pr&bEE?cZ^j(!<6 z9>1r!zq12{=Bz_x@azntq)Jc$wE!}RLS(P6W501!!atu%hEr30hhIGiR~x^emoE7= zWhg{j7%-WHY|ocjLr6_VM>nFup`giA~c`Pm&qEQJTr<^zCrFHy{GO&J%Au!bDW5Sad2FP(^CG%kIau95{ z8_8qYz~vZ4I;7bfgdl715f%=}x*}6h^hs==l*;i%2$zrJadUGwq=nm)Es(4|T=9Q0 z_v(I2d)8HEL>8uZY=#0sa3LOv_zd?GY8(cahC5BTxUQ$cefzgW;?iC zWF()wDVIMaO(9XiZcJIbL&NNiAWWvTTBlPd@=%Kv2C>_%T+VTX-hkEw`h0bf-GLf+ zyHty*tQHFW8I^!m&~6Wx`(=IaSOE$KuUeN?s&AExi|wbKIHAX8s8QY*Cm1-GevFJ8 zk>j`)OEjV5j*SRdroPQ1J;6W-ai_n(@NHY$Gm6~9%|_x1e=uF!qu;Ke z9ES@CPN(D%SuhYeYOwBW|1aIcg(fUhu`{^57Vf$l*S9u6=D?P=q*%RKTo8s4=#`mr zi$4*s;|E!cjPjSV%wC&NoI%q7{d_7;SFm7M4HC%~Zo-YHzV+~?y!Yi<(3KAOvv<#d zx7J%wn|SrKP2}8y+gJ{#)~(cV2N~f;|D&Y)B@)~(IiAhV=!)3n%i&0~w*VHb5KVQ5vAVNidYB{VHUT8rv!d(b39fPf*!coq@ zJK^X(d>QT6k%v4?=zAAvSOLm|$H>g3fJ3qPaAX!gfdzz+Ho{h3t?c#5lu}TxcH1a< zj{7reT}+BU4|F=L1H@P$g_&JN8ueD~_f;@dJ~cJbu*U?d%$r3S`{23~=@Vq(U)!uT$(787>ViowO zZ+UAU*ijW&I_)kfoppjG{OIoATL;-PYZHX}BD(VCh_6?;h$Ic^xoKI4dhG7L+r~sE z_f7nN*M@(qHbOPM@`Ix~saO;}44H6?0CGhthV=X9nyX7HEa<*DR_FnjFyl9epC@__ zBC$O13Tjxb&rW}D8nUtkB9JLjg5xK1T{*gjOYmYFn1Z-V>W=5d6@yT5h*3=lxxPHv z7ZkB->5NxaLUMUk2+Sh!YoN#A#;H~N@29eQP|tvuaf$%Hx~M1AgTt=nB!!cC-A!$7 z-J9@h`))4(0E3qs@EXI?z2<^uw7nFxm8pEn)idLNJFS%UonzB5c`mBLz=e=s>$HRxcn4z0r=~@Lg>`n8H#p^1^5Jzm2%Q#gv{4fjn7*6w(e-1hxJ;iQ z8sD#!Ft>sTv!M0@%ToRdt8}kB*32tuTa=@w-Lp?m0R@1%sNA((B2TzFD5tBgXa;f> zv|(Z8m1A29k40mN4BpmO-TQ{y!Khjt=C`{bO%-RyPaG#{B^-j%!25 zLhu5M&LwGEamX1kme-Lw+OmU*d2icUXPE9HD1I!%r>O&aiyQT0Q_{B9mjfa z$GcDgQFPKJB2_H7V>^|pzwF5WJAsjYN?zk@I|}EU65)MBu-lmphlaLq<{~oKO{0RM z;dPw%1e3WviE6O7lba%F$K+jQ)rFk4N`Re_#^h`DjwCT2A@hycfwrlud)ndWwi3<(W;!ov`E(&)H67{C zL(SweBvG~L%gwHnk~@~G(B6&9fV4UJ`l69+r03!ZZQN^#+V|erIftkFnnHh@!m~$m zuso|M6?5+;&oVv*erSz4+&kq;J?ERYi#6tthA|; zZ$&g7N$EJ7#ZtYV6K{Ur);PV|i>S2Q*=!`&WY;bgK{ojrlM=RI*#b*XKTpW>j&;X; z(`0N+Bm%_GPok`>yjx_s5_x+I^KGG3@HjNTt>2p_*Gk1JkbT9KK*zI1{Q9HoesEvK z>9X447I)igi$WI!7*6S^D=pum6X)w+ySQYukTC6i^zJkOmRyl5PQ!E~Pu9 zrMtTXM7m1}>F(|j1Qy-h-Mz=c`+lDLdEWQf$KLr=v}E*6852dK3Z&^I2^E5jdTOfHLJ;yG8m7@pV(OGwByO(Ao;RW_;}BPM5& zgfoaKJjbVQJjZZzYjC)&zKgg5SZ#IS!1TFZkO{3#>zm^GN96)HlBHuBh1c6_L0dT_ zz3;=ztP}w$BiL#0cT0ZC!wl0)FJ|^khMptzQ01w?6Zg$ML0<7?k4X0W(x(=AcFaHD zWmM(bA>*))^4{R}{`fGAn>T!hW}#T*awZug3*v<1$D%Xj*5$ZTizMk`Ex$NW>_gdx z4IV0eFE0MEa?Lv}!a%D(_O@u`)Ol|O!9KydtEXS4VShEXixRE%ssatiNSw#%DiZ(xt`Ph=rfPqSaTVe!k7yq+WV1Ze>W^tj$;YTo?% zyoc)Ndq4l66`uXa=f?d{|Uc=$n`gswOs?AYGn*itbiZDC~u6&E+F*yN1R zF>ob>IaBwzD;(5`BPe_heJ;l>Cu&bq=oENuOV&2b z!>{yI9ucM7;(!P3OGE3)h{ci;rbM2EG4>Toiu^^P<5gw0g>uC^5|Pc(WHdxp)=?a` zPe?z1{sj500^2ucL}FrMmU~_o4#GK=85v}5llzF763H)Nd%eRAvL_CD_I$-X%#Rw*hu)k2KmZsi~==oc5xs7u)AG zf(exZVl=P0>Y~=bvT3X{HBT-DiVmo=D-F2^WE>bH(4yIv{KMk$e(CY8kh&kjw@vDQ zHZMihzGVa7hLAZvYr?!Q{!HPldDLl-e)YD^kfo7``7&}{O5 zZGTu8e|F)25JdjirjfDfh?%#LpfHR+=7~ezzh11)d;i|4pu2L7W%~eF=L4qgALQg@ zK}7!gq;;$NINV>5u`x1=H5$6?dfj$zinBZ#C^i^u>Am;(5*FRhpHU1bL{5_ZBCIqc zLCX%h4X*t0>`*+Rq2qx!5OF>M#xC{zG9Dez$Vg(0?Mr}9$r1@8EUMUkOtGSt8J1hBGWj?1CXdw;2nwJY zBm(y~HFu1Yq5p)7+#icUOn$TKG|={aq5K{`cCH3ZPBFjnuz<2ucdC+C&Qt-?-LuYZ>Uyq#-kb zX5s8$l^!rZqMLabA_^rCPr?npvw^DslBpTIskU8^!vsVO*$rth2Nama8)G}~+2daB zY34&wHrU^sv8#lD9iRqlkTrl6N~US6fExMY!6(-K84RgyZF+6^e4dNnFgTj5WLj1wC`}Mf_jeNvPyxhr&)ZV0@ady77R9VK z;B<*cb~o441;8{!T3M>bZQ{Lwb#<-$RQ_q^6|ofyGAcppEEy0ILO$|ENUGCA4+11< zs;zeIR}8E}T!InYQf~R^q7)(+I%^)&TK)_QB zHpgh%2DYRo0-<6Psxoqtl(B=FvD7o0Fg3vi2-hEMi^e;g!^^5~7+++CetG_NZn+pd&@ZJB~{=jL%1hz)tYPS9;<2G=A5O2LXl0mlaK zeyRjqfmMJu2?|lI$RY30H&~;h2o^>lM9YqT^W1j+H~AQuR7qHShch&UD!w~ZDA|T-X3`2etQMOt5Sh++H+(c$AifW)}%+7 zng=btcW(u>!)v~GG`9{q9EJ^a*C6BKlg5C1<~NGnMIlZ5i;7X-fNa{(lz>hz;V@Py zO_x#?S0TZF?MLwB6zhbNYHO~hrgubb0yThlEi)-ZM{kz0-0v0EzxFDISZa~ge8zKZ z&W(tLrNf!TNSKH#be4{8eQHdQw)*v!1Z%YWEeptHg0X)LORQZ;+frUc!8Fh_uPl| z!S>6;myEu-2yBGsK{&I4_FgolV7#}2C3Ct+atlVh>Ejow!h6|_yf|h0bJdoWH zV{)ujkYj?I9t=SJA9Vdvn;6&}?CjZ5OyyLPE;9DF=S>1T!00 z=_$JjkbprQdD!&HwxX!WBWb1`^Zb4ck}a=cYaNa5Sbdf-iLO?#(VO~i3qUftjjE{b znncr%Q?w-%dA!gWJ1NX;vE2I}FM$Qtr}z94`Z&lyzQOy+9HiKUxb9@}8oA-2;?*l6 z3vhyQ0BA(TSV>r)90MZ)o!jC;ULK7;YBq2RKh(JDoYOYZ&7k{1LO1ng(p_ft?r3w1 zvbTqtYWa08>As1XK6$TAbyZatq4=c0$2R@ET;989W14IVvtvE+o-R%$4Gch=yB`v_gCj1#ge=Ov*Ra>X3=$x;|4F^co7u)u_25}~W z->bdNA%`PEH$qf%KI^FCGG`vYdLM)HMR++G84>q;G>-l9I^*_at@Nm6DrZq_SF56i z28lV|VoqY)Q{VPqA_b%5oAtm&|ACTXa5ySL*AinELl8Peq3*f478|cnjGwn|_Qtny zw$&7{5DcnhliAzdA9g78wYvdQ^8e$i#sVg!59^nKFwV#@vXQaZq(r zu1!BR#r1#%FknbUYO!D&%i5IGp=wxM;{=;PJL9q4IlU&E{%yPvH@8wVa2MKCg5HDB zZPCKvrIBPX@`f=*mIp9-oZ7mV<`s_Ve&**3yIhMRAsok0H2MW#uHV3i&9AuEQ||GB zGf37nr#OoxB&}u{m&tfSoA?Y-har+}_ToW;+f1l3+pGutUcwwZad3n9h%XraF=-W| ziUI;80818Kt>=$~BKzkU2tf}1IsnB7Pk?;qF+Ke+eS!3`!II~i;0BLpKVv7JOUF!0 zM;VnN8AiY|q!sU7<0LuT=w5%o3SzkTd&CEHEewaX3fDuXG=+wtnM|4cLA16^QcFWs~EATUCq zwM)g8IBzWYmx#$6A3yHu>Ju_m)Mdhx5j4Bvv-68J$r;d7&~=W3~sW~Tff{obp8Ex zr(}Wa7`OhpiK5#V`?))`JvvoiX_^~rD3*9O)!3!`Jqq*6F> z#Z&J1s;W;Fh|GFs`xP|&;=z;dg|9D|o$QWH8Fk7(YcxU1Z0c@LowM_ETZ7$iO6%T0 z#=9L=H{S~BJw*}$w)lP6Y0r9V7kkzI6 zOZsA7rYFL7FgT1(FZ~=wiFur;8*b<@ILbGzAl-f1OPf#G>}NzTbd=RRAnQp=wN}sV zKB-X)v{Prj(q|hbdM}ux{?(;0jBxES_6cM9u0*1qin2e_dOL?qs-eM0Wb->|-(`{a$LSuaSvC^PaHrUtZBl1+aad4N77A+?>xg=R-l{jsqU4H#2?( zdaAt(!Kb5VyU`ymWY^3!3TShx02r5ZA0dE~5<6AF0FA|g&1Ucoke8%m0mG8=x{jlPMz`K z)i39p8U|FH{&iu9YXJI>`<0LfUt-c5iin-?q$Fx*7T*nIgjaCd=oIlfkj<_ec>Nx4 zk>qRLQlqWVnN4PoCrce#Wmbn*Q1nKh=B-~?bbgy=vSyI9qRSJ_l-pS5t&Wb_cU<;& zucW8JaXVP$BEnHSL!`eG&r~&(1_Qn8SY?>?IaodpoPzbsJL|F%=oAIr(RwwOoPba& zxQAH_nZGkH!tlLCv<;^lqelHMShF1q>ioaFeIgLP^X;iCq~lFaxu7bGj%C;hiR%n6+>^!iZ4J zcdW>Zm99nzmwkRUW6Hav-hIv%o%9K-)YE!@-Wofp=~~9J^;}45B8n@VcTtL)r&*8| zlHC>B-t1lczKFb`a8kiUT=DUTKWX;PoCz8QU$18Q5q z6J7L8yTIE5QuFN^oRfZGvR#*lm}!oEXMVy6sDrpdZzmcPt6InHY0#D1*P1;ax>hYu&HZ7a73}C}t(S#kTACF#dGZh5wtJKn<8}=>*1W@& zA{2+cx6!`%YPRDP@>8(?mPM)hGioTcxnLo~%0))&ymEr)I;}~usV=t|9z?htFbX7#>YNCt+lI*sF-!|0@x*TvR!X1CDA7OF-Y= zKsRder+^qFOo=E7(H}<4)$egrF*mX-x)@K!Q54x^$q>*&S2$6pm(srJl%Ci{qfdP; zxjoF8+3>gHMuG7^ppa4}XS><#j$DgY`15+nUca~^WcGL;qFveH3lqbyYKMK;FRu0BXc3(eDYDMGSW0gSIEi}#LdnhQP z^HrTt2NNS)W)x2lR{agn*O8s5v2zla0|}(F124_5hm%1yII_u*OJ0$e z=Z}bO-n&CGJ4iTk&?;aB=SjxWTn8M8ZSoFZ1f`m|om`&xVs3(LWSF3ikcUiK$b0IIn!=bLe_Lo2xPq6ctO> zjK%A<{zFj-h|hwF0yZ|dezVmGh~~*YTOE>3lJ@k?-ov02l|L0@+fC>I5gyT-*E8io zW5<&Bj$cLc%SY|_vJcbWKEI6ni`sMp)5o)in~^+2RAVyzi^FmgOj^U|crVt1%4$wM z^7d2-<+WHwZHqxk%uk=5>=j2a2vJgVCi*14s@F%R*+cW9Bqe`qMzbhoD>JrR!_1y@ zE!p&krXaa;&rE31yPfqGtuD#_H{v0PI3K0+w`gqkheBRT7|IpnG=(D6I-9c}&*RN9 zviwz2)P%CievgzB6LHwp&vWUpbDvZg4Ng5L?NzBi{03I;gDb_`BZ#A;qe?e7sOQ_k z=5!_)TWDJtTfkpcGg%~ASHYOItv|G!^9aAAzdfDNxG7(jF*IMpR#}0$AjthwiQ9^ZWiY6=Xw0?wpE$1D9h-3?! z-!Og6u#99+&qyyQTuzfpSCF^X&RD2l_N61LDE*4;{RehrOm^W+w)t; z=_8_e(roFP?BJVvQ|4%%lbV5_G)`qFF(?LAI8S?2C*OWfOIzXHd9Lh_UVNzQa=u|j zbLT`bYCaxVZ>j8&kg%`>aE14q-UIKFnC@oLcj~gbFXKOE@%_fIRY$()5`E6*HJ>xK zF=00J5Q=WzY4LQJv;)48sp)=`mq!swI_IsP@H^r%Ma6mR!;|w>*m<}$9=zH#wvlr>_SzvQjb|xed~fHY6N#(xQ5ZL& z@*^6>UU7I2{c9iMK6y{sFPz?${{rWMW?T>dNb(7*HfkrYPO_hbAkU{QE6dIAOk?hQ zBgq09fljI-Mz^>DDbHPI5?LO{^v()cce`6*9U@&b$i^gjvg?1IoqAkRB!l8_Rrl2s za1yL0qe+-^_~WjcR!V9!K9STGIhv2xw5Z`m+8tSV7QdOf$Ptlw1plSc66@U~$ENoF zLml(w5}gYmN4?+DN3~>5tvKL81QC-o#}`*zNm#=lPvVJFdb5cg4&U3W|KSUyR2ZZZ z^2T!V&g*FP(>+KNSmpox(yo2ugpoG5v!F{2GFH`8Yd)M^8!U~$9Ugq#)yl455=xSG zE9vdJqqZlEwg2=59DL-$e6!NCjnklyrxZs`g!qa*@r`Fz#b=cck(+R0;%}zBZx|k( znV4`sAfve?aqxk)*kwr93AS}=r!p=(Z0{L!&cm_Qi^AAcGU zzCrM$U55RfbdNRQsOiit=H{ZiqbhaB1E&yGwL$~x%hX1&gM-{v2 z&j?FbIiJ3}*uZ4Bq`@k_h{~qydHY8#;T5-~)K{(jU>i4bN2t6@`ip>y5rZv}oKYTaK1%@{>OnuPFW4h6ynk`& ze$|{pgkkGzW0$UPgr%lXdM3PNp+ZS_jQ{0H#LfKpGSBahljH#r9SKe`;J5(3cqXGy zbJ&E~OkdGrJYq2^U$ZNEdQHC(GM@^{{vsCZ94dUi3{w<^`=qS13AdjI!-9bm^*M`h zml(T;B$rg`Z?%at;PD?S`vwX+Q8k6Peo_j z-hRgs0g9)44pt=nAF)V9w&(uC+P@l;rtx{-hUUX5Il3jqqD4&=#*d4*5O)#mM0oAf z<8X^H!qrbxwQnTr3FdW@d|UmQW#p9o>f|RcUw1lp{Hkgww1b^oTJii{d_y8+e5CLx;Zbv&OV9p~XA96PP&2)fP0N)|^hd`amKTQs}RNDwB zFtKiDYSV98;43Z;*lk|JQLfP8u#?~iuZDOTz}xbE@BJ9oA;6_JJ^M*zYs)Gq!4EM`T2dazR785(CAmpQz98N zddhe}iNpCiRnQ$5wBk=WUc`J^NP`989o~keq2%9nl-{SRSgjQQ`@u%(^cxG?{c}xO z*rl~#gqCT+fRdxLjgUkn59mIx#~YYUAU^*%vI!X7>6!m~htcMjwN;sjfNTzw=blYD z_$~l&Snk6}6d|}EuH&9vseW`>#hH=0$_>B~_i50`|67xD6~tta#<9JhE02^{$mY-t zKJLR;QaSa?4JI?q&*yxT1={E8JVJQnbOX=oJ=?mo?qf(;@JLRAbfJCEr2NuJq18xz zsO$e(I?1R#uw<0?V?E0dGHU!8Nspf%3aYO+0TE2$^wMg{6VIJs?~g_Qkg^%6cZrzm zeMwS~!eh+%Z*Bl5ws%P%<=>g}ps6NzUpu{TbAv|H|B_Ad*Ps47(c}N?e>+jCvDtVG z;QIGLIT`hdm;mRy22etn+W${NL;eg+Nc}XAIq!XF%qO}vp2+ULJorARfNI>|g4MJ= zD|PT~e6p{0w*cqkBI=b+dQ66(7id7**hYAM9MVg0PSKktzD;{bza? z+k^Fgk4&p!MvkNiX?=A6Y>4sY*9k7Qd01#bAd@T1Uq|nMCZha*ef<72f93z*PlKkt zI0@9xe1gI@whaqsx00zA*|aWBkxr5s|1J^L>giOEU)^#F-A@rP$;LUd6X6c_>PRl; zNp*<$}pywR2=J&yY8ox3wvELY`Qn*PsMtA z@Oo|6q)_avKL0Jf_&3h<@6kZ>&(cQ@kYD^-{cl!jK{Bg_wLJ@W^<kwj zD5$MiJ}P_92zIW>D3)m!KGcaX2eM2-dBPPG5%)Oz8IQKGG4dYq7kuWYurrW?$(WzI zr8nD;vG35n466HoUkz#hK$9pF=FKNeT0E_$Y={4;ABq3=T`Pw^wG>hN?E0hc23Ufx zq>HTlV!*rL^5M^NR_h|KMw(^@Um*)vM9mBblvx%2V zel)sI&EUSVj7mZmWxS z9PQ`w8MOCVodGf9+KH$0btG zT3IFO4>5H}szL*t5N-C)pB>EZmwe~&zBq}Wrr*GuH=JndC2?f%W|*Kg?<^Hl6j_gb zE?-`3n6^A~d4`Rh`vWR{sQxhZ#^sou`}{ZA_?7DSYk>&RaxNf1>ai<3e2M>s4wn0s zRyG@1$(T>jn-vyXKgV$zni>mDPa|fn$$T=Rm7h9H?BEVAdhQr-@?}DdGz@<|v(e)a+Vf zS`5#K11cxHOoC6<7cpCHSe2_6XysnMzK`MH9&4|EE$X0rqxTi5!|k{`t7@eJ%=qM%;A*kI4xLF)jc?yUK4dE^zi=xoeDGsb(Rok)PQk5R9W zxN3i01CP!y-StFYKl}Gis@Ce4G}3JLy+ipANcdQAXUUrczP<_YF73#L+BoS65#xQx z$uNuW7<-Ba-NFwX?3JL5Q5KfulnNH`Aq=ET@-WiP`#Wy`DbTi%v1>TwL#%M-;K6@5Y^7}6L z1Sj*nfQtqy7?P=g9nsGs zDZsKoIPl~O+h%ElgEg27Gp&Z#0z6OFO@uCV`I06?Zcba)VK;H^saO|lgcEu}dT@2TG0fludA}Vz88#f( zGZ&uz1HZtJkjrBKYv1E4;3coSnLA^6ZOZ<+%97P>rb3;U?(kvIwa22>hl5xpyKNuQ z^QpNQs;R!nUIg>&HM42!IoQL~(t$?en5*5ZlXqKWa&#}r$(J_xZiQD#p7jRr6ewLh zrpk?f^?7tuwhxskumgBU-pX{LUDT~d}Z2+b5 z9ZYqdVdw4P_R(t~Na+nY3Em0V3A8nudOmY1DgJ%cac$;o<+QAq_oR==l9aAN^aY7o zZH`%PTS=*T^~^eyT%wMQ!@13W5qFU75Bt`227*!ZDR!dCxsQfM?eI~u5m~ z8!NvfT)Nx&!6Ls(QYxK2-{_sigAE>62FukXrK)vp?$dEhhs$C>2i8YZgRH2Ko1!E; zh&dJ%Z;YZ%=vL%YNqz44xl`O_P3X5_y}H=!AH~UAkZ0cgun%`QJ~b~Lu@TP3%+ksx z((zhIhH1FziJq#~ysO0&BCG@bbzgBg|E-SXc28bw6H8!{;k_ki;!3-)hkqwsEP3q1DHd|Im&$6!PL9mzvfo@Qn~Kgz!y^9zFTD4m=zZTI~?MlZLp z@;2|X;P^WFE$&uKl+o&tt1#=6+a~(6W|$@OL|=3PLW|;3pC7E1rpk;e&*e%iJ%b(k zyOEZ0x)5aSoltp|DxR8zfwVN`z~k>o5NdZk=FiCuD4a)6ytk)lwbnM4RiCNhLPuD)mU5CB zonJ~^x--sHV+K$-6^Q`ATTGaD=qR!}1rPqbrepln&QJKj5uY#GL$1C#TWD4^4s*01 zCX-*A&MV>LiBq*=VHs28#+qV&cgrjRBg2~x#Zu0AN3HqS2C1xAwJ3UN@9gdCAf5bzc zG{br?o85TUs|c!%QaYW@Hd?^c)z?AfRtBc}kgPu^lRHoD&R(hNioxY8GaK~SAghp8 z?tTx%T;4f6wBi8Q7B!G(&9R$=*3oF%zX0AJSML` z&DiKhbPDmTQtc$4H}450zM?NM+-i%Aa8`iREQj;=n;(A!^O~v1hAZ^Q zcxaR0v=+I*gH@$TuSGb8rv~Co|S@=OP{tKqQ-F~j_z3EgM4R(Ta zyLahl7&84JuPS8fVmp)X_^~E?qX4-)jDTNy=#izAU4($$*z%$v8(&BZ1j(oN!^9V|Rtcf>pOMLpZG3R)&KDkuK-WOh$vJhp{B@jK7C zy9Mb@IWsb;pVBG3A#OL9Ix-eTDo)`Dx1qQ^V#(iw#pP`S#ig82A$En(*-;D7*$Ok! zHmq$ZEI+op&pIF{unEoA94tY8&|~D7+qlo0m^c%=O-o6LeG?dNaDve!QOb#MBUW19 zn!qM>z05v)Q&MWJhpI9tf96i)9(31mCJ-Td?D8B)qbQuFPUb%oXm zejiCAIK$HG9xmg>Q5lc4#}|97RaGmoTjM<3?)i#A2Gr;aptLCJ^#@!5R2o+hxO%1CRFHZ9B$6%@!|Oh36BDP zqmteULJNcoTYG^36Yce)z{CYDer`n_oKTF&asihumHI3eMR`o?be<8v0vbghDSRpp zyYR8c(?(r7x4XWS{jE_mIO$YX;K5XRhSznGCC>H!3$JD1YoKH(;B}oofO_ct_r~7D z0fY?@!6YS(kSAd9U2mMeHv=ceDK#jUl$)Dd%g87vS_9JBCvmDUV(^)+hyJsoV%ht! z{pP!P$+^Ni0p5c8r$E|AM9p{gsB)THbv5R>(TiQpV+OyF7yffRCtr~85p{@&oR_uh z4)zoW$A;xkJ8sr;3$+i+@bp!wCO-^TKuMzaam~kzMbTy-?$cUMp@qX5m5oq~ypM7U zvq}YA_Etp^pwPHp3=L3e3yg>@yq9QvXd@^4)`P!+FH!Trqm6{?T zh4xD6lyHbw@tF5=dpImU5g*TKyQx{QYOMi&|FTgd+~}!IU_|Fy@*P)47+x^^UL$H+ z8c9)QsegHSRP!1x)$m;Ay6{Un^O*|WtU*`I`k*$^ye>+1yS{a-t??mUP!qINnPT0* zeae=){j$}DZA?%bN483r3zs)Gup*P zOtf-$KDSH9jO}{r!=<3aa-9cKv#E2w67!qSO18}o3_-~EKaccQPEMPaKeBVfg@) z$KCmCHy=2p2g@__cRcg+ksn^)=uvrWC#u=z1h;XP@hH#>=Sk;*6${^E&;1j&xt`g4 z(pVLFd2iqo#yrBJ5!#(7WeN$!X_G*DgInyDe=WeU1EJ)YUj2T$iCLF@ zDdpFAZ5+j2J&IBPjqSSR$&~$e+j8JoM&nt#fF_tKCWoU>`O6rYGv`vvJXy|7SJouq z9QwMu+kcvmWuMVW{@GvX3XNLXh))<*o!W#N=>@wCoLoC<nUtixC*rl;Q)$U{WMufI~k-C@9JgpUH-7IanuDNVN21_P@LIazlBQ+x4a?7!lz z@%+Bvc(2`_+T#Ye?nJq3HF@x#;Kui=WzI2tJbjJfxSM=2e76vCR~It1mmId&py|Iw zp_WBA!8Ax_H`MmzH7#u`Y%o#BoTig9ire9DvaqGmsXf2a(ufjd)kLwe<+A5(2xG2S zPCD&tn)BeSwJeYgZjwm`CQG?HTvAS`u7j7i5ZxWp0N|avBW2Eb;qR{kN_Fd=9sJDT znoXFTBn*gTMWsA*|8lOp%7MLsDs=VcYIG_d8D#>axM7ax^tB%fE@>rM1w{q*D2siw zYgd1FbA~vfSLNl>d|tw*o)5e_sq{M~I#c$q&9?g0or|E(*pZj%2HUV_bHTcuVZEG2 zQ~f}QCIoENN0AchS8MLM0W(L!Zkv#R;6DhK6B2isghGk|=juDwCkJ66(oz zPgrlg1c%O@g^=E$HP_pTEF281S7Q`#DB_}`5zT9N^>>=Mbx;E3q(v${De1SE2b;B{ zaF@^~YsCb1InfzU5srENf%&xCRK77KR1dPmuetqKmjYsTv$rJ8cojXh;-OL_zYg z;(Rz9ai?qd?BaPZ9whR1Tb9FPbX}HApO6pi$fkp-HduQ7wMhir&ko@C&<#`P@9qou z^F6is&+oy{|5E_)|77bz=cLUR-&IM0|0Qf%9wcZd{<$$h{%#)`_xEyw$NRHkkW8ec zdg>KnMK|0zqD;HPeJ@ffwNXf@0ukr2adFMl(`x-E6teU;{{fku1nKFFU`=HbcG~v) zx0=1&t@ruZ@6>8~uYz<5I34-`tvtB`Xh z`wCn%{)V|A>ELr{GD(f-M)kA7kDW=3W!khgRl|E+b@82cS(yP3y&u2;x8Dvk^5cuP4z0Y`*mpv4RfSNmx1vf60&oQkj!42OoT!=b=wr%D_p_U7#)iOZ2=GK%8athR|IZT_Cf<(A;eUf%z$w+D5c zuE$dx9tZZm1!o=!-OR_3S|ae?R4JS^cpuaNKA%MzDUtN>7>rL`(n*9tg;d`nsyj&7Exuhp< zzv_Z^Yh#AuD>h_~Ww)o?5kN@rLVcx1>ykLu!Y_B)cCz3-5vLBLi`MxcZfMUu=gPN8 zwexv#S3mQba6{ZMBe2^x5Bis^K`w}o>@(5ImCx6walj;EwbR89{i6S&bq zShw-UN+|!j0 zWpPFYXvf;*gR*W$qydT37AMWsxnLat_?@3`5fwA@60sm}E{~!J5q?be@d!*1ZkZ?CTWI6cV~JMr)&T*Fo95Cq1l4^t`V1uVeE8Plx9K86%jpj zncsI}Kl}wx2IQ2EU9^wou2=&pf{C%&)CUb&&z_%D4#yj?Ce+mB$E4WU*tn+kka<;K z-}VxU0=KUp0U6pa>IZp{xcEv9r*Q&sPm2NvfXm?oc1)r|zPf);57misCRsmxIto5O z1<{oI6u^OwkRbLgGo=EAj?j??re@LA6SV0$&={O^mO%NvH@zbo_Yq>e=k8wOIcxk@pW~HH| zMzcoBP@_GJweqME0~$eIcimFzaGVCON7o44nql~_x0^^-%&(?7j<+W;BPgW!qpV2r zt*?Dt8ln;A3By7n>T`t5Uk!4JB2n43Mg~IjboC4P!pBa%D>XZdNW8-n<2xesNz>`_ z%FQCq)1;TZS>BbAc~#6Xeg^<|U*Qh;RSXzy;Jo3m(BHY3M45O6h*e92odjzGDI#rt zlJBy9soJM%YD!ORG)IDG&+jFUJHPH0_wKIQzR3?kM6z>rWll>zlF}Iy9hxLDF82RB zUhbEw50@WD>Mev&$Y3O=S8naF#kR7q)yt7qvUMScZsry8iQ#Nk9~3+8nUxa%yTR7( zrC_rX;EwbCfS7yvtMCh5wypoxEKms^B=he+ewe8sD@zIclT?ON&mvppCyCRj)5%t@ z%Qa-_t@o#*NEjHmLp?>LA~{*dVm4b-wTDo)G9ACQwKaq~MHv|xnThtTq-}XkZxxzEudaw;C`!59wGN!yw8tFUxw*lB`7?n%&E+nuAdGfV zpIT7XkLl=zABijN8)2_F@;cb-D7=$^Ub^3rV14pY&?QH?c2^{kn!eNZXzyJih{+Zy zNc6kRq$pmLlSO~&x^dCibyaO}q&F~5->B@}c)df8&*3ByZBkux+Hua9@ij8iOFm0z z=~0}f-Q2Br2}M*2C%d>NDr(#&G3P4#uJgLR!*08KPk7N0;!}&Ox={P3+9H-h}KTY~uFQ2ZA);dKl^$kAK8#`-G zC2`fxJ@S69F3X8RzS_)U!QR51HzLPWud+WYq^etc zfvdm8ydnNjze0M9HBr^1vDZFFIFU{}isWtQH+e>Oi+!~INz`{ms$(4jA~113SJ&yEFG=WnNAepPDPq^B+>~F z%xdfx4L`X=M2=s9LX7ik&w6({UK(Vi_M;@b;{O(Jz!uh+l0LYR{k2}f@uY|Mb?=B% zn5Q(Vq^IRyc>KUUri18balkwwNF6 zRyQte5wR{+W>CH^+V^Pm&!3I~D0-p2ajy_AJL)YC0EvowT{E9*-RC(pZhNk`BlW@Y zi$_YtEqb=VVy5)|uT$e=yj56{lZE)}mqI&}ewrgEFPsWR|7BQ+IvbBd#t8buqP{~n zf_18~)|Gc~s8Z{AW_1)izcH&?KgJn;h1xT}CLhK}BN8-9MMv3ws_y)IZVFNNU5Jc$ z2w>)QnqQsviu0Mraz5#ol7c?W>Xv+TypbQ0>c%fz9HJlrD3ZEoqRZ|#2WuhY_4X-! zcqZls)Xo$qni!lh?NjOw=1I5qL=*>zacmM%y*Q+kUob5xEIFxrwYU^yHAv{EY;COC$|y0T>Jd8p z9>G)2weO%=(_q!BJ1^}G+~9ggmh=veat1<}bcnUWEBF&d)-hq}-x09W6s8}^@|sLt z*3Uk>7g^@TuxIMb&i*5**{P{{gnFQ*9RHJL?3l$UC(4*9NZ>x z{z5T;Tfdr7F%A9Y`=hYyIX6az_l!(9)aNs%ty!?zUU7i7694Q0ikr3-hh|oAj0LV- zcm*sFd3Z)3GzAQ{G8EYpSn1g7eAJ@}HM_<@?=+srV#Oe9bFz*)8?wi<$P;ocA>OPo zCLa~aOz$#E&HUWzH7{oi7Z{GNRL$}{{dw6p-KjFlDxS z9xbvhC{_#$7vzfG+4k=U)FB#aCuF&Fx39z$n1mkHM&(Nb&*LB=c zhvQUMD1E1e@LOFKM4jE+LOjl##CP^NSqUfb%8SXJ@Mz^#0n42QX$|m<7~Ixv5t{N@ z*|lW05Wy)^^UF=&RS-?l-&oXZGo_&Fwp*}!Gs)Z}E@17Fi4l~3V14uF@Gw97xPpjl z)9&#$=7y~*ZRI6$qp0QzZM}K|6BS^y3OHx|6_xJZKnnK7%boCpfwQkrpFf`;8X5R~ zpK9IBN72YKgO>G35jbB=5Yzb;K_fjyaC^W;>@$w~mc4N6To3mSb-5ELkx_GZxB|`n z3^>l^{Yw^s43Bi_6HZ8jkvMYM^1)!1~7Seh?Bor8D&@>HlW zGmdTaJqF2SvTz0-}_y z;QhJhhdIM#eW^#UFRUCW#l|!j##q#xJQ?l^W*Y?dN(EbA{A`eX{>iFPP1rkLt6Sq< zl~Q8a=VBoaBxG)Bm?ggpXeFZ`^`_iKUkeQ~Ug{%bb{Gd&3dS zKx->GgihexIrJ>o*@7UJy+ZC@H;5>9Li})_;stT;AAS%2RDJB>JEpAvfaZMc$Ide% z-^b@O729tiCY1<-f0TspYdE4d{e3mS&D@_W0{h6jo->@TFyQkqJH#G#w;g~)e@^f| z{Zxd9g*Pj%1opdWs`{BsOvW{i@#$}U4(Et(4*l{Kd|kWIfqr^leRh3~jX#b};8(g#-i&w|fEFIf)U{+R{4r(BZ<~^%A{<25q0p9io z<~P=oB&DR1M+8stoel1wZ4lp>%M>Wg?TpmUD>Q6&LVu3+a|16FJoNN@^Ww&f8n5jK zK+)-N;JEoeS2m1j3iqT8ZuJSJeKvh3WmKWZ!!rleUwW07^dLq=fj{o#szBj|f%V3o zmPkK5Z6za_s*FF>+lTA_4U)Tc*4Qc{XQX$*%uTS$ZG^%kj~&glGR^|8K>baS{;@Q zJPCXQf1Eyj=T|oNU>1x@9Q_)dOtj3h0gVxsah;UR;H6?q2B!^RDjUv$b9uYbID$*U(Odg^Peo-}NYT#PqRbi|nsCq7Cn(6Xp>3*GW{ zi!z2+VIrqw@D;gV^;seqy2_=4qvJGz02XK9F@b#0m0{E;X1BMmObZX$BBaq5LGB8TzfDIPadWY!0# z3bKTIFZYh0OT@>_cV5{^GDU~7!QZ6JH55o=(6xk%P9t-eaPhBNUb^WVtfnWP+SWe_ zyCT)+o?ZQLv8*$`oUMMCvY=7+)QEV7r#HU8K zUja8ToyD{GjJ{%%Uv7Ln#mY;Jb{_tc`^>0F!J4W*l4NQ_L-L^}RupLqx#hDJ*8X`2 zVa9^E0w%SIR_xaLqJl|OI%tZpt{)K$v8;A~OKRHq8Q@Jo8g?!@W`*75sThBXH$WC1 z#j4CNj?n_UUa&gmrh1@e=gR`AwoC7_eoR%m;vATdWWAW%hdEiE={j}l5pM1zB^tEn zD{TJOQ*XnH+}UnmZh<}HSw(^_IA;0X_4As@mhJeK)0^)I?F)A6wp}7-p{yz7<*`$o z;`)(^28vRoJvn+Fnsu+LULL}y0NtoAb8F(9UWFs#bUL%Rov_Lvsi6K!$~LcVESb$S z-gDRS&IsaaIj6KbtBE!2VRy~_bTdRJTcnrQxsD6^0e+_a1>N-Zp8M8xiUBFWCj zVCSlMOrdnpGnW{I@Ga9#$uY=|5J#`=QwOVHvbi*D1q`44FlV+kgA91QyF8t$zU4R? zVC!72Kf))Ft-t=rYbCG9-v6aICP$l_=uWaDdnm2X@J+<3pNvzTJ}gZqy5biPiB_ri zo)$2XdJBuk#!rm<8HJF=H&Uy<0##lirDWT@BO)uAxAEKQrd(nA%_Z-5He~%)`)-3n zr_z0!;U(w0+Nn{3D9QMJ&%R5XD1jAh?P~<4$3Tc<(8ic?*1$WE4*;bL^7Ig zqNS@8sHJ-ux~;D!?bt*cu31atC~Jg?$s;T|bUp@LU8={YY-0UAJHsE+PGrct$FYaZ z*i%}ncRNZ}w-r!wHo%}ao&_Z$CdfpvoxKz*mhxIiZYdCf`T; zbSfUG@4Zz+OmB)FS=!Xoy=?V|=U|QWK*9`8*xWF~S2y z!xiegadMtv+Etwu%T2rW&=^lEW}{-|Q|ZtjUY(NeC$2;N28w!-o$G6?-~1a$kfC`- z{jRfzU%}Ed&R;rGVcjJO8U%Jf=1vZ@BmerBh7XVHC^N1lHLCLNA zT2Z}>cXLwEW?1TCIva%0?sM?lb+IIJ{^~+49;*g9S<>p#A{>0f>MFzzv!iYAH9|;Q zAZc|(>evQ5XL^|#9Urey=ILO%j|Slt@H!vqAt4mZ2D)d=s0r)*mAloitID@*vT7MK zuTB@CY=J{1QNH+CFRJ@Sizq4mvuaHR)#7uYL*WP4r^n&^zs+UOYx%jNcWGwyNiro1 z944)ZOcc3N*>StC zg(%%+Y43B%t=M7k-Pex`lP{;ge0X`DN6msCB2cy(_2#qEMN9(g@~(?KxL(|2XLTN5 zZo6q1LLg1Vi|lNsdSSvHI5@@Unmo2)&$RoJ;U-R^rfp)eSMMtH2X(-u;ya;4yfmpI z(ZBw-(1fg12AsGkQbC+{#!nEdg*l$f<^gOc@gGc_*e0nU{v}ll#st{|aJil0u z>g>O`>JZWdz|f;nT|#TLXO3KTcdeKs!vJ z?uzOR2V9r)Qqqcn6ASt_*cMV`9`&()A&poFl^RF&^)Dq$< zXngEvwUMIGOhPnVz^c1C>I!g|%|_Kvvnq^of_zXW6Z9&yC?VgNYTCTXiG8bs2(h-> zc&&i89A8bTS*qm4e1H+ylo2b-a-OdirAC5hCn$4oJmWlfL&A#Ol+R(CW}*W^ry8v` z=Bm*nh%6x>90y9W=Isc~*_@j*%OF1b=_g{n^T21u@oPr9y>kw~Oc6t%T=RHrLhx;E z%c{!I8%A-8VlC+RW}7o9kpsqMo8N!H)6`_*zVe-D3~gRM#!Oj?Zq~?e8RA8qxAFI# zV%VAnFmcvGrkTOd`XjBk!++-Mb$C>*50FYOtyg$%t~{cEmlz7`?HBV3y%z6u#_J$Z%2IbH5^Sr_n^ZP>L6=7= z6otd=w9#w4Xqb}-XYa+>s7Le@Z@&+DQd7+8FOGa=)4~iMGGqi?=@5{v57ktqJk1gA z;lhLRf0DB$%Qm~k%0y4TWwY@%5e!~H^H~Off8LEE&aE5w9$Q3S$+qbA6OJOgnmj&7 z0*X!9SAVY`*%bthj9*cdFWUBzpC?yD8FT)sl2&Yy?J!&xMrDOb1sD*%kf4;&9@p?<*<}2Pyde|k z;bVVxyN*NJi}}5bHnc^-y!qNgPuL5vYVy0*23iWu7d{ym%z$eV zJ+@`sc^&(XiPo{g_jES1tWGury?%{?{>nztngeBHu)g82S2^534 zxj~?GHv)RqqY<*)aY1GJ#mI8>Y%-$E!F)83zVjo!&}(O^{~Rg029INJdEJUP9%Q;V z-BB1*J{K3HKYn{-ELJ_lG4F|M_wsUdv++wig)23XC5gq$j1q$hcZ-PpG{5$lAHCox zl_gL^)j1jb=Fio+peIs0itsS`hz%bMcxeJ3+w-Z%z;jDe-jpndYlH|}ZU*?_d3#Uo zkqPn=3)vX0h4~dgMv!tef$`$s7wAn>tmqr|IJ5?vaI`w4^lY|OwU~U71wUKZ26eN! z5gI3{r;T~rsjhVK#LCYKfA_b>@uMQ~o`YPV6v=39VXISA-ae_3i>eCwF_(9qY>0>y zzZH&V6$v}L1ohTXE%!3s*@}8IjkO);U>lHcsh~A%e#BV z#l~{luP$W4=CcGb*3Lr=QpSbYQsUqK)X(Hde4V14 zNW>f$I&%U(hxwtdeuhoh;!K9+K+CE_JSMbyl&czYS~{?`Yp}xEAx34VA}t-_Jauja z*8*XeisuI5nyVyT?MA-5v+^hniQinSS#Q! zH^t>YaS4zJgW6I8B!d@9Y6!g0Xt|dc(S=~t*|;;7cR!45ZK1oOq{Zmg&fMTo~?6{24*`ay>ZPtV!kwWFtm#xm3EIA?MbVQ(X3Cr95!8dyDdzS{@Oq z#{IUJL?<+sH8^|gN;NR`G{iCOqT*V#PCI;04Jn6Pda0BX|0Sw6afg<+cIKngW@#(* zQ@xJANlA%ovJSXWb|hceq{u?R=ptDSK}0=SPnU~;s#H7Lo(b&*maifi{Z7W+ODyjF zbSvq5SUr|dJ=>ifvMZuc7%|@>;Mrbc+!K1$aIF7*-&c4)aXC8s*R9wj@&Wt!I>nN( z^}}90-$m_yex~D>>X+jq1Tg5ea;Yes?N)f2$8esSowl2KBk&HsThk(csB(aJX5j2% z%|hN!yY_rduZgjZmaz?RT*@68{En#=cdD=v<)u)dS!U=`44?WF%_|aa{u4&QHJ}I8 zF_EI+hHJsr_SN7h)*e!N)0HC~0by2N>x(th?LU$C>)UV-8eZSQG>eJr#c^Z^caCFz z7*}eoos7FwUJ?TbLuBGI`O4hF9!>bG^MT$N#3o8LoG)qINlNScsWka3S1NjlH~Z9^ z_+jC<=hqQ1{pB)o@Duj1b{_Z%iL!0}V8A5ZZ% zZhx(r`O;upQ|Pq>FNvg{bdS>R>2$j96QfRSui2?IZTY~u6qw{@KEAv?of73WW1iX~ z;E3C_p73-LOvtZ~l=d3#W+kiP+`mu$E}vd)JBA5voiy8e>h+P`Q^GCy_u>xa}TkwJkRdE>c2EP{S?^3UH!;jHntdY z7_U#nc66#*S{!^n2J^Y4Y}%LT!^slbJ+3Hz^1)4W7Fr;_ zB`&VtRUs*b<)J@8FagWGJ~R5qb=wLBY}BFTdpyrW#}9C(e}*}@7Fjix^c`Z+B#gep zauBTU8vyfRO)i*}sR*p^2l!6q3#p0?xDWEZO)ZYpv&@!`7x~7Lf;~X6dWSu_-zNAa z&~>n-t&;f3TPJ+xvEWtF#h_}bVhn_>0^JpcXxm))3 z_P|R;5^%UqkoCWk8o<~a%(BtHN9pH{Iufqi`=ozfcly8J!5%NZhyvsUuIoYou6tjI zUmh)u)~e``^)2`1NhqtIWii-q=}Pwb%Oo#*EeBs4XLomZBhyqN6~D*p4S`f-DA3o{ z()JHB;`{;v_FbQDm|I%|g>Z-a0>uiAP2v3$+_SnBDnS6(KS6a4xKyrpWcaPm_b0n_7On*_!XbI_TN7SUI@0PqxLBAuak1`kN+qT{~MV9_v!!d z#nRg1;HReH+H!K?!%%9zH6wYwMmiU%jHm!k4=seZ0lQ3)LE{a9LuvXM5`)OlvzKWi{-!wpOU86MEYl06BiGwGy4(vCG~c|@W_r6if}z%=XB5BUN<}B zdS=jcd%%=ZCup4(w?7A`wvL?OPwMZ70mriIWtjr9S82hp?&kdPC1GE^jg>xeM@M~( z-TVRJ*Z_+RzHoa#4plx$2*|^~k25f^XmoTBS%X5Q!l?DZ)13yAyuWDgo(c9+bTM*5 z6VEaUkbN0_?h!BxxCowcW;OYJH!cdrKeOtg5boG+53iR6w#}J|$u4peYVz?JaWakC z`=Z&U>D(HwXDON@m#RFdrz}O-%)|F__9Pv)w6w5e1hF#t zIc(mxSzK)gwYk<5dRA>6!8|QO{}wzg1ohPugxCi;!*|_jAlvN5>S`2a9VWbedLQ?1 zHc#90B1LSuDFeNt`EhRtyZOt?#O&ItA`>*u>xb&2Q>ET+PPgf>e;TdkMFL)2fBLQOXGh<@5zz5pW8!mB%?(*m#G z^3g%lJ!1LP6ztkrMYTfDPS<{n+a%a?yyQPGr7l0+k4YB3m8zFs18oSS!R?06v1(IW z^eDy46MW388_;HLwXF}EE8=QGBHM!n(+L=!=B^wK{OEi~w0S}HgP;p*s{cS}pbt=t zks@kbl$?>fSz_!ZF`F3~=XntEd=S~`nL|3D1*8u)o!jVS8ds+()onC{d{5PiDCw12V&%*A*8@tBnJFHq(>gv<| zxKw48h4e(x@i0ep3`6ww34LazM8AhYvD=-BEkL7e13=5Mkq8!WOt@u$lE+9G_`R?Q<^%M>+eo)FYk0jtZOTby+7RI;EWyNZCYpu zz`iiDyFKNbM}k-E;{3;jsz?2_o#E4&NP?U?a)q+l&Wkc6k{e{f?gkk$PWrO)@-2Va zSF*CQ6@}EhhVT*-coQh-Jg1!Do?Z12T;t>HB|M}PAGi5^G17-!vUu<%yX`5;hg2<9 ze?v4;l7qb{GQiH-OL&;KGjelHj3f7rW(avVQj8?pvdrs+t>}5F@afxnjxQH98)OIm0mlD$=2o7+PIVgT-uTO+p@lSf#W5pWFE{kNANGa|L0wIng3J$*Kh@1MmwdC_dS3i&cZ#F)3@4?pWqR%CCAZK{r3eQ1_R^NmRINI%*J8o> zxSa_O+~}#Y5F=^XFdX%+%7T+tJb!XTE+He>b)W>a?x&mnmiFoc2K}j}#Vv_MSKFa% zE;K>qcV}~%!s?rpjxt};K$_wsW?Eo-0!*7L){~z%9vpUUoS9(YNFBgRx-kboizB;p zFv5&fcW}rQ)qeX?@AQz9C6WPSz$Z$$dm6NjEBpLT!lD^I0P*Arx9&Q^DP+0!)j_3m;zF}@w z_4#kWU<3SoO6!*-1!Imm=Mht!vLywnuZtes^}+4Vl>~o=!4&5;z8c-m2%nNAUmv=! zt=ozE%$yXBZ$^YM>J2^72&lh*RcN|~-SjI8Wi&UwT?<`e*>ujMZoSHyuIJH6#!+UF z1$Ir0*O-J}I)UB!Imf=Cyr`+5%I7s@dY;C7iuO^r7QB%W-s4ootKFDS_|x!qMhN{y zgP_mp%nTF_px4QYeWMAf+||kQS!Pi25Rsi~w^wf7 z<3mm@BpXKbW_@+zrINt0WNAO$-O zcCz9HCK!)&)32V(=s7#~YOx;?VBSE_@*FD8tMy2fbxB1T{ADd@=W%=$X@pG2Fe3w| z8X~t0v||K>0fVUL$YH3D33}CEdo;)wEp97FspCAauXNS!p8YKy{iT2rPL2^vQEawJ zX8z<3fg@2{d#ARxG+q-HdzU6~+G{ayAHB`Z=|4x$y^N+WcmnARLCb27Hm$ZLbyQ*B zh?n#5bM~g?WqdJix3gvk#@p;HE+q0s@Y%zuG}(dU!M)Vv`MhG7YEZRI@8vuKTei&X zb9tEa=%8EZtc2CJ)L+I+7OeY=z=Q~8P~|NZJ$EP90lIb%Js`wEkC&izC@D=h&THvj zxx#!Dh}I6{rlc?55?n2dY(sIBIqG=T-*uKl;SFIY#Vpi3VxrK$33;@8oE7>^M+#KHCCy?PNyKZFz@pMr|MCnAEMn zA-&3;q$8JR^m2{fu#>jCrZf$%M8#&vJLS05Nt;!Iz)dJK59a!>V*4U`c zb{)}O3}q-Zdz#h^;})}j&8>|}=}@jwEWSbPOcZVkv_#jw(b5$(Z}^T=V47K&zq2vm zm&=$-)}!L`8OgBOw@zFI;F^s>LnrmM`ugR!`<4s`z1bnviVMi+7&`0SuZtQGC<*fA z2>={~76w%$rrAJBvRG1Ipi8!7<>jRhe!spCRU9d7QW3UXyG0AZsBfeNj01Uu#t0~T z1TMj2DcR#7tuMO3{`=2(hZ`$j5=8M4o$8?AMh9@?!j9t1`_D@a?-Sz{|{&7le&&AVfic9yZp)Z zw5SM%?5)KolH;TBm5)6`qb1I-+*~G*64S{O(Sw7AnW#xTFSmAEes_tE0@uqiXP76d zpw_+@zq?M0++a2grsi=}GzDp(qm0g1ks~)}JkO6a%6nShgB*Fb!EpiDv`EPjz(fQs zfylwPbM$k4oS+4Y%kHL&JNF8^PY_63V_xW~H!X0R-S=s#g-^TK_HvUQ0tyb)(l`Ny zi@+YW_tuEKgi_qZ3jT?+^Y46c&Ek8u@@{0OD&4KfcET#%AKzl zvM5}1my#06)?|46abn(q?-NW>%(4_;-&TP9i=ci97+#20_EPXx8#`n77*KY2TAT~5t-;;3`KIVf(g3D3N5j5#=1zB? ztbB$oEd$W?s%4Lzc?9({@A-DANI*Jyo3_a{ z7y00rBp5X&$-ND@2VBp?wEm}KA}tlqMT5?fKokl>EP4x4NldL{!?m+yKS?Dq38Gs3(jz)OUV0b>A*Z1DzjU|2Nf8mso9bH)l%z<`{F*J(ASOXE51$aH zqpSvT{;`Y4k1YrI0RBSKp5;Fp^Yu+0J}u5kxrDHpkJnvx{_li<8umg!X$qb;RR#cY zj-&wb2sGdud@d`KuKo|+!Fs_T``p@#b#>VXt%Bo$pU2(kt8)23^i#OHfU{r)@E;yd zdUr?w%m%J6Ab_^kj%X0@eH{t5etFE{zyi1cA$7uD~hHc=WJaI z{C^!5XC-4&(l%1kh@lw+dS1CmRJ@L+pTeNrIttugezKfiCW?z^Z1EdOuwA!?B|1XY zynuLN7o>zO0?D%Wj>!3Sk{b{zEWZRU<)6ZHUHH{qq`CR)<7W&lfH?QJ>qeomX?J17 z*-#*y{9HKE|9pqa2Ov^e-UmQ?zC*$^kbZ|o0Jro>OHp2!I3d`cbMy?0IyJC|#{Jnu z``J6!D&c!#b;u|f7dh+aFo6PMTi5l3AV&v=rPcvejWZ|#Zugmxl*uZD-|LPdcXr-rikk2aMX zChAg>1>PHD{;5F#Og@R8%7I81R7VwDF z773NLJOZ#~BDLf|Z{@>aT(mxMXL~1$DVhL`wyNOX3Rv3GhSa=+OO?yO0 z2V2u&uHR@S9Bsa}jbPXRN~#L`w%fKJ0O4qt>RF`LCSBI(^|pose&|4vYbA)}U1(Jjg7sEGlsFiWRC2|y-3JC%`^X_U z$F0_S$kzI@Mn5eaXF+O(HCQoJXJ=cL3*Ah=_Ok;q;;#N5;4a2g%RSFk9JF^G;U+=Luf!Ay<0{I&_qN}`aG?hrZ>+ma`_ghu98sdSPleq&_ zl3WZ31>dh>wky<|oqZ*XouJAe1H@h8`mA5EVHkF=)A^y^ZR{z4#-ghS+pw>Z$z<=} zY*wI=N+KkA)yH_?jzhggFbSaF5hU$kTf<~Ia@?qp`^UgBd(geUV9h zN}L;jUn!V$`*v*si)?>CnP>y;er$%^~l` zf}Rg&tB?Dbu%Yhg^PK*nHG7f&IeIhi%BpVZn`=z$os`OW4)6}DVz zg9A9U0jZ+YJ%*c}yb9MCx=;*1>5%BH0^m#AzWj5jVZEOLu)*4-F|$B)1b}n=g3wVZ z*N9KazP|Oy2Q+{Am}0loeiu_$PwPGHz2G%Fc@3PT*Agde?oxT;Hi!hE92yAouHTc_ zBpfTCl5n$!GiFf@b#=fpg+hPKTAuJ1NA1Su9TE$iCa?9ppx zf3&`V-yMseS2Wg@hu&G=MiOW5l8Z@~_WJ4oWI4~|p2g6|;eJM-udi*7jjj3mHDHL1 zxs6XNMoaol8`Tg})rrLQzp)eFBd{EhCrY$<;cQc1?)x5Rnu0Se-e*i#*>xGu3~$@n zIwC4=;Ewii<+H~b`-0&LCh5_*GW`kwSbq!N7|v#J$maQQmY=zetz_0v)jp5X0d;W4Msc|N zQ)QzsAmIJVNI;*n1P>%UFBd)MGVAR$AQl)Js9a}lu%|%wQ4l(6q*8AMgx(<5fq>Ti zcD*n8VfldlSGr1lX5X-XHr8##dXKPrrW!-YhN~5#Q?9}1T>K9WEUE431>4@StL2Rt z{|isZzvP9wlQGZsl8`pNWB2363Zin)j9E+1 z{?j3`OY$b$8L<+=$J7O?NU z`}r?fZq-ioC&1Uk1ox!@KJ}zg1eXX{gr96LGmXp3#d}*ZzW)RRyFkR#G=XgIJGiK* z1899s!X(!Ym@C@_*(a^(7Lj}TIC@cQ(ww+9!6DRb zd(c|+uYBG189=OoYdaV1$ds*W+-i`lXQ)B;z$Q~WW%w7D4>rM#d zIxj8&F4?7ZmQuvv>f(T*tH0=LcF9TrkB5_YaBY`3$tV9NH}T6vOpnB z#*l5nfHrsA{NonzaF+PXLiYcRFMAaEzbpurOA4Jy(7r3lLi1Il0?c0kdDKk3HgsJc zbj>Mx>+}4@PbW2?MQF$PamS6j5~OLthm$KG0IT4-ZDn=%P~97(6!yT8lly(H`38%o z6}$fPL(u!n534->84^Pe@^Yvy0;w$=__*-!HxzasKBL1S)!M{m9aX1qJ9%E{AALaY zcV3q-q{pJH@(vvr{A++DqR_94zU&U1yabj*Z#qMO(QSWi3JdG(?W_1u4@@w=4r!NAl1 eGoqLg$z;Dj_G&fm^mN)D%sZO;w@Pk44F5kQb=bB5 diff --git a/blazor/gantt-chart/images/cell-edit.png b/blazor/gantt-chart/images/cell-edit.png new file mode 100644 index 0000000000000000000000000000000000000000..af1496d81a68906a668c1a2075fe2a915019141f GIT binary patch literal 29451 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�e^=U8-dXl+OU*3X?%_`#E|;7l*?DJr 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 literal 0 HcmV?d00001 diff --git a/blazor/gantt-chart/images/user-interaction.png b/blazor/gantt-chart/images/user-interaction.png new file mode 100644 index 0000000000000000000000000000000000000000..2c55bc67ea5348be42702c797950b5e6d8e1076f GIT binary patch literal 37572 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

    -SXG{Ae?4*o2Yc1WqFu%V`?RQ>stcwhsw4&=D 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 pj{hA`0^TwP4X_#=J-u`P - + - +

    Task Name: @((context as TaskData).TaskName) @@ -42,27 +55,27 @@ The Gantt Chart component maps any data source fields to [GanttLabelSettings](ht 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, 07), }, + 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; } @@ -73,6 +86,8 @@ The Gantt Chart component maps any data source fields to [GanttLabelSettings](ht color: black !important; } -``` -![Blazor Gantt Chart with Task Label](images/blazor-gantt-chart-task-label.png) +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/LtLIDkVIpzpsrlhR?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} \ No newline at end of file diff --git a/blazor/gantt-chart/managing-tasks.md b/blazor/gantt-chart/managing-tasks.md index c82cdf05e0..e2a795ad2b 100644 --- a/blazor/gantt-chart/managing-tasks.md +++ b/blazor/gantt-chart/managing-tasks.md @@ -3,42 +3,90 @@ layout: post title: Managing Tasks in Blazor Gantt Chart Component | Syncfusion description: Checkout and learn here all about Managing Tasks in Syncfusion Blazor Gantt Chart component and more. platform: Blazor -control: Gantt Chart +control: Managing tasks documentation: ug --- # Managing Tasks in Blazor Gantt Chart Component -The [Blazor Gantt Chart](https://www.syncfusion.com/blazor-components/blazor-gantt-chart) component has options to dynamically insert, delete, and update tasks in a project. The primary key column is necessary to manage the tasks and perform CRUD operations in Gantt Chart. To define the primary key, set the `GanttColumn.IsPrimaryKey` property to `true` in the column. +Managing tasks in the Blazor Gantt Chart component enables dynamic project updates, such as inserting, deleting, or editing tasks and dependencies, by enabling [AllowAdding](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditSettings.html#Syncfusion_Blazor_Gantt_GanttEditSettings_AllowAdding), [AllowDeleting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditSettings.html#Syncfusion_Blazor_Gantt_GanttEditSettings_AllowDeleting), [AllowEditing](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditSettings.html#Syncfusion_Blazor_Gantt_GanttEditSettings_AllowEditing), and [AllowTaskbarEditing](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditSettings.html#Syncfusion_Blazor_Gantt_GanttEditSettings_AllowTaskbarEditing). A primary key column, defined by [GanttColumn.IsPrimaryKey](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttColumn.html#Syncfusion_Blazor_Gantt_GanttColumn_IsPrimaryKey) set to **true** (e.g., on id), ensures reliable CRUD operations and task identification. Editing modes include cell editing for quick TreeGrid updates, dialog editing for comprehensive changes, taskbar dragging for duration or date adjustments, and connector line dragging for dependencies. Customize dialogs with templates or fields using [AddDialogFields](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_AddDialogFields) and [EditDialogFields](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_EditDialogFields). Methods like [AddRecordAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_AddRecordAsync__0_System_Nullable_System_Int32__System_Nullable_Syncfusion_Blazor_Gantt_RowPosition__System_Object_), [DeleteRecordAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_DeleteRecordAsync_System_Nullable_System_Int32__), and [UpdateRecordByIDAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_UpdateRecordByIDAsync__0_) support programmatic management. Ensure valid [GanttTaskFields](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttTaskFields.html) mappings and a primary key to enable editing seamlessly. -## Cell edit type and its params +The following code example demonstrates editing in the Gantt component. + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + +@using Syncfusion.Blazor.Gantt + + + + + + +@code{ + private List TaskCollection { get; set; } + protected override void OnInitialized() + { + this.TaskCollection = GetTaskCollection(); + } + + public class TaskData + { + 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 Predecessor { get; set; } + public int? ParentID { get; set; } + } -The `GanttColumn.EditType` is used to customize the edit type of the particular column. You can set the `GanttColumn.EditType` based on data type of the column. + public static List GetTaskCollection() + { + List Tasks = new List(); + Tasks.Add(new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 04, 08), }); + Tasks.Add(new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 }); + Tasks.Add(new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "4", Progress = 40, Predecessor = "2", ParentID = 1 }); + Tasks.Add(new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, Predecessor = "3", ParentID = 1 }); + Tasks.Add(new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 11), EndDate = new DateTime(2022, 04, 18), }); + Tasks.Add(new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 30, Predecessor = "4", ParentID = 5 }); + Tasks.Add(new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, Predecessor = "6", ParentID = 5 }); + Tasks.Add(new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, Predecessor = "7", ParentID = 5 }); + return Tasks; + } +} -* [NumericTextBox](https://blazor.syncfusion.com/documentation/numeric-textbox/getting-started) component for integers, double, and decimal data types. +{% endhighlight %} +{% endtabs %} -* [TextBox](https://blazor.syncfusion.com/documentation/textbox/getting-started) component for string data type. +{% previewsample "https://blazorplayground.syncfusion.com/embed/LXBIWDWeiYcZSwrs?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -* [DropDownList](https://blazor.syncfusion.com/documentation/dropdown-list/getting-started) component for list data type. +Editing feature requires a primary key column for CRUD operations. While defining columns in Gantt using the [GanttColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttColumns.html) property, it is mandatory that any one of the columns, must be a primary column. By default, the [Id](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttTaskFields.html#Syncfusion_Blazor_Gantt_GanttTaskFields_Id) column will be the primary key column. If `Id` column is not defined, we need to enable [IsPrimaryKey](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttColumn.html#Syncfusion_Blazor_Gantt_GanttColumn_IsPrimaryKey) for any one of the columns defined in the `GanttColumns` property. -* [DatePicker](https://blazor.syncfusion.com/documentation/datepicker/getting-started) component for date values. +## Cell edit type and its params -* [DateTimePicker](https://blazor.syncfusion.com/documentation/datetime-picker/getting-started) component for datetime type. +The [GanttColumn.EditType](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttColumn.html#Syncfusion_Blazor_Gantt_GanttColumn_EditType) is used to define the edit type for any particular column. You can set the `GanttColumn.editType` based on data type of the column. -* [Checkbox](https://blazor.syncfusion.com/documentation/check-box/getting-started) component for boolean type. +Below is the combined content from the provided markdown sections in bullet points, as requested, ensuring clarity and conciseness while preserving the original information: -Also, you can customize model of the `GanttColumn.EditType` component through the `GanttColumn.EditorSettings`. +- **Cell edit types and components**: + - **numericedit**: Uses the [NumericTextBox](https://blazor.syncfusion.com/documentation/numeric-textbox/getting-started) component for editing integers, doubles, and decimals. + - **defaultedit**: Uses the [TextBox](https://blazor.syncfusion.com/documentation/textbox/getting-started) component for editing string data. + - **dropdownedit**: Uses the [DropDownList](https://blazor.syncfusion.com/documentation/dropdown-list/getting-started) component to display all unique values for a field. + - **booleanedit**: Uses the [Checkbox](https://blazor.syncfusion.com/documentation/check-box/getting-started) component for editing boolean data. + - **datepickeredit**: Uses the [DatePicker](https://blazor.syncfusion.com/documentation/datepicker/getting-started) component for editing date data. + - **datetimepickeredit**: Uses the [DateTimePicker](https://blazor.syncfusion.com/documentation/datetime-picker/getting-started) component for editing date-time data. -The following table describes cell edit type component and their corresponding edit params of the column. +- **Customization**: + - You can customize model of the `GanttColumn.EditType` component through the `GanttColumn.EditorSettings`. -Component |Example ------|----- -[NumericTextBox](https://blazor.syncfusion.com/documentation/numeric-textbox/getting-started) | @(new { @params = new { format = "n"} }) -[TextBox](https://blazor.syncfusion.com/documentation/textbox/getting-started) | - -[DropDownList](https://blazor.syncfusion.com/documentation/dropdown-list/getting-started) | @(new { @params = new { value = "Germany"} }) -[DatePicker](https://blazor.syncfusion.com/documentation/datepicker/getting-started) | @(new { @params = new { format = "yyyy-MM-dd"} }) -[DateTimePicker](https://blazor.syncfusion.com/documentation/datetime-picker/getting-started) | @(new { @params = new { strictMode = true} }) -[Checkbox](https://blazor.syncfusion.com/documentation/check-box/getting-started) | @(new { @params = new { checked = true} }) +- **Edit type parameters**: + - **numericedit**: Supports parameters like `Decimals: 2`, `Value: 5`. + - **dropdownedit**: Supports parameters like `Value: 'Germany'`. + - **booleanedit**: Supports parameters like `Checked: true`. + - **datepickeredit**: Supports parameters like `Format: 'dd.MM.yyyy'`. + - **datetimepickeredit**: Supports parameters like `Value: new Date()`. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -106,13 +154,13 @@ Component |Example {% previewsample "https://blazorplayground.syncfusion.com/embed/VXVIsNjUCkvqfHQC?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -N> If edit type is not defined in the column, then it will be considered as the **StringEdit** type (Textbox component). +> If edit type is not defined in the column, then it will be considered as the **StringEdit** type (Textbox component). ## Cell edit template -The cell edit template is used to add a custom component for a particular column when the column is edited. +The cell edit template feature in Syncfusion Blazor Gantt Chart component allows you to customize the editing interface of individual cells by embedding custom components or HTML elements. Instead of using the default editor such as a textbox, you can define a template that provides a tailored editing experience such as a dropdown, date picker, or checkbox based on your application's requirements. This is especially useful when you need more control over how data is entered or displayed during editing. -The following code example describes, how to define the Edit template for a particular column. +The following code example demonstrates how to define an edit template for a specific column, where the **TaskName** field is rendered using a dropdown. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -194,9 +242,9 @@ The following code example describes, how to define the Edit template for a part ## Disable editing for particular column -You can disable editing for particular columns by using the [GanttColumn.AllowEditing](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttColumn.html#Syncfusion_Blazor_Gantt_GanttColumn_AllowEditing) property. +You can disable editing for particular columns, by using the [GanttColumn.AllowEditing](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttColumn.html#Syncfusion_Blazor_Gantt_GanttColumn_AllowEditing) property. -In the following demo, editing is disabled for the `TaskName` column. +In the following demo, editing is disabled for the **TaskName** column. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -257,7 +305,9 @@ In the following demo, editing is disabled for the `TaskName` column. ## Troubleshoot: Editing works only when primary key column is defined -Editing feature requires a primary key column for CRUD operations. While defining columns in Gantt using the `GanttColumns` property, any one of the columns must be a primary column. By default, the `Id` column will be the primary key column. If `Id` column is not defined, you need to enable `IsPrimaryKey` for any one of the columns defined in the `GanttColumns` property. +The editing feature in the Syncfusion Blazor Gantt Chart component requires a primary key column to perform CRUD operations. When defining columns using the [GanttColumns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttColumns.html) property, at least one column must be marked as the primary key. + +By default, the [Id](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttTaskFields.html#Syncfusion_Blazor_Gantt_GanttTaskFields_Id) column is considered the primary key. If the `Id` column is not defined, you must explicitly set the [IsPrimaryKey](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttColumn.html#Syncfusion_Blazor_Gantt_GanttColumn_IsPrimaryKey) property to true for one of the columns in the `GanttColumns` collection to enable editing functionality. ## Touch interaction @@ -273,19 +323,24 @@ Action |Description ### Task dependency editing -Tap the taskbar to initiate the taskbar editing for predecessors. Once it enters the edited state, `tap` the left or right connector point to initiate the task [dependencies](https://blazor.syncfusion.com/documentation/gantt-chart/managing-tasks#task-dependency-editing) editing. The dialog will be rendered with the message `Choose another task` and `Cancel` button. +You can tap the left/right connector point to initiate task [dependencies](https://blazor.syncfusion.com/documentation/gantt-chart/managing-tasks#task-dependency-editing) edit mode and again tap another taskbar to establish the dependency line between two taskbars. -![Task Dependency Editing in Blazor Gantt Chart](images/dependency-editing-touch.png) +Once the dependency edit mode is initiated, a dialog appears with the message **Choose another task** and a **Cancel** button. Tapping another taskbar will prompt a second dialog with the message **Select the connector position** and a tooltip near the second taskbar showing **Left** and **Right** buttons. Selecting one of these buttons establishes the dependency relationship between the two tasks. You can click the **Cancel** button at any time to exit the edit mode. -Click the `Cancel` button to cancel the edit action and to continue editing, tap another taskbar to establish the dependency line between the two taskbars. +![Task Dependency Editing in Blazor Gantt Chart](images/dependency-editing.png) -Once the second taskbar is tapped, the dialog will display a message `Select the connector position` and `Cancel` button. A tooltip is also displayed near the second taskbar with the `Left` and `Right` buttons. Click any button to establish a dependency relationship between the two tasks. +The following table explains the taskbar state in dependency edit mode. -![Task Dependency Editing in Blazor Gantt Chart](images/dependency-editing.png) +Taskbar state |Description +-----|----- +Parent taskbar | You cannot create dependency relationship to parent tasks.
    ![Parent taskbar](images/parent-taskbar.PNG) +Taskbar without dependency | If you tap a valid child taskbar, it will create `FS` type dependency line between tasks, otherwise exits from task dependency edit mode.
    ![Valid taskbar](images/valid-taskbar.PNG) +Taskbar with dependency | If you tap the second taskbar, which has already been directly connected, it will ask to remove it.
    ![Invalid taskbar](images/invalid-taskbar.PNG) +Removing dependency | Once you tap the taskbar with direct dependency, then confirmation dialog will be shown for removing dependency.
    ![Confirm dialog](images/confirm-dialog.PNG) -## Editing tooltip +## Taskbar editing tooltip -It is possible to enable or disable the tooltip while performing editing actions on the taskbar like left resizing, right resizing, dragging, and progress resizing by using the [GanttTooltipSettings.ShowTooltipOnEditing](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttTooltipSettings-1.html#Syncfusion_Blazor_Gantt_GanttTooltipSettings_1_ShowTooltipOnEditing) property. By default, this property is set to 'true.' +The taskbar editing tooltip can be customized using the [GanttTooltipSettings.ShowTooltipOnEditing](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttTooltipSettings-1.html#Syncfusion_Blazor_Gantt_GanttTooltipSettings_1_ShowTooltipOnEditing) property. By default, this property is set to **true**. The following code example shows how to customize the taskbar editing tooltip in Gantt Chart. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @@ -422,4 +477,10 @@ The taskbar editing tooltip can be customized using the [GanttTooltipSettings.Ed {% endhighlight %} {% endtabs %} -{% previewsample "https://blazorplayground.syncfusion.com/embed/BthoiDjqLVZxPYek?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} \ No newline at end of file +{% previewsample "https://blazorplayground.syncfusion.com/embed/BthoiDjqLVZxPYek?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +## See also +- [How to add new tasks?](https://blazor.syncfusion.com/documentation/gantt-chart/adding-new-tasks) +- [How to delete tasks?](https://blazor.syncfusion.com/documentation/gantt-chart/deleting-tasks) +- [How to manage task dependencies?](https://blazor.syncfusion.com/documentation/gantt-chart/task-dependencies) +- [How to configure critical path?](https://blazor.syncfusion.com/documentation/gantt-chart/criticalpath) \ No newline at end of file diff --git a/blazor/gantt-chart/pdf-export.md b/blazor/gantt-chart/pdf-export.md index 60a7f84a51..ff3fdf954a 100644 --- a/blazor/gantt-chart/pdf-export.md +++ b/blazor/gantt-chart/pdf-export.md @@ -1,1225 +1,34 @@ --- layout: post title: PDF Export in Blazor Gantt Chart Component | Syncfusion -description: Checkout and learn here all about PDF Export in Syncfusion Blazor Gantt Chart component and much more. +description: Learn how to export Gantt to PDF in the Syncfusion Blazor Gantt Chart component, including indicators, blob objects, single-page, multiple Gantt, and theme options. platform: Blazor -control: Gantt Chart +control: PDF export documentation: ug --- # PDF Export in Blazor Gantt Chart Component -The PDF export feature enables exporting Gantt chart data to a PDF document. To perform the export, use the [ExportToPdfAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_ExportToPdfAsync) method. Ensure that PDF export is enabled in the Gantt chart component by setting the [AllowPdfExport](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_AllowPdfExport) property to true. +The PDF export feature enables exporting Blazor Gantt chart data to a PDF document. To perform the export, use the [ExportToPdfAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_ExportToPdfAsync) method. Ensure that PDF export is enabled in the Gantt chart component by setting the [AllowPdfExport](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_AllowPdfExport) property to true. +PDF export in the Blazor Gantt Chart component enables exporting project data to PDF documents for sharing or archiving, using the [ExportToPdfAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_ExportToPdfAsync) method. with [AllowPdfExport](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_AllowPdfExport) set to**true**. This feature supports exporting timelines, tasks, and dependencies, with options for indicators via `base64` images, blob objects for previews, single-page layouts, multiple Gantt instances in one file, and themes like Material or Bootstrap. Focus on auto-scheduled tasks for accurate export, as manual scheduling is not currently supported. -{% tabs %} -{% highlight razor tabtitle="Index.razor" %} - -@using Syncfusion.Blazor.Gantt -@using Syncfusion.Blazor.Navigations - - - - - - - -@code { - private List TaskCollection { get; set; } - private SfGantt Gantt; - private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; - protected override void OnInitialized() - { - this.TaskCollection = GetTaskCollection(); - } - public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) - { - if (args.Item.Id == "PdfExport") - { - await Gantt.ExportToPdfAsync(); - } - } - - public class TaskData - { - 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 string Predecessor { get; set; } - } - - public static List GetTaskCollection() - { - List Tasks = new List() - { - 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, Predecessor = "2" }, - new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, - 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; - } -} - -{% endhighlight %} -{% endtabs %} - -{% previewsample "https://blazorplayground.syncfusion.com/embed/rZLIsjZgrAtEMygE?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} - -## Customize the PDF export - -The PDF export functionality in the Syncfusion® Gantt Chart provides extensive customization options through the [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html) class. By configuring the properties within this class, you can control the layout, format, and content of the exported PDF. This customization ensures that the PDF accurately represents the Gantt chart's structure and allows for tailored exports. - -### Customize file name for exported document -The PDF export functionality in the Syncfusion® Gantt Chart allows you to customize the file name of the exported document. By configuring the [FileName](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_FileName) property within the [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html) class, you can assign a specific name to the generated PDF. This is especially useful for keeping your exported documents organized and easily identifiable. - -In this example, the exported PDF will be saved as `ProjectSchedule.pdf`. - -{% tabs %} -{% highlight razor tabtitle="Index.razor" %} - -@using Syncfusion.Blazor.Gantt -@using Syncfusion.Blazor.Navigations - - - - - - - -@code { - private List TaskCollection { get; set; } - private SfGantt Gantt; - private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; - protected override void OnInitialized() - { - this.TaskCollection = GetTaskCollection(); - } - public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) - { - if (args.Item.Id == "PdfExport") - { - GanttPdfExportProperties exportProperties = new GanttPdfExportProperties(); - exportProperties.FileName = "ProjectSchedule.pdf"; - await Gantt.ExportToPdfAsync(exportProperties); - } - } - - public class TaskData - { - 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 string Predecessor { get; set; } - } - - public static List GetTaskCollection() - { - List Tasks = new List() - { - 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, Predecessor = "2" }, - new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, - 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; - } -} - -{% endhighlight %} -{% endtabs %} - -{% previewsample "https://blazorplayground.syncfusion.com/embed/BjBSCZNAhALZXWKG?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} - -### How to add a text in header/footer - -The PDF export functionality of the Gantt Chart allows you to add and style custom text in the header or footer of the exported PDF document. This customization can be achieved using the [Header](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_Header) and [Footer](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_Footer) properties of the [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html) class. By configuring these properties, you can include important information, such as titles, project names, or other relevant details, to enhance the exported document. - -The following sample code demonstrates how to add custom text and apply styling to the header and footer sections of the exported PDF document, - -{% tabs %} -{% highlight razor tabtitle="Index.razor" %} - -@using Syncfusion.Blazor.Gantt -@using Syncfusion.Blazor.Grids -@using Syncfusion.Blazor.Navigations - - - - - - - -@code { - private List TaskCollection { get; set; } - private SfGantt Gantt; - private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; - public List HeaderContent = new List - { - new PdfHeaderFooterContent() { Type = ContentType.Text, Value = "Gantt Chart PDF Export Header", Position = new PdfPosition() { X = 0, Y = 50 }, Style = new PdfContentStyle() { TextBrushColor = "#000000", FontSize = 13 } } - }; - public List FooterContent = new List - { - new PdfHeaderFooterContent() { Type = ContentType.Text, Value = "Gantt Chart PDF Export Footer", Position = new PdfPosition() { X = 0, Y = 350 }, Style = new PdfContentStyle() { TextBrushColor = "#000000", FontSize = 13 } } - }; - protected override void OnInitialized() - { - this.TaskCollection = GetTaskCollection(); - } - public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) - { - if (args.Item.Id == "PdfExport") - { - GanttPdfExportProperties exportProperties = new GanttPdfExportProperties(); - PdfHeader Header = new PdfHeader() - { - FromTop = 0, - Height = 100, - Contents = HeaderContent - }; - PdfFooter Footer = new PdfFooter() - { - FromBottom = 250, - Height = 100, - Contents = FooterContent - }; - exportProperties.Header = Header; - exportProperties.Footer = Footer; - await Gantt.ExportToPdfAsync(exportProperties); - } - } - - public class TaskData - { - 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 string Predecessor { get; set; } - } - - public static List GetTaskCollection() - { - List Tasks = new List() - { - 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, Predecessor = "2" }, - new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, - 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; - } -} - -{% endhighlight %} -{% endtabs %} - -{% previewsample "https://blazorplayground.syncfusion.com/embed/rDhyiDXArUzpgPqb?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} - -### How to draw a line in header/footer - -You can add lines to the Header or Footer area of the exported PDF document using the [Header](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_Header) and [Footer](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_Footer) properties in the [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html) class. - -Supported line styles are, - -* Dash -* Dot -* DashDot -* DashDotDot -* Solid - -The following sample code demonstrates adding line in the Header and Footer section of the exported document, - -{% tabs %} -{% highlight razor tabtitle="Index.razor" %} - -@using Syncfusion.Blazor.Gantt -@using Syncfusion.Blazor.Grids -@using Syncfusion.Blazor.Navigations - - - - - - - -@code { - private List TaskCollection { get; set; } - private SfGantt Gantt; - private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; - public List HeaderContent = new List - { - new PdfHeaderFooterContent() { Type = ContentType.Line, Points = new PdfPoints() { X1 = 0, Y1 = 4, X2 = 685, Y2 = 4 }, Style = new PdfContentStyle() { PenColor = "#000080", DashStyle = PdfDashStyle.Solid } } - }; - public List FooterContent = new List - { - new PdfHeaderFooterContent() { Type = ContentType.Line, Points = new PdfPoints() { X1 = 0, Y1 = 350, X2 = 685, Y2 = 350 }, Style = new PdfContentStyle() { PenColor = "#000080", DashStyle = PdfDashStyle.Solid } } - }; - protected override void OnInitialized() - { - this.TaskCollection = GetTaskCollection(); - } - public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) - { - if (args.Item.Id == "PdfExport") - { - GanttPdfExportProperties exportProperties = new GanttPdfExportProperties(); - PdfHeader Header = new PdfHeader() - { - FromTop = 0, - Height = 100, - Contents = HeaderContent - }; - PdfFooter Footer = new PdfFooter() - { - FromBottom = 250, - Height = 100, - Contents = FooterContent - }; - exportProperties.Header = Header; - exportProperties.Footer = Footer; - await Gantt.ExportToPdfAsync(exportProperties); - } - } - - public class TaskData - { - 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 string Predecessor { get; set; } - } - - public static List GetTaskCollection() - { - List Tasks = new List() - { - 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, Predecessor = "2" }, - new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, - 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; - } -} - -{% endhighlight %} -{% endtabs %} - -{% previewsample "https://blazorplayground.syncfusion.com/embed/BZBIWtXKVKPSwLAW?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} - -### How to change the page orientation - -The PDF export functionality allows you to customize the page orientation of the exported document. By setting the [PageOrientation](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_PageOrientation) property in the [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html) class, you can choose between [Portrait](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PageOrientation.html#Syncfusion_Blazor_Grids_PageOrientation_Portrait) (default) and [Landscape](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PageOrientation.html#Syncfusion_Blazor_Grids_PageOrientation_Landscape) orientations based on your requirements. - -The following code snippet demonstrates how to set the page orientation to Landscape for the exported PDF document, - -{% tabs %} -{% highlight razor tabtitle="Index.razor" %} - -@using Syncfusion.Blazor.Gantt -@using Syncfusion.Blazor.Navigations - - - - - - - -@code { - private List TaskCollection { get; set; } - private SfGantt Gantt; - private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; - protected override void OnInitialized() - { - this.TaskCollection = GetTaskCollection(); - } - public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) - { - if (args.Item.Id == "PdfExport") - { - GanttPdfExportProperties exportProperties = new GanttPdfExportProperties(); - exportProperties.PageOrientation = Syncfusion.Blazor.Grids.PageOrientation.Landscape; - await Gantt.ExportToPdfAsync(exportProperties); - } - } - - public class TaskData - { - 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 string Predecessor { get; set; } - } - - public static List GetTaskCollection() - { - List Tasks = new List() - { - 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, Predecessor = "2" }, - new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, - 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; - } -} - -{% endhighlight %} -{% endtabs %} - -{% previewsample "https://blazorplayground.syncfusion.com/embed/BtVyMjNgBzDbCnDU?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} - -### How to change the page size - -The PDF export functionality allows you to customize the page size of the exported document to suit your needs. By setting the [PageSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfPageSize.html) property in the [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html) class, you can select from various standard page sizes. The default page size is Letter, but other options like A4, A3, and others. - -Supported page sizes are: -* Letter -* Note -* Legal -* A0 -* A1 -* A2 -* A3 -* A5 -* A6 -* A7 -* A8 -* A9 -* B0 -* B1 -* B2 -* B3 -* B4 -* B5 -* Archa -* Archb -* Archc -* Archd -* Arche -* Flsa -* HalfLetter -* Letter11x17 -* Ledger - -The following code demonstrates how to change the page size to A4 for the exported PDF document, - -{% tabs %} -{% highlight razor tabtitle="Index.razor" %} - -@using Syncfusion.Blazor.Gantt -@using Syncfusion.Blazor.Navigations - - - - - - - -@code { - private List TaskCollection { get; set; } - private SfGantt Gantt; - private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; - protected override void OnInitialized() - { - this.TaskCollection = GetTaskCollection(); - } - public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) - { - if (args.Item.Id == "PdfExport") - { - GanttPdfExportProperties exportProperties = new GanttPdfExportProperties(); - exportProperties.PageSize = Syncfusion.Blazor.Grids.PdfPageSize.A4; - await Gantt.ExportToPdfAsync(exportProperties); - } - } - - public class TaskData - { - 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 string Predecessor { get; set; } - } - - public static List GetTaskCollection() - { - List Tasks = new List() - { - 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, Predecessor = "2" }, - new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, - 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; - } -} - -{% endhighlight %} -{% endtabs %} - -{% previewsample "https://blazorplayground.syncfusion.com/embed/BNhyiZZKhzLBWLhu?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} - -### Export current view records - -The PDF export functionality allows you to export only the records that are currently in view on the Gantt chart to a PDF document. This can be achieved by enabling the [IsCurrentViewExport](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.PdfExportEventArgs.html#Syncfusion_Blazor_Gantt_PdfExportEventArgs_IsCurrentViewExport) boolean argument in the [PdfExporting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEvents-1.html#Syncfusion_Blazor_Gantt_GanttEvents_1_PdfExporting) event. - -N> Exporting current view records is only applicable when the virtualization feature is enabled, and it does not retain the state of collapsed rows during export. - -The following code demonstrates how to use the `PdfExporting` event to export current view data of the Gantt chart to a PDF document, - -{% tabs %} -{% highlight razor tabtitle="Index.razor" %} - -@using Syncfusion.Blazor.Gantt -@using Syncfusion.Blazor.Navigations - - - - - - - - - - - - - - - - - - - - -@code { - private SfGantt Gantt { get; set; } - private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; - private List TaskCollection { get; set; } - protected override void OnInitialized() - { - this.TaskCollection = VirtualData.GetTreeVirtualData(30); - } - public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) - { - if (args.Item.Id == "PdfExport") - { - await Gantt.ExportToPdfAsync(); - } - } - public void PdfExportingHandler(PdfExportEventArgs args) - { - args.IsCurrentViewExport = true; - } - public class VirtualData - { - public static List GetTreeVirtualData(int count) - { - List DataCollection = new List(); - Random rand = new Random(); - var x = 0; - int duration = 0; - DateTime startDate = new DateTime(2000, 1, 5); - DateTime endDate = new DateTime(2000, 1, 12); - string[] assignee = { "Allison Janney", "Bryan Fogel", "Richard King", "Alex Gibson" }; - string[] reporter = { "James Ivory", "Jordan Peele", "Guillermo del Toro", "Gary Oldman" }; - for (var i = 1; i <= count / 5; i++) - { - var name = rand.Next(0, 100); - TaskData Parent = new TaskData() - { - ID = ++x, - TaskName = "Task " + x, - StartDate = startDate, - EndDate = startDate.AddDays(26), - Duration = "20", - Assignee = "Mark Bridges", - Reporter = "Kobe Bryant", - Progress = 50, - }; - DataCollection.Add(Parent); - for (var j = 1; j <= 4; j++) - { - startDate = startDate.AddDays(j == 1 ? 0 : duration + 2); - duration = 5; - DataCollection.Add(new TaskData() - { - ID = ++x, - TaskName = "Task " + x, - StartDate = startDate, - EndDate = startDate.AddDays(5), - Duration = duration.ToString(), - Assignee = assignee[j - 1], - Reporter = reporter[j - 1], - Progress = 50, - ParentID = Parent.ID, - }); - } - } - return DataCollection; - } - } - public class TaskData - { - public int ID { get; set; } - public string TaskName { get; set; } - public DateTime? StartDate { get; set; } - public DateTime? EndDate { get; set; } - public string Duration { get; set; } - public string Assignee { get; set; } - public string Reporter { get; set; } - public int Progress { get; set; } - public int? ParentID { get; set; } - public string Predecessor { get; set; } - } -} - -{% endhighlight %} -{% endtabs %} - -{% previewsample "https://blazorplayground.syncfusion.com/embed/hjhyWjtqBfpHsisd?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} - -### How to export Gantt chart with custom timeline range - -The PDF export functionality allows you to export with custom timeline range of the Gantt chart to the PDF document. To specify the range, set the [RangeStart](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.PdfExportEventArgs.html#Syncfusion_Blazor_Gantt_PdfExportEventArgs_RangeStart) and [RangeEnd](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.PdfExportEventArgs.html#Syncfusion_Blazor_Gantt_PdfExportEventArgs_RangeEnd) arguments within the [PdfExporting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEvents-1.html#Syncfusion_Blazor_Gantt_GanttEvents_1_PdfExporting) event. The `RangeStart` argument defines the start date, and the `RangeEnd` argument defines the end date of the timeline range. - -The following code demonstrates how to use the `RangeStart` and `RangeEnd` arguments of the PdfExporting event to export a custom timeline range of the Gantt chart to a PDF document, - -{% tabs %} -{% highlight razor tabtitle="Index.razor" %} - -@using Syncfusion.Blazor.Gantt -@using Syncfusion.Blazor.Navigations - - - - - - - - - - - - - - - - - - - - -@code { - private SfGantt Gantt { get; set; } - private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; - private List TaskCollection { get; set; } - protected override void OnInitialized() - { - this.TaskCollection = VirtualData.GetTreeVirtualData(30); - } - public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) - { - if (args.Item.Id == "PdfExport") - { - await Gantt.ExportToPdfAsync(); - } - } - public void PdfExportingHandler(PdfExportEventArgs args) - { - args.RangeStart = new DateTime(2000, 1, 14); - args.RangeEnd = new DateTime(2000, 05, 12); - } - public class VirtualData - { - public static List GetTreeVirtualData(int count) - { - List DataCollection = new List(); - var x = 0; - int duration = 0; - DateTime startDate = new DateTime(2000, 1, 5); - DateTime endDate = new DateTime(2000, 1, 12); - string[] assignee = { "Allison Janney", "Bryan Fogel", "Richard King", "Alex Gibson" }; - string[] reporter = { "James Ivory", "Jordan Peele", "Guillermo del Toro", "Gary Oldman" }; - for (var i = 1; i <= count / 5; i++) - { - TaskData Parent = new TaskData() - { - ID = ++x, - TaskName = "Task " + x, - StartDate = startDate, - EndDate = startDate.AddDays(26), - Duration = "20", - Assignee = "Mark Bridges", - Reporter = "Kobe Bryant", - Progress = 50, - }; - DataCollection.Add(Parent); - for (var j = 1; j <= 4; j++) - { - startDate = startDate.AddDays(j == 1 ? 0 : duration + 2); - duration = 5; - DataCollection.Add(new TaskData() - { - ID = ++x, - TaskName = "Task " + x, - StartDate = startDate, - EndDate = startDate.AddDays(5), - Duration = duration.ToString(), - Assignee = assignee[j - 1], - Reporter = reporter[j - 1], - Progress = 50, - ParentID = Parent.ID, - }); - } - } - return DataCollection; - } - } - public class TaskData - { - public int ID { get; set; } - public string TaskName { get; set; } - public DateTime? StartDate { get; set; } - public DateTime? EndDate { get; set; } - public string Duration { get; set; } - public string Assignee { get; set; } - public string Reporter { get; set; } - public int Progress { get; set; } - public int? ParentID { get; set; } - public string Predecessor { get; set; } - } -} - -{% endhighlight %} -{% endtabs %} - -{% previewsample "https://blazorplayground.syncfusion.com/embed/rtByWjjUrpHrtFIB?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} - -### Export hidden columns - -The PDF export functionality allows you to include hidden columns from the Gantt chart in the exported PDF document. To achieve this, set the [IncludeHiddenColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Grids.PdfExportPropertiesBase.html#Syncfusion_Blazor_Grids_PdfExportPropertiesBase_IncludeHiddenColumn) property to true within the [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html) class. This ensures that columns not visible in the Gantt chart are included in the PDF export. - -The following code demonstrates how to export hidden columns in the Gantt chart to a PDF document, - -{% tabs %} -{% highlight razor tabtitle="Index.razor" %} - -@using Syncfusion.Blazor.Gantt -@using Syncfusion.Blazor.Navigations - - - - - - - - - - - - - - - -@code { - private List TaskCollection { get; set; } - private SfGantt Gantt; - private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; - protected override void OnInitialized() - { - this.TaskCollection = GetTaskCollection(); - } - public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) - { - if (args.Item.Id == "PdfExport") - { - GanttPdfExportProperties exportProperties = new GanttPdfExportProperties(); - exportProperties.IncludeHiddenColumn = true; - await Gantt.ExportToPdfAsync(exportProperties); - } - } - - public class TaskData - { - 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 string Predecessor { get; set; } - } - - public static List GetTaskCollection() - { - List Tasks = new List() - { - 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, Predecessor = "2" }, - new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, - 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; - } -} - -{% endhighlight %} -{% endtabs %} - -{% previewsample "https://blazorplayground.syncfusion.com/embed/VtreCNXgVTcKHkcY?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} - -### Customize column width in exported PDF document - -The PDF export functionality allows you to customize the width of columns in the exported PDF document. This can be achieved using the [Width](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttColumn.html#Syncfusion_Blazor_Gantt_GanttColumn_Width) property in the [GanttColumn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttColumn.html) class. By specifying the width for each column, you can tailor the appearance of the exported PDF to your requirements. - -The following code snippet demonstrates how to customize column widths in the exported PDF document using the [Columns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html#Syncfusion_Blazor_Gantt_GanttPdfExportProperties_Columns) property of the [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html) class, - -{% tabs %} -{% highlight razor tabtitle="Index.razor" %} - -@using Syncfusion.Blazor.Gantt -@using Syncfusion.Blazor.Grids -@using Syncfusion.Blazor.Navigations -@using Syncfusion.PdfExport - - - - - - - - - - - - - - - -@code { - private List TaskCollection { get; set; } - private SfGantt Gantt; - private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; - protected override void OnInitialized() - { - this.TaskCollection = GetTaskCollection(); - } - public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) - { - if (args.Item.Id == "PdfExport") - { - GanttPdfExportProperties exportProperties = new GanttPdfExportProperties(); - exportProperties.Columns = new List() - { - new GanttColumn(){ Field = "TaskID", HeaderText = "Task Id", Width = "200" }, - new GanttColumn(){ Field = "TaskName", HeaderText = "Task Name", Width = "250"}, - new GanttColumn(){ Field = "StartDate", HeaderText = "Start Date", Width = "150"}, - }; - await Gantt.ExportToPdfAsync(exportProperties); - } - } - - public class TaskData - { - 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 string Predecessor { get; set; } - } - - public static List GetTaskCollection() - { - List Tasks = new List() - { - 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, Predecessor = "2" }, - new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, - 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; - } -} - -{% endhighlight %} -{% endtabs %} - -{% previewsample "https://blazorplayground.syncfusion.com/embed/LtBostXgrIjeKZvL?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} - -## How to export Gantt chart with specific columns - -### Through property - -The PDF export functionality enables you to export only specific columns from the Gantt chart, rather than exporting all columns by default. To achieve this, set the [Columns](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html#Syncfusion_Blazor_Gantt_GanttPdfExportProperties_Columns) property of the [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html) class. This allows you to tailor the exported PDF to include only the columns that are relevant to your needs. - -The following code snippet demonstrates how to configure the `Columns` property to export specific columns from the Gantt chart to a PDF document: - -{% tabs %} -{% highlight razor tabtitle="Index.razor" %} - -@using Syncfusion.Blazor.Gantt -@using Syncfusion.Blazor.Grids -@using Syncfusion.Blazor.Navigations -@using Syncfusion.PdfExport - - - - - - - - - - - - - - - -@code { - private List TaskCollection { get; set; } - private SfGantt Gantt; - private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; - protected override void OnInitialized() - { - this.TaskCollection = GetTaskCollection(); - } - public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) - { - if (args.Item.Id == "PdfExport") - { - GanttPdfExportProperties exportProperties = new GanttPdfExportProperties(); - exportProperties.Columns = new List() - { - new GanttColumn(){ Field = "TaskID", HeaderText = "Task Id", Width = "100" }, - new GanttColumn(){ Field = "TaskName", HeaderText = "Task Name", Width = "200"}, - new GanttColumn(){ Field = "StartDate", HeaderText = "Start Date", Width = "150"}, - }; - await Gantt.ExportToPdfAsync(exportProperties); - } - } - - public class TaskData - { - 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 string Predecessor { get; set; } - } - - public static List GetTaskCollection() - { - List Tasks = new List() - { - 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, Predecessor = "2" }, - new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, - 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; - } -} - -{% endhighlight %} -{% endtabs %} - -{% previewsample "https://blazorplayground.syncfusion.com/embed/hXhIiXZAVoCQueAU?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} - -### Through event - -The PDF export functionality allows you to export only specific columns from the Gantt chart, rather than exporting all columns by default. This can be achieved by using the `Columns` argument in the [PdfExporting](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEvents-1.html#Syncfusion_Blazor_Gantt_GanttEvents_1_PdfExporting) event. +## Export basic Gantt data -The following code demonstrates how to use the `PdfExporting` event to export specific columns of the Gantt chart to a PDF document, +Export Gantt data to PDF by setting [AllowPdfExport](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_AllowPdfExport) to**true** and calling [ExportToPdfAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_ExportToPdfAsync), which generates a document with the chart and tree-grid data. {% tabs %} {% highlight razor tabtitle="Index.razor" %} @using Syncfusion.Blazor.Gantt -@using Syncfusion.Blazor.Grids @using Syncfusion.Blazor.Navigations -@using Syncfusion.PdfExport - - - - - - - - - - - -@code { - private List TaskCollection { get; set; } - private SfGantt Gantt; - private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; - protected override void OnInitialized() - { - this.TaskCollection = GetTaskCollection(); - } - public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) - { - if (args.Item.Id == "PdfExport") - { - await Gantt.ExportToPdfAsync(); - } - } - public void PdfExportingHandler(PdfExportEventArgs args) - { - args.Columns = new List() - { - new GanttColumn(){ Field = "TaskID", HeaderText = "Task Id", Width = "100" }, - new GanttColumn(){ Field = "TaskName", HeaderText = "Task Name", Width = "200"}, - new GanttColumn(){ Field = "StartDate", HeaderText = "Start Date", Width = "150"}, - }; - } - - public class TaskData - { - 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 string Predecessor { get; set; } - } - - public static List GetTaskCollection() - { - List Tasks = new List() - { - 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, Predecessor = "2" }, - new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentID = 1 , Predecessor = "3" }, - 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; - } -} - -{% endhighlight %} -{% endtabs %} - -{% previewsample "https://blazorplayground.syncfusion.com/embed/hXVoCjXAVSBmCcUQ?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} - -## Customizing taskbar appearance - -### Through property - -The PDF export functionality allows you to customize the appearance of taskbars in the exported PDF document using the [TaskbarColor](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.PdfGanttStyle.html#Syncfusion_Blazor_Gantt_PdfGanttStyle_TaskbarColor) property in the [GanttPdfExportProperties](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttPdfExportProperties.html) class. This property enables you to set colors for various types of taskbars, including: - -* Parent Taskbars -* Child Taskbars -* Milestones -* Critical Paths -* Manual Taskbars -* Baselines - -By configuring the TaskbarColor property, you can format these taskbars to match your desired color scheme. The following code snippet demonstrates how to use the `TaskbarColor` property to customize the colors of different taskbars in the exported PDF document, - -{% tabs %} -{% highlight razor tabtitle="Index.razor" %} - -@using Syncfusion.Blazor.Gantt -@using Syncfusion.Blazor.Grids -@using Syncfusion.Blazor.Navigations -@using Syncfusion.PdfExport - - - - - - - - - - - -@code { - private List TaskCollection { get; set; } - private SfGantt Gantt; - private List toolbarItem = new List() { new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; - protected override void OnInitialized() - { - this.TaskCollection = GetTaskCollection(); - } - public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) - { - if (args.Item.Id == "PdfExport") - { - GanttPdfExportProperties pdfExport = new GanttPdfExportProperties(); - pdfExport.Style = new PdfGanttStyle(); - pdfExport.Style.TaskbarColor = new PdfTaskbarColor(); - pdfExport.Style.TaskbarColor.ParentTaskbarColor = new PdfColor(220, 118, 51); - pdfExport.Style.TaskbarColor.ParentProgressColor = new PdfColor(203, 67, 53); - pdfExport.Style.TaskbarColor.ChildProgressColor = new PdfColor(35, 155, 86); - pdfExport.Style.TaskbarColor.ChildTaskbarColor = new PdfColor(130, 224, 170); - pdfExport.Style.TaskbarColor.CriticalPathTaskbarColor = new PdfColor(173, 121, 64); - pdfExport.Style.TaskbarColor.CriticalPathProgressColor = new PdfColor(145, 76, 0); - pdfExport.Style.TaskbarColor.BaselineColor = new PdfColor(179, 38, 30); - pdfExport.Style.TaskbarColor.MilestoneColor = new PdfColor(141, 124, 187); - await Gantt.ExportToPdfAsync(pdfExport); - } - } - - public class TaskData - { - public int TaskID { get; set; } - public string TaskName { get; set; } - public DateTime? BaselineStartDate { get; set; } - public DateTime? BaselineEndDate { 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 static List GetTaskCollection() - { - List Tasks = new List() - { - new TaskData() { TaskID = 1, TaskName = "Project initiation", BaselineStartDate = new DateTime(2021, 04, 02), BaselineEndDate = new DateTime(2021, 04, 04), StartDate = new DateTime(2021, 04, 02), EndDate = new DateTime(2021, 04, 08) }, - new TaskData() { TaskID = 2, TaskName = "Identify site location", StartDate = new DateTime(2021, 04, 02), EndDate = new DateTime(2021, 04, 02), Duration = "0", BaselineStartDate = new DateTime(2021, 04, 02), BaselineEndDate = new DateTime(2021, 04, 02), Progress = 30, ParentID = 1 }, - new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2021, 04, 02), Duration = "5", Progress = 40, BaselineStartDate = new DateTime(2021, 04, 02), BaselineEndDate = new DateTime(2021, 04, 06), ParentID = 1 }, - new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2021, 04, 08), Duration = "0", EndDate = new DateTime(2021, 04, 08), BaselineStartDate = new DateTime(2021, 04, 08), BaselineEndDate = new DateTime(2021, 04, 08), Progress = 30, ParentID = 1 }, - new TaskData() { TaskID = 5, TaskName = "Project initiation", StartDate = new DateTime(2021, 04, 02), EndDate = new DateTime(2021, 04, 08) }, - new TaskData() { TaskID = 6, TaskName = "Identify site location", StartDate = new DateTime(2021, 04, 02), Duration = "2", Progress = 30, ParentID = 5, BaselineStartDate = new DateTime(2021, 04, 02), BaselineEndDate = new DateTime(2021, 04, 02) }, - new TaskData() { TaskID = 7, TaskName = "Perform soil test", StartDate = new DateTime(2021, 04, 02), Duration = "4", Progress = 40, ParentID = 5, BaselineStartDate = new DateTime(2021, 04, 02), BaselineEndDate = new DateTime(2021, 04, 03) }, - new TaskData() { TaskID = 8, TaskName = "Soil test approval", StartDate = new DateTime(2021, 04, 02), Duration = "5", Progress = 30, ParentID = 5, BaselineStartDate = new DateTime(2021, 04, 02), BaselineEndDate = new DateTime(2021, 04, 04) } - }; - return Tasks; - } -} - -{% endhighlight %} -{% endtabs %} - -{% previewsample "https://blazorplayground.syncfusion.com/embed/BXVyijDKBofOIgSk?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} - -### Through event - -The PDF export functionality allows you to customize the appearance of taskbars in the exported PDF document using the [PdfQueryTaskbarInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEvents-1.html#Syncfusion_Blazor_Gantt_GanttEvents_1_PdfQueryTaskbarInfo) event. This event provides the flexibility to customize and format the appearance of taskbars, including parent taskbars, individual taskbars, and milestone templates. - -The following code snippet demonstrates how to use the `PdfQueryTaskbarInfo` event to customize the appearance of taskbars in the exported PDF document, - -{% tabs %} -{% highlight razor tabtitle="Index.razor" %} - -@using Syncfusion.Blazor.Gantt -@using Syncfusion.Blazor.Grids -@using Syncfusion.Blazor.Navigations -@using Syncfusion.PdfExport - - - - - - - - - - - - - - - @code { private List TaskCollection { get; set; } private SfGantt Gantt; @@ -1235,21 +44,7 @@ The following code snippet demonstrates how to use the `PdfQueryTaskbarInfo` eve await Gantt.ExportToPdfAsync(); } } - public void PdfQueryTaskbarInfoHandler(PdfQueryTaskbarInfoEventArgs args) - { - if (args.Data.TaskID == 3) - { - args.TaskbarStyle.Color = new PdfTaskbarColor(); - args.TaskbarStyle.Color.ChildProgressColor = new Syncfusion.PdfExport.PdfColor(103, 80, 164); - args.TaskbarStyle.Color.ChildTaskbarColor = new Syncfusion.PdfExport.PdfColor(141, 124, 187); - } - if (args.Data.TaskID == 4) - { - args.TaskbarStyle.Color = new PdfTaskbarColor(); - args.TaskbarStyle.Color.MilestoneColor = new Syncfusion.PdfExport.PdfColor(103, 80, 164); - } - - } + public class TaskData { public int TaskID { get; set; } @@ -1282,15 +77,20 @@ The following code snippet demonstrates how to use the `PdfQueryTaskbarInfo` eve {% endhighlight %} {% endtabs %} -{% previewsample "https://blazorplayground.syncfusion.com/embed/VDheittqhyxNSXIj?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} +{% previewsample "https://blazorplayground.syncfusion.com/embed/rZLIsjZgrAtEMygE?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} ## Events triggered during exporting -When exporting the Gantt chart to a PDF document, a series of events are triggered in a specific order, allowing for advanced customization of the export process. Understanding this flow is essential to control and modify the exported content effectively. Below is the flow of events that occur during PDF export in the Gantt chart: +When exporting the Gantt chart to a PDF document, a series of events are triggered in a specific order, allowing for advanced customization of the export process. Understanding this flow is essential for effectively controlling and modifying the exported content. Below is the sequence of events that occur during PDF export in the Gantt chart: * [PdfExporting](https://blazor.syncfusion.com/documentation/gantt-chart/events) + * [PdfQueryTimelineCellInfo](https://blazor.syncfusion.com/documentation/gantt-chart/events) + * [PdfColumnHeaderQueryCellInfo](https://blazor.syncfusion.com/documentation/gantt-chart/events) + * [PdfQueryCellInfo](https://blazor.syncfusion.com/documentation/gantt-chart/events) + * [PdfQueryTaskbarInfo](https://blazor.syncfusion.com/documentation/gantt-chart/events) -* [PdfExported](https://blazor.syncfusion.com/documentation/gantt-chart/events) + +* [PdfExported](https://blazor.syncfusion.com/documentation/gantt-chart/events) \ No newline at end of file diff --git a/blazor/gantt-chart/splitter.md b/blazor/gantt-chart/splitter.md index 0816fe6b77..3dbd534410 100644 --- a/blazor/gantt-chart/splitter.md +++ b/blazor/gantt-chart/splitter.md @@ -166,4 +166,4 @@ The following example adjusts the splitter dynamically: {% endhighlight %} {% endtabs %} -{% previewsample "https://blazorplayground.syncfusion.com/embed/rZVoiXXaAhuibSQZ?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} +{% previewsample "https://blazorplayground.syncfusion.com/embed/rZVoiXXaAhuibSQZ?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} \ No newline at end of file diff --git a/blazor/gantt-chart/taskbar-editing.md b/blazor/gantt-chart/taskbar-editing.md index db821c7d04..04cf8dbaac 100644 --- a/blazor/gantt-chart/taskbar-editing.md +++ b/blazor/gantt-chart/taskbar-editing.md @@ -1,7 +1,7 @@ --- layout: post title: Taskbar editing in Blazor Gantt Chart Component | Syncfusion -description: Checkout and learn here all about Taskbar editing in Syncfusion Blazor Gantt Chart component and more. +description: Learn how to edit tasks via taskbar interactions in the Syncfusion Blazor Gantt Chart component for intuitive project timeline adjustments. platform: Blazor control: Gantt Chart documentation: ug @@ -9,12 +9,14 @@ documentation: ug # Taskbar editing in Blazor Gantt Chart Component -Modify the task details through user interaction, such as resizing and dragging the taskbar, by enabling the [GanttEditSettings.AllowTaskbarEditing](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditSettings.html#Syncfusion_Blazor_Gantt_GanttEditSettings_AllowTaskbarEditing) property. When you begin taskbar editing by clicking on a taskbar, a virtual taskbar appears over it. This virtual taskbar serves as a reference, helping you remember the original position of the task on the timeline before making any changes. With the virtual taskbar as a reference, you can make adjustments to the task, such as changing the duration by resizing the taskbar and dragging the taskbar to the desired position on the timeline to adjust the task's start and end dates. +Task bar editing in the Blazor Gantt Chart component enables intuitive project timeline adjustments by allowing to drag or resize taskbars to modify task details, such as start dates, durations, or progress, using mouse or touch interactions. Enable this feature by setting the [GanttEditSettings.AllowTaskbarEditing](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditSettings.html#Syncfusion_Blazor_Gantt_GanttEditSettings_AllowTaskbarEditing) property to **true**, ensuring task data aligns with valid [GanttTaskFields](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttTaskFields.html) mappings (e.g., ID, StartDate, Duration). When taskbar editing begins by clicking or tapping on a taskbar, a virtual taskbar appears over the original. This overlay acts as a reference to indicate the original position of the task on the timeline before any changes are made. With this reference, it is possible to drag the taskbar to shift start and end dates, resize it to adjust durations, or move the progress grip to update completion percentages. The [TaskbarEditing](https://blazor.syncfusion.com/documentation/gantt-chart/events#taskbarediting) event allows preventing edits for specific tasks. + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} -```cshtml @using Syncfusion.Blazor.Gantt - + @@ -28,41 +30,47 @@ Modify the task details through user interaction, such as resizing and dragging 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 static List GetTaskCollection() { List Tasks = new List() { - new TaskData() { TaskId = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 02), EndDate = new DateTime(2022, 04, 21), }, - new TaskData() { TaskId = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 02), Duration = "0", Progress = 30, ParentId = 1 }, - new TaskData() { TaskId = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 02), Duration = "4", Progress = 40, ParentId = 1 }, - new TaskData() { TaskId = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 02), Duration = "0", Progress = 30, ParentId = 1 }, - new TaskData() { TaskId = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 02), EndDate = new DateTime(2022, 04, 21), }, - new TaskData() { TaskId = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 04), Duration = "3", Progress = 30, ParentId = 5 }, - new TaskData() { TaskId = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 04), Duration = "3", Progress = 40, ParentId = 5 }, - new TaskData() { TaskId = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 04), Duration = "0", Progress = 30, ParentId = 5 } + new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 04), EndDate = new DateTime(2022, 04, 07), }, + new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 04), Duration = "0", Progress = 30, ParentID = 1 }, + new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 04), Duration = "4", Progress = 40, ParentID = 1 }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 04), Duration = "0", Progress = 30, ParentID = 1 }, + new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 04), EndDate = new DateTime(2022, 04, 21), }, + new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 04), Duration = "3", Progress = 30, ParentID = 5 }, + new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 04), Duration = "3", Progress = 40, ParentID = 5 }, + new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 04), Duration = "0", Progress = 30, ParentID = 5 } }; return Tasks; } } -``` + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/rjrStaBeqAqlpiUb?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} ## Creating taskbar on draw action -A taskbar can be drawn in an empty row by drag and drop interaction. This can be achieved by enabling the [GanttEditSettings.AllowSchedulingOnDrag](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditSettings.html#Syncfusion_Blazor_Gantt_GanttEditSettings_AllowSchedulingOnDrag) and [GanttEditSettings.AllowTaskbarEditing](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditSettings.html#Syncfusion_Blazor_Gantt_GanttEditSettings_AllowTaskbarEditing) property. +A taskbar can be drawn in an empty row by drag and drop interaction. This can be achieved by enabling the [GanttEditSettings.AllowSchedulingOnDrag](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditSettings.html#Syncfusion_Blazor_Gantt_GanttEditSettings_AllowSchedulingOnDrag) and [GanttEditSettings.AllowTaskbarEditing](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEditSettings.html#Syncfusion_Blazor_Gantt_GanttEditSettings_AllowTaskbarEditing) properties. A taskbar can be drawn only when [AllowUnscheduledTasks](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_AllowUnscheduledTasks) property is set to true and when a task has no start and end date. -```cshtml +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + @using Syncfusion.Blazor.Gantt - + @@ -76,44 +84,50 @@ A taskbar can be drawn only when [AllowUnscheduledTasks](https://help.syncfusion } 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 static List GetTaskCollection() { List Tasks = new List() { - new TaskData() { TaskId = 1, TaskName = "Project initiation", StartDate = new DateTime(2019, 04, 02) }, - new TaskData() { TaskId = 2, TaskName = "Identify Site location", Progress = 30, ParentId = 1 }, - new TaskData() { TaskId = 3, TaskName = "Perform soil test", Progress = 40, ParentId = 1 }, - new TaskData() { TaskId = 4, TaskName = "Soil test approval", EndDate =new DateTime(2019, 04, 03), Progress = 30, ParentId = 1 }, - new TaskData() { TaskId = 5, TaskName = "Project initiation", StartDate = new DateTime(2019, 04, 04) }, - new TaskData() { TaskId = 6, TaskName = "Identify Site location", StartDate = new DateTime(2019, 04, 02), Progress = 30, ParentId = 5 }, - new TaskData() { TaskId = 7, TaskName = "Perform soil test", StartDate = new DateTime(2019, 04, 02), Progress = 40, ParentId = 5 }, - new TaskData() { TaskId = 8, TaskName = "Soil test approval", EndDate = new DateTime(2019, 04, 02), Progress = 30, ParentId = 5 }, - new TaskData() { TaskId=9, TaskName="Marketing and presales", StartDate=new DateTime(2019,06,26), EndDate=new DateTime(2019,07,01) }, - new TaskData() { TaskId = 10, TaskName = "Important improvement", StartDate = new DateTime(2019, 06, 14), EndDate = new DateTime(2019, 06, 19) } + new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2019, 04, 03) }, + new TaskData() { TaskID = 2, TaskName = "Identify Site location", Progress = 30, ParentID = 1 }, + new TaskData() { TaskID = 3, TaskName = "Perform soil test", Progress = 40, ParentID = 1 }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", EndDate =new DateTime(2019, 04, 03), Progress = 30, ParentID = 1 }, + new TaskData() { TaskID = 5, TaskName = "Project initiation", StartDate = new DateTime(2019, 04, 04) }, + new TaskData() { TaskID = 6, TaskName = "Identify Site location", StartDate = new DateTime(2019, 04, 02), Progress = 30, ParentID = 5 }, + new TaskData() { TaskID = 7, TaskName = "Perform soil test", StartDate = new DateTime(2019, 04, 02), Progress = 40, ParentID = 5 }, + new TaskData() { TaskID = 8, TaskName = "Soil test approval", EndDate = new DateTime(2019, 04, 02), Progress = 30, ParentID = 5 }, + new TaskData() { TaskID=9, TaskName="Marketing and presales", StartDate=new DateTime(2019,06,26), EndDate=new DateTime(2019,07,01) }, + new TaskData() { TaskID = 10, TaskName = "Important improvement", StartDate = new DateTime(2019, 06, 14), EndDate = new DateTime(2019, 06, 19) } }; return Tasks; } } -``` -![Taskbar draw in Blazor Gantt Chart](./images/taskbar_draw.gif) + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/BjrIXOBIqTQEudyf?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} ## Prevent editing for specific tasks On the taskbar edit action, the [TaskbarEditing](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEvents-1.html#Syncfusion_Blazor_Gantt_GanttEvents_1_TaskbarEditing) event will be triggered. You can prevent the taskbar from editing using the `TaskbarEditing` event. This can be done by setting the [Cancel](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.TaskbarEditingEventArgs-1.html#Syncfusion_Blazor_Gantt_TaskbarEditingEventArgs_1_Cancel) property of the taskbarEditing event argument to true. For more information, refer to the following: -```cshtml + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + @using Syncfusion.Blazor.Gantt - + @@ -122,7 +136,7 @@ For more information, refer to the following: @code{ private void TaskbarBeginEditHandler(TaskbarEditingEventArgs args) { - if(args.Data.TaskId == 3) + if(args.Data.TaskID == 3) args.Cancel = true; } @@ -134,30 +148,34 @@ For more information, refer to the following: 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 Predecessor { get; set; } - public int? ParentId { get; set; } + public int? ParentID { get; set; } } public static List GetTaskCollection() { List Tasks = new List() { - new TaskData() { TaskId = 1, TaskName = "Project initiation", StartDate = new DateTime(2019, 04, 05), EndDate = new DateTime(2019, 04, 21), }, - new TaskData() { TaskId = 2, TaskName = "Identify Site location", StartDate = new DateTime(2019, 04, 05), Duration = "0", Progress = 30, ParentId = 1 }, - new TaskData() { TaskId = 3, TaskName = "Perform soil test", StartDate = new DateTime(2019, 04, 05), Duration = "4", Progress = 40, Predecessor = "2", ParentId = 1 }, - new TaskData() { TaskId = 4, TaskName = "Soil test approval", StartDate = new DateTime(2019, 04, 05), Duration = "0", Progress = 30, Predecessor = "3", ParentId = 1 }, - new TaskData() { TaskId = 5, TaskName = "Project estimation", StartDate = new DateTime(2019, 04, 06), EndDate = new DateTime(2019, 04, 21), Predecessor = "1FS", }, - new TaskData() { TaskId = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2019, 04, 06), Duration = "3", Progress = 30, Predecessor = "4" , ParentId = 5 }, - new TaskData() { TaskId = 7, TaskName = "List materials", StartDate = new DateTime(2019, 04, 06), Duration = "3", Progress = 40, Predecessor = "6" , ParentId = 5 }, - new TaskData() { TaskId = 8, TaskName = "Estimation approval", StartDate = new DateTime(2019, 04, 06), Duration = "0", Progress = 30, Predecessor = "7" , ParentId = 5 }, + new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2019, 04, 05), EndDate = new DateTime(2019, 04, 21), }, + new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2019, 04, 05), Duration = "0", Progress = 30, ParentID = 1 }, + new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2019, 04, 05), Duration = "4", Progress = 40, Predecessor = "2", ParentID = 1 }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2019, 04, 05), Duration = "0", Progress = 30, Predecessor = "3", ParentID = 1 }, + new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2019, 04, 06), EndDate = new DateTime(2019, 04, 21), Predecessor = "1FS", }, + new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2019, 04, 06), Duration = "3", Progress = 30, Predecessor = "4" , ParentID = 5 }, + new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2019, 04, 06), Duration = "3", Progress = 40, Predecessor = "6" , ParentID = 5 }, + new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2019, 04, 06), Duration = "0", Progress = 30, Predecessor = "7" , ParentID = 5 }, }; return Tasks; } } -``` \ No newline at end of file + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/rtBIZkVyqoXNCLAZ?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} \ No newline at end of file diff --git a/blazor/gantt-chart/template-pdf-export.md b/blazor/gantt-chart/template-pdf-export.md deleted file mode 100644 index dd2ab733cc..0000000000 --- a/blazor/gantt-chart/template-pdf-export.md +++ /dev/null @@ -1,378 +0,0 @@ ---- -layout: post -title: PDF Export with templates in Blazor Gantt Chart Component | Syncfusion -description: Checkout and learn here all about PDF Exporting with templates in Syncfusion Blazor Gantt Chart component and much more. -platform: Blazor -control: Gantt Chart -documentation: ug ---- - - -# Exporting PDF with templates - -The Gantt chart export functionality allows you to export both column and header templates to a PDF document. These templates can include various customizations such as images, formatted text, and custom cell styles within the header and columns. - -## Exporting with column template - -The PDF export functionality allows for advanced customization of Gantt chart columns, including the inclusion of images, background colors, and custom text. This can be achieved using the [PdfQueryCellInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEvents-1.html#Syncfusion_Blazor_Gantt_GanttEvents_1_PdfQueryCellInfo) event. By handling this event, you can define how individual cells in the Gantt chart are rendered in the exported PDF. - -The following code snippet demonstrates how to use the `PdfQueryCellInfo` event to export Gantt columns with custom text and different cell background colors, - -```cshtml -@using Syncfusion.Blazor.Gantt -@using Syncfusion.Blazor.Grids -@using Syncfusion.Blazor.Navigations -@using Syncfusion.PdfExport - - - - - - - - - - - - - - - -@code { - private List TaskCollection { get; set; } - private SfGantt Gantt; - private List toolbarItem = new List() { new ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; - protected override void OnInitialized() - { - this.TaskCollection = GetTaskCollection(); - } - public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) - { - if (args.Item.Id == "PdfExport") - { - await Gantt.ExportToPdfAsync(); - } - } - public void PdfQueryCellInfoHandler(Syncfusion.Blazor.Gantt.PdfQueryCellInfoEventArgs args) - { - if (args.Column.Field == "TaskName" && args.Data.TaskId == 5) - { - args.Cell.Value = "Updated Value"; - args.Cell.CellStyle = new PdfElementStyle() - { - FillBackgroundColor = "Orange", - Font = new PdfGridFont() - { - FontFamily = PdfFontFamily.TimesRoman, - FontSize = 6, - FontStyle = PdfFontStyle.Italic, - IsTrueType = false, - TextColor = "Red", - TextHighlightColor = "Green" - } - }; - args.Cell.CellStyle.Border = new PdfBorder() - { - Color = "Black", - DashStyle = Syncfusion.Blazor.Grids.PdfDashStyle.Dot, - Width = 0.1 - }; - } - } - public class TaskData - { - 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 string Predecessor { get; set; } - } - - public static List 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, Predecessor = "2" }, - new TaskData() { TaskId = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentId = 1 , Predecessor = "3" }, - 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 } - }; - return Tasks; - } -} -``` - -## Exporting with column header template - -The PDF export functionality allows for customization of Gantt chart columns header, including the inclusion of images, background colors, and custom text. This can be achieved using the [PdfColumnHeaderQueryCellInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEvents-1.html#Syncfusion_Blazor_Gantt_GanttEvents_1_PdfColumnHeaderQueryCellInfo) event. By handling this event, you can define how each column header in the Gantt chart is rendered in the exported PDF. - -The following code snippet demonstrates how to use the `PdfColumnHeaderQueryCellInfo` event to export Gantt columns header with custom text and image on the task name column header, - -``` cshtml -@using Syncfusion.Blazor.Gantt -@using Syncfusion.Blazor.Grids -@using Syncfusion.Blazor.Navigations -@using Syncfusion.PdfExport -@using System.Net - - - - - - - - - - - - - - - -@code { - private List TaskCollection { get; set; } - private SfGantt Gantt; - private List toolbarItem = new List() { new ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; - private static WebClient webClient = new WebClient(); - private static byte[] imageBytes = webClient.DownloadData("https://cdn.syncfusion.com/content/images/landing-page/yes.png"); - private static MemoryStream imageStream = new MemoryStream(imageBytes); - public static PdfImage image = PdfImage.FromStream(imageStream); - protected override void OnInitialized() - { - this.TaskCollection = GetTaskCollection(); - } - public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) - { - if (args.Item.Id == "PdfExport") - { - await Gantt.ExportToPdfAsync(); - } - } - public void PdfHeaderQueryCellInfoHandler(Syncfusion.Blazor.Gantt.PdfHeaderQueryCellInfoEventArgs args) - { - if (args.Column.Field == "TaskName") - { - args.Cell.Value = "Updated Value"; - args.Cell.CellStyle = new PdfElementStyle() { Image = image}; - } - } - public class TaskData - { - 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 string Predecessor { get; set; } - } - - public static List 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, Predecessor = "2" }, - new TaskData() { TaskId = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentId = 1 , Predecessor = "3" }, - 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 } - }; - return Tasks; - } -} -``` -## Custom label for Gantt Chart PDF export - -The PDF export feature of the Gantt chart allows for detailed customization of labels such as right label, left label, and task label. This functionality includes the ability to include images, change background colors, and add custom text. These customizations are managed using the [PdfQueryTaskbarInfo](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttEvents-1.html#Syncfusion_Blazor_Gantt_GanttEvents_1_PdfQueryTaskbarInfo) event. By handling this event, you can specify how each label in the Gantt chart will appear in the exported PDF. - -The following example demonstrates how to implement the `PdfQueryTaskbarInfo` event to customize the PDF export of Gantt chart labels with specific text and images, -``` cshtml -@using Syncfusion.Blazor.Gantt -@using Syncfusion.Blazor.Grids -@using Syncfusion.Blazor.Navigations -@using Syncfusion.PdfExport -@using System.Net - - - - - - - - - - - - - - - @{ - @if ((context as TaskData).TaskId == 5) - { -
    - -
    - } - else - { -
    - @((context as TaskData).TaskName) -
    - } - } -
    - - @if ((context as TaskData).TaskId == 2) - { -
    - Updated Value -
    - } - else - { -
    - @((context as TaskData).TaskName) -
    - } - -
    - - @if ((context as TaskData).TaskId == 3) - { -
    - -@((context as TaskData).Progress)% -
    - } - else - { -
    - @((context as TaskData).Progress)% -
    - } -
    -
    - -
    - -@code { - private List TaskCollection { get; set; } - private SfGantt Gantt; - private List toolbarItem = new List() { new ToolbarItem() { Text = "PDF Export", TooltipText = "PDF Export", Id = "PdfExport", PrefixIcon = "e-pdfexport" } }; - private static WebClient webClient = new WebClient(); - private static byte[] imageBytes = webClient.DownloadData("https://cdn.syncfusion.com/content/images/landing-page/yes.png"); - private static MemoryStream imageStream = new MemoryStream(imageBytes); - public static PdfImage image = PdfImage.FromStream(imageStream); - protected override void OnInitialized() - { - this.TaskCollection = GetTaskCollection(); - } - public async void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) - { - if (args.Item.Id == "PdfExport") - { - await Gantt.ExportToPdfAsync(); - } - } - public void PdfQueryTaskbarInfoHandler(PdfQueryTaskbarInfoEventArgs args) - { - if (args.Data.TaskId == 2) - { - args.LabelSettings.LeftLabelValue = "Updated Value"; - } - else - { - args.LabelSettings.LeftLabelValue = args.Data.TaskName; - } - - if (args.Data.TaskId == 5) - { - args.LabelSettings.RightLabel = new PdfElementStyle() { Image = image }; - } - else - { - args.LabelSettings.RightLabelValue = args.Data.TaskName; - } - if (args.Data.TaskId == 3) - { - args.LabelSettings.TaskbarLabelValue = $"-{args.Data.Progress}%"; - } - else - { - args.LabelSettings.TaskbarLabelValue = $"{args.Data.Progress}%"; - } - } - public class TaskData - { - 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 string Predecessor { get; set; } - } - - public static List 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, Predecessor = "2" }, - new TaskData() { TaskId = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, ParentId = 1 , Predecessor = "3" }, - 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 } - }; - return Tasks; - } -} -``` -## Best practices for exporting PDF with templates - -- **Optimize PdfQueryCellInfo event usage**: Use the `PdfQueryCellInfo` event to customize individual cell appearances efficiently. Minimize complex logic to maintain performance. - -- **Utilize PdfColumnHeaderQueryCellInfo effectively**: Apply the `PdfColumnHeaderQueryCellInfo` event for custom header styles and content, focusing on clarity and readability. -- **Accessibility and clarity**: Keep header elements simple and accessible. Use straightforward text and icons to convey column purposes clearly. - -- **Efficient use of PdfQueryTaskbarInfo**: Utilize the `PdfQueryTaskbarInfo` event to apply label customizations based on task data conditions for effective communication of task statuses. -- **Consistent label styling**: Ensure consistent theme across labels with uniform font styles, colors, and sizes. - -## Image handling across events -- **Base64 and MemoryStream**: Convert images to Base64 strings, then use `MemoryStream` to convert them to `PdfImage`. This avoids reliance on potentially inaccessible web links. -- **Height and width management**: Scale images to fit designated areas to prevent default resizing that reflects cell or row heights. Maintain a professional PDF layout. -- **Compression and optimization**: Compress images prior to Base64 conversion to reduce file size while maintaining quality, optimizing the final PDF document size. - -## Troubleshooting PDF export - -1. **Customizations not appearing in PDF** - - **Check event handler**: Ensure that the `PdfQueryTaskbarInfo` event is correctly implemented and bound in your code. Double-check the event handler's logic to verify that conditions for customization are being met. - - **Data matching**: Ensure that the task data (like `TaskId`) used in the event matches the data in the task collection. Mismatches can prevent customizations from applying. - -2. **Images not displaying** - - **Image URL**: Verify that the image URLs are correct and accessible. Ensure that external images are hosted on a server with public access rights. - - **Supported formats**: Use compatible image formats such as JPG, PNG, or GIF. Unsupported formats may not render correctly in a PDF. - -3. **Performance issues** - - **Optimize resources**: Large images or complex styling may slow down the PDF export process. Consider optimizing image size and simplifying styles. - -4. **Color code customization** - - **Use valid color codes**: You can use HEX (`#RRGGBB`), or standard color names like `red`, `blue`, etc. Ensure all color codes or names used are supported and valid. - - **Consistency across styles**: Maintain consistent use of color codes in the styles to avoid unexpected color changes or conflicts during PDF rendering. \ No newline at end of file diff --git a/blazor/gantt-chart/tool-bar.md b/blazor/gantt-chart/tool-bar.md index 06f4577113..047967f9c6 100644 --- a/blazor/gantt-chart/tool-bar.md +++ b/blazor/gantt-chart/tool-bar.md @@ -1,19 +1,19 @@ --- layout: post title: Toolbar in Blazor Gantt Chart Component | Syncfusion -description: Checkout and learn here all about Toolbar in Syncfusion Blazor Gantt Chart component and much more details. +description: Learn all about the Toolbar in Syncfusion Blazor Gantt Chart, including customization, actions and more. platform: Blazor -control: Gantt Chart +control: Toolbar documentation: ug --- # Toolbar in Blazor Gantt Chart Component -The Gantt Chart component provides the toolbar support to handle Gantt Chart actions. The [Toolbar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_Toolbar) property accepts the collection of built-in toolbar items and `ToolbarItem` objects for custom toolbar items. +The Blazor Gantt Chart component includes built-in toolbar support for executing common actions such as editing, searching, and navigating the timeline. The [Toolbar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_Toolbar) property accepts the collection of built-in toolbar items and `ToolbarItem` objects for custom toolbar items. ## Built-in toolbar items -Built-in toolbar items execute standard actions of the Gantt Chart component, and these items can be added to toolbar by defining the `Toolbar` as a collection of built-in items. It renders the button with icon and text. +Built-in toolbar items allow you to perform standard operations directly from the Gantt interface. These items can be added to the toolbar by specifying the [Toolbar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_Toolbar) property as a collection of predefined items. Each toolbar item appears as a button with an associated icon and label for intuitive interaction. The following table shows built-in toolbar items and its actions. @@ -35,11 +35,13 @@ The following table shows built-in toolbar items and its actions. | ZoomOut | To perform zoom-out action on Gantt Chart timeline. | | ZoomToFit | To show all tasks with timeline fit into available Chart width. | -```cshtml +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + @using Syncfusion.Blazor.Gantt - + @@ -47,7 +49,7 @@ The following table shows built-in toolbar items and its actions. @code{ - public string[] Searchfields = new string[] { "TaskId", "TaskName", "StartDate", "EndDate", "Duration", "Progress" }; + public string[] Searchfields = new string[] { "TaskID", "TaskName", "StartDate", "EndDate", "Duration", "Progress" }; private List TaskCollection { get; set; } protected override void OnInitialized() { @@ -56,65 +58,73 @@ The following table shows built-in toolbar items and its actions. 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, 07), }, + 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; } } -``` -![Blazor Gantt Chart with Default Toolbar](images/blazor-gantt-chart-default-toolbar.png) +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/VjhyCNrhgoIEpOJJ?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -N> The `Toolbar` has options to define both built-in and custom toolbar items. +> * The [Toolbar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_Toolbar) has options to define both built-in and custom toolbar items. ## Custom toolbar items -Custom toolbar items can be added to the toolbar by defining the `Toolbar` property as a collection of `ItemModels`. Actions for this customized toolbar items are defined in the `OnToolbarClick` event. +You can add custom items to the Gantt chart toolbar by setting the [Toolbar](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_Toolbar) property with a collection of `ItemModel` objects. The actions associated with these custom toolbar items can be handled using the [OnToolbarClick](https://blazor.syncfusion.com/documentation/gantt-chart/events#ontoolbarclick) event. -By default, the custom toolbar items are at left position. You can change the position by using the `Align` property. In the following sample, the `Quick Filter` toolbar item is positioned at right. +By default, custom toolbar items are aligned to the left. However, you can change their position using the [Align](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.ToolbarItem.html#Syncfusion_Blazor_Navigations_ToolbarItem_Align) property. In the example below, the **Collapse All** toolbar item is aligned to the right. -```cshtml -@using Syncfusion.Blazor.Gantt -@using Syncfusion.Blazor.Navigations +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} - + @code{ public SfGantt Gantt; - public List Toolbaritems = new List() { new ToolbarItem() { Text = "Quick Filter", - TooltipText = "Quick Filter", Id = "toolbarfilter" } }; + public List Toolbaritems = new List() + { + new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "Expand All",TooltipText = "Expand All", Id = "ExpandAll" }, + new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "Collapse All",TooltipText = "Collapse All", Id = "CollapseAll", Align = Syncfusion.Blazor.Navigations.ItemAlign.Right } + }; private List TaskCollection { get; set; } - public void ToolbarClickHandler(ClickEventArgs args) + public void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) { - if (args.Item.Id == "toolbarfilter") + if (args.Item.Id == "ExpandAll") { - this.Gantt.FilterByColumnAsync("TaskName", "startswith", "Identify"); + this.Gantt.ExpandAllAsync(); + } + if(args.Item.Id == "CollapseAll") + { + this.Gantt.CollapseAllAsync(); } } @@ -125,65 +135,67 @@ By default, the custom toolbar items are at left position. You can change the po 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, 07), }, + 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; } } -``` -N> * The `Toolbar` has options to define both built-in and custom toolbar items. -
    * If a toolbar item does not match the built-in items, it will be treated as a custom toolbar item. +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/BNhIWtrBAcHEYwhs?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} -![Alt text](images/customToolbar.png) +> * If a toolbar item does not match the built-in items, it will be treated as a custom toolbar item. ## Built-in and custom items in toolbar -The Gantt Chart component has an option to use both built-in and custom toolbar items at the same time. +The Gantt component supports using both built-in and custom toolbar items simultaneously. In this example, **ExpandAll** and **CollapseAll** are built-in items, while **Test** is a custom item added to the toolbar. -In the following example, the `ExpandAll` and `CollapseAll` are built-in toolbar items and `Test` is the custom toolbar item. +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} -```cshtml @using Syncfusion.Blazor.Gantt @using Syncfusion.Blazor.Navigations - +

    @Message

    - + @code{ public SfGantt Gantt; - public List Toolbaritems = new List() { "ExpandAll", "CollapseAll", new ToolbarItem() { Text = "Test", TooltipText = "Test", Id = "Test" } }; + public List Toolbaritems = new List() { "ExpandAll", "CollapseAll", new Syncfusion.Blazor.Navigations.ToolbarItem() { Text = "Test", TooltipText = "Test", Id = "Test" } }; private List TaskCollection { get; set; } + public string Message; - public void ToolbarClickHandler(ClickEventArgs args) + public void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) { if (args.Item.Id == "Test") { - Console.WriteLine("Custom toolbar click..."); + this.Message = "Custom Toolbar Clicked"; } } @@ -194,54 +206,62 @@ In the following example, the `ExpandAll` and `CollapseAll` are built-in toolbar 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, 07), }, + 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; } } -``` -![Customizing Toolbar Items in Blazor Gantt Chart](images/blazor-gantt-chart-with-custom-toolbar.png) +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/LjLyMDLVJigSxqLs?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5 %} ## Enable or disable toolbar items -You can enable or disable the toolbar items by using the `EnableItems` method. +You can control toolbar items dynamically using the [EnableItems](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Navigations.SfToolbar.html#Syncfusion_Blazor_Navigations_SfToolbar_EnableItems_System_Collections_Generic_List_System_Int32__System_Nullable_System_Boolean__) method. This allows you to enable or disable specific items based on user actions or application state. + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} -```cshtml @using Syncfusion.Blazor.Gantt @using Syncfusion.Blazor.Navigations +@using Syncfusion.Blazor.Buttons - - +
    + + +
    - + @code{ public SfGantt Gantt; + private bool? isChecked = true; public List Toolbaritems = new List() { new ToolbarItem() { Text = "Quick Filter", TooltipText = "Quick Filter", Id = "quickfilter" }, new ToolbarItem() { Text = "Clear Filter", TooltipText = "Clear Filter", Id = "clearfilter" } }; public void ToolbarClickHandler(Syncfusion.Blazor.Navigations.ClickEventArgs args) @@ -255,13 +275,10 @@ You can enable or disable the toolbar items by using the `EnableItems` method. this.Gantt.ClearFilteringAsync(); } } - public void EnableToolbar() - { - this.Gantt.EnableItems(new List() { 0,1 }, true); - } - public void DisableToolbar() + private void OnSwitchChange(Syncfusion.Blazor.Buttons.ChangeEventArgs args) { - this.Gantt.EnableItems(new List() { 0,1 }, false); + this.isChecked = args.Checked; + this.Gantt.EnableItems(new List() { 0, 1 }, isChecked ?? true); } public List TaskCollection { get; set; } protected override void OnInitialized() @@ -271,33 +288,35 @@ You can enable or disable the toolbar items by using the `EnableItems` method. 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, 07), }, + 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; } } -``` -![Enabling Toolbar Items in Blazor Gantt Chart](images/blazor-gantt-chart-enable-toolbar.png) +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/BZLyiDLTLJawoAQK?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?theme=bootstrap5) to know how to render and configure the Gantt. \ No newline at end of file diff --git a/blazor/gantt-chart/top-tier-and-bottom-tier.md b/blazor/gantt-chart/top-tier-and-bottom-tier.md index 95c3d9c4ff..fd54f61599 100644 --- a/blazor/gantt-chart/top-tier-and-bottom-tier.md +++ b/blazor/gantt-chart/top-tier-and-bottom-tier.md @@ -1,25 +1,35 @@ --- layout: post title: Top tier and bottom tier in Blazor Gantt Chart Component | Syncfusion -description: Checkout and learn here all about Top tier and bottom tier timeline cells in Syncfusion Blazor Gantt Chart component and much more. +description: Learn how to configure top and bottom tiers in the Syncfusion Blazor Gantt Chart component using timeline settings such as unit, format, count, and formatter. platform: Blazor -control: Gantt Chart +control: Top tier and bottom tier documentation: ug --- -# Top tier and bottom tier +# Top tier and bottom tier in Blazor Gantt Chart component -Gantt Chart component contains two tier layout in timeline, you can customize the top tier and bottom tier using [GanttTopTierSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttTopTierSettings.html) and [GanttBottomTierSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttBottomTierSettings.html) properties. Timeline tier's unit can be defined by using `Unit` property and `Format` property was used to define date format of timeline cell and `Count` property was used to define how many unit will be combined as single cell. +The Blazor Gantt Chart component supports a two-tier timeline layout, enabling customization of both the top and bottom tiers through specific configuration options. + +- [TopTier](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttTimelineSettings.html#Syncfusion_Blazor_Gantt_GanttTimelineSettings_TopTier) and [BottomTier](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttTimelineSettings.html#Syncfusion_Blazor_Gantt_GanttTimelineSettings_BottomTier): Define the structure and visibility of each timeline tier. +- [Unit](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttTimelineTierSettings.html#Syncfusion_Blazor_Gantt_GanttTimelineTierSettings_Unit): Specifies the time unit for each tier, such as day, week, or month. +- [Format](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttTimelineTierSettings.html#Syncfusion_Blazor_Gantt_GanttTimelineTierSettings_Format): Determines the date format displayed in timeline cells. +- [Count](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttTimelineTierSettings.html#Syncfusion_Blazor_Gantt_GanttTimelineTierSettings_Count): Combines multiple time units into a single timeline cell. +- [Formatter](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttTimelineTierSettings.html#Syncfusion_Blazor_Gantt_GanttTimelineTierSettings_Formatter): Applies a custom method to format the timeline cell values programmatically. + +These properties allow precise control over how time intervals are displayed, enhancing the readability and usability of the Gantt chart across various project scales. + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} -```cshtml @using Syncfusion.Blazor.Gantt - + - + @@ -32,46 +42,55 @@ Gantt Chart component contains two tier layout in timeline, you can customize th 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 static List 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, 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 }, }; return Tasks; } } -``` -![Blazor Gantt Chart with Top and Bottom Tier](images/blazor-gantt-chart-top-bottom-tier.png) +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/VtrSWXicLfvvejyd?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} ## Combining timeline cells -In Gantt Chart, timeline cells in top tier and bottom tier can be combined with number of timeline units, this can be achieved by using `GanttTopTierSettings.Count` and `GanttBottomTierSettings.Count` properties. Refer the following sample. +In the Blazor Gantt Chart component, timeline cells in the top and bottom tiers can be merged by grouping multiple time units into a single cell. This behavior is controlled using the `Count` property in both `TopTier` and `BottomTier` configurations. + +- [TopTier.count](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttTimelineTierSettings.html#Syncfusion_Blazor_Gantt_GanttTimelineTierSettings_Count): Specifies the number of time units to combine in each top-tier cell. +- [BottomTier.count](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttTimelineTierSettings.html#Syncfusion_Blazor_Gantt_GanttTimelineTierSettings_Count): Specifies the number of time units to combine in each bottom-tier cell. + +By adjusting these values, the timeline can display broader or more granular intervals, improving visibility for long-term or short-term project views. + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} -```cshtml @using Syncfusion.Blazor.Gantt - + - + @@ -86,42 +105,51 @@ In Gantt Chart, timeline cells in top tier and bottom tier can be combined with 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 static List GetTaskCollection() { List Tasks = new List() { - new TaskData() { TaskId = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 08, 21), }, - new TaskData() { TaskId = 2, TaskName = "Identify site location", StartDate = new DateTime(2022, 04, 05), Duration = "150", Progress = 70, ParentId = 1 }, - new TaskData() { TaskId = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "150", Progress = 50, ParentId = 1 }, - new TaskData() { TaskId = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "150", Progress = 50, ParentId = 1 }, - new TaskData() { TaskId = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 05, 06), EndDate = new DateTime(2022, 09, 21), }, - new TaskData() { TaskId = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 05, 06), Duration = "150", Progress = 70, ParentId = 5 }, - new TaskData() { TaskId = 7, TaskName = "List materials", StartDate = new DateTime(2022, 05, 06), Duration = "150", Progress = 50, ParentId = 5 }, + new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 08, 21), }, + new TaskData() { TaskID = 2, TaskName = "Identify site location", StartDate = new DateTime(2022, 04, 05), Duration = "150", Progress = 70, ParentID = 1 }, + new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "150", Progress = 50, ParentID = 1 }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "150", Progress = 50, ParentID = 1 }, + new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 05, 06), EndDate = new DateTime(2022, 09, 21), }, + new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 05, 06), Duration = "150", Progress = 70, ParentID = 5 }, + new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 05, 06), Duration = "150", Progress = 50, ParentID = 5 }, }; return Tasks; } } -``` -![Combining Timeline Cells in Blazor Gantt Chart](images/blazor-gantt-chart-combine-cells.png) +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/rXVeMjsmrILGXGvG?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +## Format value of timeline cell -## Customize header timeline cells +In the Blazor Gantt Chart component, the values displayed in the top and bottom timeline cells can be formatted using either standard date format strings or custom formatter methods. -In the Gantt Chart component, you can format the value of top and bottom timeline cells using the standard date format string or the custom formatter method. This can be done using the `GanttTopTierSettings.Format`, `GanttTopTierSettings.FormatterTemplate`, `GanttBottomTierSettings.Format`, and `GanttBottomTierSettings.FormatterTemplate` properties. The following example shows how to use the formatter method for timeline cells. +- [TopTier.Format](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttTimelineTierSettings.html#Syncfusion_Blazor_Gantt_GanttTimelineTierSettings_Format) and [BottomTier.Format](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttTimelineTierSettings.html#Syncfusion_Blazor_Gantt_GanttTimelineTierSettings_Format): Define the date format for timeline cells using predefined format strings. +- [TopTier.formatter](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttTimelineTierSettings.html#Syncfusion_Blazor_Gantt_GanttTimelineTierSettings_Formatter) and [BottomTier.formatter](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttTimelineTierSettings.html#Syncfusion_Blazor_Gantt_GanttTimelineTierSettings_Formatter): Apply custom logic to format timeline cell values programmatically. + +These options provide flexibility in presenting timeline data according to project requirements or localization needs. + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} -```cshtml @using Syncfusion.Blazor.Gantt - + @@ -148,13 +176,13 @@ In the Gantt Chart component, you can format the value of top and bottom timelin 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 string Formatter(DateTime? date) { DateTime dateTime=(DateTime)(date); @@ -171,29 +199,42 @@ In the Gantt Chart component, you can format the value of top and bottom timelin } public static List GetTaskCollection() { List Tasks = new List () { - new TaskData() { TaskId = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 06, 21) }, - new TaskData() { TaskId = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "20", Progress = 30, ParentId = 1 }, - new TaskData() { TaskId = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "24", Progress = 40, ParentId = 1 }, - new TaskData() { TaskId = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 05, 05), Duration = "25", Progress = 30, ParentId = 1 }, - new TaskData() { TaskId = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 06, 06), EndDate = new DateTime(2022, 09, 21) }, - new TaskData() { TaskId = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 06, 06), Duration = "33", Progress = 30, ParentId = 5 }, - new TaskData() { TaskId = 7, TaskName = "List materials", StartDate = new DateTime(2022, 07, 06), Duration = "23", Progress = 40, ParentId = 5 }, - new TaskData() { TaskId = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 08, 06), Duration = "20", Progress = 30, ParentId = 5 } + new TaskData() { TaskID = 1, TaskName = "Project initiation", StartDate = new DateTime(2022, 04, 05), EndDate = new DateTime(2022, 06, 08) }, + new TaskData() { TaskID = 2, TaskName = "Identify Site location", StartDate = new DateTime(2022, 04, 05), Duration = "20", Progress = 30, ParentID = 1 }, + new TaskData() { TaskID = 3, TaskName = "Perform soil test", StartDate = new DateTime(2022, 04, 05), Duration = "24", Progress = 40, ParentID = 1 }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 05, 05), Duration = "25", Progress = 30, ParentID = 1 }, + new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 06, 06), EndDate = new DateTime(2022, 09, 02) }, + new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 06, 06), Duration = "33", Progress = 30, ParentID = 5 }, + new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 07, 06), Duration = "23", Progress = 40, ParentID = 5 }, + new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 08, 06), Duration = "20", Progress = 30, ParentID = 5 } }; return Tasks; } } -``` + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/hZrSsNimUskhhuZd?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} ## Timeline cell width -In the Gantt Chart component, you can define the width value of timeline cell using the `GanttTimelineSettings.TimelineUnitSize` property. This value will be set to the bottom timeline cell, and the width value of top timeline cell will be calculated automatically based on bottom tier cell width using the `GanttTopTierSettings.Unit` and `GanttTimelineSettings.TimelineUnitSize` properties. Refer the following example. +In the Blazor Gantt Chart component, the width of timeline cells can be configured using the [TimelineSettings.TimelineUnitSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttTimelineSettings.html#Syncfusion_Blazor_Gantt_GanttTimelineSettings_TimelineUnitSize) property within [TimelineSettings](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttTimelineSettings.html). This value directly sets the width of the bottom tier cells. + +The width of the top tier cells is automatically calculated based on the bottom tier's unit and the specified `TimelineUnitSize`. This ensures consistent scaling across both tiers while maintaining clarity in the timeline view. + +- [TimelineSettings.TimelineUnitSize](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttTimelineSettings.html#Syncfusion_Blazor_Gantt_GanttTimelineSettings_TimelineUnitSize): Defines the pixel width of each bottom-tier timeline cell. +- [TopTier.Unit](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.GanttTimelineTierSettings.html#Syncfusion_Blazor_Gantt_GanttTimelineTierSettings_Unit): Determines how the top-tier cell width is derived relative to the bottom tier. + +This configuration allows precise control over the visual density of the timeline, supporting both detailed and high-level project views. + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} -```cshtml @using Syncfusion.Blazor.Gantt - + @@ -207,31 +248,33 @@ In the Gantt Chart component, you can define the width value of timeline cell us 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 static List 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; } } -``` -![Customizing Timeline Width in Blazor Gantt Chart](images/blazor-gantt-chart-time-line-width.png) +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/VZBSMZCQKVggEfTc?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} \ No newline at end of file diff --git a/blazor/gantt-chart/zooming.md b/blazor/gantt-chart/zooming.md index 7905c648bf..2f8129e19b 100644 --- a/blazor/gantt-chart/zooming.md +++ b/blazor/gantt-chart/zooming.md @@ -1,32 +1,36 @@ --- layout: post title: Zooming in Blazor Gantt Chart Component | Syncfusion -description: Checkout and learn here all about Zooming timespan levels in Syncfusion Blazor Gantt Chart component and much more. +description: Explore zooming options in the Syncfusion Blazor Gantt Chart component, including Zoom In, Zoom Out, Zoom To Fit, and custom zooming levels. platform: Blazor -control: Gantt Chart +control: Zooming documentation: ug --- -# Zooming in Blazor Gantt Chart Component +# Zooming functionality in Blazor Gantt Chart component -Gantt Chart has 25 predefined zooming timespan levels from year timespan to hour timespan. This support enables you to view the tasks in a project clearly from minute to decade timespan. To enable the zooming features, define the `ZoomIn`, `ZoomOut`, and `ZoomToFit` items to toolbar items collections. The following zooming options are available to view the project: +The Blazor Gantt Chart component provides zooming support to adjust the timeline view dynamically. This includes increasing or decreasing the width of timeline cells and changing the timeline units to view tasks across various timespan from minutes to decades. -## Zoom in +To enable zooming features, add `ZoomIn`, `ZoomOut`, and `ZoomToFit` to the toolbar items collection. These actions can also be triggered externally using the built-in methods like [ZoomIn](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_ZoomInAsync), [ZoomOut](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_ZoomOutAsync), and [ZoomToFitAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_ZoomToFitAsync). + +**Zoom in** This support is used to increase the timeline width and timeline unit from years to minutes timespan. When the `ZoomIn` icon was clicked, the timeline cell width is increased when the cell size exceeds the specified range and the timeline unit is changed based on the current zoom levels. -## Zoom out +**Zoom out** This support is used to increase the timeline width and timeline unit from minutes to years timespan. When the `ZoomOut` icon was clicked, the timeline cell width is decreased when the cell size falls behind the specified range and the timeline view mode is changed based on the current zooming levels. -## Zoom to fit +**Zoom to fit** + +This support is used to view all the tasks available in a project within available area on the chart part of Gantt. When users click the `ZoomToFit` icon, then all the tasks are rendered within the available chart container width. -This support is used to view all the tasks available in a project to specific timespan which is compatible with available area on the chart part of Gantt Chart. When users click the `ZoomToFit` icon, then all the tasks are rendered within the available chart container width. +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} -```cshtml @using Syncfusion.Blazor.Gantt - + @@ -40,48 +44,48 @@ This support is used to view all the tasks available in a project to specific ti 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 Predecessor { get; set; } - public int? ParentId { get; set; } + public int? ParentID { get; set; } } public static List 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, Predecessor = "2", ParentId = 1 }, - new TaskData() { TaskId = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, Predecessor = "3", 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, Predecessor = "4", ParentId = 5 }, - new TaskData() { TaskId = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, Predecessor = "6", ParentId = 5 }, - new TaskData() { TaskId = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, Predecessor = "7", ParentId = 5 }, + 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, Predecessor = "2", ParentID = 1 }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, Predecessor = "3", 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, Predecessor = "4", ParentID = 5 }, + new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, Predecessor = "6", ParentID = 5 }, + new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, Predecessor = "7", ParentID = 5 }, }; return Tasks; } } -``` -![Zooming in Blazor Gantt Chart](images/blazor-gantt-chart-zooming.png) +{% endhighlight %} +{% endtabs %} -## Zoom action by methods - -Zooming action also can be performed on external actions such as button click using the `ZoomIn()`, `ZoomOut()`, and `ZoomToFitAsync()` built-in methods. +{% previewsample "https://blazorplayground.syncfusion.com/embed/BXrIMZicUTszPxmp?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} ## Customizing zooming levels -In the Gantt chart, the zoom-in and zoom-out actions are performed based on the predefined zooming Levels. You can customize the zooming actions by defining the required zooming levels to the [CustomZoomingLevels](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_CustomZoomingLevels) property. +Zoom actions are governed by predefined zooming levels specified in the [CustomZoomingLevels](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_CustomZoomingLevels) property. These levels can be customized by assigning a collection of zoom configurations to the `CustomZoomingLevels` property. + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} -```cshtml @using Syncfusion.Blazor.Gantt - + @@ -105,47 +109,127 @@ In the Gantt chart, the zoom-in and zoom-out actions are performed based on 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 string Predecessor { get; set; } + public int? ParentID { get; set; } + } + + public static List GetTaskCollection() + { + List Tasks = new List() + { + 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, Predecessor = "2", ParentID = 1 }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, Predecessor = "3", ParentID = 1 }, + new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 11), EndDate = new DateTime(2022, 04, 18), }, + new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 30, Predecessor = "4", ParentID = 5 }, + new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, Predecessor = "6", ParentID = 5 }, + new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, Predecessor = "7", ParentID = 5 }, + }; + return Tasks; + } +} + +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/VtBysjWwqJeIdgws?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} + +## Zoom actions via methods + +Zooming actions can be triggered dynamically or through external controls using the following methods: + +* **Zoom In** - Use `ZoomIn` when `ZoomIn` external button was clicked, the timeline cell width is increased when the cell size exceeds the specified range and the timeline unit is changed based on the current zoom levels. +* **Zoom Out** - Use `ZoomOut` when the `ZoomOut` external button was clicked, the timeline cell width is decreased when the cell size falls behind the specified range and the timeline view mode is changed based on the current zooming levels. +* **Zoom To Fit** - Use `ZoomToFitAsync` When `Fit To Project` external button was clicked then all the tasks are rendered within the available chart container width. + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} + +@using Syncfusion.Blazor.Gantt + + + + + + + + + + + +@code { + private SfGantt Gantt; + private List TaskCollection { get; set; } + protected override void OnInitialized() + { + this.TaskCollection = GetTaskCollection(); + } + private async void ZoomIn() + { + await Gantt.ZoomInAsync(); + } + private async void ZoomOut() + { + await Gantt.ZoomOutAsync(); + } + private async void ZoomToFit() + { + await Gantt.ZoomToFitAsync(); + } + public class TaskData + { + 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 Predecessor { get; set; } - public int? ParentId { get; set; } + public int? ParentID { get; set; } } public static List 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, Predecessor = "2", ParentId = 1 }, - new TaskData() { TaskId = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, Predecessor = "3", 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, Predecessor = "4", ParentId = 5 }, - new TaskData() { TaskId = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, Predecessor = "6", ParentId = 5 }, - new TaskData() { TaskId = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, Predecessor = "7", ParentId = 5 }, + 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, Predecessor = "2", ParentID = 1 }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, Predecessor = "3", 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, Predecessor = "4", ParentID = 5 }, + new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, Predecessor = "6", ParentID = 5 }, + new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, Predecessor = "7", ParentID = 5 }, }; return Tasks; } } -``` -![Customizing zooming levels in Blazor Gantt Chart](images/blazor-gantt-chart-custom-zooming-levels.gif) +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/hjryCNMwUIBQDMde?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} ## Resetting zooming levels using method -In Gantt chart, you can reset the zoom level to its initial state, as configured during the initial rendering, after performing zooming actions like ZoomIn, ZoomOut, and ZoomToFit, using [ResetZoomAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_ResetZoomAsync) method. +In Gantt chart, you can reset the zoom level to its initial state, as configured during the initial rendering, after performing zooming actions like **ZoomIn**, **ZoomOut**, and **ZoomToFit**, using [ResetZoomAsync](https://help.syncfusion.com/cr/blazor/Syncfusion.Blazor.Gantt.SfGantt-1.html#Syncfusion_Blazor_Gantt_SfGantt_1_ResetZoomAsync) method. + +{% tabs %} +{% highlight razor tabtitle="Index.razor" %} -```cshtml @using Syncfusion.Blazor.Gantt - + @@ -163,32 +247,34 @@ In Gantt chart, you can reset the zoom level to its initial state, as configured } 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 Predecessor { get; set; } - public int? ParentId { get; set; } + public int? ParentID { get; set; } } public static List 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, Predecessor = "2", ParentId = 1 }, - new TaskData() { TaskId = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, Predecessor = "3", 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, Predecessor = "4", ParentId = 5 }, - new TaskData() { TaskId = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, Predecessor = "6", ParentId = 5 }, - new TaskData() { TaskId = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, Predecessor = "7", 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, Predecessor = "2", ParentID = 1 }, + new TaskData() { TaskID = 4, TaskName = "Soil test approval", StartDate = new DateTime(2022, 04, 05), Duration = "0", Progress = 30, Predecessor = "3", ParentID = 1 }, + new TaskData() { TaskID = 5, TaskName = "Project estimation", StartDate = new DateTime(2022, 04, 11), EndDate = new DateTime(2022, 04, 18), }, + new TaskData() { TaskID = 6, TaskName = "Develop floor plan for estimation", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 30, Predecessor = "4", ParentID = 5 }, + new TaskData() { TaskID = 7, TaskName = "List materials", StartDate = new DateTime(2022, 04, 06), Duration = "3", Progress = 40, Predecessor = "6", ParentID = 5 }, + new TaskData() { TaskID = 8, TaskName = "Estimation approval", StartDate = new DateTime(2022, 04, 06), Duration = "0", Progress = 30, Predecessor = "7", ParentID = 5 }, }; return Tasks; } } -``` -![Resetting zooming levels in Blazor Gantt Chart](images/blazor-gantt-chart-zooming-reset.gif) +{% endhighlight %} +{% endtabs %} + +{% previewsample "https://blazorplayground.syncfusion.com/embed/hNreMNCGgopuohOR?appbar=false&editor=false&result=true&errorlist=false&theme=bootstrap5" %} \ No newline at end of file From 6d0ecf645c9e2c25bb8b19a80a6647bd6256f4c6 Mon Sep 17 00:00:00 2001 From: Nithya Date: Tue, 4 Nov 2025 18:55:20 +0530 Subject: [PATCH 2/2] 989389: Restored and updated content post revert in dev branch Signed-off-by: Nithya --- blazor/gantt-chart/customize-pdf-export.md | 2 +- blazor/gantt-chart/pdf-export.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/blazor/gantt-chart/customize-pdf-export.md b/blazor/gantt-chart/customize-pdf-export.md index 50f00114bf..66c1525687 100644 --- a/blazor/gantt-chart/customize-pdf-export.md +++ b/blazor/gantt-chart/customize-pdf-export.md @@ -1,6 +1,6 @@ --- layout: post -title: Customize PDF exporting in Blazor Gantt Chart component | Syncfusion +title: Customize PDF exporting in Syncfusion Blazor Gantt Chart description: Learn here all about Customize PDF exporting in Syncfusion Blazor Gantt Chart component and much more. platform: Blazor control: Customize pdf export diff --git a/blazor/gantt-chart/pdf-export.md b/blazor/gantt-chart/pdf-export.md index ff3fdf954a..38208f29ac 100644 --- a/blazor/gantt-chart/pdf-export.md +++ b/blazor/gantt-chart/pdf-export.md @@ -1,7 +1,7 @@ --- layout: post title: PDF Export in Blazor Gantt Chart Component | Syncfusion -description: Learn how to export Gantt to PDF in the Syncfusion Blazor Gantt Chart component, including indicators, blob objects, single-page, multiple Gantt, and theme options. +description: Export Gantt charts to PDF in Syncfusion Blazor Gantt with blob objects, single-page layouts, themes, and advanced customization options. platform: Blazor control: PDF export documentation: ug