Enric Tobella
4 years ago
18 changed files with 16002 additions and 27 deletions
-
4kpi_dashboard/__manifest__.py
-
3kpi_dashboard/models/kpi_kpi.py
-
0kpi_dashboard/security/security.xml
-
9503kpi_dashboard/static/lib/nvd3/d3.v3.js
-
427kpi_dashboard/static/lib/nvd3/nv.d3.css
-
5985kpi_dashboard/static/lib/nvd3/nv.d3.js
-
7kpi_dashboard/static/src/js/dashboard_controller.js
-
2kpi_dashboard/static/src/js/dashboard_model.js
-
1kpi_dashboard/static/src/js/dashboard_renderer.js
-
50kpi_dashboard/static/src/js/lib/nvd3.js
-
9kpi_dashboard/static/src/js/widget/abstract_widget.js
-
1kpi_dashboard/static/src/js/widget/counter_widget.js
-
13kpi_dashboard/static/src/js/widget/graph_widget.js
-
5kpi_dashboard/static/src/js/widget/integer_widget.js
-
4kpi_dashboard/static/src/js/widget/meter_widget.js
-
8kpi_dashboard/tests/test_formula.py
-
4kpi_dashboard/tests/test_kpi_dashboard.py
-
3kpi_dashboard/wizards/kpi_dashboard_menu.py
9503
kpi_dashboard/static/lib/nvd3/d3.v3.js
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,427 @@ |
|||||
|
/* nvd3 version 1.8.2-dev (https://github.com/novus/nvd3) 2016-02-08 */ |
||||
|
.nvd3 .nv-axis { |
||||
|
pointer-events:none; |
||||
|
opacity: 1; |
||||
|
} |
||||
|
|
||||
|
.nvd3 .nv-axis path { |
||||
|
fill: none; |
||||
|
stroke: #000; |
||||
|
stroke-opacity: .75; |
||||
|
shape-rendering: crispEdges; |
||||
|
} |
||||
|
|
||||
|
.nvd3 .nv-axis path.domain { |
||||
|
stroke-opacity: .75; |
||||
|
} |
||||
|
|
||||
|
.nvd3 .nv-axis.nv-x path.domain { |
||||
|
stroke-opacity: 0; |
||||
|
} |
||||
|
|
||||
|
.nvd3 .nv-axis line { |
||||
|
fill: none; |
||||
|
stroke: #e5e5e5; |
||||
|
shape-rendering: crispEdges; |
||||
|
} |
||||
|
|
||||
|
.nvd3 .nv-axis .zero line, |
||||
|
/*this selector may not be necessary*/ .nvd3 .nv-axis line.zero { |
||||
|
stroke-opacity: .75; |
||||
|
} |
||||
|
|
||||
|
.nvd3 .nv-axis .nv-axisMaxMin text { |
||||
|
font-weight: bold; |
||||
|
} |
||||
|
|
||||
|
.nvd3 .x .nv-axis .nv-axisMaxMin text, |
||||
|
.nvd3 .x2 .nv-axis .nv-axisMaxMin text, |
||||
|
.nvd3 .x3 .nv-axis .nv-axisMaxMin text { |
||||
|
text-anchor: middle |
||||
|
} |
||||
|
|
||||
|
.nvd3 .nv-axis.nv-disabled { |
||||
|
opacity: 0; |
||||
|
} |
||||
|
|
||||
|
/* scatter */ |
||||
|
.nvd3 .nv-groups .nv-point.hover { |
||||
|
stroke-width: 20px; |
||||
|
stroke-opacity: .5; |
||||
|
} |
||||
|
|
||||
|
.nvd3 .nv-scatter .nv-point.hover { |
||||
|
fill-opacity: 1; |
||||
|
} |
||||
|
.nv-noninteractive { |
||||
|
pointer-events: none; |
||||
|
} |
||||
|
|
||||
|
.nv-distx, .nv-disty { |
||||
|
pointer-events: none; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
.nvtooltip { |
||||
|
position: absolute; |
||||
|
background-color: rgba(255,255,255,1.0); |
||||
|
color: rgba(0,0,0,1.0); |
||||
|
padding: 1px; |
||||
|
border: 1px solid rgba(0,0,0,.2); |
||||
|
z-index: 10000; |
||||
|
display: block; |
||||
|
|
||||
|
font-family: Arial; |
||||
|
font-size: 13px; |
||||
|
text-align: left; |
||||
|
pointer-events: none; |
||||
|
|
||||
|
white-space: nowrap; |
||||
|
|
||||
|
-webkit-touch-callout: none; |
||||
|
-webkit-user-select: none; |
||||
|
-khtml-user-select: none; |
||||
|
-moz-user-select: none; |
||||
|
-ms-user-select: none; |
||||
|
user-select: none; |
||||
|
} |
||||
|
|
||||
|
.nvtooltip { |
||||
|
background: rgba(255,255,255, 0.8); |
||||
|
border: 1px solid rgba(0,0,0,0.5); |
||||
|
border-radius: 4px; |
||||
|
} |
||||
|
|
||||
|
/*Give tooltips that old fade in transition by |
||||
|
putting a "with-transitions" class on the container div. |
||||
|
*/ |
||||
|
.nvtooltip.with-transitions, .with-transitions .nvtooltip { |
||||
|
transition: opacity 50ms linear; |
||||
|
-moz-transition: opacity 50ms linear; |
||||
|
-webkit-transition: opacity 50ms linear; |
||||
|
|
||||
|
transition-delay: 200ms; |
||||
|
-moz-transition-delay: 200ms; |
||||
|
-webkit-transition-delay: 200ms; |
||||
|
} |
||||
|
|
||||
|
.nvtooltip.x-nvtooltip, |
||||
|
.nvtooltip.y-nvtooltip { |
||||
|
padding: 8px; |
||||
|
} |
||||
|
|
||||
|
.nvtooltip h3 { |
||||
|
margin: 0; |
||||
|
padding: 4px 14px; |
||||
|
line-height: 18px; |
||||
|
font-weight: normal; |
||||
|
background-color: rgba(247,247,247,0.75); |
||||
|
color: rgba(0,0,0,1.0); |
||||
|
text-align: center; |
||||
|
|
||||
|
border-bottom: 1px solid #ebebeb; |
||||
|
|
||||
|
-webkit-border-radius: 5px 5px 0 0; |
||||
|
-moz-border-radius: 5px 5px 0 0; |
||||
|
border-radius: 5px 5px 0 0; |
||||
|
} |
||||
|
|
||||
|
.nvtooltip p { |
||||
|
margin: 0; |
||||
|
padding: 5px 14px; |
||||
|
text-align: center; |
||||
|
} |
||||
|
|
||||
|
.nvtooltip span { |
||||
|
display: inline-block; |
||||
|
margin: 2px 0; |
||||
|
} |
||||
|
|
||||
|
.nvtooltip table { |
||||
|
margin: 6px; |
||||
|
border-spacing:0; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
.nvtooltip table td { |
||||
|
padding: 2px 9px 2px 0; |
||||
|
vertical-align: middle; |
||||
|
} |
||||
|
|
||||
|
.nvtooltip table td.key { |
||||
|
font-weight: normal; |
||||
|
} |
||||
|
.nvtooltip table td.key.total { |
||||
|
font-weight: bold; |
||||
|
} |
||||
|
.nvtooltip table td.value { |
||||
|
text-align: right; |
||||
|
font-weight: bold; |
||||
|
} |
||||
|
|
||||
|
.nvtooltip table tr.highlight td { |
||||
|
padding: 1px 9px 1px 0; |
||||
|
border-bottom-style: solid; |
||||
|
border-bottom-width: 1px; |
||||
|
border-top-style: solid; |
||||
|
border-top-width: 1px; |
||||
|
} |
||||
|
|
||||
|
.nvtooltip table td.legend-color-guide div { |
||||
|
width: 8px; |
||||
|
height: 8px; |
||||
|
vertical-align: middle; |
||||
|
} |
||||
|
|
||||
|
.nvtooltip table td.legend-color-guide div { |
||||
|
width: 12px; |
||||
|
height: 12px; |
||||
|
border: 1px solid #999; |
||||
|
} |
||||
|
|
||||
|
.nvtooltip .footer { |
||||
|
padding: 3px; |
||||
|
text-align: center; |
||||
|
} |
||||
|
|
||||
|
.nvtooltip-pending-removal { |
||||
|
pointer-events: none; |
||||
|
display: none; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/**** |
||||
|
Interactive Layer |
||||
|
*/ |
||||
|
.nvd3 .nv-interactiveGuideLine { |
||||
|
pointer-events:none; |
||||
|
} |
||||
|
.nvd3 line.nv-guideline { |
||||
|
stroke: #ccc; |
||||
|
} |
||||
|
|
||||
|
.nvd3 .nv-bars rect { |
||||
|
fill-opacity: .75; |
||||
|
|
||||
|
transition: fill-opacity 250ms linear; |
||||
|
-moz-transition: fill-opacity 250ms linear; |
||||
|
-webkit-transition: fill-opacity 250ms linear; |
||||
|
} |
||||
|
|
||||
|
.nvd3 .nv-bars rect.hover { |
||||
|
fill-opacity: 1; |
||||
|
} |
||||
|
|
||||
|
.nvd3 .nv-bars .hover rect { |
||||
|
fill: lightblue; |
||||
|
} |
||||
|
|
||||
|
.nvd3 .nv-bars text { |
||||
|
fill: rgba(0,0,0,0); |
||||
|
} |
||||
|
|
||||
|
.nvd3 .nv-bars .hover text { |
||||
|
fill: rgba(0,0,0,1); |
||||
|
} |
||||
|
|
||||
|
.nvd3 .nv-multibar .nv-groups rect, |
||||
|
.nvd3 .nv-multibarHorizontal .nv-groups rect, |
||||
|
.nvd3 .nv-discretebar .nv-groups rect { |
||||
|
stroke-opacity: 0; |
||||
|
|
||||
|
transition: fill-opacity 250ms linear; |
||||
|
-moz-transition: fill-opacity 250ms linear; |
||||
|
-webkit-transition: fill-opacity 250ms linear; |
||||
|
} |
||||
|
|
||||
|
.nvd3 .nv-multibar .nv-groups rect:hover, |
||||
|
.nvd3 .nv-multibarHorizontal .nv-groups rect:hover, |
||||
|
.nvd3 .nv-candlestickBar .nv-ticks rect:hover, |
||||
|
.nvd3 .nv-discretebar .nv-groups rect:hover { |
||||
|
fill-opacity: 1; |
||||
|
} |
||||
|
|
||||
|
.nvd3 .nv-discretebar .nv-groups text, |
||||
|
.nvd3 .nv-multibarHorizontal .nv-groups text { |
||||
|
font-weight: bold; |
||||
|
fill: rgba(0,0,0,1); |
||||
|
stroke: rgba(0,0,0,0); |
||||
|
} |
||||
|
|
||||
|
.nvd3 .nv-groups path.nv-line { |
||||
|
fill: none; |
||||
|
} |
||||
|
|
||||
|
.nvd3 .nv-groups path.nv-area { |
||||
|
stroke: none; |
||||
|
} |
||||
|
|
||||
|
.nvd3.nv-line .nvd3.nv-scatter .nv-groups .nv-point { |
||||
|
fill-opacity: 0; |
||||
|
stroke-opacity: 0; |
||||
|
} |
||||
|
|
||||
|
.nvd3.nv-scatter.nv-single-point .nv-groups .nv-point { |
||||
|
fill-opacity: .5 !important; |
||||
|
stroke-opacity: .5 !important; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
.with-transitions .nvd3 .nv-groups .nv-point { |
||||
|
transition: stroke-width 250ms linear, stroke-opacity 250ms linear; |
||||
|
-moz-transition: stroke-width 250ms linear, stroke-opacity 250ms linear; |
||||
|
-webkit-transition: stroke-width 250ms linear, stroke-opacity 250ms linear; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
.nvd3.nv-scatter .nv-groups .nv-point.hover, |
||||
|
.nvd3 .nv-groups .nv-point.hover { |
||||
|
stroke-width: 7px; |
||||
|
fill-opacity: .95 !important; |
||||
|
stroke-opacity: .95 !important; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
.nvd3 .nv-point-paths path { |
||||
|
stroke: #aaa; |
||||
|
stroke-opacity: 0; |
||||
|
fill: #eee; |
||||
|
fill-opacity: 0; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
|
||||
|
.nvd3 .nv-indexLine { |
||||
|
cursor: ew-resize; |
||||
|
} |
||||
|
|
||||
|
/******************** |
||||
|
* SVG CSS |
||||
|
*/ |
||||
|
|
||||
|
/******************** |
||||
|
Default CSS for an svg element nvd3 used |
||||
|
*/ |
||||
|
svg.nvd3-svg { |
||||
|
-webkit-touch-callout: none; |
||||
|
-webkit-user-select: none; |
||||
|
-khtml-user-select: none; |
||||
|
-ms-user-select: none; |
||||
|
-moz-user-select: none; |
||||
|
user-select: none; |
||||
|
display: block; |
||||
|
width:100%; |
||||
|
height:100%; |
||||
|
} |
||||
|
|
||||
|
/******************** |
||||
|
Box shadow and border radius styling |
||||
|
*/ |
||||
|
.nvtooltip.with-3d-shadow, .with-3d-shadow .nvtooltip { |
||||
|
-moz-box-shadow: 0 5px 10px rgba(0,0,0,.2); |
||||
|
-webkit-box-shadow: 0 5px 10px rgba(0,0,0,.2); |
||||
|
box-shadow: 0 5px 10px rgba(0,0,0,.2); |
||||
|
|
||||
|
-webkit-border-radius: 5px; |
||||
|
-moz-border-radius: 5px; |
||||
|
border-radius: 5px; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
.nvd3 text { |
||||
|
font: normal 12px Arial; |
||||
|
} |
||||
|
|
||||
|
.nvd3 .title { |
||||
|
font: bold 14px Arial; |
||||
|
} |
||||
|
|
||||
|
.nvd3 .nv-background { |
||||
|
fill: white; |
||||
|
fill-opacity: 0; |
||||
|
} |
||||
|
|
||||
|
.nvd3.nv-noData { |
||||
|
font-size: 18px; |
||||
|
font-weight: bold; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/********** |
||||
|
* Brush |
||||
|
*/ |
||||
|
|
||||
|
.nv-brush .extent { |
||||
|
fill-opacity: .125; |
||||
|
shape-rendering: crispEdges; |
||||
|
} |
||||
|
|
||||
|
.nv-brush .resize path { |
||||
|
fill: #eee; |
||||
|
stroke: #666; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/********** |
||||
|
* Legend |
||||
|
*/ |
||||
|
|
||||
|
.nvd3 .nv-legend .nv-series { |
||||
|
cursor: pointer; |
||||
|
} |
||||
|
|
||||
|
.nvd3 .nv-legend .nv-disabled circle { |
||||
|
fill-opacity: 0; |
||||
|
} |
||||
|
|
||||
|
/* focus */ |
||||
|
.nvd3 .nv-brush .extent { |
||||
|
fill-opacity: 0 !important; |
||||
|
} |
||||
|
|
||||
|
.nvd3 .nv-brushBackground rect { |
||||
|
stroke: #000; |
||||
|
stroke-width: .4; |
||||
|
fill: #fff; |
||||
|
fill-opacity: .7; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
.nvd3.nv-pie path { |
||||
|
stroke-opacity: 0; |
||||
|
transition: fill-opacity 250ms linear, stroke-width 250ms linear, stroke-opacity 250ms linear; |
||||
|
-moz-transition: fill-opacity 250ms linear, stroke-width 250ms linear, stroke-opacity 250ms linear; |
||||
|
-webkit-transition: fill-opacity 250ms linear, stroke-width 250ms linear, stroke-opacity 250ms linear; |
||||
|
|
||||
|
} |
||||
|
|
||||
|
.nvd3.nv-pie .nv-pie-title { |
||||
|
font-size: 24px; |
||||
|
fill: rgba(19, 196, 249, 0.59); |
||||
|
} |
||||
|
|
||||
|
.nvd3.nv-pie .nv-slice text { |
||||
|
stroke: #000; |
||||
|
stroke-width: 0; |
||||
|
} |
||||
|
|
||||
|
.nvd3.nv-pie path { |
||||
|
stroke: #fff; |
||||
|
stroke-width: 1px; |
||||
|
stroke-opacity: 1; |
||||
|
} |
||||
|
|
||||
|
.nvd3.nv-pie path { |
||||
|
fill-opacity: .7; |
||||
|
} |
||||
|
.nvd3.nv-pie .hover path { |
||||
|
fill-opacity: 1; |
||||
|
} |
||||
|
.nvd3.nv-pie .nv-label { |
||||
|
pointer-events: none; |
||||
|
} |
||||
|
.nvd3.nv-pie .nv-label rect { |
||||
|
fill-opacity: 0; |
||||
|
stroke-opacity: 0; |
||||
|
} |
5985
kpi_dashboard/static/lib/nvd3/nv.d3.js
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,50 @@ |
|||||
|
/* |
||||
|
global nv |
||||
|
*/ |
||||
|
odoo.define("web.nvd3.extensions", function() { |
||||
|
"use strict"; |
||||
|
|
||||
|
/** |
||||
|
* The nvd3 library extensions and fixes should be done here to avoid patching |
||||
|
* in place. |
||||
|
*/ |
||||
|
|
||||
|
nv.dev = false; |
||||
|
// Sets nvd3 library in production mode
|
||||
|
|
||||
|
// monkey patch nvd3 to allow removing eventhandler on windowresize events
|
||||
|
// see https://github.com/novus/nvd3/pull/396 for more details
|
||||
|
|
||||
|
// Adds a resize listener to the window.
|
||||
|
nv.utils.onWindowResize = function(fun) { |
||||
|
if (fun === null) return; |
||||
|
window.addEventListener("resize", fun); |
||||
|
}; |
||||
|
|
||||
|
// Backwards compatibility with current API.
|
||||
|
nv.utils.windowResize = nv.utils.onWindowResize; |
||||
|
|
||||
|
// Removes a resize listener from the window.
|
||||
|
nv.utils.offWindowResize = function(fun) { |
||||
|
if (fun === null) return; |
||||
|
window.removeEventListener("resize", fun); |
||||
|
}; |
||||
|
|
||||
|
// Monkey patch nvd3 to prevent crashes when user changes view and nvd3
|
||||
|
// tries to remove tooltips after 500 ms... seriously nvd3, what were you
|
||||
|
// thinking?
|
||||
|
nv.tooltip.cleanup = function() { |
||||
|
$(".nvtooltip").remove(); |
||||
|
}; |
||||
|
|
||||
|
// Monkey patch nvd3 to prevent it to display a tooltip (position: absolute)
|
||||
|
// with a negative `top`; with this patch the highest tooltip's position is
|
||||
|
// still in the graph
|
||||
|
var originalCalcTooltipPosition = nv.tooltip.calcTooltipPosition; |
||||
|
nv.tooltip.calcTooltipPosition = function() { |
||||
|
var container = originalCalcTooltipPosition.apply(this, arguments); |
||||
|
container.style.top = |
||||
|
container.style.top.split("px")[0] < 0 ? 0 + "px" : container.style.top; |
||||
|
return container; |
||||
|
}; |
||||
|
}); |
Write
Preview
Loading…
Cancel
Save
Reference in new issue