@@ -4,11 +4,12 @@ import * as ChartClient from '../ChartClient';
4
4
import * as ChartUtils from './Components/ChartUtils';
5
5
import { translate, scale, rotate, skewX, skewY, matrix, scaleFor } from './Components/ChartUtils';
6
6
import { ChartRow, ChartScriptProps } from '../ChartClient';
7
-
import TextEllipsis from './Components/TextEllipsis';
8
7
import { XKeyTicks, YScaleTicks, YKeyTicks, XScaleTicks } from './Components/Ticks';
9
8
import { XAxis, YAxis } from './Components/Axis';
10
9
import { Rule } from './Components/Rule';
11
10
import InitialMessage from './Components/InitialMessage';
11
+
import TextIfFits from './Components/TextIfFits';
12
+
import TextEllipsis from './Components/TextEllipsis';
12
13
13
14
14
15
export default function renderBars({ data, width, height, parameters, loading, onDrillDown, initialLoad, chartRequest, memo, dashboardFilter }: ChartScriptProps): React.ReactElement<any> {
@@ -70,6 +71,8 @@ export default function renderBars({ data, width, height, parameters, loading, o
70
71
71
72
var detector = dashboardFilter?.getActiveDetector(chartRequest);
72
73
74
+
const bandMargin = y.bandwidth() > 20 ? 2 : 0;
75
+
73
76
return (
74
77
<svg direction="ltr" width={width} height={height}>
75
78
<g opacity={dashboardFilter ? .5 : undefined}>
@@ -79,98 +82,85 @@ export default function renderBars({ data, width, height, parameters, loading, o
79
82
80
83
{/*PAINT GRAPH*/}
81
84
<g className="shape" transform={translate(xRule.start('content'), yRule.start('content'))}>
82
-
{orderedRows.map(r => {
85
+
{keyValues.map(k => {
83
86
84
-
var active = detector?.(r);
87
+
var key = keyColumn.getKey(k);
85
88
86
-
var key = keyColumn.getValueKey(r);
89
+
var row: ChartRow | undefined = rowsByKey[key];
90
+
var active = detector?.(row);
87
91
88
-
return (
89
-
<rect key={key} className="shape sf-transition"
90
-
opacity={active == false ? .5 : undefined}
91
-
stroke={active == true ? "black" : y.bandwidth() > 4 ? '#fff' : undefined}
92
-
strokeWidth={active == true ? 3 : undefined}
93
-
transform={translate(0, y(key)!) + (initialLoad ? scale(0, 1) : scale(1, 1))}
94
-
width={x(valueColumn.getValue(r))}
95
-
height={y.bandwidth()}
96
-
fill={keyColumn.getValueColor(r) ?? color(key)}
97
-
onClick={e => onDrillDown(r, e)}
98
-
cursor="pointer">
99
-
<title>
100
-
{keyColumn.getValueNiceName(r) + ': ' + valueColumn.getValueNiceName(r)}
101
-
</title>
102
-
</rect>
103
-
);
104
-
})}
105
-
</g>
92
+
var posx = x(row ? valueColumn.getValue(row) : 0)!;
106
93
107
-
{y.bandwidth() > 15 &&
108
-
(isMargin ?
109
-
<g className="y-label" transform={translate(xRule.end('labels'), yRule.start('content') + y.bandwidth() / 2)}>
110
-
{(isAll ? keyValues : orderedRows.map(r => keyColumn.getValue(r))).map(k => <TextEllipsis key={keyColumn.getKey(k)}
111
-
transform={translate(0, y(keyColumn.getKey(k))!)}
112
-
maxWidth={xRule.size('labels')}
113
-
padding={labelMargin}
114
-
className="y-label sf-transition"
115
-
fill={(keyColumn.getColor(k) ?? color(keyColumn.getKey(k)))}
116
-
dominantBaseline="middle"
117
-
textAnchor="end"
118
-
fontWeight="bold"
119
-
onClick={e => onDrillDown({ c0: k }, e)}
120
-
cursor="pointer">
121
-
{keyColumn.getNiceName(k)}
122
-
</TextEllipsis>)}
123
-
</g> :
124
-
isInside ?
125
-
<g className="y-label" transform={translate(xRule.start('content') + labelMargin, yRule.start('content') + y.bandwidth() / 2)}>
126
-
{(isAll ? keyValues : orderedRows.map(r => keyColumn.getValue(r))).map(k => {
127
-
128
-
var row = rowsByKey[keyColumn.getKey(k)];
129
-
130
-
var posx = x(row ? valueColumn.getValue(row) : 0)!;
131
-
return (
132
-
<TextEllipsis key={keyColumn.getKey(k)}
133
-
transform={translate(posx >= size / 2 ? 0 : posx, y(keyColumn.getKey(k))!)}
134
-
maxWidth={posx >= size / 2 ? posx : size - posx}
94
+
return (
95
+
<g className="shadow-group" key={key}>
96
+
{row && <rect className="shape sf-transition shadow"
97
+
opacity={active == false ? .5 : undefined}
98
+
transform={translate(0, y(key)! + bandMargin) + (initialLoad ? scale(0, 1) : scale(1, 1))}
99
+
width={x(valueColumn.getValue(row))}
100
+
height={y.bandwidth() - bandMargin * 2}
101
+
fill={keyColumn.getValueColor(row) ?? color(key)}
102
+
onClick={e => onDrillDown(row!, e)}
103
+
cursor="pointer">
104
+
<title>
105
+
{keyColumn.getValueNiceName(row) + ': ' + valueColumn.getValueNiceName(row)}
106
+
</title>
107
+
</rect>
108
+
}
109
+
{y.bandwidth() > 15 && (isAll || row != null) &&
110
+
(isMargin ?
111
+
<g className="y-label" transform={translate(-labelMargin, y.bandwidth() / 2)}>
112
+
<TextEllipsis
113
+
transform={translate(0, y(keyColumn.getKey(key))!)}
114
+
maxWidth={xRule.size('labels')}
115
+
padding={labelMargin}
116
+
className="y-label sf-transition"
117
+
fill={(keyColumn.getColor(key) ?? color(keyColumn.getKey(key)))}
118
+
dominantBaseline="middle"
119
+
textAnchor="end"
120
+
fontWeight="bold"
121
+
onClick={e => onDrillDown({ c0: key }, e)}
122
+
cursor="pointer">
123
+
{keyColumn.getNiceName(key)}
124
+
</TextEllipsis>)
125
+
</g> :
126
+
isInside ?
127
+
<g className="y-label" transform={translate(labelMargin, y.bandwidth() / 2)}>
128
+
<TextEllipsis
129
+
transform={translate(posx >= size / 2 ? 0 : posx, y(keyColumn.getKey(key))!)}
130
+
maxWidth={posx >= size / 2 ? posx : size - posx}
131
+
padding={labelMargin}
132
+
className="y-label sf-transition"
133
+
fill={posx >= size / 2 ? '#fff' : (keyColumn.getColor(key) ?? color(keyColumn.getKey(key)))}
134
+
dominantBaseline="middle"
135
+
fontWeight="bold"
136
+
onClick={e => onDrillDown({ c0: key }, e)}
137
+
cursor="pointer">
138
+
{keyColumn.getNiceName(key)}
139
+
</TextEllipsis>
140
+
</g> : null
141
+
)}
142
+
{y.bandwidth() > 15 && parseFloat(parameters["NumberOpacity"]) > 0 && row &&
143
+
<g className="numbers-label">
144
+
<TextIfFits
145
+
transform={translate(x(valueColumn.getValue(row))! / 2, y(keyColumn.getValueKey(row))! + y.bandwidth() / 2)}
146
+
maxWidth={x(valueColumn.getValue(row))!}
135
147
padding={labelMargin}
136
-
className="y-label sf-transition"
137
-
fill={posx >= size / 2 ? '#fff' : (keyColumn.getColor(k) ?? color(keyColumn.getKey(k)))}
148
+
className="number-label sf-transition"
149
+
fill={parameters["NumberColor"] ?? "#000"}
138
150
dominantBaseline="middle"
151
+
opacity={parameters["NumberOpacity"]}
152
+
textAnchor="middle"
139
153
fontWeight="bold"
140
-
onClick={e => onDrillDown({ c0: k }, e)}
154
+
onClick={e => onDrillDown(row!, e)}
141
155
cursor="pointer">
142
-
{keyColumn.getNiceName(k)}
143
-
</TextEllipsis>
144
-
);
145
-
})}
146
-
</g> : null
147
-
)}
148
-
149
-
{y.bandwidth() > 15 && parseFloat(parameters["NumberOpacity"]) > 0 &&
150
-
<g className="numbers-label" transform={translate(xRule.start('content'), yRule.start('content'))}>
151
-
{orderedRows
152
-
.filter(r => x(valueColumn.getValue(r))! > 20)
153
-
.map(r => {
154
-
var posx = x(valueColumn.getValue(r))!;
155
-
156
-
return (<TextEllipsis key={keyColumn.getValueKey(r)}
157
-
transform={translate(x(valueColumn.getValue(r))! / 2, y(keyColumn.getValueKey(r))! + y.bandwidth() / 2)}
158
-
maxWidth={posx >= size / 2 ? posx : size - posx}
159
-
padding={labelMargin}
160
-
className="number-label sf-transition"
161
-
fill={parameters["NumberColor"] ?? "#000"}
162
-
dominantBaseline="middle"
163
-
opacity={parameters["NumberOpacity"]}
164
-
textAnchor="middle"
165
-
fontWeight="bold"
166
-
onClick={e => onDrillDown(r, e)}
167
-
cursor="pointer">
168
-
{valueColumn.getValueNiceName(r)}
169
-
</TextEllipsis>);
170
-
})}
171
-
</g>
172
-
}
173
-
156
+
{valueColumn.getValueNiceName(row)}
157
+
</TextIfFits>
158
+
</g>
159
+
}
160
+
</g>
161
+
);
162
+
})}
163
+
</g>
174
164
<InitialMessage data={data} x={xRule.middle("content")} y={yRule.middle("content")} loading={loading} />
175
165
<g opacity={dashboardFilter ? .5 : undefined}>
176
166
<XAxis xRule={xRule} yRule={yRule} />
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4