Skip to content

Commit 7b8228e

Browse files
authored
Merge pull request #93 from running-elephant/dev
Dev
2 parents 0a87912 + e02118a commit 7b8228e

File tree

29 files changed

+454
-221
lines changed

29 files changed

+454
-221
lines changed

config/profiles/application-config.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ datart:
7373
server:
7474
address: ${datart.address:http://127.0.0.1:8080}
7575

76-
# 租户管理模式:plateform-平台(默认),team-团队
76+
# 租户管理模式:platform-平台(默认),team-团队
7777
tenant-management-mode: platform
7878
# 团队管理员用户名/密码: 仅team模式且两者都不为空时重置
7979
admin:

core/src/main/java/datart/core/mappers/ext/UserSettingsMapperExt.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public interface UserSettingsMapperExt extends UserSettingsMapper {
1717
List<UserSettings> selectByUser(String userId);
1818

1919
@Delete({
20-
"DELETE FROM user_settings t WHERE t.user_id = #{userId}"
20+
"DELETE FROM user_settings WHERE user_id = #{userId}"
2121
})
2222
int deleteByUser(String userId);
2323

frontend/src/app/components/ChartDrill/ChartDrillContextMenu.tsx

Lines changed: 74 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -16,35 +16,47 @@
1616
* limitations under the License.
1717
*/
1818

19+
import { CheckOutlined } from '@ant-design/icons';
1920
import { Dropdown, Menu } from 'antd';
2021
import useI18NPrefix from 'app/hooks/useI18NPrefix';
2122
import { DrillMode } from 'app/models/ChartDrillOption';
2223
import ChartDrillContext from 'app/pages/ChartWorkbenchPage/contexts/ChartDrillContext';
24+
import classnames from 'classnames';
2325
import { FC, memo, useContext, useMemo } from 'react';
2426
import styled from 'styled-components/macro';
27+
import { FONT_WEIGHT_MEDIUM, SPACE_SM } from 'styles/StyleConstants';
2528

2629
const ChartDrillContextMenu: FC<{}> = memo(({ children }) => {
2730
const t = useI18NPrefix(`viz.palette.drill`);
2831
const { drillOption, onDrillOptionChange } = useContext(ChartDrillContext);
2932

33+
const currentDrillLevel = drillOption?.getCurrentDrillLevel();
34+
const selectDrillStatusMenu = useMemo(() => {
35+
return (
36+
<Menu.Item key="selectDrillStatus">
37+
<StyledMenuSwitch
38+
className={classnames({ on: !!drillOption?.isSelectedDrill })}
39+
>
40+
<p>
41+
{drillOption?.isSelectedDrill
42+
? t('selectDrillOn')
43+
: t('selectDrillOff')}
44+
</p>
45+
<CheckOutlined className="icon" />
46+
</StyledMenuSwitch>
47+
</Menu.Item>
48+
);
49+
}, [drillOption?.isSelectedDrill, t]);
3050
const contextMenu = useMemo(() => {
3151
return (
32-
<Menu
33-
style={{ width: 200 }}
52+
<StyledChartDrillMenu
3453
onClick={({ key }) => {
3554
if (!drillOption) {
3655
return;
3756
}
38-
if (key === 'enable') {
39-
if (!drillOption?.isSelectedDrill) {
40-
drillOption?.toggleSelectedDrill(true);
41-
onDrillOptionChange?.(drillOption);
42-
}
43-
} else if (key === 'disable') {
44-
if (drillOption?.isSelectedDrill) {
45-
drillOption?.toggleSelectedDrill(false);
46-
onDrillOptionChange?.(drillOption);
47-
}
57+
if (key === 'selectDrillStatus') {
58+
drillOption?.toggleSelectedDrill(!drillOption?.isSelectedDrill);
59+
onDrillOptionChange?.(drillOption);
4860
} else if (key === DrillMode.Drill) {
4961
drillOption?.drillDown();
5062
onDrillOptionChange?.(drillOption);
@@ -57,34 +69,27 @@ const ChartDrillContextMenu: FC<{}> = memo(({ children }) => {
5769
}
5870
}}
5971
>
60-
<Menu.Item key={'rollUp'}>{t('rollUp')}</Menu.Item>
61-
<Menu.Item
62-
disabled={drillOption?.mode === DrillMode.Expand}
63-
key={DrillMode.Drill}
64-
>
65-
{t('showNextLevel')}
66-
</Menu.Item>
67-
<Menu.Item
68-
disabled={drillOption?.mode === DrillMode.Drill}
69-
key={DrillMode.Expand}
70-
>
71-
{t('expandNextLevel')}
72-
</Menu.Item>
73-
<Menu.SubMenu
74-
disabled={drillOption?.mode === DrillMode.Expand}
75-
key="selectDrillStatus"
76-
title={t('selectDrillStatus')}
77-
>
78-
<Menu.Item key="enable" disabled={drillOption?.isSelectedDrill}>
79-
{t('enable')}
80-
</Menu.Item>
81-
<Menu.Item key="disable" disabled={!drillOption?.isSelectedDrill}>
82-
{t('disable')}
83-
</Menu.Item>
84-
</Menu.SubMenu>
85-
</Menu>
72+
{!!currentDrillLevel && (
73+
<Menu.Item key={'rollUp'}>{t('rollUp')}</Menu.Item>
74+
)}
75+
{drillOption?.mode !== DrillMode.Expand &&
76+
!drillOption?.isBottomLevel && (
77+
<Menu.Item key={DrillMode.Drill}>{t('showNextLevel')}</Menu.Item>
78+
)}
79+
{drillOption?.mode !== DrillMode.Drill &&
80+
!drillOption?.isBottomLevel && (
81+
<Menu.Item key={DrillMode.Expand}>{t('expandNextLevel')}</Menu.Item>
82+
)}
83+
{drillOption?.mode !== DrillMode.Expand && selectDrillStatusMenu}
84+
</StyledChartDrillMenu>
8685
);
87-
}, [drillOption, t, onDrillOptionChange]);
86+
}, [
87+
currentDrillLevel,
88+
t,
89+
drillOption,
90+
selectDrillStatusMenu,
91+
onDrillOptionChange,
92+
]);
8893

8994
return (
9095
<StyledChartDrill className="chart-drill-menu-container">
@@ -107,3 +112,33 @@ const StyledChartDrill = styled.div`
107112
position: relative;
108113
width: 100%;
109114
`;
115+
116+
const StyledChartDrillMenu = styled(Menu)`
117+
min-width: 200px;
118+
`;
119+
120+
const StyledMenuSwitch = styled.div`
121+
display: flex;
122+
align-items: center;
123+
124+
p {
125+
flex: 1;
126+
}
127+
128+
.icon {
129+
display: none;
130+
}
131+
132+
&.on {
133+
p {
134+
font-weight: ${FONT_WEIGHT_MEDIUM};
135+
}
136+
137+
.icon {
138+
display: block;
139+
flex-shrink: 0;
140+
padding-left: ${SPACE_SM};
141+
color: ${p => p.theme.success};
142+
}
143+
}
144+
`;

frontend/src/app/components/ChartDrill/ChartDrillPaths.tsx

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import ChartDrillContext from 'app/pages/ChartWorkbenchPage/contexts/ChartDrillC
2222
import { getColumnRenderName } from 'app/utils/chartHelper';
2323
import { FC, memo, useContext } from 'react';
2424
import styled from 'styled-components/macro';
25-
import { SPACE_TIMES } from 'styles/StyleConstants';
25+
import { SPACE_SM, SPACE_XS } from 'styles/StyleConstants';
2626

2727
const ChartDrillPaths: FC<{}> = memo(() => {
2828
const { drillOption, onDrillOptionChange } = useContext(ChartDrillContext);
@@ -33,11 +33,12 @@ const ChartDrillPaths: FC<{}> = memo(() => {
3333

3434
const drilledFields = drillOption.getDrilledFields();
3535
return (
36-
<StyledChartDrillPaths className="chart-drill-path">
36+
<StyledChartDrillPaths>
3737
<Breadcrumb>
3838
{drilledFields.map(f => {
3939
return (
4040
<StyledDrillNode
41+
key={f.uid}
4142
isActive={Boolean(
4243
drillOption?.getCurrentFields()?.some(df => df.uid === f.uid),
4344
)}
@@ -62,11 +63,12 @@ const ChartDrillPaths: FC<{}> = memo(() => {
6263
export default ChartDrillPaths;
6364

6465
const StyledChartDrillPaths = styled.div`
65-
padding-left: ${SPACE_TIMES(2)};
66+
padding: ${SPACE_XS} ${SPACE_SM};
67+
background-color: ${p => p.theme.componentBackground};
6668
`;
6769

6870
const StyledDrillNode = styled(Breadcrumb.Item)<{ isActive: boolean }>`
71+
color: ${p => (p.isActive ? p.theme.primary : p.theme.normal)} !important;
6972
cursor: pointer;
7073
user-select: none;
71-
color: ${p => (p.isActive ? p.theme.primary : p.theme.normal)} !important;
7274
`;

frontend/src/app/components/ChartGraph/BasicFunnelChart/BasicFunnelChart.tsx

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import ChartDataSetDTO, {
3131
import {
3232
getAutoFunnelTopPosition,
3333
getColumnRenderName,
34+
getDrillableRows,
3435
getExtraSeriesDataFormat,
3536
getExtraSeriesRowData,
3637
getGridStyle,
@@ -42,6 +43,7 @@ import {
4243
import { init } from 'echarts';
4344
import isEmpty from 'lodash/isEmpty';
4445
import Chart from '../../../models/Chart';
46+
import { ChartDrillOption } from '../../../models/ChartDrillOption';
4547
import Config from './config';
4648
import { Series, SeriesData } from './types';
4749

@@ -86,7 +88,11 @@ class BasicFunnelChart extends Chart {
8688
if (!this.isMatchRequirement(props.config)) {
8789
return;
8890
}
89-
const newOptions = this.getOptions(props.dataset, props.config);
91+
const newOptions = this.getOptions(
92+
props.dataset,
93+
props.config,
94+
props.drillOption,
95+
);
9096
this.chart?.setOption(Object.assign({}, newOptions), true);
9197
}
9298

@@ -98,12 +104,17 @@ class BasicFunnelChart extends Chart {
98104
this.chart?.resize({ width: context?.width, height: context?.height });
99105
}
100106

101-
private getOptions(dataset: ChartDataSetDTO, config: ChartConfig) {
107+
private getOptions(
108+
dataset: ChartDataSetDTO,
109+
config: ChartConfig,
110+
drillOption: ChartDrillOption,
111+
) {
102112
const styleConfigs = config.styles || [];
103113
const dataConfigs = config.datas || [];
104-
const groupConfigs = dataConfigs
105-
.filter(c => c.type === ChartDataSectionType.GROUP)
106-
.flatMap(config => config.rows || []);
114+
const groupConfigs: ChartDataSectionField[] = getDrillableRows(
115+
dataConfigs,
116+
drillOption,
117+
);
107118
const aggregateConfigs = dataConfigs
108119
.filter(c => c.type === ChartDataSectionType.AGGREGATE)
109120
.flatMap(config => config.rows || []);

frontend/src/app/components/ChartGraph/BasicFunnelChart/config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ const config: ChartConfig = {
3131
STRING: ['alias', 'colorize', 'sortable'],
3232
DATE: ['alias', 'colorize', 'sortable'],
3333
},
34+
drillable: true,
3435
},
3536
{
3637
label: 'metrics',

frontend/src/app/components/ChartGraph/BasicLineChart/BasicLineChart.tsx

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import {
3535
getAxisTick,
3636
getColorizeGroupSeriesColumns,
3737
getColumnRenderName,
38+
getDrillableRows,
3839
getExtraSeriesDataFormat,
3940
getExtraSeriesRowData,
4041
getGridStyle,
@@ -51,6 +52,7 @@ import {
5152
import { init } from 'echarts';
5253
import { UniqArray } from 'utils/object';
5354
import Chart from '../../../models/Chart';
55+
import { ChartDrillOption } from '../../../models/ChartDrillOption';
5456
import Config from './config';
5557
import { Series } from './types';
5658

@@ -97,7 +99,11 @@ class BasicLineChart extends Chart {
9799
this.chart?.clear();
98100
return;
99101
}
100-
const newOptions = this.getOptions(props.dataset, props.config);
102+
const newOptions = this.getOptions(
103+
props.dataset,
104+
props.config,
105+
props.drillOption,
106+
);
101107
this.chart?.setOption(Object.assign({}, newOptions), true);
102108
}
103109

@@ -110,13 +116,18 @@ class BasicLineChart extends Chart {
110116
this.chart?.dispose();
111117
}
112118

113-
private getOptions(dataset: ChartDataSetDTO, config: ChartConfig) {
119+
private getOptions(
120+
dataset: ChartDataSetDTO,
121+
config: ChartConfig,
122+
drillOption: ChartDrillOption,
123+
) {
114124
const styleConfigs = config.styles || [];
115125
const dataConfigs = config.datas || [];
116126
const settingConfigs = config.settings || [];
117-
const groupConfigs = dataConfigs
118-
.filter(c => c.type === ChartDataSectionType.GROUP)
119-
.flatMap(config => config.rows || []);
127+
const groupConfigs: ChartDataSectionField[] = getDrillableRows(
128+
dataConfigs,
129+
drillOption,
130+
);
120131
const aggregateConfigs = dataConfigs
121132
.filter(c => c.type === ChartDataSectionType.AGGREGATE)
122133
.flatMap(config => config.rows || []);
@@ -133,13 +144,17 @@ class BasicLineChart extends Chart {
133144
dataConfigs,
134145
);
135146

136-
const xAxisColumns: XAxisColumns[] = (groupConfigs || []).map(config => {
137-
return {
147+
const xAxisColumns: XAxisColumns[] = [
148+
{
138149
type: 'category',
139150
tooltip: { show: true },
140-
data: UniqArray(chartDataSet.map(dc => dc.getCell(config))),
141-
};
142-
});
151+
data: UniqArray(
152+
chartDataSet?.map(row => {
153+
return groupConfigs.map(g => row.getCell(g)).join('-');
154+
}),
155+
),
156+
},
157+
];
143158
const series = this.getSeries(
144159
settingConfigs,
145160
styleConfigs,
@@ -215,7 +230,6 @@ class BasicLineChart extends Chart {
215230
});
216231
}
217232

218-
const xAxisConfig = groupConfigs?.[0];
219233
const secondGroupInfos = getColorizeGroupSeriesColumns(
220234
chartDataSet,
221235
colorConfigs[0],
@@ -239,7 +253,9 @@ class BasicLineChart extends Chart {
239253
normal: { color: itemStyleColor?.value },
240254
},
241255
data: xAxisColumns[0].data.map(d => {
242-
const row = dataSet.find(r => r.getCell(xAxisConfig) === d)!;
256+
const row = dataSet.find(
257+
r => r.getMultiCell(...groupConfigs) === d,
258+
)!;
243259
return {
244260
...getExtraSeriesRowData(row),
245261
...getExtraSeriesDataFormat(aggConfig?.format),

frontend/src/app/components/ChartGraph/BasicLineChart/config.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ const config: ChartConfig = {
2525
key: 'dimension',
2626
required: true,
2727
type: 'group',
28-
limit: 1,
28+
limit: [1, 999],
29+
drillable: true,
2930
},
3031
{
3132
label: 'metrics',

0 commit comments

Comments
 (0)