Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
M
Metabase
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Iterations
Wiki
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Engineering Digital Service
Metabase
Commits
c59a1756
Unverified
Commit
c59a1756
authored
3 years ago
by
Alexander Polyankin
Committed by
GitHub
3 years ago
Browse files
Options
Downloads
Patches
Plain Diff
Merge events by pixel coordinates (#21282)
parent
f613e81a
Branches
Branches containing commit
Tags
Tags containing commit
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
frontend/src/metabase/visualizations/lib/LineAreaBarPostRender.js
+0
-7
0 additions, 7 deletions
.../src/metabase/visualizations/lib/LineAreaBarPostRender.js
frontend/src/metabase/visualizations/lib/timelines.js
+53
-47
53 additions, 47 deletions
frontend/src/metabase/visualizations/lib/timelines.js
with
53 additions
and
54 deletions
frontend/src/metabase/visualizations/lib/LineAreaBarPostRender.js
+
0
−
7
View file @
c59a1756
...
...
@@ -393,8 +393,6 @@ function onRenderAddTimelineEvents(
{
timelineEvents
,
selectedTimelineEventIds
,
xDomain
,
xInterval
,
isTimeseries
,
onHoverChange
,
onOpenTimelines
,
...
...
@@ -405,8 +403,6 @@ function onRenderAddTimelineEvents(
renderEvents
(
chart
,
{
events
:
timelineEvents
,
selectedEventIds
:
selectedTimelineEventIds
,
xDomain
,
xInterval
,
isTimeseries
,
onHoverChange
,
onOpenTimelines
,
...
...
@@ -423,7 +419,6 @@ function onRender(
timelineEvents
,
selectedTimelineEventIds
,
isSplitAxis
,
xDomain
,
xInterval
,
yAxisSplit
,
isStacked
,
...
...
@@ -457,8 +452,6 @@ function onRender(
onRenderAddTimelineEvents
(
chart
,
{
timelineEvents
,
selectedTimelineEventIds
,
xDomain
,
xInterval
,
isTimeseries
,
onHoverChange
,
onOpenTimelines
,
...
...
This diff is collapsed.
Click to expand it.
frontend/src/metabase/visualizations/lib/timelines.js
+
53
−
47
View file @
c59a1756
import
d3
from
"
d3
"
;
import
_
from
"
underscore
"
;
import
{
ICON_PATHS
}
from
"
metabase/icon_paths
"
;
import
{
stretchTimeseriesDomain
}
from
"
./apply_axis
"
;
import
timeseriesScale
from
"
./timeseriesScale
"
;
const
ICON_X
=
-
16
;
const
ICON_Y
=
10
;
const
ICON_SIZE
=
16
;
const
ICON_SCALE
=
0.45
;
const
ICON_X
=
-
ICON_SIZE
;
const
ICON_Y
=
10
;
const
RECT_SIZE
=
ICON_SIZE
*
2
;
const
TEXT_X
=
10
;
const
TEXT_Y
=
16
;
const
TEXT_DISTANCE
=
ICON_SIZE
*
2
;
const
RECT_SIZE
=
ICON_SIZE
*
2
;
function
get
X
Axis
(
chart
)
{
function
getAxis
(
chart
)
{
return
chart
.
svg
().
select
(
"
.axis.x
"
);
}
...
...
@@ -21,27 +18,42 @@ function getBrush(chart) {
return
chart
.
svg
().
select
(
"
.brush
"
);
}
function
getEventScale
(
chart
,
xDomain
,
xInterval
)
{
return
timeseriesScale
(
xInterval
)
.
domain
(
stretchTimeseriesDomain
(
xDomain
,
xInterval
))
.
range
([
0
,
chart
.
effectiveWidth
()]);
function
getScale
(
chart
)
{
return
chart
.
x
();
}
function
getEventMapping
(
events
,
xInterval
)
{
return
_
.
groupBy
(
events
,
event
=>
event
.
timestamp
.
clone
()
.
startOf
(
xInterval
.
interval
)
.
valueOf
(),
);
function
getEventMapping
(
events
,
scale
)
{
const
mapping
=
new
Map
();
let
group
=
[];
let
groupPoint
=
0
;
events
.
forEach
(
event
=>
{
const
eventPoint
=
scale
(
event
.
timestamp
);
const
groupDistance
=
eventPoint
-
groupPoint
;
if
(
!
group
.
length
||
groupDistance
<
ICON_SIZE
)
{
group
.
push
(
event
);
groupPoint
+=
(
eventPoint
-
groupPoint
)
/
group
.
length
;
}
else
{
mapping
.
set
(
groupPoint
,
group
);
group
=
[
event
];
groupPoint
=
eventPoint
;
}
});
if
(
group
.
length
)
{
mapping
.
set
(
groupPoint
,
group
);
}
return
mapping
;
}
function
getEvent
Date
s
(
eventMapping
)
{
return
Object
.
keys
(
eventMapping
).
map
(
value
=>
new
Date
(
parseInt
(
value
)
));
function
getEvent
Point
s
(
eventMapping
)
{
return
Array
.
from
(
eventMapping
.
keys
(
));
}
function
getEventGroups
(
eventMapping
)
{
return
Object
.
values
(
eventMapping
);
return
Array
.
from
(
eventMapping
.
values
()
);
}
function
isSelected
(
events
,
selectedEventIds
)
{
...
...
@@ -71,19 +83,19 @@ function getIconLabel(events) {
return
`
${
icon
}
icon`
;
}
function
isEventWithin
(
eventIndex
,
event
Scale
,
eventDate
s
,
eventDistance
)
{
const
this
Date
=
event
Date
s
[
eventIndex
];
const
prev
Date
=
event
Date
s
[
eventIndex
-
1
];
const
next
Date
=
event
Date
s
[
eventIndex
+
1
];
const
prevDistance
=
prevDate
&&
eventScale
(
thisDate
)
-
eventScale
(
prevDate
)
;
const
nextDistance
=
next
Date
&&
eventScale
(
nextDate
)
-
eventScale
(
thisDate
)
;
function
isEventWithin
(
eventIndex
,
event
Point
s
,
eventDistance
)
{
const
this
Point
=
event
Point
s
[
eventIndex
];
const
prev
Point
=
event
Point
s
[
eventIndex
-
1
]
??
Number
.
NEGATIVE_INFINITY
;
const
next
Point
=
event
Point
s
[
eventIndex
+
1
]
??
Number
.
POSITIVE_INFINITY
;
const
prevDistance
=
thisPoint
-
prevPoint
;
const
nextDistance
=
next
Point
-
thisPoint
;
return
prevDistance
<
eventDistance
||
nextDistance
<
eventDistance
;
}
function
hasEventText
(
events
,
eventIndex
,
event
Scale
,
eventDate
s
)
{
function
hasEventText
(
events
,
eventIndex
,
event
Point
s
)
{
if
(
events
.
length
>
1
)
{
return
!
isEventWithin
(
eventIndex
,
event
Scale
,
eventDate
s
,
TEXT_DISTANCE
);
return
!
isEventWithin
(
eventIndex
,
event
Point
s
,
TEXT_DISTANCE
);
}
else
{
return
false
;
}
...
...
@@ -92,8 +104,7 @@ function hasEventText(events, eventIndex, eventScale, eventDates) {
function
renderEventLines
({
chart
,
brush
,
eventScale
,
eventDates
,
eventPoints
,
eventGroups
,
selectedEventIds
,
})
{
...
...
@@ -106,8 +117,8 @@ function renderEventLines({
.
append
(
"
line
"
)
.
attr
(
"
class
"
,
"
event-line
"
)
.
classed
(
"
hover
"
,
d
=>
isSelected
(
d
,
selectedEventIds
))
.
attr
(
"
x1
"
,
(
d
,
i
)
=>
event
Scale
(
eventDate
s
[
i
])
)
.
attr
(
"
x2
"
,
(
d
,
i
)
=>
event
Scale
(
eventDate
s
[
i
])
)
.
attr
(
"
x1
"
,
(
d
,
i
)
=>
event
Point
s
[
i
])
.
attr
(
"
x2
"
,
(
d
,
i
)
=>
event
Point
s
[
i
])
.
attr
(
"
y1
"
,
"
0
"
)
.
attr
(
"
y2
"
,
brushHeight
);
}
...
...
@@ -115,8 +126,7 @@ function renderEventLines({
function
renderEventTicks
({
axis
,
brush
,
eventScale
,
eventDates
,
eventPoints
,
eventGroups
,
selectedEventIds
,
onHoverChange
,
...
...
@@ -141,7 +151,7 @@ function renderEventTicks({
.
append
(
"
g
"
)
.
attr
(
"
class
"
,
"
event-tick
"
)
.
classed
(
"
hover
"
,
d
=>
isSelected
(
d
,
selectedEventIds
))
.
attr
(
"
transform
"
,
(
d
,
i
)
=>
`translate(
${
event
Scale
(
eventDate
s
[
i
]
)
}
, 0)`
);
.
attr
(
"
transform
"
,
(
d
,
i
)
=>
`translate(
${
event
Point
s
[
i
]}
, 0)`
);
eventTicks
.
append
(
"
path
"
)
...
...
@@ -159,7 +169,7 @@ function renderEventTicks({
.
attr
(
"
transform
"
,
()
=>
getIconTransform
());
eventTicks
.
filter
((
d
,
i
)
=>
hasEventText
(
d
,
i
,
event
Scale
,
eventDate
s
))
.
filter
((
d
,
i
)
=>
hasEventText
(
d
,
i
,
event
Point
s
))
.
append
(
"
text
"
)
.
attr
(
"
class
"
,
"
event-text
"
)
.
attr
(
"
transform
"
,
`translate(
${
TEXT_X
}
,
${
TEXT_Y
}
)`
)
...
...
@@ -199,27 +209,24 @@ export function renderEvents(
{
events
=
[],
selectedEventIds
=
[],
xDomain
=
[],
xInterval
=
{},
onHoverChange
,
onOpenTimelines
,
onSelectTimelineEvents
,
onDeselectTimelineEvents
,
},
)
{
const
axis
=
get
X
Axis
(
chart
);
const
axis
=
getAxis
(
chart
);
const
brush
=
getBrush
(
chart
);
const
eventS
cale
=
get
Event
Scale
(
chart
,
xDomain
,
xInterval
);
const
eventMapping
=
getEventMapping
(
events
,
xInterv
al
);
const
event
Date
s
=
getEvent
Date
s
(
eventMapping
);
const
s
cale
=
getScale
(
chart
);
const
eventMapping
=
getEventMapping
(
events
,
sc
al
e
);
const
event
Point
s
=
getEvent
Point
s
(
eventMapping
);
const
eventGroups
=
getEventGroups
(
eventMapping
);
if
(
brush
)
{
renderEventLines
({
chart
,
brush
,
eventScale
,
eventDates
,
eventPoints
,
eventGroups
,
selectedEventIds
,
});
...
...
@@ -229,8 +236,7 @@ export function renderEvents(
renderEventTicks
({
axis
,
brush
,
eventScale
,
eventDates
,
eventPoints
,
eventGroups
,
selectedEventIds
,
onHoverChange
,
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment