Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
N
nexpie-grafana-theme
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Registry
Registry
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Kornkitt Poolsup
nexpie-grafana-theme
Commits
a0fa5698
Commit
a0fa5698
authored
Mar 17, 2019
by
ryan
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
rename reducer to statsCalculator
parent
29695077
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
107 additions
and
118 deletions
+107
-118
packages/grafana-ui/src/components/StatsPicker/StatsPicker.story.tsx
+17
-17
packages/grafana-ui/src/components/StatsPicker/StatsPicker.tsx
+17
-17
packages/grafana-ui/src/utils/statsCalculator.test.ts
+73
-0
packages/grafana-ui/src/utils/statsCalculator.ts
+0
-0
packages/grafana-ui/src/utils/tableReducer.test.ts
+0
-84
No files found.
packages/grafana-ui/src/components/
TableReducePicker/TableReduce
Picker.story.tsx
→
packages/grafana-ui/src/components/
StatsPicker/Stats
Picker.story.tsx
View file @
a0fa5698
...
@@ -3,45 +3,45 @@ import React, { PureComponent } from 'react';
...
@@ -3,45 +3,45 @@ import React, { PureComponent } from 'react';
import
{
storiesOf
}
from
'@storybook/react'
;
import
{
storiesOf
}
from
'@storybook/react'
;
import
{
action
}
from
'@storybook/addon-actions'
;
import
{
action
}
from
'@storybook/addon-actions'
;
import
{
withCenteredStory
}
from
'../../utils/storybook/withCenteredStory'
;
import
{
withCenteredStory
}
from
'../../utils/storybook/withCenteredStory'
;
import
{
TableReducePicker
}
from
'./TableReduce
Picker'
;
import
{
StatsPicker
}
from
'./Stats
Picker'
;
import
{
text
,
boolean
}
from
'@storybook/addon-knobs'
;
import
{
text
,
boolean
}
from
'@storybook/addon-knobs'
;
interface
State
{
interface
State
{
reducer
s
:
string
[];
stat
s
:
string
[];
}
}
export
class
WrapperWithState
extends
PureComponent
<
any
,
State
>
{
export
class
WrapperWithState
extends
PureComponent
<
any
,
State
>
{
constructor
(
props
:
any
)
{
constructor
(
props
:
any
)
{
super
(
props
);
super
(
props
);
this
.
state
=
{
this
.
state
=
{
reducers
:
this
.
toReducer
sArray
(
props
.
initialReducers
),
stats
:
this
.
toStat
sArray
(
props
.
initialReducers
),
};
};
}
}
to
Reducer
sArray
=
(
txt
:
string
):
string
[]
=>
{
to
Stat
sArray
=
(
txt
:
string
):
string
[]
=>
{
return
txt
.
split
(
','
).
map
(
v
=>
v
.
trim
());
return
txt
.
split
(
','
).
map
(
v
=>
v
.
trim
());
};
};
componentDidUpdate
(
prevProps
:
any
)
{
componentDidUpdate
(
prevProps
:
any
)
{
const
{
initialReducers
}
=
this
.
props
;
const
{
initialReducers
}
=
this
.
props
;
if
(
initialReducers
!==
prevProps
.
initialReducers
)
{
if
(
initialReducers
!==
prevProps
.
initialReducers
)
{
this
.
setState
({
reducers
:
this
.
toReducer
sArray
(
initialReducers
)
});
this
.
setState
({
stats
:
this
.
toStat
sArray
(
initialReducers
)
});
}
}
}
}
render
()
{
render
()
{
const
{
placeholder
,
default
Reducer
,
allowMultiple
}
=
this
.
props
;
const
{
placeholder
,
default
Stat
,
allowMultiple
}
=
this
.
props
;
const
{
reducer
s
}
=
this
.
state
;
const
{
stat
s
}
=
this
.
state
;
return
(
return
(
<
TableReduce
Picker
<
Stats
Picker
placeholder=
{
placeholder
}
placeholder=
{
placeholder
}
default
Reducer=
{
defaultReducer
}
default
Stat=
{
defaultStat
}
allowMultiple=
{
allowMultiple
}
allowMultiple=
{
allowMultiple
}
reducers=
{
reducer
s
}
stats=
{
stat
s
}
onChange=
{
(
reducer
s
:
string
[])
=>
{
onChange=
{
(
stat
s
:
string
[])
=>
{
action
(
'Picked:'
)(
reducer
s
);
action
(
'Picked:'
)(
stat
s
);
this
.
setState
({
reducer
s
});
this
.
setState
({
stat
s
});
}
}
}
}
/>
/>
);
);
...
@@ -52,16 +52,16 @@ const story = storiesOf('UI/TableReducePicker', module);
...
@@ -52,16 +52,16 @@ const story = storiesOf('UI/TableReducePicker', module);
story
.
addDecorator
(
withCenteredStory
);
story
.
addDecorator
(
withCenteredStory
);
story
.
add
(
'picker'
,
()
=>
{
story
.
add
(
'picker'
,
()
=>
{
const
placeholder
=
text
(
'Placeholder Text'
,
''
);
const
placeholder
=
text
(
'Placeholder Text'
,
''
);
const
default
Reducer
=
text
(
'Default Reducer
'
,
''
);
const
default
Stat
=
text
(
'Default Stat
'
,
''
);
const
allowMultiple
=
boolean
(
'Allow Multiple'
,
false
);
const
allowMultiple
=
boolean
(
'Allow Multiple'
,
false
);
const
initial
Reducers
=
text
(
'Initial Reducer
s'
,
''
);
const
initial
Stats
=
text
(
'Initial Stat
s'
,
''
);
return
(
return
(
<
div
>
<
div
>
<
WrapperWithState
<
WrapperWithState
placeholder=
{
placeholder
}
placeholder=
{
placeholder
}
default
Reducer=
{
defaultReducer
}
default
Stat=
{
defaultStat
}
allowMultiple=
{
allowMultiple
}
allowMultiple=
{
allowMultiple
}
initial
Reducers=
{
initialReducer
s
}
initial
Stats=
{
initialStat
s
}
/>
/>
</
div
>
</
div
>
);
);
...
...
packages/grafana-ui/src/components/
TableReducePicker/TableReduce
Picker.tsx
→
packages/grafana-ui/src/components/
StatsPicker/Stats
Picker.tsx
View file @
a0fa5698
...
@@ -4,19 +4,19 @@ import isArray from 'lodash/isArray';
...
@@ -4,19 +4,19 @@ import isArray from 'lodash/isArray';
import
{
Select
}
from
'../index'
;
import
{
Select
}
from
'../index'
;
import
{
get
TableReducers
}
from
'../../utils/tableReduce
r'
;
import
{
get
StatsCalculators
}
from
'../../utils/statsCalculato
r'
;
import
{
SelectOptionItem
}
from
'../Select/Select'
;
import
{
SelectOptionItem
}
from
'../Select/Select'
;
interface
Props
{
interface
Props
{
placeholder
?:
string
;
placeholder
?:
string
;
onChange
:
(
reducer
s
:
string
[])
=>
void
;
onChange
:
(
stat
s
:
string
[])
=>
void
;
reducer
s
:
string
[];
stat
s
:
string
[];
width
?:
number
;
width
?:
number
;
allowMultiple
?:
boolean
;
allowMultiple
?:
boolean
;
default
Reducer
?:
string
;
default
Stat
?:
string
;
}
}
export
class
TableReduce
Picker
extends
PureComponent
<
Props
>
{
export
class
Stats
Picker
extends
PureComponent
<
Props
>
{
static
defaultProps
=
{
static
defaultProps
=
{
width
:
12
,
width
:
12
,
allowMultiple
:
false
,
allowMultiple
:
false
,
...
@@ -31,25 +31,25 @@ export class TableReducePicker extends PureComponent<Props> {
...
@@ -31,25 +31,25 @@ export class TableReducePicker extends PureComponent<Props> {
}
}
checkInput
=
()
=>
{
checkInput
=
()
=>
{
const
{
reducers
,
allowMultiple
,
defaultReducer
,
onChange
}
=
this
.
props
;
const
{
stats
,
allowMultiple
,
defaultStat
,
onChange
}
=
this
.
props
;
// Check that the selected reducers are all real
// Check that the selected reducers are all real
const
notFound
:
string
[]
=
[];
const
notFound
:
string
[]
=
[];
const
current
=
get
TableReducers
(
reducer
s
,
notFound
);
const
current
=
get
StatsCalculators
(
stat
s
,
notFound
);
if
(
notFound
.
length
>
0
)
{
if
(
notFound
.
length
>
0
)
{
console
.
warn
(
'Unknown reducers'
,
notFound
,
reducer
s
);
console
.
warn
(
'Unknown reducers'
,
notFound
,
stat
s
);
onChange
(
current
.
map
(
reducer
=>
reducer
.
value
));
onChange
(
current
.
map
(
reducer
=>
reducer
.
value
));
}
}
// Make sure there is only one
// Make sure there is only one
if
(
!
allowMultiple
&&
reducer
s
.
length
>
1
)
{
if
(
!
allowMultiple
&&
stat
s
.
length
>
1
)
{
console
.
warn
(
'Removing extra
reducers'
,
reducer
s
);
console
.
warn
(
'Removing extra
stat'
,
stat
s
);
onChange
([
reducer
s
[
0
]]);
onChange
([
stat
s
[
0
]]);
}
}
// Set the reducer from callback
// Set the reducer from callback
if
(
default
Reducer
&&
reducer
s
.
length
<
1
)
{
if
(
default
Stat
&&
stat
s
.
length
<
1
)
{
onChange
([
default
Reducer
]);
onChange
([
default
Stat
]);
}
}
};
};
...
@@ -63,17 +63,17 @@ export class TableReducePicker extends PureComponent<Props> {
...
@@ -63,17 +63,17 @@ export class TableReducePicker extends PureComponent<Props> {
};
};
render
()
{
render
()
{
const
{
width
,
reducers
,
allowMultiple
,
defaultReducer
,
placeholder
}
=
this
.
props
;
const
{
width
,
stats
,
allowMultiple
,
defaultStat
,
placeholder
}
=
this
.
props
;
const
current
=
get
TableReducers
(
reducer
s
);
const
current
=
get
StatsCalculators
(
stat
s
);
return
(
return
(
<
Select
<
Select
width=
{
width
}
width=
{
width
}
value=
{
current
}
value=
{
current
}
isClearable=
{
!
default
Reducer
}
isClearable=
{
!
default
Stat
}
isMulti=
{
allowMultiple
}
isMulti=
{
allowMultiple
}
isSearchable=
{
true
}
isSearchable=
{
true
}
options=
{
get
TableReduce
rs
()
}
options=
{
get
StatsCalculato
rs
()
}
placeholder=
{
placeholder
}
placeholder=
{
placeholder
}
onChange=
{
this
.
onSelectionChange
}
onChange=
{
this
.
onSelectionChange
}
/>
/>
...
...
packages/grafana-ui/src/utils/statsCalculator.test.ts
0 → 100644
View file @
a0fa5698
import
{
parseCSV
}
from
'./processTableData'
;
import
{
getStatsCalculators
,
StatID
,
calculateStats
}
from
'./statsCalculator'
;
describe
(
'Stats Calculators'
,
()
=>
{
const
basicTable
=
parseCSV
(
'a,b,c
\
n10,20,30
\
n20,30,40'
);
it
(
'should load all standard stats'
,
()
=>
{
const
names
=
[
StatID
.
sum
,
StatID
.
max
,
StatID
.
min
,
StatID
.
logmin
,
StatID
.
mean
,
StatID
.
last
,
StatID
.
first
,
StatID
.
count
,
StatID
.
range
,
StatID
.
diff
,
StatID
.
step
,
StatID
.
delta
,
// StatID.allIsZero,
// StatID.allIsNull,
];
const
notFound
:
string
[]
=
[];
const
stats
=
getStatsCalculators
(
names
,
notFound
);
stats
.
forEach
((
stat
,
index
)
=>
{
expect
(
stat
?
stat
.
value
:
'<missing>'
).
toEqual
(
names
[
index
]);
});
expect
(
notFound
.
length
).
toBe
(
0
);
});
it
(
'should fail to load unknown stats'
,
()
=>
{
const
names
=
[
'not a stat'
,
StatID
.
max
,
StatID
.
min
,
'also not a stat'
];
const
notFound
:
string
[]
=
[];
const
stats
=
getStatsCalculators
(
names
,
notFound
);
expect
(
stats
.
length
).
toBe
(
2
);
expect
(
notFound
.
length
).
toBe
(
2
);
});
it
(
'should calculate stats'
,
()
=>
{
const
stats
=
calculateStats
({
data
:
basicTable
,
columnIndex
:
0
,
stats
:
[
'first'
,
'last'
,
'mean'
],
});
// First
expect
(
stats
.
first
).
toEqual
(
10
);
// Last
expect
(
stats
.
last
).
toEqual
(
20
);
// Mean
expect
(
stats
.
mean
).
toEqual
(
15
);
});
it
(
'should support a single stat also'
,
()
=>
{
const
stats
=
calculateStats
({
data
:
basicTable
,
columnIndex
:
0
,
stats
:
[
'first'
,
'last'
,
'mean'
],
});
// First
expect
(
stats
.
first
).
toEqual
(
10
);
// Last
expect
(
stats
.
last
).
toEqual
(
20
);
// Mean
expect
(
stats
.
mean
).
toEqual
(
15
);
});
});
packages/grafana-ui/src/utils/
tableReduce
r.ts
→
packages/grafana-ui/src/utils/
statsCalculato
r.ts
View file @
a0fa5698
This diff is collapsed.
Click to expand it.
packages/grafana-ui/src/utils/tableReducer.test.ts
deleted
100644 → 0
View file @
29695077
import
{
parseCSV
}
from
'./processTableData'
;
import
{
reduceTableData
,
getTableReducers
,
TableReducerID
}
from
'./tableReducer'
;
describe
(
'Table Reducer'
,
()
=>
{
const
basicTable
=
parseCSV
(
'a,b,c
\
n10,20,30
\
n20,30,40'
);
it
(
'should load all standard stats'
,
()
=>
{
const
names
=
[
TableReducerID
.
sum
,
TableReducerID
.
max
,
TableReducerID
.
min
,
TableReducerID
.
logmin
,
TableReducerID
.
mean
,
TableReducerID
.
last
,
TableReducerID
.
first
,
TableReducerID
.
count
,
TableReducerID
.
range
,
TableReducerID
.
diff
,
TableReducerID
.
step
,
TableReducerID
.
delta
,
// TableReducerID.allIsZero,
// TableReducerID.allIsNull,
];
const
notFound
:
string
[]
=
[];
const
reducers
=
getTableReducers
(
names
,
notFound
);
reducers
.
forEach
((
reducer
,
index
)
=>
{
expect
(
reducer
?
reducer
.
value
:
'<missing>'
).
toEqual
(
names
[
index
]);
});
expect
(
notFound
.
length
).
toBe
(
0
);
});
it
(
'should fail to load unknown reducers'
,
()
=>
{
const
names
=
[
'not a reducer'
,
TableReducerID
.
max
,
TableReducerID
.
min
,
'also not a reducer'
];
const
notFound
:
string
[]
=
[];
const
reducers
=
getTableReducers
(
names
,
notFound
);
expect
(
reducers
.
length
).
toBe
(
2
);
expect
(
notFound
.
length
).
toBe
(
2
);
});
it
(
'should calculate stats'
,
()
=>
{
const
reduced
=
reduceTableData
(
basicTable
,
{
columnIndexes
:
[
0
,
1
],
stats
:
[
'first'
,
'last'
,
'mean'
],
});
expect
(
reduced
.
length
).
toBe
(
3
);
// First
expect
(
reduced
[
0
].
rows
[
0
]).
toEqual
([
10
,
20
]);
// Last
expect
(
reduced
[
1
].
rows
[
0
]).
toEqual
([
20
,
30
]);
// Mean
expect
(
reduced
[
2
].
rows
[
0
]).
toEqual
([
15
,
25
]);
});
it
(
'should support a single stat also'
,
()
=>
{
// First
let
reduced
=
reduceTableData
(
basicTable
,
{
columnIndexes
:
[
0
,
1
],
stats
:
[
'first'
],
});
expect
(
reduced
.
length
).
toBe
(
1
);
expect
(
reduced
[
0
].
rows
[
0
]).
toEqual
([
10
,
20
]);
// Last
reduced
=
reduceTableData
(
basicTable
,
{
columnIndexes
:
[
0
,
1
],
stats
:
[
'last'
],
});
expect
(
reduced
.
length
).
toBe
(
1
);
expect
(
reduced
[
0
].
rows
[
0
]).
toEqual
([
20
,
30
]);
// Mean
reduced
=
reduceTableData
(
basicTable
,
{
columnIndexes
:
[
0
,
1
],
stats
:
[
'mean'
],
});
expect
(
reduced
.
length
).
toBe
(
1
);
expect
(
reduced
[
0
].
rows
[
0
]).
toEqual
([
15
,
25
]);
});
});
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment