Scheduler düzenlemeleri
This commit is contained in:
parent
2044abdca2
commit
b0e78ac619
8 changed files with 500 additions and 33 deletions
|
|
@ -34,9 +34,9 @@ public class SchedulerOptionDto
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public int StartDayHour { get; set; } = 8;
|
public int StartDayHour { get; set; } = 8;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Günün bitiş saati (örn: "18" = 18:00)
|
/// Günün bitiş saati (örn: "20" = 20:00)
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public int EndDayHour { get; set; } = 18;
|
public int EndDayHour { get; set; } = 20;
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Varsayılan görünüm (örn: "week", "month", "day")
|
/// Varsayılan görünüm (örn: "week", "month", "day")
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
@ -83,7 +83,7 @@
|
||||||
"RecurrenceRuleExpr": null,
|
"RecurrenceRuleExpr": null,
|
||||||
"RecurrenceExceptionExpr": null,
|
"RecurrenceExceptionExpr": null,
|
||||||
"StartDayHour": 8,
|
"StartDayHour": 8,
|
||||||
"EndDayHour": 18,
|
"EndDayHour": 20,
|
||||||
"DefaultView": "week",
|
"DefaultView": "week",
|
||||||
"ShowAllDayPanel": true,
|
"ShowAllDayPanel": true,
|
||||||
"CellDuration": 30,
|
"CellDuration": 30,
|
||||||
|
|
|
||||||
|
|
@ -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": []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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-datagrid-header-panel > .dx-toolbar .dx-toolbar-after .dx-button-text,
|
||||||
.dx-treelist-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 {
|
.dx-gantt-toolbar-wrapper .dx-button-text {
|
||||||
text-transform: none !important;
|
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-datagrid-header-panel > .dx-toolbar .dx-toolbar-menu-container,
|
||||||
.dx-treelist-header-panel > .dx-toolbar .dx-toolbar-menu-container {
|
.dx-treelist-header-panel > .dx-toolbar .dx-toolbar-menu-container {
|
||||||
margin-left: 2px !important;
|
margin-left: 2px !important;
|
||||||
|
|
|
||||||
|
|
@ -248,7 +248,7 @@ function FormTabScheduler(props: FormEditProps) {
|
||||||
type="number"
|
type="number"
|
||||||
autoComplete="off"
|
autoComplete="off"
|
||||||
name="schedulerOptionDto.endDayHour"
|
name="schedulerOptionDto.endDayHour"
|
||||||
placeholder="18"
|
placeholder="20"
|
||||||
component={Input}
|
component={Input}
|
||||||
min={0}
|
min={0}
|
||||||
max={24}
|
max={24}
|
||||||
|
|
|
||||||
|
|
@ -109,7 +109,7 @@ const initialValues: ListFormWizardDto = {
|
||||||
recurrenceRuleExpr: '',
|
recurrenceRuleExpr: '',
|
||||||
recurrenceExceptionExpr: '',
|
recurrenceExceptionExpr: '',
|
||||||
startDayHour: 8,
|
startDayHour: 8,
|
||||||
endDayHour: 18,
|
endDayHour: 20,
|
||||||
defaultView: 'week',
|
defaultView: 'week',
|
||||||
showAllDayPanel: true,
|
showAllDayPanel: true,
|
||||||
cellDuration: 30,
|
cellDuration: 30,
|
||||||
|
|
|
||||||
|
|
@ -21,12 +21,7 @@ import { useCallback, useEffect, useRef, useState } from 'react'
|
||||||
import { Helmet } from 'react-helmet'
|
import { Helmet } from 'react-helmet'
|
||||||
import { getList } from '@/services/form.service'
|
import { getList } from '@/services/form.service'
|
||||||
import { useListFormCustomDataSource } from './useListFormCustomDataSource'
|
import { useListFormCustomDataSource } from './useListFormCustomDataSource'
|
||||||
import {
|
import { addCss, addJs, autoNumber, getEditingFormGroups } from './Utils'
|
||||||
addCss,
|
|
||||||
addJs,
|
|
||||||
autoNumber,
|
|
||||||
getEditingFormGroups,
|
|
||||||
} from './Utils'
|
|
||||||
import { layoutTypes } from '../admin/listForm/edit/types'
|
import { layoutTypes } from '../admin/listForm/edit/types'
|
||||||
import WidgetGroup from '@/components/ui/Widget/WidgetGroup'
|
import WidgetGroup from '@/components/ui/Widget/WidgetGroup'
|
||||||
import { ROUTES_ENUM } from '@/routes/route.constant'
|
import { ROUTES_ENUM } from '@/routes/route.constant'
|
||||||
|
|
@ -36,6 +31,7 @@ import { Loading } from '@/components/shared'
|
||||||
import { usePermission } from '@/utils/hooks/usePermission'
|
import { usePermission } from '@/utils/hooks/usePermission'
|
||||||
import { RowMode, SimpleItemWithColData } from '../form/types'
|
import { RowMode, SimpleItemWithColData } from '../form/types'
|
||||||
import { captionize } from 'devextreme/core/utils/inflector'
|
import { captionize } from 'devextreme/core/utils/inflector'
|
||||||
|
import { formatDate } from 'devextreme/localization'
|
||||||
import type { AppointmentFormOpeningEvent } from 'devextreme/ui/scheduler'
|
import type { AppointmentFormOpeningEvent } from 'devextreme/ui/scheduler'
|
||||||
|
|
||||||
interface SchedulerViewProps {
|
interface SchedulerViewProps {
|
||||||
|
|
@ -174,6 +170,84 @@ const SchedulerView = (props: SchedulerViewProps) => {
|
||||||
setCurrentView(value)
|
setCurrentView(value)
|
||||||
}, [])
|
}, [])
|
||||||
|
|
||||||
|
const getAppointmentHtml = useCallback(
|
||||||
|
(appointmentData: Record<string, any>) => {
|
||||||
|
const textExpr = gridDto?.gridOptions.schedulerOptionDto?.textExpr || 'text'
|
||||||
|
return String(appointmentData?.[textExpr] ?? '')
|
||||||
|
},
|
||||||
|
[gridDto],
|
||||||
|
)
|
||||||
|
|
||||||
|
const getAppointmentTimeText = useCallback(
|
||||||
|
(appointmentData: Record<string, any>) => {
|
||||||
|
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 (
|
||||||
|
<>
|
||||||
|
<div
|
||||||
|
className="dx-scheduler-appointment-title scheduler-appointment-text"
|
||||||
|
dangerouslySetInnerHTML={{ __html: getAppointmentHtml(appointmentData) }}
|
||||||
|
/>
|
||||||
|
<div className="dx-scheduler-appointment-content-date">
|
||||||
|
{getAppointmentTimeText(appointmentData)}
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
},
|
||||||
|
[getAppointmentHtml, getAppointmentTimeText],
|
||||||
|
)
|
||||||
|
|
||||||
|
const renderAppointmentTooltip = useCallback(
|
||||||
|
(data: any) => {
|
||||||
|
const appointmentData = data.targetedAppointmentData || data.appointmentData || {}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="scheduler-appointment-preview flex min-w-72 items-center gap-3 px-4 py-3">
|
||||||
|
<div className="min-w-0 flex-1 text-left">
|
||||||
|
<div
|
||||||
|
className="scheduler-appointment-preview-text font-semibold"
|
||||||
|
dangerouslySetInnerHTML={{ __html: getAppointmentHtml(appointmentData) }}
|
||||||
|
/>
|
||||||
|
<div className="text-xs">{getAppointmentTimeText(appointmentData)}</div>
|
||||||
|
</div>
|
||||||
|
{gridDto?.gridOptions.schedulerOptionDto?.allowDeleting && (
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
className="shrink-0 self-start dx-button dx-button-mode-text dx-widget dx-button-has-icon"
|
||||||
|
onClick={(event) => {
|
||||||
|
event.stopPropagation()
|
||||||
|
schedulerRef.current?.instance().deleteAppointment(data.appointmentData)
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<span className="dx-button-content">
|
||||||
|
<i className="dx-icon dx-icon-trash" />
|
||||||
|
</span>
|
||||||
|
</button>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
},
|
||||||
|
[getAppointmentHtml, getAppointmentTimeText, gridDto],
|
||||||
|
)
|
||||||
|
|
||||||
const onAppointmentFormOpening = useCallback(
|
const onAppointmentFormOpening = useCallback(
|
||||||
(e: AppointmentFormOpeningEvent) => {
|
(e: AppointmentFormOpeningEvent) => {
|
||||||
if (!gridDto) return
|
if (!gridDto) return
|
||||||
|
|
@ -194,7 +268,11 @@ const SchedulerView = (props: SchedulerViewProps) => {
|
||||||
)
|
)
|
||||||
e.popup.option('showTitle', gridDto.gridOptions.editingOptionDto?.popup?.showTitle)
|
e.popup.option('showTitle', gridDto.gridOptions.editingOptionDto?.popup?.showTitle)
|
||||||
e.popup.option('width', gridDto.gridOptions.editingOptionDto?.popup?.width)
|
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('resizeEnabled', gridDto.gridOptions.editingOptionDto?.popup?.resizeEnabled)
|
||||||
e.popup.option('fullScreen', isPopupFullScreen)
|
e.popup.option('fullScreen', isPopupFullScreen)
|
||||||
|
|
||||||
|
|
@ -282,11 +360,13 @@ const SchedulerView = (props: SchedulerViewProps) => {
|
||||||
if (newFullScreenState) {
|
if (newFullScreenState) {
|
||||||
e.popup.option('width', '100%')
|
e.popup.option('width', '100%')
|
||||||
e.popup.option('height', '100%')
|
e.popup.option('height', '100%')
|
||||||
|
e.popup.option('maxHeight', '100%')
|
||||||
} else {
|
} else {
|
||||||
e.popup.option('width', gridDto.gridOptions.editingOptionDto?.popup?.width || 600)
|
e.popup.option('width', gridDto.gridOptions.editingOptionDto?.popup?.width || 600)
|
||||||
|
e.popup.option('height', 'auto')
|
||||||
e.popup.option(
|
e.popup.option(
|
||||||
'height',
|
'maxHeight',
|
||||||
gridDto.gridOptions.editingOptionDto?.popup?.height || 'auto',
|
gridDto.gridOptions.editingOptionDto?.popup?.height || '90vh',
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
@ -429,7 +509,9 @@ const SchedulerView = (props: SchedulerViewProps) => {
|
||||||
editorScript: i.editorScript,
|
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]) }
|
item.label = { text: captionize(i.fieldName.split(':')[1]) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -446,15 +528,25 @@ const SchedulerView = (props: SchedulerViewProps) => {
|
||||||
return item
|
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) => {
|
sortedFormDto.forEach((e: any) => {
|
||||||
// Items'ları da order'a göre sırala
|
// Items'ları da order'a göre sırala
|
||||||
const sortedItems = (e.items || [])
|
const sortedItems = (e.items || [])
|
||||||
.slice()
|
.slice()
|
||||||
.sort((a: any, b: any) =>
|
.sort((a: any, b: any) => ((a.editOrderNo ?? 0) >= (b.editOrderNo ?? 0) ? 1 : -1))
|
||||||
(a.editOrderNo ?? 0) >= (b.editOrderNo ?? 0) ? 1 : -1,
|
|
||||||
)
|
|
||||||
|
|
||||||
const groupItems = sortedItems.map(mapFormItem)
|
const groupItems = sortedItems.map(mapFormItem).filter(isVisibleFormItem)
|
||||||
|
|
||||||
if (e.itemType !== 'tabbed') {
|
if (e.itemType !== 'tabbed') {
|
||||||
// Grup kullanmadan direkt items'ları ekle - form'un colCount'u geçerli olsun
|
// 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,
|
(a.editOrderNo ?? 0) >= (b.editOrderNo ?? 0) ? 1 : -1,
|
||||||
)
|
)
|
||||||
.map(mapFormItem)
|
.map(mapFormItem)
|
||||||
.filter((a: any) => {
|
.filter(isVisibleFormItem),
|
||||||
if (currentMode === 'new') {
|
|
||||||
return a.canCreate || a.canRead
|
|
||||||
} else if (currentMode === 'edit') {
|
|
||||||
return a.canUpdate || a.canRead
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}),
|
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
})
|
})
|
||||||
|
|
@ -575,10 +660,12 @@ const SchedulerView = (props: SchedulerViewProps) => {
|
||||||
gridDto.gridOptions.schedulerOptionDto?.recurrenceExceptionExpr
|
gridDto.gridOptions.schedulerOptionDto?.recurrenceExceptionExpr
|
||||||
}
|
}
|
||||||
startDayHour={gridDto.gridOptions.schedulerOptionDto?.startDayHour || 8}
|
startDayHour={gridDto.gridOptions.schedulerOptionDto?.startDayHour || 8}
|
||||||
endDayHour={gridDto.gridOptions.schedulerOptionDto?.endDayHour || 18}
|
endDayHour={gridDto.gridOptions.schedulerOptionDto?.endDayHour || 20}
|
||||||
currentView={currentView}
|
currentView={currentView}
|
||||||
onCurrentViewChange={onCurrentViewChange}
|
onCurrentViewChange={onCurrentViewChange}
|
||||||
onAppointmentFormOpening={onAppointmentFormOpening}
|
onAppointmentFormOpening={onAppointmentFormOpening}
|
||||||
|
appointmentRender={renderAppointment}
|
||||||
|
appointmentTooltipRender={renderAppointmentTooltip}
|
||||||
onAppointmentAdding={() => {
|
onAppointmentAdding={() => {
|
||||||
props.refreshData?.()
|
props.refreshData?.()
|
||||||
}}
|
}}
|
||||||
|
|
@ -610,28 +697,36 @@ const SchedulerView = (props: SchedulerViewProps) => {
|
||||||
| 5
|
| 5
|
||||||
| 6) || 1
|
| 6) || 1
|
||||||
}
|
}
|
||||||
adaptivityEnabled={true}
|
adaptivityEnabled={false}
|
||||||
>
|
>
|
||||||
<Toolbar>
|
<Toolbar>
|
||||||
<Item name="dateNavigator" />
|
<Item name="dateNavigator" />
|
||||||
<Item name="today" />
|
<Item name="today" />
|
||||||
<Item name="viewSwitcher" />
|
<Item name="viewSwitcher" />
|
||||||
<Item
|
<Item
|
||||||
|
cssClass="scheduler-toolbar-action"
|
||||||
location="after"
|
location="after"
|
||||||
widget="dxButton"
|
widget="dxButton"
|
||||||
|
locateInMenu="auto"
|
||||||
|
showText="always"
|
||||||
options={{
|
options={{
|
||||||
icon: 'refresh',
|
icon: 'refresh',
|
||||||
|
text: translate('::ListForms.ListForm.Refresh'),
|
||||||
hint: translate('::ListForms.ListForm.Refresh'),
|
hint: translate('::ListForms.ListForm.Refresh'),
|
||||||
onClick: handleRefresh,
|
onClick: handleRefresh,
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
{checkPermission('App.Listforms.Listform.Update') && (
|
{checkPermission('App.Listforms.Listform.Update') && (
|
||||||
<Item
|
<Item
|
||||||
|
cssClass="scheduler-toolbar-action"
|
||||||
location="after"
|
location="after"
|
||||||
widget="dxButton"
|
widget="dxButton"
|
||||||
|
locateInMenu="auto"
|
||||||
|
showText="always"
|
||||||
options={{
|
options={{
|
||||||
icon: 'preferences',
|
icon: 'preferences',
|
||||||
hint: 'Settings',
|
text: translate('::ListForms.ListForm.Manage'),
|
||||||
|
hint: translate('::ListForms.ListForm.Manage'),
|
||||||
onClick: settingButtonClick,
|
onClick: settingButtonClick,
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
|
@ -646,9 +741,21 @@ const SchedulerView = (props: SchedulerViewProps) => {
|
||||||
allowDragging={gridDto.gridOptions.schedulerOptionDto?.allowDragging ?? false}
|
allowDragging={gridDto.gridOptions.schedulerOptionDto?.allowDragging ?? false}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<View type="day" name={translate('::App.Listform.ListformField.Day')} />
|
<View
|
||||||
<View type="week" name={translate('::ListForms.SchedulerOptions.Week')} />
|
type="day"
|
||||||
<View type="workWeek" name={translate('::ListForms.SchedulerOptions.WorkWeek')} />
|
name={translate('::App.Listform.ListformField.Day')}
|
||||||
|
maxAppointmentsPerCell="unlimited"
|
||||||
|
/>
|
||||||
|
<View
|
||||||
|
type="week"
|
||||||
|
name={translate('::ListForms.SchedulerOptions.Week')}
|
||||||
|
maxAppointmentsPerCell="unlimited"
|
||||||
|
/>
|
||||||
|
<View
|
||||||
|
type="workWeek"
|
||||||
|
name={translate('::ListForms.SchedulerOptions.WorkWeek')}
|
||||||
|
maxAppointmentsPerCell="unlimited"
|
||||||
|
/>
|
||||||
<View type="month" name={translate('::ListForms.SchedulerOptions.Month')} />
|
<View type="month" name={translate('::ListForms.SchedulerOptions.Month')} />
|
||||||
<View
|
<View
|
||||||
type="timelineDay"
|
type="timelineDay"
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue