From 533e9373078abc19e7a08ad75b2aade0ff3b23dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sedat=20=C3=96zt=C3=BCrk?= Date: Sun, 9 Nov 2025 00:19:00 +0300 Subject: [PATCH] =?UTF-8?q?Widget=20d=C3=BCzenlemesi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ListForms/GridOptionsDto/WidgetEditDto.cs | 1 + .../ListForms/Select/WidgetDto.cs | 1 + .../ListForms/ListFormSelectAppService.cs | 2 +- .../Seeds/LanguagesData.json | 6 ++ .../Kurs.Platform.Domain/Queries/Widget.cs | 2 + ui/src/proxy/form/models.ts | 2 + .../admin/listForm/edit/FormTabWidgets.tsx | 2 + .../JsonRowOpDialogWidget.tsx | 84 +++++++++++-------- ui/src/views/list/Grid.tsx | 34 +++++++- ui/src/views/list/Tree.tsx | 32 ++++++- 10 files changed, 127 insertions(+), 39 deletions(-) diff --git a/api/src/Kurs.Platform.Application.Contracts/ListForms/GridOptionsDto/WidgetEditDto.cs b/api/src/Kurs.Platform.Application.Contracts/ListForms/GridOptionsDto/WidgetEditDto.cs index 155bb8e1..4bae4e1a 100644 --- a/api/src/Kurs.Platform.Application.Contracts/ListForms/GridOptionsDto/WidgetEditDto.cs +++ b/api/src/Kurs.Platform.Application.Contracts/ListForms/GridOptionsDto/WidgetEditDto.cs @@ -13,4 +13,5 @@ public class WidgetEditDto public string SubTitle { get; set; } public string OnClick { get; set; } public string ClassName { get; set; } + public bool IsActive { get; set; } } diff --git a/api/src/Kurs.Platform.Application.Contracts/ListForms/Select/WidgetDto.cs b/api/src/Kurs.Platform.Application.Contracts/ListForms/Select/WidgetDto.cs index 3fa021b9..980d3491 100644 --- a/api/src/Kurs.Platform.Application.Contracts/ListForms/Select/WidgetDto.cs +++ b/api/src/Kurs.Platform.Application.Contracts/ListForms/Select/WidgetDto.cs @@ -6,6 +6,7 @@ public class WidgetDto public int ColSpan { get; set; } public string ClassName { get; set; } public List Items { get; set; } + public bool IsActive { get; set; } } public class WidgetItemDto diff --git a/api/src/Kurs.Platform.Application/ListForms/ListFormSelectAppService.cs b/api/src/Kurs.Platform.Application/ListForms/ListFormSelectAppService.cs index e7076c34..bb0877de 100644 --- a/api/src/Kurs.Platform.Application/ListForms/ListFormSelectAppService.cs +++ b/api/src/Kurs.Platform.Application/ListForms/ListFormSelectAppService.cs @@ -231,7 +231,7 @@ public class ListFormSelectAppService : PlatformAppService, IListFormSelectAppSe if (!listForm.WidgetsJson.IsNullOrWhiteSpace()) { var widgetList = JsonSerializer.Deserialize(listForm.WidgetsJson) ?? []; - foreach (var widget in widgetList) + foreach (var widget in widgetList.Where(w => w.IsActive)) { if (!string.IsNullOrWhiteSpace(widget.SqlQuery)) { diff --git a/api/src/Kurs.Platform.DbMigrator/Seeds/LanguagesData.json b/api/src/Kurs.Platform.DbMigrator/Seeds/LanguagesData.json index edc4f2e8..a8c62052 100644 --- a/api/src/Kurs.Platform.DbMigrator/Seeds/LanguagesData.json +++ b/api/src/Kurs.Platform.DbMigrator/Seeds/LanguagesData.json @@ -4957,6 +4957,12 @@ "en": "Value Class Name", "tr": "Değer Sütun Sınıf Adı" }, + { + "resourceName": "Platform", + "key": "ListForms.ListFormEdit.WidgetStatus", + "en": "Status", + "tr": "Durum" + }, { "resourceName": "Platform", "key": "ListForms.ListFormEdit.WidgetColor", diff --git a/api/src/Kurs.Platform.Domain/Queries/Widget.cs b/api/src/Kurs.Platform.Domain/Queries/Widget.cs index b0139304..eafb006e 100644 --- a/api/src/Kurs.Platform.Domain/Queries/Widget.cs +++ b/api/src/Kurs.Platform.Domain/Queries/Widget.cs @@ -16,6 +16,7 @@ public class Widget : ValueObject public string SubTitle { get; set; } public string OnClick { get; set; } public string ClassName { get; set; } + public bool IsActive { get; set; } protected override IEnumerable GetAtomicValues() { @@ -30,5 +31,6 @@ public class Widget : ValueObject yield return SubTitle; yield return OnClick; yield return ClassName; + yield return IsActive; } } diff --git a/ui/src/proxy/form/models.ts b/ui/src/proxy/form/models.ts index 2b840a04..b375efe1 100644 --- a/ui/src/proxy/form/models.ts +++ b/ui/src/proxy/form/models.ts @@ -792,6 +792,7 @@ export interface WidgetGroupDto { colSpan?: number className?: string items: WidgetEditDto[] + isActive: boolean } export interface WidgetEditDto { @@ -806,6 +807,7 @@ export interface WidgetEditDto { icon: string subTitle: string onClick: string + isActive: boolean } export interface LayoutDto { diff --git a/ui/src/views/admin/listForm/edit/FormTabWidgets.tsx b/ui/src/views/admin/listForm/edit/FormTabWidgets.tsx index 64ce86fa..5a36b20c 100644 --- a/ui/src/views/admin/listForm/edit/FormTabWidgets.tsx +++ b/ui/src/views/admin/listForm/edit/FormTabWidgets.tsx @@ -59,6 +59,7 @@ function FormTabWidgets(props: { listFormCode: string }) { {translate('::ListForms.ListFormEdit.WidgetSqlQuery')} {translate('::ListForms.ListFormEdit.WidgetClassName')} {translate('::ListForms.ListFormEdit.WidgetValueClassName')} + {translate('::ListForms.ListFormEdit.WidgetStatus')} @@ -108,6 +109,7 @@ function FormTabWidgets(props: { listFormCode: string }) { {row.sqlQuery} {row.className} {row.valueClassName} + {row.isActive ? 'Active' : 'Inactive'} ))} diff --git a/ui/src/views/admin/listForm/edit/json-row-operations/JsonRowOpDialogWidget.tsx b/ui/src/views/admin/listForm/edit/json-row-operations/JsonRowOpDialogWidget.tsx index 767f3b56..950a6441 100644 --- a/ui/src/views/admin/listForm/edit/json-row-operations/JsonRowOpDialogWidget.tsx +++ b/ui/src/views/admin/listForm/edit/json-row-operations/JsonRowOpDialogWidget.tsx @@ -1,5 +1,6 @@ import { Button, + Checkbox, Dialog, FormContainer, FormItem, @@ -97,6 +98,7 @@ function JsonRowOpDialogWidget({ icon: 'Icon', subTitle: 'SubTitle', onClick: '', + isActive: false, } } validationSchema={schema} @@ -137,40 +139,55 @@ function JsonRowOpDialogWidget({
- - - +
+ + + - - - {({ field, form }: FieldProps) => ( - option.value === values.colSpan, + )} + onChange={(option) => form.setFieldValue(field.name, option?.value)} + /> + )} + + + + + + +
diff --git a/ui/src/views/list/Grid.tsx b/ui/src/views/list/Grid.tsx index a97644db..75821bbd 100644 --- a/ui/src/views/list/Grid.tsx +++ b/ui/src/views/list/Grid.tsx @@ -87,6 +87,7 @@ const Grid = (props: GridProps) => { const gridRef = useRef() const refListFormCode = useRef('') + const widgetGroupRef = useRef(null) const [gridDataSource, setGridDataSource] = useState>() const [columnData, setColumnData] = useState() @@ -95,6 +96,7 @@ const Grid = (props: GridProps) => { const [extraFilters, setExtraFilters] = useState([]) const [gridDto, setGridDto] = useState() const [isPopupFullScreen, setIsPopupFullScreen] = useState(false) + const [widgetGroupHeight, setWidgetGroupHeight] = useState(0) const preloadExportLibs = () => { import('exceljs') @@ -593,6 +595,29 @@ const Grid = (props: GridProps) => { gridRef.current.instance.option('stateStoring', stateStoring) }, [columnData]) + // WidgetGroup yüksekliğini hesapla + useEffect(() => { + const calculateWidgetHeight = () => { + if (widgetGroupRef.current) { + const height = widgetGroupRef.current.offsetHeight + setWidgetGroupHeight(height) + } + } + + // İlk render'da hesapla + calculateWidgetHeight() + + // Resize durumunda tekrar hesapla + const resizeObserver = new ResizeObserver(calculateWidgetHeight) + if (widgetGroupRef.current) { + resizeObserver.observe(widgetGroupRef.current) + } + + return () => { + resizeObserver.disconnect() + } + }, [gridDto?.widgets]) + const onExporting = async (e: DataGridTypes.ExportingEvent) => { // DevExtreme’in varsayılan export davranışını iptal ediyoruz; kendi akışımızı çalıştıracağız e.cancel = true @@ -663,7 +688,9 @@ const Grid = (props: GridProps) => { return ( <> - +
+ +
{!isSubForm && ( @@ -682,7 +709,10 @@ const Grid = (props: GridProps) => { //dataSource={gridDataSource} //remoteOperations={{ groupPaging: true }} //remoteOperations={false} - height={gridDto.gridOptions.height || 'calc(100vh - 150px)'} + height={ + gridDto.gridOptions.height || + `calc(100vh - ${170 + widgetGroupHeight}px)` + } width={gridDto.gridOptions.width || '100%'} allowColumnResizing={gridDto.gridOptions.columnOptionDto?.allowColumnResizing} allowColumnReordering={gridDto.gridOptions.columnOptionDto?.allowColumnReordering} diff --git a/ui/src/views/list/Tree.tsx b/ui/src/views/list/Tree.tsx index e8bbf5ae..796ca898 100644 --- a/ui/src/views/list/Tree.tsx +++ b/ui/src/views/list/Tree.tsx @@ -80,6 +80,7 @@ const Tree = (props: TreeProps) => { const gridRef = useRef() const refListFormCode = useRef('') + const widgetGroupRef = useRef(null) const [treeListDataSource, setTreeListDataSource] = useState>() const [columnData, setColumnData] = useState() @@ -88,6 +89,8 @@ const Tree = (props: TreeProps) => { const [extraFilters, setExtraFilters] = useState([]) const [gridDto, setGridDto] = useState() const [isPopupFullScreen, setIsPopupFullScreen] = useState(false) + const [widgetGroupHeight, setWidgetGroupHeight] = useState(0) + const [expandedRowKeys, setExpandedRowKeys] = useState([]) const preloadExportLibs = () => { @@ -435,6 +438,29 @@ const Tree = (props: TreeProps) => { } }, [listFormCode]) + // WidgetGroup yüksekliğini hesapla + useEffect(() => { + const calculateWidgetHeight = () => { + if (widgetGroupRef.current) { + const height = widgetGroupRef.current.offsetHeight + setWidgetGroupHeight(height) + } + } + + // İlk render'da hesapla + calculateWidgetHeight() + + // Resize durumunda tekrar hesapla + const resizeObserver = new ResizeObserver(calculateWidgetHeight) + if (widgetGroupRef.current) { + resizeObserver.observe(widgetGroupRef.current) + } + + return () => { + resizeObserver.disconnect() + } + }, [gridDto?.widgets]) + useEffect(() => { if (!gridDto) { return @@ -565,7 +591,9 @@ const Tree = (props: TreeProps) => { return ( <> - +
+ +
{!isSubForm && ( @@ -580,7 +608,7 @@ const Tree = (props: TreeProps) => {