From 76621b24d845a848b5f336fc31fc861e65f26c1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sedat=20=C3=96ZT=C3=9CRK?= <76204082+iamsedatozturk@users.noreply.github.com> Date: Thu, 18 Jun 2026 17:03:22 +0300 Subject: [PATCH] Grid, Tree, Chart, Pivot Toolbar style --- ui/src/index.css | 134 +++++++++++++++++ ui/src/views/list/Chart.tsx | 152 +++++++++++--------- ui/src/views/list/ChartDrawer.tsx | 36 ++--- ui/src/views/list/GanttView.tsx | 2 +- ui/src/views/list/Grid.tsx | 13 +- ui/src/views/list/Pivot.tsx | 214 ++++++++++++++-------------- ui/src/views/list/SchedulerView.tsx | 2 +- ui/src/views/list/Tree.tsx | 2 +- 8 files changed, 349 insertions(+), 206 deletions(-) diff --git a/ui/src/index.css b/ui/src/index.css index d975d76..1d1aeb8 100644 --- a/ui/src/index.css +++ b/ui/src/index.css @@ -113,6 +113,140 @@ div.dialog-after-open > div.dialog-content.maximized { padding: 0 0 !important; } +.dx-datagrid-header-panel.pivot-toolbar-panel { + min-height: 37px; + background-color: transparent !important; +} + +.dark .dx-datagrid-header-panel.pivot-toolbar-panel { + background-color: #202020 !important; +} + +.dx-datagrid-header-panel.pivot-toolbar-panel .button, +.dx-datagrid-header-panel.pivot-toolbar-panel .dx-button, +.dx-datagrid-header-panel.pivot-toolbar-panel button { + background-color: transparent !important; + border-color: transparent !important; + border-radius: 0 !important; + padding: 0 !important; +} + +.dx-datagrid-header-panel.pivot-toolbar-panel .relative.flex { + gap: 4px !important; +} + +.dx-datagrid-header-panel.pivot-toolbar-panel > .dx-toolbar { + width: 100% !important; + background-color: transparent !important; +} + +.dx-datagrid-header-panel.pivot-toolbar-panel > .dx-toolbar .dx-toolbar-items-container { + min-height: 28px !important; +} + +.dx-datagrid-header-panel.pivot-toolbar-panel > .dx-toolbar .dx-toolbar-before { + width: auto !important; + max-width: none !important; +} + +.dx-datagrid-header-panel.pivot-toolbar-panel > .dx-toolbar .dx-toolbar-after { + width: auto !important; + max-width: none !important; +} + +.dx-datagrid-header-panel.pivot-toolbar-panel > .dx-toolbar .dx-toolbar-after .dx-toolbar-item { + padding-inline: 2px !important; +} + +.dx-datagrid-header-panel.pivot-toolbar-panel > .dx-toolbar .dx-button-content { + padding-block: 4px !important; + padding-inline: 6px !important; +} + +.dx-datagrid-header-panel.pivot-toolbar-panel .chart-toolbar-search { + width: 160px; + height: 32px; + padding: 6px 12px 6px 34px; + border: 0 !important; + border-bottom: 1px solid #d1d5db !important; + border-radius: 0 !important; + background-color: #fff; +} + +.dark .dx-datagrid-header-panel.pivot-toolbar-panel .chart-toolbar-search { + background-color: #2d2d2d !important; + border-bottom-color: #6b7280 !important; +} + +.dx-datagrid-header-panel.pivot-toolbar-panel > .dx-toolbar .dx-toolbar-menu-container .dx-button { + border-radius: 50% !important; +} + +.dark + .dx-datagrid-header-panel.pivot-toolbar-panel + > .dx-toolbar + .dx-toolbar-menu-container + .dx-button { + background-color: #343440 !important; + border-color: #343440 !important; +} + +.dark + .dx-datagrid-header-panel.pivot-toolbar-panel + > .dx-toolbar + .dx-toolbar-menu-container + .dx-button:hover { + background-color: #424250 !important; + border-color: #424250 !important; +} + +.dx-datagrid-header-panel.pivot-toolbar-panel + > .dx-toolbar + .dx-toolbar-menu-container + .dx-button-content { + padding: 4px !important; +} + +.dark .dx-datagrid-header-panel.pivot-toolbar-panel .button, +.dark .dx-datagrid-header-panel.pivot-toolbar-panel .dx-button, +.dark .dx-datagrid-header-panel.pivot-toolbar-panel button { + background-color: transparent !important; + border-color: transparent !important; + color: #fff !important; +} + +.dx-datagrid-header-panel.pivot-toolbar-panel .dx-button-text { + text-transform: none !important; +} + +.dx-datagrid-header-panel.pivot-toolbar-panel .button:hover, +.dx-datagrid-header-panel.pivot-toolbar-panel .dx-button:hover, +.dx-datagrid-header-panel.pivot-toolbar-panel button:hover { + background-color: #dedede !important; +} + +.dark .dx-datagrid-header-panel.pivot-toolbar-panel .button:hover, +.dark .dx-datagrid-header-panel.pivot-toolbar-panel .dx-button:hover, +.dark .dx-datagrid-header-panel.pivot-toolbar-panel button:hover { + background-color: #2d2d2d !important; +} + +.dx-datagrid-header-panel.pivot-toolbar-panel, +.dx-datagrid-header-panel.pivot-toolbar-panel .dx-button, +.dx-datagrid-header-panel.pivot-toolbar-panel .dx-button-text, +.dx-datagrid-header-panel.pivot-toolbar-panel svg { + color: #000 !important; +} + +.dark .dx-datagrid-header-panel.pivot-toolbar-panel, +.dark .dx-datagrid-header-panel.pivot-toolbar-panel .button, +.dark .dx-datagrid-header-panel.pivot-toolbar-panel .dx-button, +.dark .dx-datagrid-header-panel.pivot-toolbar-panel .dx-button-text, +.dark .dx-datagrid-header-panel.pivot-toolbar-panel button, +.dark .dx-datagrid-header-panel.pivot-toolbar-panel svg { + color: #fff !important; +} + .dx-datagrid-header-panel > .dx-toolbar .dx-toolbar-before, .dx-treelist-header-panel > .dx-toolbar .dx-toolbar-before { width: 50% !important; diff --git a/ui/src/views/list/Chart.tsx b/ui/src/views/list/Chart.tsx index 0d39163..ceecce1 100644 --- a/ui/src/views/list/Chart.tsx +++ b/ui/src/views/list/Chart.tsx @@ -9,10 +9,10 @@ import { Helmet } from 'react-helmet' import { useParams, useSearchParams } from 'react-router-dom' import { GridDto } from '@/proxy/form/models' import { usePermission } from '@/utils/hooks/usePermission' -import { Button, toast, Notification } from '@/components/ui' +import { toast, Notification } from '@/components/ui' import { ROUTES_ENUM } from '@/routes/route.constant' import { usePWA } from '@/utils/hooks/usePWA' -import { FaCog, FaCrosshairs, FaSearch, FaSyncAlt } from 'react-icons/fa' +import { FaSearch } from 'react-icons/fa' import { buildSeriesDto } from './Utils' import { ChartSeriesDto } from '@/proxy/admin/charts/models' import { SelectBoxOption } from '@/types/shared' @@ -29,6 +29,7 @@ import { } from '@/services/admin/list-form.service' import { layoutTypes } from '../admin/listForm/edit/types' import { useListFormCustomDataSource } from './useListFormCustomDataSource' +import Toolbar, { Item } from 'devextreme-react/toolbar' interface ChartProps extends CommonProps, Meta { id: string @@ -327,82 +328,95 @@ const Chart = (props: ChartProps) => { > )} {_listFormCode && chartOptions && ( -
-
-
- - setSearchText(e.target.value)} - onKeyDown={(e) => { - if (e.key === 'Enter') { - onFilter(e.currentTarget.value) - setPrevValue(e.currentTarget.value.trim()) // Enter ile tetiklenirse güncelle - } - }} - onBlur={(e) => { - const newValue = e.currentTarget.value.trim() +
+
+ + ( +
+ + setSearchText(e.target.value)} + onKeyDown={(e) => { + if (e.key === 'Enter') { + onFilter(e.currentTarget.value) + setPrevValue(e.currentTarget.value.trim()) // Enter ile tetiklenirse güncelle + } + }} + onBlur={(e) => { + const newValue = e.currentTarget.value.trim() - // 1. Değer değişmemişse => hiçbir şey yapma - if (newValue === prevValue) return + // 1. Değer değişmemişse => hiçbir şey yapma + if (newValue === prevValue) return - // 2. Yeni değer boş, ama eskiden değer vardı => filtre temizle - // 3. Yeni değer dolu ve eskisinden farklı => filtre uygula - onFilter(newValue) - setPrevValue(newValue) - }} - className="p-1 pl-6 pr-2 border border-1 outline-none text-xs text-gray-700 dark:text-gray-200 placeholder-gray-400 rounded" + // 2. Yeni değer boş, ama eskiden değer vardı => filtre temizle + // 3. Yeni değer dolu ve eskisinden farklı => filtre uygula + onFilter(newValue) + setPrevValue(newValue) + }} + className="chart-toolbar-search outline-none text-xs text-gray-700 placeholder-gray-400 dark:text-gray-200 dark:placeholder-gray-400" + /> +
+ )} /> - - + /> + setOpenDrawer(true), + }} + /> {checkPermission(gridDto?.gridOptions.permissionDto.u) && ( - + /> )} -
+
-
+
diff --git a/ui/src/views/list/ChartDrawer.tsx b/ui/src/views/list/ChartDrawer.tsx index 8cfa603..7dbf179 100644 --- a/ui/src/views/list/ChartDrawer.tsx +++ b/ui/src/views/list/ChartDrawer.tsx @@ -90,7 +90,7 @@ const ChartDrawer = ({ <> {/* Drawer */}
@@ -139,8 +139,8 @@ const ChartDrawer = ({ return (
{/* Header */} -
-

+
+

📊 {translate('::App.Platform.ChartDrawer.ChartSeries')}

@@ -155,7 +155,7 @@ const ChartDrawer = ({ {/* Add Series Button */} -
+
{selectedSeriesIndex === index && ( -
+
{chartSeriesTypeOptions.map((chartType) => ( diff --git a/ui/src/views/list/GanttView.tsx b/ui/src/views/list/GanttView.tsx index fc8f9cc..235eab7 100644 --- a/ui/src/views/list/GanttView.tsx +++ b/ui/src/views/list/GanttView.tsx @@ -187,7 +187,7 @@ const GanttView = (props: GanttViewProps) => { return ( <> -
+
0 ? 'mt-2' : ''}>
diff --git a/ui/src/views/list/Grid.tsx b/ui/src/views/list/Grid.tsx index b568076..89eb2e6 100644 --- a/ui/src/views/list/Grid.tsx +++ b/ui/src/views/list/Grid.tsx @@ -1402,7 +1402,7 @@ const Grid = (props: GridProps) => { return ( <> -
+
0 ? 'mt-2' : ''}>
@@ -1556,9 +1556,7 @@ const Grid = (props: GridProps) => { popup={{ deferRendering: true, animation: {}, - wrapperAttr: useMobileEditPopup - ? { class: 'mobile-edit-popup' } - : undefined, + wrapperAttr: useMobileEditPopup ? { class: 'mobile-edit-popup' } : undefined, title: (mode === 'new' ? '✚ ' : '🖊️ ') + translate('::' + gridDto.gridOptions.editingOptionDto?.popup?.title), @@ -1568,9 +1566,10 @@ const Grid = (props: GridProps) => { width: useMobileEditPopup ? '100%' : gridDto.gridOptions.editingOptionDto?.popup?.width, - height: useMobileEditPopup && isPopupFullScreen - ? '100%' - : gridDto.gridOptions.editingOptionDto?.popup?.height, + height: + useMobileEditPopup && isPopupFullScreen + ? '100%' + : gridDto.gridOptions.editingOptionDto?.popup?.height, position: useMobileEditPopup ? { my: 'top center', diff --git a/ui/src/views/list/Pivot.tsx b/ui/src/views/list/Pivot.tsx index 6649696..70d8ca4 100644 --- a/ui/src/views/list/Pivot.tsx +++ b/ui/src/views/list/Pivot.tsx @@ -32,8 +32,7 @@ import { } from './Utils' import { useFilters } from './useFilters' import WidgetGroup from '@/components/common/WidgetGroup' -import { Button, Dropdown, Notification, toast } from '@/components/ui' -import { FaCaretDown, FaCog, FaSave, FaTimes, FaUndo } from 'react-icons/fa' +import { Notification, toast } from '@/components/ui' import { usePermission } from '@/utils/hooks/usePermission' import { ROUTES_ENUM } from '@/routes/route.constant' import { usePWA } from '@/utils/hooks/usePWA' @@ -42,6 +41,7 @@ import { useListFormCustomDataSource } from './useListFormCustomDataSource' import { useListFormColumns } from './useListFormColumns' import { useStoreState } from '@/store' import Checkbox from '@/components/ui/Checkbox' +import Toolbar, { Item } from 'devextreme-react/toolbar' interface PivotProps { listFormCode: string @@ -263,6 +263,44 @@ const Pivot = (props: PivotProps) => { }) }, [listFormCode, storageKey]) + const savePivotGridState = useCallback(() => { + const instance = gridRef.current?.instance() + if (!instance) { + return + } + + const ds = instance.getDataSource() + if (!ds || typeof ds.state !== 'function') { + return + } + + const currentState = ds.state() + customSaveState(currentState) + .then(() => { + toast.push( + + {translate('::ListForms.ListForm.GridStateSaved')} + , + { placement: 'top-end' }, + ) + }) + .catch(() => { + toast.push( + + {translate('::ListForms.ListForm.GridStateSaveError')} + , + { placement: 'top-end' }, + ) + }) + }, [customSaveState, translate]) + + const openFormManager = useCallback(() => { + window.open( + ROUTES_ENUM.protected.saas.listFormManagement.edit.replace(':listFormCode', listFormCode), + isPwaMode ? '_self' : '_blank', + ) + }, [isPwaMode, listFormCode]) + useEffect(() => { refListFormCode.current = listFormCode }, [listFormCode]) @@ -420,112 +458,72 @@ const Pivot = (props: PivotProps) => { > )} {gridDto && columnData && ( -
-
-
- -
- } - className="text-sm flex items-center gap-1 border-0" - title="Menu" - > - - - {translate('::ListForms.ListForm.GridMenu')} - - - } - > - - - - {translate('::ListForms.ListForm.RemoveFilter')} +
+
+ + ( +
-
+ setShowChart(checked)} /> + + )} + /> + + + + {checkPermission(gridDto?.gridOptions.permissionDto.u) && ( + + )} +
{showChart && ( @@ -537,8 +535,6 @@ const Pivot = (props: PivotProps) => { )} -
- { return ( <> -
+
0 ? 'mt-2' : ''}>
diff --git a/ui/src/views/list/Tree.tsx b/ui/src/views/list/Tree.tsx index 2dfcf22..6aa8fce 100644 --- a/ui/src/views/list/Tree.tsx +++ b/ui/src/views/list/Tree.tsx @@ -1060,7 +1060,7 @@ const Tree = (props: TreeProps) => { return ( <> -
+
0 ? 'mt-2' : ''}>