diff --git a/api/src/Erp.Platform.Application.Contracts/ListForms/GridOptionsDto/GridEditingDto.cs b/api/src/Erp.Platform.Application.Contracts/ListForms/GridOptionsDto/GridEditingDto.cs index bb1ea9fa..a6156064 100644 --- a/api/src/Erp.Platform.Application.Contracts/ListForms/GridOptionsDto/GridEditingDto.cs +++ b/api/src/Erp.Platform.Application.Contracts/ListForms/GridOptionsDto/GridEditingDto.cs @@ -13,7 +13,8 @@ public class GridEditingDto /// Accepted Values: 'full' | 'reshape' | 'repaint' /// public string RefreshMode { get; set; } = "full"; - public bool AllowUpdating { get; set; } = false; + public bool AllowEditing { get; set; } = false; + public bool AllowDetail { get; set; } = false; public bool AllowDeleting { get; set; } = false; public bool AllowAllDeleting { get; set; } = false; public bool AllowAdding { get; set; } = false; diff --git a/api/src/Erp.Platform.Application.Contracts/ListForms/GridOptionsDto/SchedulerOptionDto.cs b/api/src/Erp.Platform.Application.Contracts/ListForms/GridOptionsDto/SchedulerOptionDto.cs index b1aee7b8..d92162ac 100644 --- a/api/src/Erp.Platform.Application.Contracts/ListForms/GridOptionsDto/SchedulerOptionDto.cs +++ b/api/src/Erp.Platform.Application.Contracts/ListForms/GridOptionsDto/SchedulerOptionDto.cs @@ -72,7 +72,7 @@ public class SchedulerOptionDto /// /// Etkinlik güncellemeye izin verilip verilmediğini belirtir /// - public bool AllowUpdating { get; set; } = false; + public bool AllowEditing { get; set; } = false; /// /// Etkinlik eklemeye izin verilip verilmediğini belirtir /// diff --git a/api/src/Erp.Platform.DbMigrator/Seeds/LanguagesData.json b/api/src/Erp.Platform.DbMigrator/Seeds/LanguagesData.json index f2ff4914..b4108c47 100644 --- a/api/src/Erp.Platform.DbMigrator/Seeds/LanguagesData.json +++ b/api/src/Erp.Platform.DbMigrator/Seeds/LanguagesData.json @@ -3998,10 +3998,16 @@ }, { "resourceName": "Platform", - "key": "ListForms.ListFormEdit.EditingAllowUpdating", + "key": "ListForms.ListFormEdit.EditingAllowEditing", "en": "Allow Editing", "tr": "Güncellemeye İzin Ver" }, + { + "resourceName": "Platform", + "key": "ListForms.ListFormEdit.EditingAllowDetail", + "en": "Allow Detail", + "tr": "Detaya İzin Ver" + }, { "resourceName": "Platform", "key": "ListForms.ListFormEdit.EditingAllowDeleting", @@ -10118,9 +10124,9 @@ }, { "resourceName": "Platform", - "key": "ListForms.SchedulerOptions.AllowUpdating", + "key": "ListForms.SchedulerOptions.AllowEditing", "tr": "Güncellemeye İzin Ver", - "en": "Allow Updating" + "en": "Allow Editing" }, { "resourceName": "Platform", @@ -10200,6 +10206,12 @@ "tr": "Düzenle", "en": "Edit" }, + { + "resourceName": "Platform", + "key": "App.Platform.Detail", + "tr": "Detay", + "en": "Detail" + }, { "resourceName": "Platform", "key": "App.Platform.Delete", diff --git a/api/src/Erp.Platform.DbMigrator/Seeds/ListFormSeeder_Crm.cs b/api/src/Erp.Platform.DbMigrator/Seeds/ListFormSeeder_Crm.cs index 22e5cf44..22f12d86 100644 --- a/api/src/Erp.Platform.DbMigrator/Seeds/ListFormSeeder_Crm.cs +++ b/api/src/Erp.Platform.DbMigrator/Seeds/ListFormSeeder_Crm.cs @@ -1153,8 +1153,8 @@ public class ListFormSeeder_Crm : IDataSeedContributor, ITransientDependency { Order = 3, Caption="Supply Card", ColCount = 3, ColSpan = 2, ItemType = "group", Items = [ - new EditingFormItemDto { Order = 22, DataField = "CustomerTypeId", ColSpan = 1, EditorType2 = EditorTypes.dxSelectBox, EditorOptions=EditorOptionValues.ShowClearButton }, - new EditingFormItemDto { Order = 23, DataField = "CustomerSegmentId", ColSpan = 1, EditorType2 = EditorTypes.dxSelectBox, EditorOptions=EditorOptionValues.ShowClearButton }, + new EditingFormItemDto { Order = 22, DataField = "CustomerTypeId", ColSpan = 1, IsRequired = true, EditorType2 = EditorTypes.dxSelectBox, EditorOptions=EditorOptionValues.ShowClearButton }, + new EditingFormItemDto { Order = 23, DataField = "CustomerSegmentId", ColSpan = 1, IsRequired = true, EditorType2 = EditorTypes.dxSelectBox, EditorOptions=EditorOptionValues.ShowClearButton }, new EditingFormItemDto { Order = 24, DataField = "EmployeeId", ColSpan = 1, EditorType2 = EditorTypes.dxSelectBox, EditorOptions=EditorOptionValues.ShowClearButton }, new EditingFormItemDto { Order = 25, DataField = "TeamCode", ColSpan = 1, EditorType2 = EditorTypes.dxSelectBox, EditorOptions=EditorOptionValues.ShowClearButton }, new EditingFormItemDto { Order = 26, DataField = "TotalRevenue", ColSpan = 1, EditorType2 = EditorTypes.dxNumberBox, EditorOptions=EditorOptionValues.NumberStandartFormat() }, @@ -3321,7 +3321,7 @@ public class ListFormSeeder_Crm : IDataSeedContributor, ITransientDependency new EditingFormItemDto { Order = 10, DataField="ExchangeRate", ColSpan = 1, EditorType2 = EditorTypes.dxNumberBox, EditorOptions = EditorOptionValues.NumberStandartFormat() }, new EditingFormItemDto { Order = 11, DataField="DiscountRate", ColSpan = 1, EditorType2 = EditorTypes.dxNumberBox, EditorOptions = EditorOptionValues.NumberStandartFormat() }, new EditingFormItemDto { Order = 12, DataField="TaxRate", ColSpan = 1, EditorType2 = EditorTypes.dxNumberBox, EditorOptions = EditorOptionValues.NumberStandartFormat() }, - new EditingFormItemDto { Order = 13, DataField="SpecialInstructions", ColSpan = 2, EditorType2 = EditorTypes.dxTextArea }, + new EditingFormItemDto { Order = 13, DataField="SpecialInstructions", ColSpan = 2, EditorType2 = EditorTypes.dxTextBox }, new EditingFormItemDto { Order = 14, DataField="Notes", ColSpan = 2, EditorType2 = EditorTypes.dxTextArea }, ]} }), @@ -3336,8 +3336,8 @@ public class ListFormSeeder_Crm : IDataSeedContributor, ITransientDependency }), CommandColumnJson = JsonSerializer.Serialize(new CommandColumnDto[] { new() { - Hint = "Manage", - Text ="Manage", + Hint = "Items", + Text ="Items", UrlTarget="_blank", AuthName = listFormName, Url=$"/admin/form/{SeederUtils.GetDefaultFormCodes(listFormName)}/@Id", diff --git a/api/src/Erp.Platform.DbMigrator/Seeds/ListFormSeeder_Maintenance.cs b/api/src/Erp.Platform.DbMigrator/Seeds/ListFormSeeder_Maintenance.cs index 7c6b7637..4418d17c 100644 --- a/api/src/Erp.Platform.DbMigrator/Seeds/ListFormSeeder_Maintenance.cs +++ b/api/src/Erp.Platform.DbMigrator/Seeds/ListFormSeeder_Maintenance.cs @@ -2859,7 +2859,7 @@ public class ListFormSeeder_Maintenance : IDataSeedContributor, ITransientDepend AllowResizing = true, AllowDragging = true, AllowDeleting = true, - AllowUpdating = true, + AllowEditing = true, AllowAdding = true, }), CultureName = LanguageCodes.En, diff --git a/api/src/Erp.Platform.DbMigrator/Seeds/SeederDefaults.cs b/api/src/Erp.Platform.DbMigrator/Seeds/SeederDefaults.cs index b22d9d6b..f2ab798c 100644 --- a/api/src/Erp.Platform.DbMigrator/Seeds/SeederDefaults.cs +++ b/api/src/Erp.Platform.DbMigrator/Seeds/SeederDefaults.cs @@ -35,16 +35,18 @@ public static class SeederDefaults int Height, bool AllowDeleting, bool AllowAdding, - bool AllowUpdating, + bool AllowEditing, bool ConfirmDelete, - bool SendOnlyChangedFormValuesUpdate) => JsonSerializer.Serialize(new GridEditingDto + bool SendOnlyChangedFormValuesUpdate, + bool AllowDetail = false) => JsonSerializer.Serialize(new GridEditingDto { Popup = new GridEditingPopupDto() { Title = Title, Width = Width, Height = Height }, AllowDeleting = AllowDeleting, AllowAdding = AllowAdding, - AllowUpdating = AllowUpdating, + AllowEditing = AllowEditing, ConfirmDelete = ConfirmDelete, - SendOnlyChangedFormValuesUpdate = SendOnlyChangedFormValuesUpdate + SendOnlyChangedFormValuesUpdate = SendOnlyChangedFormValuesUpdate, + AllowDetail = AllowDetail }); public static readonly string DefaultFilterJson = "\"IsDeleted\" = 'false'"; diff --git a/ui/src/proxy/form/models.ts b/ui/src/proxy/form/models.ts index 1ebfd340..cffc5ff7 100644 --- a/ui/src/proxy/form/models.ts +++ b/ui/src/proxy/form/models.ts @@ -429,7 +429,7 @@ export interface SchedulerOptionDto { allowResizing?: boolean allowDragging?: boolean allowDeleting?: boolean - allowUpdating?: boolean + allowEditing?: boolean allowAdding?: boolean resources?: SchedulerResourceDto[] } @@ -444,7 +444,8 @@ export interface SchedulerResourceDto { export interface GridEditingDto { mode?: GridsEditMode refreshMode?: GridsEditRefreshMode - allowUpdating: boolean + allowEditing: boolean + allowDetail: boolean allowDeleting: boolean allowAllDeleting: boolean allowAdding: boolean diff --git a/ui/src/views/admin/listForm/edit/FormTabEdit.tsx b/ui/src/views/admin/listForm/edit/FormTabEdit.tsx index 7debbb08..66e9f097 100644 --- a/ui/src/views/admin/listForm/edit/FormTabEdit.tsx +++ b/ui/src/views/admin/listForm/edit/FormTabEdit.tsx @@ -55,18 +55,33 @@ function FormTabEdit(props: FormEditProps & { listFormCode: string }) { /> + + + + + - - + + diff --git a/ui/src/views/admin/listForm/edit/form-fields/FormFieldTabOptions.tsx b/ui/src/views/admin/listForm/edit/form-fields/FormFieldTabOptions.tsx index 5ccff4dd..60f66a49 100644 --- a/ui/src/views/admin/listForm/edit/form-fields/FormFieldTabOptions.tsx +++ b/ui/src/views/admin/listForm/edit/form-fields/FormFieldTabOptions.tsx @@ -102,7 +102,7 @@ function FormFieldTabOptions({ > - + diff --git a/ui/src/views/form/useFormData.tsx b/ui/src/views/form/useFormData.tsx index 58dd1472..0550dbcc 100644 --- a/ui/src/views/form/useFormData.tsx +++ b/ui/src/views/form/useFormData.tsx @@ -181,7 +181,7 @@ const useGridData = (props: { checkPermission(gridDto?.gridOptions.permissionDto.c), r: checkPermission(gridDto?.gridOptions.permissionDto.r), u: - gridDto?.gridOptions.editingOptionDto.allowUpdating === true && + gridDto?.gridOptions.editingOptionDto.allowEditing === true && checkPermission(gridDto?.gridOptions.permissionDto.u), d: gridDto?.gridOptions.editingOptionDto.allowDeleting === true && diff --git a/ui/src/views/list/Grid.tsx b/ui/src/views/list/Grid.tsx index 2c0163b2..a29ab32f 100644 --- a/ui/src/views/list/Grid.tsx +++ b/ui/src/views/list/Grid.tsx @@ -1151,7 +1151,7 @@ const Grid = (props: GridProps) => { refreshMode={gridDto.gridOptions.editingOptionDto?.refreshMode} mode={smaller.md ? 'form' : gridDto.gridOptions.editingOptionDto?.mode} allowDeleting={gridDto.gridOptions.editingOptionDto?.allowDeleting} - allowUpdating={gridDto.gridOptions.editingOptionDto?.allowUpdating} + allowUpdating={gridDto.gridOptions.editingOptionDto?.allowEditing} allowAdding={gridDto.gridOptions.editingOptionDto?.allowAdding} useIcons={gridDto.gridOptions.editingOptionDto?.useIcons} confirmDelete={gridDto.gridOptions.editingOptionDto?.confirmDelete} diff --git a/ui/src/views/list/SchedulerView.tsx b/ui/src/views/list/SchedulerView.tsx index 5de41c79..3a511bb9 100644 --- a/ui/src/views/list/SchedulerView.tsx +++ b/ui/src/views/list/SchedulerView.tsx @@ -615,7 +615,7 @@ const SchedulerView = (props: SchedulerViewProps) => { { refreshMode={gridDto.gridOptions.editingOptionDto?.refreshMode} mode={smaller.md ? 'form' : gridDto.gridOptions.editingOptionDto?.mode} allowDeleting={gridDto.gridOptions.editingOptionDto?.allowDeleting} - allowUpdating={gridDto.gridOptions.editingOptionDto?.allowUpdating} + allowUpdating={gridDto.gridOptions.editingOptionDto?.allowEditing} allowAdding={gridDto.gridOptions.editingOptionDto?.allowAdding} useIcons={gridDto.gridOptions.editingOptionDto?.useIcons} confirmDelete={gridDto.gridOptions.editingOptionDto?.confirmDelete} diff --git a/ui/src/views/list/useListFormColumns.ts b/ui/src/views/list/useListFormColumns.ts index 2ba29eb6..d69aeef1 100644 --- a/ui/src/views/list/useListFormColumns.ts +++ b/ui/src/views/list/useListFormColumns.ts @@ -9,6 +9,7 @@ import { usePWA } from '@/utils/hooks/usePWA' import { useDialogContext } from '../shared/DialogContext' import { dynamicFetch } from '@/services/form.service' import { GridColumnData } from './GridColumnData' +import { useLocation } from 'react-router-dom' import { ColumnFormatDto, EditingFormItemDto, @@ -113,19 +114,20 @@ const MAX_CACHE_SIZE = 100 // Maksimum cache entry sayısı const cachedLoader = (key: string, loader: () => Promise) => { const now = Date.now() const cached = __lookupCache.get(key) - + // Cache'de var ve süresi dolmamışsa kullan - if (cached && (now - cached.timestamp) < CACHE_DURATION) { + if (cached && now - cached.timestamp < CACHE_DURATION) { return cached.promise } - + // Cache boyutu limitini aşarsa en eskiyi temizle if (__lookupCache.size >= MAX_CACHE_SIZE) { - const oldestKey = Array.from(__lookupCache.entries()) - .sort((a, b) => a[1].timestamp - b[1].timestamp)[0][0] + const oldestKey = Array.from(__lookupCache.entries()).sort( + (a, b) => a[1].timestamp - b[1].timestamp, + )[0][0] __lookupCache.delete(oldestKey) } - + const p = Promise.resolve() .then(() => loader()) .then((res) => res ?? []) @@ -133,7 +135,7 @@ const cachedLoader = (key: string, loader: () => Promise) => { __lookupCache.delete(key) // hata olursa tekrar denenebilsin throw err }) - + __lookupCache.set(key, { promise: p, timestamp: now }) return p } @@ -153,55 +155,59 @@ const useListFormColumns = ({ const { translate } = useLocalization() const { checkPermission } = usePermission() const isPwaMode = usePWA() + const location = useLocation() useEffect(() => { // listFormCode değişince lookup cache temizlensin (farklı form farklı lookuplar) __lookupCache.clear() }, [listFormCode]) - const lookupDataSource = useCallback((options: any, colData: any, listFormCode: string) => { - const { lookupDto } = colData - const filters = [] - if (lookupDto.cascadeParentFields) { - if (lookupDto.dataSourceType == UiLookupDataSourceTypeEnum.StaticData) { - filters.push([ - lookupDto?.cascadeRelationField, - lookupDto?.cascadeFilterOperator, - options?.data[lookupDto?.cascadeParentField], - ]) - //TODO: Statik data test edilecek - } else { - const data = options?.data ?? options - for (const cascadeParentField of lookupDto.cascadeParentFields.split(',')) { - filters.push(data[cascadeParentField]) + const lookupDataSource = useCallback( + (options: any, colData: any, listFormCode: string) => { + const { lookupDto } = colData + const filters = [] + if (lookupDto.cascadeParentFields) { + if (lookupDto.dataSourceType == UiLookupDataSourceTypeEnum.StaticData) { + filters.push([ + lookupDto?.cascadeRelationField, + lookupDto?.cascadeFilterOperator, + options?.data[lookupDto?.cascadeParentField], + ]) + //TODO: Statik data test edilecek + } else { + const data = options?.data ?? options + for (const cascadeParentField of lookupDto.cascadeParentFields.split(',')) { + filters.push(data[cascadeParentField]) + } } } - } - //UiLookupDataSourceTypeEnum : - // Data = 1 (Statik Data), - // Query = 2 (API'den geliyor fakat API query çalıştırıyor) - // WebService = 3 (API servisten geliyor) - if (lookupDto.dataSourceType == UiLookupDataSourceTypeEnum.StaticData) { - return createLookupStaticDataSource( - () => JSON.parse(lookupDto?.lookupQuery), - filters.length ? filters : null, - `static:${listFormCode}:${colData.fieldName}`, // cache key - ) - } else if (lookupDto.dataSourceType == UiLookupDataSourceTypeEnum.Query) { - return createLookupQueryDataSource(listFormCode, colData.fieldName, filters) - } else if (lookupDto.dataSourceType == UiLookupDataSourceTypeEnum.WebService) { - return createLookupApiDataSource( - listFormCode, - lookupDto?.lookupQuery, - filters, - colData.lookupDto?.valueExpr?.toLowerCase(), - ) - } else { - return { - store: [], + //UiLookupDataSourceTypeEnum : + // Data = 1 (Statik Data), + // Query = 2 (API'den geliyor fakat API query çalıştırıyor) + // WebService = 3 (API servisten geliyor) + if (lookupDto.dataSourceType == UiLookupDataSourceTypeEnum.StaticData) { + return createLookupStaticDataSource( + () => JSON.parse(lookupDto?.lookupQuery), + filters.length ? filters : null, + `static:${listFormCode}:${colData.fieldName}`, // cache key + ) + } else if (lookupDto.dataSourceType == UiLookupDataSourceTypeEnum.Query) { + return createLookupQueryDataSource(listFormCode, colData.fieldName, filters) + } else if (lookupDto.dataSourceType == UiLookupDataSourceTypeEnum.WebService) { + return createLookupApiDataSource( + listFormCode, + lookupDto?.lookupQuery, + filters, + colData.lookupDto?.valueExpr?.toLowerCase(), + ) + } else { + return { + store: [], + } } - } - }, [listFormCode]) + }, + [listFormCode], + ) const createLookupStaticDataSource = ( load: () => any, @@ -247,7 +253,7 @@ const useListFormColumns = ({ name: a.Name, group: a.Group, - ...a + ...a, })) }) } catch (error: any) { @@ -312,13 +318,17 @@ const useListFormColumns = ({ } const hasUpdate = - gridDto.gridOptions.editingOptionDto.allowUpdating && + gridDto.gridOptions.editingOptionDto.allowEditing && checkPermission(gridDto.gridOptions.permissionDto.u) const hasDelete = gridDto.gridOptions.editingOptionDto.allowDeleting && checkPermission(gridDto.gridOptions.permissionDto.d) + const hasDetail = + gridDto.gridOptions.editingOptionDto.allowDetail && + checkPermission(gridDto.gridOptions.permissionDto.u) + const hasCommandButtons = gridDto.gridOptions.commandColumnDto.length > 0 // Eğer hiçbir buton eklenecek durumda değilse: çık @@ -328,17 +338,39 @@ const useListFormColumns = ({ const buttons: any[] = [] + if (hasDetail) { + const item = { + name: 'detail', + text: translate('::App.Platform.Detail'), + onClick: (e: any) => { + if (typeof e.event?.preventDefault === 'function') { + e.event.preventDefault() + } + + if (!gridDto.gridOptions.keyFieldName) return + + const url = + location.pathname?.replace('/list/', '/form/') + + `/${e.row.data[gridDto.gridOptions.keyFieldName]}` + + window.open(url, isPwaMode ? '_self' : '_blank') + }, + } + + buttons.push(item) + } + if (hasUpdate) { buttons.push({ name: 'edit', - text: translate('::App.Platform.Edit') + text: translate('::App.Platform.Edit'), }) } if (hasDelete) { buttons.push({ name: 'delete', - text: translate('::App.Platform.Delete') + text: translate('::App.Platform.Delete'), }) } @@ -418,156 +450,159 @@ const useListFormColumns = ({ return column as GridColumnData }, [gridDto, checkPermission, translate, listFormCode, isPwaMode, dialog, gridRef]) - const getColumns = useCallback((columnFormats: ColumnFormatDto[]) => { - const columns: GridColumnData[] = [] + const getColumns = useCallback( + (columnFormats: ColumnFormatDto[]) => { + const columns: GridColumnData[] = [] - if (!gridDto || !columnFormats) { - return columns - } - columnFormats.forEach((colData) => { - if (!colData.canRead || !colData.isActive) { - return + if (!gridDto || !columnFormats) { + return columns } - const column: GridColumnData = {} - column.colData = colData // Onemli: Baska event-callback lerde kullanmak icin eklendi, colData.lookupDto?.editorTemplateType - //column.showEditorAlways = true - column.dataField = colData.fieldName - if (colData.dataType) column.dataType = colData.dataType as DataType - if (colData.captionName) column.caption = translate('::' + colData.captionName) - if (colData.width > 0) column.width = colData.width - column.visible = colData.visible - - column.alignment = colData.alignment - column.format = colData.format - - let editorOptions: any = {} - if (colData.editorOptions) { - try { - editorOptions = - typeof colData.editorOptions === 'string' - ? JSON.parse(colData.editorOptions) - : colData.editorOptions - } catch { - editorOptions = {} + columnFormats.forEach((colData) => { + if (!colData.canRead || !colData.isActive) { + return } - } + const column: GridColumnData = {} + column.colData = colData // Onemli: Baska event-callback lerde kullanmak icin eklendi, colData.lookupDto?.editorTemplateType + //column.showEditorAlways = true + column.dataField = colData.fieldName + if (colData.dataType) column.dataType = colData.dataType as DataType + if (colData.captionName) column.caption = translate('::' + colData.captionName) + if (colData.width > 0) column.width = colData.width + column.visible = colData.visible - column.editorOptions = { ...editorOptions } + column.alignment = colData.alignment + column.format = colData.format - // Format bilgisini öncelik sırasına göre ata - if (column.editorOptions.displayFormat) { - column.format = column.editorOptions.displayFormat - } else if (column.editorOptions.format) { - column.format = column.editorOptions.format - } - - // columnCustomizationDto - column.fixed = colData.columnCustomizationDto?.fixed - column.fixedPosition = colData.columnCustomizationDto?.fixedPosition as HorizontalEdge - column.allowReordering = colData.columnCustomizationDto?.allowReordering - - // sort - if (colData.sortIndex >= 0) { - column.sortIndex = colData.sortIndex - column.sortOrder = colData.sortDirection as SortOrder - } - - // filterRow - column.allowFiltering = colData.columnFilterDto?.allowFiltering - column.selectedFilterOperation = colData.columnFilterDto - ?.selectedFilterOperation as SelectedFilterOperation - column.filterValue = colData.columnFilterDto?.filterValue - - // headerFilter - column.allowHeaderFiltering = colData.columnHeaderDto?.allowHeaderFiltering - if (column.allowHeaderFiltering == true) { - column.headerFilter = {} - column.headerFilter.allowSearch = colData.columnHeaderDto?.allowSearch - column.headerFilter.dataSource = colData.columnHeaderDto?.dataSource - } - - // search - column.allowSearch = colData.allowSearch - - //export - column.allowExporting = colData.canExport - - // grouping - column.allowGrouping = colData.columnGroupingDto?.allowGrouping - column.autoExpandGroup = colData.columnGroupingDto?.autoExpandGroup - if (colData.columnGroupingDto.groupIndex) - column.groupIndex = colData.columnGroupingDto?.groupIndex - - // constsa dinamik olarak css verilerini ekle - if (colData.columnCssClass) { - column.cssClass = colData.columnCssClass - if (colData.columnCssValue) { - addCss(colData.columnCssValue) + let editorOptions: any = {} + if (colData.editorOptions) { + try { + editorOptions = + typeof colData.editorOptions === 'string' + ? JSON.parse(colData.editorOptions) + : colData.editorOptions + } catch { + editorOptions = {} + } } - } - column.allowEditing = colData.columnEditingDto?.allowEditing + column.editorOptions = { ...editorOptions } - // #region lookup ayarlari - if (colData.lookupDto?.dataSourceType) { - // UiColumnEditorTemplateTypeEnum : None:0, Table:1, TagBox:2 - const allItems = gridDto.gridOptions.editingFormDto.flatMap((group) => group.items) - const formItem = allItems.find((a) => a?.dataField === colData.fieldName) - if (formItem?.editorType2 === PlatformEditorTypes.dxTagBox) { - column.extras = { - multiValue: true, - editorOptions: formItem.editorOptions, - tagBoxOptions: formItem.tagBoxOptions, + // Format bilgisini öncelik sırasına göre ata + if (column.editorOptions.displayFormat) { + column.format = column.editorOptions.displayFormat + } else if (column.editorOptions.format) { + column.format = column.editorOptions.format + } + + // columnCustomizationDto + column.fixed = colData.columnCustomizationDto?.fixed + column.fixedPosition = colData.columnCustomizationDto?.fixedPosition as HorizontalEdge + column.allowReordering = colData.columnCustomizationDto?.allowReordering + + // sort + if (colData.sortIndex >= 0) { + column.sortIndex = colData.sortIndex + column.sortOrder = colData.sortDirection as SortOrder + } + + // filterRow + column.allowFiltering = colData.columnFilterDto?.allowFiltering + column.selectedFilterOperation = colData.columnFilterDto + ?.selectedFilterOperation as SelectedFilterOperation + column.filterValue = colData.columnFilterDto?.filterValue + + // headerFilter + column.allowHeaderFiltering = colData.columnHeaderDto?.allowHeaderFiltering + if (column.allowHeaderFiltering == true) { + column.headerFilter = {} + column.headerFilter.allowSearch = colData.columnHeaderDto?.allowSearch + column.headerFilter.dataSource = colData.columnHeaderDto?.dataSource + } + + // search + column.allowSearch = colData.allowSearch + + //export + column.allowExporting = colData.canExport + + // grouping + column.allowGrouping = colData.columnGroupingDto?.allowGrouping + column.autoExpandGroup = colData.columnGroupingDto?.autoExpandGroup + if (colData.columnGroupingDto.groupIndex) + column.groupIndex = colData.columnGroupingDto?.groupIndex + + // constsa dinamik olarak css verilerini ekle + if (colData.columnCssClass) { + column.cssClass = colData.columnCssClass + if (colData.columnCssValue) { + addCss(colData.columnCssValue) } - column.editCellTemplate = 'cellEditTagBox' - column.calculateFilterExpression = calculateFilterExpressionMultiValue - column.cellTemplate = cellTemplateMultiValue - } else if (formItem?.editorType2 === PlatformEditorTypes.dxGridBox) { - column.extras = { - multiValue: false, - editorOptions: formItem.editorOptions, - gridBoxOptions: formItem.gridBoxOptions, - } - column.editCellTemplate = 'cellEditGridBox' - column.cellTemplate = cellTemplateMultiValue - if (formItem.gridBoxOptions?.selectionMode === 'multiple') { + } + + column.allowEditing = colData.columnEditingDto?.allowEditing + + // #region lookup ayarlari + if (colData.lookupDto?.dataSourceType) { + // UiColumnEditorTemplateTypeEnum : None:0, Table:1, TagBox:2 + const allItems = gridDto.gridOptions.editingFormDto.flatMap((group) => group.items) + const formItem = allItems.find((a) => a?.dataField === colData.fieldName) + if (formItem?.editorType2 === PlatformEditorTypes.dxTagBox) { + column.extras = { + multiValue: true, + editorOptions: formItem.editorOptions, + tagBoxOptions: formItem.tagBoxOptions, + } + column.editCellTemplate = 'cellEditTagBox' column.calculateFilterExpression = calculateFilterExpressionMultiValue - column.extras.multiValue = true + column.cellTemplate = cellTemplateMultiValue + } else if (formItem?.editorType2 === PlatformEditorTypes.dxGridBox) { + column.extras = { + multiValue: false, + editorOptions: formItem.editorOptions, + gridBoxOptions: formItem.gridBoxOptions, + } + column.editCellTemplate = 'cellEditGridBox' + column.cellTemplate = cellTemplateMultiValue + if (formItem.gridBoxOptions?.selectionMode === 'multiple') { + column.calculateFilterExpression = calculateFilterExpressionMultiValue + column.extras.multiValue = true + } + } + + column.lookup = { + valueExpr: colData.lookupDto?.valueExpr?.toLowerCase(), + displayExpr: colData.lookupDto?.displayExpr?.toLowerCase(), + dataSource: (o) => lookupDataSource(o, colData, listFormCode), + } + //column.lookup.dataSource = lookupDataSource(null, colData) + + //cascadeEmptyFields verisi dolu ise bu kolon/field bir parent field dir + if (colData.lookupDto.cascadeEmptyFields) { + // parent field guncellendigi zaman bu fonksiyon cagrilir + column.setCellValue = function (rowData: any, value: any) { + if (!colData.fieldName) return + //console.log({ rowData, value, colData }) + rowData[colData.fieldName] = Array.isArray(value) ? value[0] : value + // cascadeEmptyFields alani aralarinda virgul olacak sekilde bosaltilmak istenen alanlari saklar + colData?.lookupDto?.cascadeEmptyFields?.split(',').forEach((emptyField: any) => { + rowData[emptyField] = null + }) + } } } - - column.lookup = { - valueExpr: colData.lookupDto?.valueExpr?.toLowerCase(), - displayExpr: colData.lookupDto?.displayExpr?.toLowerCase(), - dataSource: (o) => lookupDataSource(o, colData, listFormCode), + // #endregion + if (colData.validationRuleDto) { + // for server side validation : https://js.devexpress.com/Demos/WidgetsGallery/Demo/DataGrid/DataValidation/jQuery/Light/ + column.validationRules = colData.validationRuleDto as ValidationRule[] } - //column.lookup.dataSource = lookupDataSource(null, colData) - //cascadeEmptyFields verisi dolu ise bu kolon/field bir parent field dir - if (colData.lookupDto.cascadeEmptyFields) { - // parent field guncellendigi zaman bu fonksiyon cagrilir - column.setCellValue = function (rowData: any, value: any) { - if (!colData.fieldName) return - //console.log({ rowData, value, colData }) - rowData[colData.fieldName] = Array.isArray(value) ? value[0] : value - // cascadeEmptyFields alani aralarinda virgul olacak sekilde bosaltilmak istenen alanlari saklar - colData?.lookupDto?.cascadeEmptyFields?.split(',').forEach((emptyField: any) => { - rowData[emptyField] = null - }) - } - } - } - // #endregion - if (colData.validationRuleDto) { - // for server side validation : https://js.devexpress.com/Demos/WidgetsGallery/Demo/DataGrid/DataValidation/jQuery/Light/ - column.validationRules = colData.validationRuleDto as ValidationRule[] - } + columns.push(column) + }) - columns.push(column) - }) - - return columns - }, [gridDto, lookupDataSource, translate, checkPermission, dialog, isPwaMode, listFormCode]) + return columns + }, + [gridDto, lookupDataSource, translate, checkPermission, dialog, isPwaMode, listFormCode], + ) const getBandedColumns = useCallback(() => { if (!gridDto) { diff --git a/ui/src/views/list/useToolbar.tsx b/ui/src/views/list/useToolbar.tsx index 55bc209c..4c6b3ac6 100644 --- a/ui/src/views/list/useToolbar.tsx +++ b/ui/src/views/list/useToolbar.tsx @@ -312,7 +312,7 @@ const useToolbar = ({ // batch editing icin kaydet ve geri al butonu if ( - grdOpt.editingOptionDto?.allowUpdating && + grdOpt.editingOptionDto?.allowEditing && grdOpt.editingOptionDto?.mode == 'batch' && checkPermission(grdOpt.permissionDto?.u) ) {