From b0e78ac619dfebac2eb17edfc04551217ca4b93e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sedat=20=C3=96ZT=C3=9CRK?= <76204082+iamsedatozturk@users.noreply.github.com> Date: Wed, 29 Jul 2026 13:04:07 +0300 Subject: [PATCH] =?UTF-8?q?Scheduler=20d=C3=BCzenlemeleri?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GridOptionsDto/SchedulerOptionDto.cs | 4 +- .../Seeds/SqlData/Pro_D_Scheduler.sql | 18 ++ .../Seeds/WizardData/202607282205_Todo.json | 2 +- .../WizardData/202607291133_Scheduler.json | 275 ++++++++++++++++++ ui/src/index.css | 67 +++++ .../admin/listForm/edit/FormTabScheduler.tsx | 2 +- ui/src/views/admin/listForm/wizard/Wizard.tsx | 2 +- ui/src/views/list/SchedulerView.tsx | 163 +++++++++-- 8 files changed, 500 insertions(+), 33 deletions(-) create mode 100644 api/src/Sozsoft.Platform.DbMigrator/Seeds/SqlData/Pro_D_Scheduler.sql create mode 100644 api/src/Sozsoft.Platform.DbMigrator/Seeds/WizardData/202607291133_Scheduler.json diff --git a/api/src/Sozsoft.Platform.Application.Contracts/ListForms/GridOptionsDto/SchedulerOptionDto.cs b/api/src/Sozsoft.Platform.Application.Contracts/ListForms/GridOptionsDto/SchedulerOptionDto.cs index 45a04f32..b24cc9db 100644 --- a/api/src/Sozsoft.Platform.Application.Contracts/ListForms/GridOptionsDto/SchedulerOptionDto.cs +++ b/api/src/Sozsoft.Platform.Application.Contracts/ListForms/GridOptionsDto/SchedulerOptionDto.cs @@ -34,9 +34,9 @@ public class SchedulerOptionDto /// public int StartDayHour { get; set; } = 8; /// - /// Günün bitiş saati (örn: "18" = 18:00) + /// Günün bitiş saati (örn: "20" = 20:00) /// - public int EndDayHour { get; set; } = 18; + public int EndDayHour { get; set; } = 20; /// /// Varsayılan görünüm (örn: "week", "month", "day") /// diff --git a/api/src/Sozsoft.Platform.DbMigrator/Seeds/SqlData/Pro_D_Scheduler.sql b/api/src/Sozsoft.Platform.DbMigrator/Seeds/SqlData/Pro_D_Scheduler.sql new file mode 100644 index 00000000..d56b5932 --- /dev/null +++ b/api/src/Sozsoft.Platform.DbMigrator/Seeds/SqlData/Pro_D_Scheduler.sql @@ -0,0 +1,18 @@ +IF OBJECT_ID(N'[dbo].[Pro_D_Scheduler]', 'U') IS NULL +BEGIN + CREATE TABLE [dbo].[Pro_D_Scheduler] + ( + [Id] uniqueidentifier NOT NULL DEFAULT NEWID(), + [Text] nvarchar(300) NOT NULL, + [StartDate] datetime2 NOT NULL, + [EndDate] datetime2 NOT NULL, + [AllDay] bit NOT NULL DEFAULT 0, + [RecurrenceRule] nvarchar(500) NULL, + [RecurrenceException] nvarchar(MAX) NULL, + CONSTRAINT [PK_Pro_D_Scheduler] PRIMARY KEY NONCLUSTERED + ( + [Id] ASC + )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY] + ) ON [PRIMARY] +END +GO \ No newline at end of file diff --git a/api/src/Sozsoft.Platform.DbMigrator/Seeds/WizardData/202607282205_Todo.json b/api/src/Sozsoft.Platform.DbMigrator/Seeds/WizardData/202607282205_Todo.json index 14f89cbd..fa1103ab 100644 --- a/api/src/Sozsoft.Platform.DbMigrator/Seeds/WizardData/202607282205_Todo.json +++ b/api/src/Sozsoft.Platform.DbMigrator/Seeds/WizardData/202607282205_Todo.json @@ -83,7 +83,7 @@ "RecurrenceRuleExpr": null, "RecurrenceExceptionExpr": null, "StartDayHour": 8, - "EndDayHour": 18, + "EndDayHour": 20, "DefaultView": "week", "ShowAllDayPanel": true, "CellDuration": 30, diff --git a/api/src/Sozsoft.Platform.DbMigrator/Seeds/WizardData/202607291133_Scheduler.json b/api/src/Sozsoft.Platform.DbMigrator/Seeds/WizardData/202607291133_Scheduler.json new file mode 100644 index 00000000..c0929480 --- /dev/null +++ b/api/src/Sozsoft.Platform.DbMigrator/Seeds/WizardData/202607291133_Scheduler.json @@ -0,0 +1,275 @@ +{ + "Wizard": { + "WizardName": "Scheduler", + "ListFormCode": "App.Wizard.Scheduler", + "MenuCode": "App.Wizard.Scheduler", + "MenuOrder": 4, + "IsTenant": false, + "IsBranch": false, + "IsOrganizationUnit": false, + "AllowAdding": true, + "AllowUpdating": true, + "AllowDeleting": true, + "AllowDetail": false, + "ConfirmDelete": true, + "DefaultLayout": "scheduler", + "Grid": true, + "Card": true, + "Pivot": true, + "Tree": false, + "Chart": true, + "Gantt": false, + "Scheduler": true, + "Todo": false, + "LanguageTextMenuEn": "Scheduler", + "LanguageTextMenuTr": "Scheduler", + "LanguageTextTitleEn": "Scheduler", + "LanguageTextTitleTr": "Scheduler", + "LanguageTextDescEn": "Scheduler", + "LanguageTextDescTr": "Scheduler", + "LanguageTextMenuParentEn": "Project", + "LanguageTextMenuParentTr": "Project", + "PermissionGroupName": "App.Wizard.Project", + "MenuParentCode": "App.Wizard.Project", + "MenuParentShortName": "Pro", + "MenuParentIcon": "FcVideoProjector", + "MenuIcon": "FaGlassCheers", + "DataSourceCode": "Default", + "DataSourceConnectionString": "", + "SelectCommandType": 1, + "SelectCommand": "Pro_D_Scheduler", + "KeyFieldName": "Id", + "KeyFieldDbSourceType": 9, + "TreeOptionDto": { + "KeyExpr": "", + "ParentIdExpr": "", + "HasItemsExpr": "", + "RootValue": "", + "ExpandedRowKeys": [], + "AutoExpandAll": false, + "RecursiveSelection": false, + "TitleExpr": null, + "StartExpr": null, + "EndExpr": null, + "ProgressExpr": null + }, + "GanttOptionDto": { + "KeyExpr": "", + "ParentIdExpr": "", + "HasItemsExpr": "", + "RootValue": "", + "ExpandedRowKeys": [], + "AutoExpandAll": false, + "RecursiveSelection": false, + "TitleExpr": "", + "ScaleType": "weeks", + "StartExpr": "", + "EndExpr": "", + "ProgressExpr": "", + "AllowEditing": false, + "AllowTaskAdding": false, + "AllowTaskUpdating": false, + "AllowTaskDeleting": false, + "AllowDependencyAdding": false, + "AllowDependencyDeleting": false, + "AllowResourceAdding": false, + "AllowResourceDeleting": false + }, + "SchedulerOptionDto": { + "TextExpr": "Text", + "StartDateExpr": "StartDate", + "EndDateExpr": "EndDate", + "AllDayExpr": "AllDay", + "RecurrenceRuleExpr": "RecurrenceRule", + "RecurrenceExceptionExpr": "RecurrenceException", + "StartDayHour": 8, + "EndDayHour": 20, + "DefaultView": "week", + "ShowAllDayPanel": true, + "CellDuration": 30, + "FirstDayOfWeek": 1, + "CrossScrollingEnabled": true, + "AllowResizing": true, + "AllowDragging": true, + "AllowDeleting": true, + "AllowEditing": true, + "AllowAdding": true + }, + "TodoOptionDto": { + "TitleExpr": "", + "StatusExpr": "", + "DescriptionExpr": "", + "DueDateExpr": "", + "TagExpr": "", + "AssigneeExpr": "", + "PriorityExpr": "", + "CompletedExpr": "", + "OrderExpr": "", + "StatusOrder": "Backlog, Ready to Start, In Progress, Code Review, Testing, Staging", + "AllowDragging": true + }, + "WorkflowDto": { + "ApprovalUserFieldName": "", + "ApprovalDateFieldName": "", + "ApprovalStatusFieldName": "", + "ApprovalDescriptionFieldName": "", + "ApprovalIsFilterUserName": false, + "Criteria": [] + }, + "Groups": [ + { + "Caption": "", + "ColCount": 1, + "Items": [ + { + "FieldName": "Id", + "CaptionName": "App.Listform.ListformField.Id", + "EditorType": "dxTextBox", + "EditorOptions": "", + "EditorScript": "", + "ColSpan": 1, + "IsRequired": true, + "IncludeInEditingForm": true, + "DbSourceType": 9, + "TurkishCaption": "Id", + "EnglishCaption": "Id", + "LookupDataSourceType": 1, + "ValueExpr": "Key", + "DisplayExpr": "Name", + "LookupQuery": "" + }, + { + "FieldName": "Text", + "CaptionName": "App.Listform.ListformField.Text", + "EditorType": "dxTextBox", + "EditorOptions": "", + "EditorScript": "", + "ColSpan": 1, + "IsRequired": true, + "IncludeInEditingForm": true, + "DbSourceType": 16, + "TurkishCaption": "Text", + "EnglishCaption": "Text", + "LookupDataSourceType": 1, + "ValueExpr": "Key", + "DisplayExpr": "Name", + "LookupQuery": "" + }, + { + "FieldName": "StartDate", + "CaptionName": "App.Listform.ListformField.StartDate", + "EditorType": "dxDateBox", + "EditorOptions": "", + "EditorScript": "", + "ColSpan": 1, + "IsRequired": true, + "IncludeInEditingForm": true, + "DbSourceType": 6, + "TurkishCaption": "Start Date", + "EnglishCaption": "Start Date", + "LookupDataSourceType": 1, + "ValueExpr": "Key", + "DisplayExpr": "Name", + "LookupQuery": "" + }, + { + "FieldName": "EndDate", + "CaptionName": "App.Listform.ListformField.EndDate", + "EditorType": "dxDateBox", + "EditorOptions": "", + "EditorScript": "", + "ColSpan": 1, + "IsRequired": true, + "IncludeInEditingForm": true, + "DbSourceType": 6, + "TurkishCaption": "End Date", + "EnglishCaption": "End Date", + "LookupDataSourceType": 1, + "ValueExpr": "Key", + "DisplayExpr": "Name", + "LookupQuery": "" + }, + { + "FieldName": "AllDay", + "CaptionName": "App.Listform.ListformField.AllDay", + "EditorType": "dxCheckBox", + "EditorOptions": "", + "EditorScript": "", + "ColSpan": 1, + "IsRequired": true, + "IncludeInEditingForm": true, + "DbSourceType": 3, + "TurkishCaption": "All Day", + "EnglishCaption": "All Day", + "LookupDataSourceType": 1, + "ValueExpr": "Key", + "DisplayExpr": "Name", + "LookupQuery": "" + }, + { + "FieldName": "RecurrenceRule", + "CaptionName": "App.Listform.ListformField.RecurrenceRule", + "EditorType": "dxTextBox", + "EditorOptions": "", + "EditorScript": "", + "ColSpan": 1, + "IsRequired": false, + "IncludeInEditingForm": true, + "DbSourceType": 16, + "TurkishCaption": "Recurrence Rule", + "EnglishCaption": "Recurrence Rule", + "LookupDataSourceType": 1, + "ValueExpr": "Key", + "DisplayExpr": "Name", + "LookupQuery": "" + }, + { + "FieldName": "RecurrenceException", + "CaptionName": "App.Listform.ListformField.RecurrenceException", + "EditorType": "dxTextBox", + "EditorOptions": "", + "EditorScript": "", + "ColSpan": 1, + "IsRequired": false, + "IncludeInEditingForm": true, + "DbSourceType": 16, + "TurkishCaption": "Recurrence Exception", + "EnglishCaption": "Recurrence Exception", + "LookupDataSourceType": 1, + "ValueExpr": "Key", + "DisplayExpr": "Name", + "LookupQuery": "" + } + ] + } + ], + "SubForms": [], + "Widgets": [] + }, + "IsDeletedField": false, + "IsCreatedField": false, + "InsertedRecords": { + "LanguageKeys": [ + "App.Wizard.Scheduler", + "App.Wizard.Scheduler.Title", + "App.Wizard.Scheduler.Desc", + "App.Listform.ListformField.AllDay", + "App.Listform.ListformField.RecurrenceRule", + "App.Listform.ListformField.RecurrenceException" + ], + "PermissionGroupNames": [], + "PermissionNames": [ + "App.Wizard.Scheduler", + "App.Wizard.Scheduler.Create", + "App.Wizard.Scheduler.Update", + "App.Wizard.Scheduler.Delete", + "App.Wizard.Scheduler.Export", + "App.Wizard.Scheduler.Import", + "App.Wizard.Scheduler.Note" + ], + "MenuCodes": [ + "App.Wizard.Scheduler" + ], + "DataSourceCodes": [] + } +} \ No newline at end of file diff --git a/ui/src/index.css b/ui/src/index.css index debe8c5f..1791fce4 100644 --- a/ui/src/index.css +++ b/ui/src/index.css @@ -290,10 +290,77 @@ div.dialog-after-open > div.dialog-content.maximized { .dx-datagrid-header-panel > .dx-toolbar .dx-toolbar-after .dx-button-text, .dx-treelist-header-panel > .dx-toolbar .dx-toolbar-after .dx-button-text, +.dx-scheduler-header-panel .dx-toolbar .dx-button-text, +.scheduler-toolbar-action .dx-button-text, .dx-gantt-toolbar-wrapper .dx-button-text { text-transform: none !important; } +.scheduler-toolbar-action .dx-button-text, +.scheduler-toolbar-action .dx-icon { + color: #000 !important; +} + +.dx-scheduler-navigator .dx-button-text, +.dx-scheduler-navigator .dx-icon, +.dx-scheduler-today .dx-button-text, +.dx-scheduler-today .dx-icon, +.dx-scheduler-view-switcher .dx-button-text, +.dx-scheduler-view-switcher .dx-icon { + color: #000 !important; +} + +.dark .scheduler-toolbar-action .dx-button-text, +.dark .scheduler-toolbar-action .dx-icon, +.dark .dx-scheduler-navigator .dx-button-text, +.dark .dx-scheduler-navigator .dx-icon, +.dark .dx-scheduler-today .dx-button-text, +.dark .dx-scheduler-today .dx-icon, +.dark .dx-scheduler-view-switcher .dx-button-text, +.dark .dx-scheduler-view-switcher .dx-icon { + color: #fff !important; +} + +.scheduler-appointment-preview, +.scheduler-appointment-preview * { + text-align: left !important; +} + +.scheduler-appointment-preview { + width: min(22rem, calc(100vw - 2rem)); +} + +.scheduler-appointment-text { + display: -webkit-box !important; + overflow: hidden !important; + line-height: 1.25; + white-space: normal !important; + text-overflow: clip !important; + overflow-wrap: anywhere; + -webkit-box-orient: vertical; + -webkit-line-clamp: 5; +} + +.scheduler-appointment-text p { + display: inline; + margin: 0; +} + +.scheduler-appointment-preview-text { + display: -webkit-box; + overflow: hidden; + line-height: 1.35; + white-space: normal !important; + overflow-wrap: anywhere; + -webkit-box-orient: vertical; + -webkit-line-clamp: 5; +} + +.scheduler-appointment-preview-text p { + display: inline; + margin: 0; +} + .dx-datagrid-header-panel > .dx-toolbar .dx-toolbar-menu-container, .dx-treelist-header-panel > .dx-toolbar .dx-toolbar-menu-container { margin-left: 2px !important; diff --git a/ui/src/views/admin/listForm/edit/FormTabScheduler.tsx b/ui/src/views/admin/listForm/edit/FormTabScheduler.tsx index d97e6d60..be611e9e 100644 --- a/ui/src/views/admin/listForm/edit/FormTabScheduler.tsx +++ b/ui/src/views/admin/listForm/edit/FormTabScheduler.tsx @@ -248,7 +248,7 @@ function FormTabScheduler(props: FormEditProps) { type="number" autoComplete="off" name="schedulerOptionDto.endDayHour" - placeholder="18" + placeholder="20" component={Input} min={0} max={24} diff --git a/ui/src/views/admin/listForm/wizard/Wizard.tsx b/ui/src/views/admin/listForm/wizard/Wizard.tsx index 9a1e4348..4371a286 100644 --- a/ui/src/views/admin/listForm/wizard/Wizard.tsx +++ b/ui/src/views/admin/listForm/wizard/Wizard.tsx @@ -109,7 +109,7 @@ const initialValues: ListFormWizardDto = { recurrenceRuleExpr: '', recurrenceExceptionExpr: '', startDayHour: 8, - endDayHour: 18, + endDayHour: 20, defaultView: 'week', showAllDayPanel: true, cellDuration: 30, diff --git a/ui/src/views/list/SchedulerView.tsx b/ui/src/views/list/SchedulerView.tsx index cc018a83..6bd08e23 100644 --- a/ui/src/views/list/SchedulerView.tsx +++ b/ui/src/views/list/SchedulerView.tsx @@ -21,12 +21,7 @@ import { useCallback, useEffect, useRef, useState } from 'react' import { Helmet } from 'react-helmet' import { getList } from '@/services/form.service' import { useListFormCustomDataSource } from './useListFormCustomDataSource' -import { - addCss, - addJs, - autoNumber, - getEditingFormGroups, -} from './Utils' +import { addCss, addJs, autoNumber, getEditingFormGroups } from './Utils' import { layoutTypes } from '../admin/listForm/edit/types' import WidgetGroup from '@/components/ui/Widget/WidgetGroup' import { ROUTES_ENUM } from '@/routes/route.constant' @@ -36,6 +31,7 @@ import { Loading } from '@/components/shared' import { usePermission } from '@/utils/hooks/usePermission' import { RowMode, SimpleItemWithColData } from '../form/types' import { captionize } from 'devextreme/core/utils/inflector' +import { formatDate } from 'devextreme/localization' import type { AppointmentFormOpeningEvent } from 'devextreme/ui/scheduler' interface SchedulerViewProps { @@ -174,6 +170,84 @@ const SchedulerView = (props: SchedulerViewProps) => { setCurrentView(value) }, []) + const getAppointmentHtml = useCallback( + (appointmentData: Record) => { + const textExpr = gridDto?.gridOptions.schedulerOptionDto?.textExpr || 'text' + return String(appointmentData?.[textExpr] ?? '') + }, + [gridDto], + ) + + const getAppointmentTimeText = useCallback( + (appointmentData: Record) => { + const schedulerOptions = gridDto?.gridOptions.schedulerOptionDto + const startDate = appointmentData?.[schedulerOptions?.startDateExpr || 'startDate'] + const endDate = appointmentData?.[schedulerOptions?.endDateExpr || 'endDate'] + + if (!startDate || !endDate) { + return '' + } + + return `${formatDate(new Date(startDate), 'shortTime')} - ${formatDate( + new Date(endDate), + 'shortTime', + )}` + }, + [gridDto], + ) + + const renderAppointment = useCallback( + (data: any) => { + const appointmentData = data.targetedAppointmentData || data.appointmentData || {} + + return ( + <> +
+
+ {getAppointmentTimeText(appointmentData)} +
+ + ) + }, + [getAppointmentHtml, getAppointmentTimeText], + ) + + const renderAppointmentTooltip = useCallback( + (data: any) => { + const appointmentData = data.targetedAppointmentData || data.appointmentData || {} + + return ( +
+
+
+
{getAppointmentTimeText(appointmentData)}
+
+ {gridDto?.gridOptions.schedulerOptionDto?.allowDeleting && ( + + )} +
+ ) + }, + [getAppointmentHtml, getAppointmentTimeText, gridDto], + ) + const onAppointmentFormOpening = useCallback( (e: AppointmentFormOpeningEvent) => { if (!gridDto) return @@ -194,7 +268,11 @@ const SchedulerView = (props: SchedulerViewProps) => { ) e.popup.option('showTitle', gridDto.gridOptions.editingOptionDto?.popup?.showTitle) e.popup.option('width', gridDto.gridOptions.editingOptionDto?.popup?.width) - e.popup.option('height', gridDto.gridOptions.editingOptionDto?.popup?.height) + e.popup.option('height', isPopupFullScreen ? '100%' : 'auto') + e.popup.option( + 'maxHeight', + isPopupFullScreen ? '100%' : gridDto.gridOptions.editingOptionDto?.popup?.height || '90vh', + ) e.popup.option('resizeEnabled', gridDto.gridOptions.editingOptionDto?.popup?.resizeEnabled) e.popup.option('fullScreen', isPopupFullScreen) @@ -282,11 +360,13 @@ const SchedulerView = (props: SchedulerViewProps) => { if (newFullScreenState) { e.popup.option('width', '100%') e.popup.option('height', '100%') + e.popup.option('maxHeight', '100%') } else { e.popup.option('width', gridDto.gridOptions.editingOptionDto?.popup?.width || 600) + e.popup.option('height', 'auto') e.popup.option( - 'height', - gridDto.gridOptions.editingOptionDto?.popup?.height || 'auto', + 'maxHeight', + gridDto.gridOptions.editingOptionDto?.popup?.height || '90vh', ) } }, @@ -429,7 +509,9 @@ const SchedulerView = (props: SchedulerViewProps) => { editorScript: i.editorScript, } - if (i.fieldName?.indexOf(':') >= 0) { + if (i.captionName) { + item.label = { text: translate('::' + i.captionName) } + } else if (i.fieldName?.indexOf(':') >= 0) { item.label = { text: captionize(i.fieldName.split(':')[1]) } } @@ -446,15 +528,25 @@ const SchedulerView = (props: SchedulerViewProps) => { return item } + const isVisibleFormItem = (item: SimpleItemWithColData) => { + if (currentMode === 'new') { + return item.canCreate && item.allowAdding + } + + if (currentMode === 'edit') { + return item.canUpdate && item.allowEditing + } + + return false + } + sortedFormDto.forEach((e: any) => { // Items'ları da order'a göre sırala const sortedItems = (e.items || []) .slice() - .sort((a: any, b: any) => - (a.editOrderNo ?? 0) >= (b.editOrderNo ?? 0) ? 1 : -1, - ) + .sort((a: any, b: any) => ((a.editOrderNo ?? 0) >= (b.editOrderNo ?? 0) ? 1 : -1)) - const groupItems = sortedItems.map(mapFormItem) + const groupItems = sortedItems.map(mapFormItem).filter(isVisibleFormItem) if (e.itemType !== 'tabbed') { // Grup kullanmadan direkt items'ları ekle - form'un colCount'u geçerli olsun @@ -478,14 +570,7 @@ const SchedulerView = (props: SchedulerViewProps) => { (a.editOrderNo ?? 0) >= (b.editOrderNo ?? 0) ? 1 : -1, ) .map(mapFormItem) - .filter((a: any) => { - if (currentMode === 'new') { - return a.canCreate || a.canRead - } else if (currentMode === 'edit') { - return a.canUpdate || a.canRead - } - return false - }), + .filter(isVisibleFormItem), } }), }) @@ -575,10 +660,12 @@ const SchedulerView = (props: SchedulerViewProps) => { gridDto.gridOptions.schedulerOptionDto?.recurrenceExceptionExpr } startDayHour={gridDto.gridOptions.schedulerOptionDto?.startDayHour || 8} - endDayHour={gridDto.gridOptions.schedulerOptionDto?.endDayHour || 18} + endDayHour={gridDto.gridOptions.schedulerOptionDto?.endDayHour || 20} currentView={currentView} onCurrentViewChange={onCurrentViewChange} onAppointmentFormOpening={onAppointmentFormOpening} + appointmentRender={renderAppointment} + appointmentTooltipRender={renderAppointmentTooltip} onAppointmentAdding={() => { props.refreshData?.() }} @@ -610,28 +697,36 @@ const SchedulerView = (props: SchedulerViewProps) => { | 5 | 6) || 1 } - adaptivityEnabled={true} + adaptivityEnabled={false} > {checkPermission('App.Listforms.Listform.Update') && ( @@ -646,9 +741,21 @@ const SchedulerView = (props: SchedulerViewProps) => { allowDragging={gridDto.gridOptions.schedulerOptionDto?.allowDragging ?? false} /> - - - + + +