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