BAMG#69593 Data uit Facilitor plaatsen op de landkaart.

svn path=/Website/trunk/; revision=57259
This commit is contained in:
Jos Groot Lipman
2022-09-13 12:31:40 +00:00
parent 4722a9d2a6
commit dc8cfde84d
13 changed files with 994 additions and 949 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 696 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 618 B

View File

@@ -0,0 +1,657 @@
/* required styles */
.leaflet-pane,
.leaflet-tile,
.leaflet-marker-icon,
.leaflet-marker-shadow,
.leaflet-tile-container,
.leaflet-pane > svg,
.leaflet-pane > canvas,
.leaflet-zoom-box,
.leaflet-image-layer,
.leaflet-layer {
position: absolute;
left: 0;
top: 0;
}
.leaflet-container {
overflow: hidden;
}
.leaflet-tile,
.leaflet-marker-icon,
.leaflet-marker-shadow {
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
-webkit-user-drag: none;
}
/* Prevents IE11 from highlighting tiles in blue */
.leaflet-tile::selection {
background: transparent;
}
/* Safari renders non-retina tile on retina better with this, but Chrome is worse */
.leaflet-safari .leaflet-tile {
image-rendering: -webkit-optimize-contrast;
}
/* hack that prevents hw layers "stretching" when loading new tiles */
.leaflet-safari .leaflet-tile-container {
width: 1600px;
height: 1600px;
-webkit-transform-origin: 0 0;
}
.leaflet-marker-icon,
.leaflet-marker-shadow {
display: block;
}
/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */
/* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */
.leaflet-container .leaflet-overlay-pane svg {
max-width: none !important;
max-height: none !important;
}
.leaflet-container .leaflet-marker-pane img,
.leaflet-container .leaflet-shadow-pane img,
.leaflet-container .leaflet-tile-pane img,
.leaflet-container img.leaflet-image-layer,
.leaflet-container .leaflet-tile {
max-width: none !important;
max-height: none !important;
width: auto;
padding: 0;
}
.leaflet-container.leaflet-touch-zoom {
-ms-touch-action: pan-x pan-y;
touch-action: pan-x pan-y;
}
.leaflet-container.leaflet-touch-drag {
-ms-touch-action: pinch-zoom;
/* Fallback for FF which doesn't support pinch-zoom */
touch-action: none;
touch-action: pinch-zoom;
}
.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom {
-ms-touch-action: none;
touch-action: none;
}
.leaflet-container {
-webkit-tap-highlight-color: transparent;
}
.leaflet-container a {
-webkit-tap-highlight-color: rgba(51, 181, 229, 0.4);
}
.leaflet-tile {
filter: inherit;
visibility: hidden;
}
.leaflet-tile-loaded {
visibility: inherit;
}
.leaflet-zoom-box {
width: 0;
height: 0;
-moz-box-sizing: border-box;
box-sizing: border-box;
z-index: 800;
}
/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */
.leaflet-overlay-pane svg {
-moz-user-select: none;
}
.leaflet-pane { z-index: 400; }
.leaflet-tile-pane { z-index: 200; }
.leaflet-overlay-pane { z-index: 400; }
.leaflet-shadow-pane { z-index: 500; }
.leaflet-marker-pane { z-index: 600; }
.leaflet-tooltip-pane { z-index: 650; }
.leaflet-popup-pane { z-index: 700; }
.leaflet-map-pane canvas { z-index: 100; }
.leaflet-map-pane svg { z-index: 200; }
.leaflet-vml-shape {
width: 1px;
height: 1px;
}
.lvml {
behavior: url(#default#VML);
display: inline-block;
position: absolute;
}
/* control positioning */
.leaflet-control {
position: relative;
z-index: 800;
pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */
pointer-events: auto;
}
.leaflet-top,
.leaflet-bottom {
position: absolute;
z-index: 1000;
pointer-events: none;
}
.leaflet-top {
top: 0;
}
.leaflet-right {
right: 0;
}
.leaflet-bottom {
bottom: 0;
}
.leaflet-left {
left: 0;
}
.leaflet-control {
float: left;
clear: both;
}
.leaflet-right .leaflet-control {
float: right;
}
.leaflet-top .leaflet-control {
margin-top: 10px;
}
.leaflet-bottom .leaflet-control {
margin-bottom: 10px;
}
.leaflet-left .leaflet-control {
margin-left: 10px;
}
.leaflet-right .leaflet-control {
margin-right: 10px;
}
/* zoom and fade animations */
.leaflet-fade-anim .leaflet-popup {
opacity: 0;
-webkit-transition: opacity 0.2s linear;
-moz-transition: opacity 0.2s linear;
transition: opacity 0.2s linear;
}
.leaflet-fade-anim .leaflet-map-pane .leaflet-popup {
opacity: 1;
}
.leaflet-zoom-animated {
-webkit-transform-origin: 0 0;
-ms-transform-origin: 0 0;
transform-origin: 0 0;
}
svg.leaflet-zoom-animated {
will-change: transform;
}
.leaflet-zoom-anim .leaflet-zoom-animated {
-webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1);
-moz-transition: -moz-transform 0.25s cubic-bezier(0,0,0.25,1);
transition: transform 0.25s cubic-bezier(0,0,0.25,1);
}
.leaflet-zoom-anim .leaflet-tile,
.leaflet-pan-anim .leaflet-tile {
-webkit-transition: none;
-moz-transition: none;
transition: none;
}
.leaflet-zoom-anim .leaflet-zoom-hide {
visibility: hidden;
}
/* cursors */
.leaflet-interactive {
cursor: pointer;
}
.leaflet-grab {
cursor: -webkit-grab;
cursor: -moz-grab;
cursor: grab;
}
.leaflet-crosshair,
.leaflet-crosshair .leaflet-interactive {
cursor: crosshair;
}
.leaflet-popup-pane,
.leaflet-control {
cursor: auto;
}
.leaflet-dragging .leaflet-grab,
.leaflet-dragging .leaflet-grab .leaflet-interactive,
.leaflet-dragging .leaflet-marker-draggable {
cursor: move;
cursor: -webkit-grabbing;
cursor: -moz-grabbing;
cursor: grabbing;
}
/* marker & overlays interactivity */
.leaflet-marker-icon,
.leaflet-marker-shadow,
.leaflet-image-layer,
.leaflet-pane > svg path,
.leaflet-tile-container {
pointer-events: none;
}
.leaflet-marker-icon.leaflet-interactive,
.leaflet-image-layer.leaflet-interactive,
.leaflet-pane > svg path.leaflet-interactive,
svg.leaflet-image-layer.leaflet-interactive path {
pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */
pointer-events: auto;
}
/* visual tweaks */
.leaflet-container {
background: #ddd;
outline-offset: 1px;
}
.leaflet-container a {
color: #0078A8;
}
.leaflet-zoom-box {
border: 2px dotted #38f;
background: rgba(255,255,255,0.5);
}
/* general typography */
.leaflet-container {
font-family: "Helvetica Neue", Arial, Helvetica, sans-serif;
font-size: 12px;
font-size: 0.75rem;
line-height: 1.5;
}
/* general toolbar styles */
.leaflet-bar {
box-shadow: 0 1px 5px rgba(0,0,0,0.65);
border-radius: 4px;
}
.leaflet-bar a {
background-color: #fff;
border-bottom: 1px solid #ccc;
width: 26px;
height: 26px;
line-height: 26px;
display: block;
text-align: center;
text-decoration: none;
color: black;
}
.leaflet-bar a,
.leaflet-control-layers-toggle {
background-position: 50% 50%;
background-repeat: no-repeat;
display: block;
}
.leaflet-bar a:hover,
.leaflet-bar a:focus {
background-color: #f4f4f4;
}
.leaflet-bar a:first-child {
border-top-left-radius: 4px;
border-top-right-radius: 4px;
}
.leaflet-bar a:last-child {
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
border-bottom: none;
}
.leaflet-bar a.leaflet-disabled {
cursor: default;
background-color: #f4f4f4;
color: #bbb;
}
.leaflet-touch .leaflet-bar a {
width: 30px;
height: 30px;
line-height: 30px;
}
.leaflet-touch .leaflet-bar a:first-child {
border-top-left-radius: 2px;
border-top-right-radius: 2px;
}
.leaflet-touch .leaflet-bar a:last-child {
border-bottom-left-radius: 2px;
border-bottom-right-radius: 2px;
}
/* zoom control */
.leaflet-control-zoom-in,
.leaflet-control-zoom-out {
font: bold 18px 'Lucida Console', Monaco, monospace;
text-indent: 1px;
}
.leaflet-touch .leaflet-control-zoom-in, .leaflet-touch .leaflet-control-zoom-out {
font-size: 22px;
}
/* layers control */
.leaflet-control-layers {
box-shadow: 0 1px 5px rgba(0,0,0,0.4);
background: #fff;
border-radius: 5px;
}
.leaflet-control-layers-toggle {
background-image: url(images/layers.png);
width: 36px;
height: 36px;
}
.leaflet-retina .leaflet-control-layers-toggle {
background-image: url(images/layers-2x.png);
background-size: 26px 26px;
}
.leaflet-touch .leaflet-control-layers-toggle {
width: 44px;
height: 44px;
}
.leaflet-control-layers .leaflet-control-layers-list,
.leaflet-control-layers-expanded .leaflet-control-layers-toggle {
display: none;
}
.leaflet-control-layers-expanded .leaflet-control-layers-list {
display: block;
position: relative;
}
.leaflet-control-layers-expanded {
padding: 6px 10px 6px 6px;
color: #333;
background: #fff;
}
.leaflet-control-layers-scrollbar {
overflow-y: scroll;
overflow-x: hidden;
padding-right: 5px;
}
.leaflet-control-layers-selector {
margin-top: 2px;
position: relative;
top: 1px;
}
.leaflet-control-layers label {
display: block;
font-size: 13px;
font-size: 1.08333em;
}
.leaflet-control-layers-separator {
height: 0;
border-top: 1px solid #ddd;
margin: 5px -10px 5px -6px;
}
/* Default icon URLs */
.leaflet-default-icon-path { /* used only in path-guessing heuristic, see L.Icon.Default */
background-image: url(images/marker-icon.png);
}
/* attribution and scale controls */
.leaflet-container .leaflet-control-attribution {
background: #fff;
background: rgba(255, 255, 255, 0.8);
margin: 0;
}
.leaflet-control-attribution,
.leaflet-control-scale-line {
padding: 0 5px;
color: #333;
line-height: 1.4;
}
.leaflet-control-attribution a {
text-decoration: none;
}
.leaflet-control-attribution a:hover,
.leaflet-control-attribution a:focus {
text-decoration: underline;
}
.leaflet-control-attribution svg {
display: inline !important;
}
.leaflet-left .leaflet-control-scale {
margin-left: 5px;
}
.leaflet-bottom .leaflet-control-scale {
margin-bottom: 5px;
}
.leaflet-control-scale-line {
border: 2px solid #777;
border-top: none;
line-height: 1.1;
padding: 2px 5px 1px;
white-space: nowrap;
overflow: hidden;
-moz-box-sizing: border-box;
box-sizing: border-box;
background: #fff;
background: rgba(255, 255, 255, 0.5);
}
.leaflet-control-scale-line:not(:first-child) {
border-top: 2px solid #777;
border-bottom: none;
margin-top: -2px;
}
.leaflet-control-scale-line:not(:first-child):not(:last-child) {
border-bottom: 2px solid #777;
}
.leaflet-touch .leaflet-control-attribution,
.leaflet-touch .leaflet-control-layers,
.leaflet-touch .leaflet-bar {
box-shadow: none;
}
.leaflet-touch .leaflet-control-layers,
.leaflet-touch .leaflet-bar {
border: 2px solid rgba(0,0,0,0.2);
background-clip: padding-box;
}
/* popup */
.leaflet-popup {
position: absolute;
text-align: center;
margin-bottom: 20px;
}
.leaflet-popup-content-wrapper {
padding: 1px;
text-align: left;
border-radius: 12px;
}
.leaflet-popup-content {
margin: 13px 24px 13px 20px;
line-height: 1.3;
font-size: 13px;
font-size: 1.08333em;
min-height: 1px;
}
.leaflet-popup-content p {
margin: 17px 0;
margin: 1.3em 0;
}
.leaflet-popup-tip-container {
width: 40px;
height: 20px;
position: absolute;
left: 50%;
margin-top: -1px;
margin-left: -20px;
overflow: hidden;
pointer-events: none;
}
.leaflet-popup-tip {
width: 17px;
height: 17px;
padding: 1px;
margin: -10px auto 0;
pointer-events: auto;
-webkit-transform: rotate(45deg);
-moz-transform: rotate(45deg);
-ms-transform: rotate(45deg);
transform: rotate(45deg);
}
.leaflet-popup-content-wrapper,
.leaflet-popup-tip {
background: white;
color: #333;
box-shadow: 0 3px 14px rgba(0,0,0,0.4);
}
.leaflet-container a.leaflet-popup-close-button {
position: absolute;
top: 0;
right: 0;
border: none;
text-align: center;
width: 24px;
height: 24px;
font: 16px/24px Tahoma, Verdana, sans-serif;
color: #757575;
text-decoration: none;
background: transparent;
}
.leaflet-container a.leaflet-popup-close-button:hover,
.leaflet-container a.leaflet-popup-close-button:focus {
color: #585858;
}
.leaflet-popup-scrolled {
overflow: auto;
border-bottom: 1px solid #ddd;
border-top: 1px solid #ddd;
}
.leaflet-oldie .leaflet-popup-content-wrapper {
-ms-zoom: 1;
}
.leaflet-oldie .leaflet-popup-tip {
width: 24px;
margin: 0 auto;
-ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";
filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678);
}
.leaflet-oldie .leaflet-control-zoom,
.leaflet-oldie .leaflet-control-layers,
.leaflet-oldie .leaflet-popup-content-wrapper,
.leaflet-oldie .leaflet-popup-tip {
border: 1px solid #999;
}
/* div icon */
.leaflet-div-icon {
background: #fff;
border: 1px solid #666;
}
/* Tooltip */
/* Base styles for the element that has a tooltip */
.leaflet-tooltip {
position: absolute;
padding: 6px;
background-color: #fff;
border: 1px solid #fff;
border-radius: 3px;
color: #222;
white-space: nowrap;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
pointer-events: none;
box-shadow: 0 1px 3px rgba(0,0,0,0.4);
}
.leaflet-tooltip.leaflet-interactive {
cursor: pointer;
pointer-events: auto;
}
.leaflet-tooltip-top:before,
.leaflet-tooltip-bottom:before,
.leaflet-tooltip-left:before,
.leaflet-tooltip-right:before {
position: absolute;
pointer-events: none;
border: 6px solid transparent;
background: transparent;
content: "";
}
/* Directions */
.leaflet-tooltip-bottom {
margin-top: 6px;
}
.leaflet-tooltip-top {
margin-top: -6px;
}
.leaflet-tooltip-bottom:before,
.leaflet-tooltip-top:before {
left: 50%;
margin-left: -6px;
}
.leaflet-tooltip-top:before {
bottom: 0;
margin-bottom: -12px;
border-top-color: #fff;
}
.leaflet-tooltip-bottom:before {
top: 0;
margin-top: -12px;
margin-left: -6px;
border-bottom-color: #fff;
}
.leaflet-tooltip-left {
margin-left: -6px;
}
.leaflet-tooltip-right {
margin-left: 6px;
}
.leaflet-tooltip-left:before,
.leaflet-tooltip-right:before {
top: 50%;
margin-top: -6px;
}
.leaflet-tooltip-left:before {
right: 0;
margin-right: -12px;
border-left-color: #fff;
}
.leaflet-tooltip-right:before {
left: 0;
margin-left: -12px;
border-right-color: #fff;
}
/* Printing */
@media print {
/* Prevent printers from removing background-images of controls. */
.leaflet-control {
-webkit-print-color-adjust: exact;
color-adjust: exact;
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -7,15 +7,20 @@
Description: Voer een nieuwe stijl rapport uit (toon het zoekblok/list body) Description: Voer een nieuwe stijl rapport uit (toon het zoekblok/list body)
Ook het tonen van de grafiek gebeurt in dit bestand. Ook het tonen van de grafiek gebeurt in dit bestand.
Parameters: usrrap_key van een rapport (voorkeur) Parameters: usrrap_key van een rapport (voorkeur)
of rapcode, de fac_usrrap_code een rapport.
of rap_name, de naam van de view van een rapport. Deze moet dan wel uniek zijn of rap_name, de naam van de view van een rapport. Deze moet dan wel uniek zijn
mode=list optioneel, toon het rapport direct zonder zoekblok mode=list optioneel, toon het rapport direct zonder zoekblok
Note: Procedure rapporten gaan via de oude code fac_usrrap_search.asp Note: "Procedure rapporten" gaan via de oude code fac_usrrap_search.asp
*/ */
CSP_EXTRADATA = 1; // eventuele S("csp_header_extradata") ook toestaan voor tilemap
%> %>
<!-- #include file="../scf/scaffolding.inc" --> <!-- #include file="../scf/scaffolding.inc" -->
<!-- #include file="../api2/model_reports.inc" --> <!-- #include file="../api2/model_reports.inc" -->
<!-- #include file="../Shared/xml_converter.inc" --> <!-- #include file="../Shared/xml_converter.inc" -->
<!-- #include file="./fac_report_graph.inc" -->
<!-- #include file="./fac_report_lfmap.inc" -->
<% <%
var usrrap_key = getQParamInt("usrrap_key", -1); var usrrap_key = getQParamInt("usrrap_key", -1);
var widget_height = getQParamInt("widget_height", null); var widget_height = getQParamInt("widget_height", null);
@@ -189,7 +194,15 @@
{ {
var graph = (rapport.list.autoGraph & 2) == 2; var graph = (rapport.list.autoGraph & 2) == 2;
var graph_type = getQParamInt("scf_graph_type", graph?rapport.graph_type.id:null); var graph_type = getQParamInt("scf_graph_type", graph?rapport.graph_type.id:null);
if (mode == "list" && graph_type >= 1) if (mode == "list" && graph_type == 6)
{
FCLTHeader.Requires({ plugins: ["jQuery"],
js: [ "./leaflet/leaflet.js"],
css: ["./leaflet/leaflet.css"]});
// Overrule scaffolding_list
scaffolding_list = fac_usrrap_list_map;
}
else if (mode == "list" && graph_type >= 1)
{ {
FCLTHeader.Requires({plugins: ["jQuery"], FCLTHeader.Requires({plugins: ["jQuery"],
js: ["../Localscripts/jqPlot/dist/excanvas.js", js: ["../Localscripts/jqPlot/dist/excanvas.js",
@@ -268,720 +281,6 @@
params.urllink = {index: urllink_index, col: urllink_col, link: urllink}; params.urllink = {index: urllink_index, col: urllink_col, link: urllink};
scaffolding(rapport, params); scaffolding(rapport, params);
function fac_usrrap_list_graph (model, scf_params)
{
var transit = "";
if ("transit" in scf_params)
transit = "&" + scf_params.transit.name + "=" + safe.url(scf_params.transit.val);
var xxx_params = { filter : scf_params.filter || shared.qs2json(model),
columns: scf_params.list.columns,
groupby: scf_params.list.groupby,
scf_graph: "on",
urllink: scf_params.urllink };
var pivot = ("scf_pivot" in xxx_params.filter)? xxx_params.filter.scf_pivot == 1 : model.list.autoPivot&2
// Als er een url-key kolom op het eind aanwezig is dan deze kolom niet meetellen.
var pivotcol;
if (pivot)
pivotcol = xxx_params.columns[xxx_params.columns.length - 2 - (urllink_index == -1? 0 : 1)];
// Voor een rapport heb je minstens twee kolommen nodig en met draaitabel drie kolommen
if (( pivot && ((urllink_index > -1 && scf_params.list.columns.length < 4) // Draaitabel (Ja), Klik-actie (Ja).
|| (urllink_index == -1 && scf_params.list.columns.length < 3))) || // Draaitabel (Ja), Klik-actie (Nee).
(!pivot && ((urllink_index > -1 && scf_params.list.columns.length < 3) // Draaitabel (Nee), Klik-actie (Ja).
|| (urllink_index == -1 && scf_params.list.columns.length < 2)))) // Draaitabel (Nee), Klik-actie (Nee).
shared.simpel_page(L("lcl_usrrap_invalid_more_columns"));
var xxx_array = model.REST_GET(xxx_params);
// Let op bij draaitabel met pivot kolommen, xxx_params en daarmee ook scf_params.list.columns zijn nu ook aangepast.
var xxx_columns = (xxx_params.filter.columns ? xxx_params.filter.columns.split(",") : null);
graphData = { teller: xxx_array.length
, arr_x: []
, arr_y: []
, arr_xy: []
};
graphAxes = { url: urllink_col? urllink_col : null
, xas: { naam: model.fields[scf_params.list.columns[0]].label, dbs: model.fields[scf_params.list.columns[0]].dbs }
, yas: []
, zas: { naam: ((pivot && xxx_columns && xxx_columns[2]) ? model.fields[xxx_columns[2]].label : null)}
};
for (var c = 1; c < scf_params.list.columns.length; c++)
{
if (scf_params.list.columns[c] != urllink_col)
{
graphData.arr_y.push([]);
graphAxes.yas.push({ naam: model.fields[scf_params.list.columns[c]].label });
}
}
var typX = model.fields[scf_params.list.columns[0]].orgtyp;
var lineRenderer = typX=="date" || typX=="datetime";
var nn_data = xxx_array.length * scf_params.list.columns.length;
if (nn_data > 250000)
{
__DoLog("Te veel ({0}*{1}={2}) datapunten voor grafiek.".format(xxx_array.length, scf_params.list.columns.length, nn_data));
shared.simpel_page("Too many ({0}*{1}={2}) datapoints for graph.".format(xxx_array.length, scf_params.list.columns.length, nn_data));
}
for (var i = 0; i < xxx_array.length; i++)
{
var newtyp = model.fields[scf_params.list.columns[0]].typ;
var txtX = xxx_array[i][scf_params.list.columns[0]];
if (newtyp == "datetime")
txtX = toDateTimeString(txtX);
else if (newtyp == "time")
txtX = toTimeString(txtX);
else if (typeof txtX == "date" || txtX instanceof Date)
txtX = toDateString(txtX);
graphData.arr_x.push(txtX);
for (var c = 1; c < scf_params.list.columns.length; c++)
{
if (scf_params.list.columns[c] != urllink_col)
{ // Als (urllink_index < c) dan moet er 1 van de index van arr_y afgetrokken worden want voor de url wordt geen y-waarde weergegeven.
// Als er geen draaitabel actief is dan staat de url-key kolom aan het eind van de kolommen en heeft dan de hoogste index. Er geldt dan altijd (urllink_index > c).
var ywaarde = pivot && xxx_array[i][scf_params.list.columns[c]]? xxx_array[i][scf_params.list.columns[c]] : xxx_array[i][scf_params.list.columns[c]];
var ywaarde_1 = pivot && xxx_array[i][scf_params.list.columns[c - 1]]? xxx_array[i][scf_params.list.columns[c - 1]] : xxx_array[i][scf_params.list.columns[c - 1]];
if (graph_type != 4)
{ // Voor de lijngrafiek moet een null waarde niet getoond worden en een 0 waarde wel.
ywaarde = ywaarde || 0;
}
graphData.arr_y[c - 1].push(ywaarde);
graphData.arr_xy.push([ywaarde_1, ywaarde] || 0);
}
}
}
var aantal_scf = (scf_params.list.columns.length - 1); // Aantal subcategorie<69>n (series)
var aantal_xxx = 0;
for (var i = 0; i < xxx_array.length; i++)
{
aantal_xxx += xxx_array[i].scf_subaantal; // Aantal subcategorie<69>n per x-as categorie.
}
var teller;
var limiet = [model.limit0 , model.limit1, model.limit2, model.limit3];
if (graph_type == 2 || graph_type == 5)
{ // Er moeten minstens twee aangrenzende limieten zijn ingevuld. Als limiet1 is ingevuld, dan moet ook limiet0 of limiet3 zijn ingevuld.
for (var k = 0; k < limiet.length; k++)
{
if (limiet[k] != null)
{
teller = k;
break;
}
}
if (teller != null && (teller == 3 || limiet[teller + 1] == null))
{
shared.simpel_page(L("lcl_usrrap_invalid_limits"));
}
}
// Testen of van extern toe te voegen gegevens een correct JSON format bevat.
rapport.graph_options = rapport.graph_options || "{}";
rapport.default_options = S("udr_graph_default_json") || "{}";
var test = 0;
try
{
test = 1;
var x_1 = JSON.parse(rapport.graph_options);
test = 2;
var x_1 = JSON.parse(rapport.default_options);
}
catch(e)
{
var description = (e.description ? ": " + e.description : "");
var warning = L("lcl_dirty")+ " JSON{0} '{1}'" + description;
switch (test)
{
case 1: shared.internal_error( warning.format("", L("lcl_usrrap_graphoptions")) );
case 2: shared.internal_error( warning.format(" "+L("lcl_fac_setting"), "udr_graph_default_json"));
}
}
graphInit = { title : model.records_title
, graph_type : graph_type
, maxrows : 0
, limiet : [model.limit0 , model.limit1, model.limit2, model.limit3]
, report_options : JSON.parse(rapport.graph_options) || {}
, default_options : JSON.parse(rapport.default_options) || {}
, sql_orderby : "" //oRs("fac_usrgraph_orderby").Value || ""
//, sql : sql_select
};
var asWidget = getQParamInt("asWidget", 0) == 1;
%> %>
<html<%=asWidget ? " style=\"overflow:hidden\"" : ""%>>
<head>
<% FCLTHeader.Generate(); %>
<script>
function json_reviver(nm, val)
{
// JSON.parse ondersteund niet het gebruik van functienamen binnen een object.
// Door het dan als een string "te_gebruiken_functie" te schrijven heb je wel een geldig json-object.
// In deze functie wordt tijdens het parsen gezocht op een van de bekende functiename voor jqplot en dan wordt alleen de te_gebruiken_functie terug gegeven.
// Na het parsen bevat het json-object wel de te_gebruiken_functie.
if (val && (typeof val == "string"))
{
switch(val)
{
case "$.jqplot.Highlighter": val = $.jqplot.Highlighter; break;
case "$.jqplot.PieRenderer": val = $.jqplot.PieRenderer; break;
case "$.jqplot.BarRenderer": val = $.jqplot.BarRenderer; break;
case "$.jqplot.CanvasAxisLabelRenderer": val = $.jqplot.CanvasAxisLabelRenderer; break;
case "$.jqplot.CanvasAxisTickRenderer": val = $.jqplot.CanvasAxisTickRenderer; break;
case "$.jqplot.CanvasOverlay": val = $.jqplot.CanvasOverlay; break;
case "$.jqplot.CanvasTextRenderer": val = $.jqplot.CanvasTextRenderer; break;
case "$.jqplot.CategoryAxisRenderer": val = $.jqplot.CategoryAxisRenderer; break;
case "$.jqplot.MeterGaugeRenderer": val = $.jqplot.MeterGaugeRenderer; break;
case "$.jqplot.PointLabels": val = $.jqplot.PointLabels; break;
}
}
return val;
}
var pivot = <%=pivot? 1 : 0%> == 1;
var JSONdata = "<%=safe.jsstring(JSON.stringify(graphInit))%>";
var l_init = JSON.parse(JSONdata, json_reviver);
var report_options = l_init.report_options;
var JSONdata = "<%=safe.jsstring(JSON.stringify(graphAxes))%>";
var l_axes = JSON.parse(JSONdata);
var JSONdata = "<%=safe.jsstring(JSON.stringify(graphData))%>";
var l_data = JSON.parse(JSONdata);
var l_arr_x = [];
for (var x = 0; x < l_data.arr_x.length; x++)
{
if (l_data.arr_x[x] === null || l_data.arr_x[x] == "")
l_arr_x[x] = " ";
else
l_arr_x[x] = l_data.arr_x[x];
}
var l_arr_y = l_data.arr_y;
var l_xas_naam = l_axes.xas.naam;
var l_xas_url = l_axes.url;
var l_xas_dbs = l_axes.xas.dbs;
var l_yas_naam = (l_axes.zas.naam ? l_axes.zas.naam : l_axes.yas[0].naam);
var l_yas_count = l_axes.yas.length;
var l_colors = (l_yas_count==1?<%=S("udr_graph_colors1")%>:<%=S("udr_graph_colors2")%>);
var l_labels = [];
for (var y = 0; y < l_axes.yas.length; y++)
{
l_labels.push(l_axes.yas[y].naam || "&nbsp;");
}
// Als niet alle resultaten getoond dienen te worden moet je ook kijken welke labels er getoond dienen te worden.
// Omschrijving x-as moet gekoppeld worden aan label omschrijving.
// De rapportagemaker is verantwoordelijk dat er niet twee subproductgroepen met dezelfde omschrijving zijn?
var JSONdata = "<%=safe.jsstring(JSON.stringify(xxx_array))%>";
var l_xxxlabel = JSON.parse(JSONdata);
var l_urllink = "<%=safe.htmlattr(urllink)%>";
var usrrap_maxresults = <%=usrrap_maxresults%>;
$.jqplot.config.enablePlugins = true;
var handler = function(ev, gridpos, datapos, neighbor, plot)
{
if (neighbor)
{
if (pivot && l_xxxlabel[neighbor.pointIndex].scf_urlkey)
{
var seriename = l_axes.yas[neighbor.seriesIndex].naam;
var url_key = l_xxxlabel[neighbor.pointIndex].scf_urlkey[seriename];
FcltMgr.openDetail(l_urllink + url_key, l_arr_x[neighbor.pointIndex]);
}
else if (l_xxxlabel[neighbor.pointIndex][l_xas_url])
{
var url_key = l_xxxlabel[neighbor.pointIndex][l_xas_url];
FcltMgr.openDetail(l_urllink + url_key, l_arr_x[neighbor.pointIndex]);
}
}
};
$.jqplot.eventListenerHooks.push(["jqplotClick", handler]);
<%
switch (graphInit.graph_type)
{
case 1: // BarChart
%>
var l_colors = (l_yas_count == 1?<%=S("udr_graph_colors1")%> : <%=S("udr_graph_colors2")%>);
if (report_options.seriesColors && report_options.seriesColors.lenght > 0)
l_colors = report_options.seriesColors;
var effectivedata = l_arr_y;
var props = { seriesDefaults:{ renderer: $.jqplot.BarRenderer
, rendererOptions: { fillToZero: true }
, pointLabels: { show: false }
}
, stackSeries: true
//, series:[{label: "a"}, {label: "b"}]
, legend: { show: (l_yas_count > 1)
, placement: (l_yas_count > 1? "outsideGrid" : "insideGrid")
, location: "ne"
, labels: l_labels
}
, title: l_init.title
, seriesColors: l_colors
, axes: { xaxis: { renderer: $.jqplot.CategoryAxisRenderer
, ticks: l_arr_x
, label: l_xas_naam
, tickRenderer: $.jqplot.CanvasAxisTickRenderer
, tickOptions: { enableFontSupport: true
, angle: 30
, fontSize: "9pt"
}
}
, yaxis: { label: l_yas_naam
, tickOptions: { formatString: "%.1f"
}
}
}
, highlighter: { show: true
, showMarker: false
, tooltipAxes: "y"
, tooltipLocation: "n"
, formatString: "<table style='background-color: #cccccc' class='xjqplot-highlighter'><tr><td>%s</td></tr></table>"
}
};
<%
break;
case 2: // MeterGauge
%>
var l_x = l_arr_x[0];
var l_y = l_arr_y[0];
var effectivedata = [ [100 * l_x / l_y] ];
var l_label = l_init.title + l_x + "/" + l_y;
var l_limits = [];
var l_colors = <%=S("udr_graph_gauge_colors")%>;
if (typeof l_arr_x[0] == "string")
{
effectivedata = [ l_arr_y[0] ];
l_label = l_init.title + " " + l_x + ": " + l_y;
}
if (report_options.seriesDefaults && report_options.seriesDefaults.rendererOptions)
{
if ("intervals" in report_options.seriesDefaults.rendererOptions)
{
l_limits = report_options.seriesDefaults.rendererOptions.intervals;
delete report_options.seriesDefaults.rendererOptions.intervals; // Voorkom dat deze array de "effectiveprops" overschrijft.
} // De eerste waarde in het array wordt alleen gebruikt voor het minimum.
if ("label" in report_options.seriesDefaults.rendererOptions)
{
l_label = report_options.seriesDefaults.rendererOptions.label;
delete report_options.seriesDefaults.rendererOptions.label;
}
}
if (l_limits.length < 3)
l_limits = l_init.limiet;
var l_limit_min = l_limits[0];
var l_limit_max = l_limits[l_limits.length-1];
l_limits.splice(0,1); // haal alleen de eerste waarde weg.
if (l_limits[0] == null && l_limits[1] == null && l_limits[2] == null)
l_limits = []; // Dan wordt er in ieder geval een GRIJZE Dashboard getoond.
var props = { title: l_init.title
, seriesDefaults: { renderer: $.jqplot.MeterGaugeRenderer
, rendererOptions: { showTicks: true
, showTickLabels: true
, label: l_label
, labelPosition: "bottom"
, labelHeightAdjust: -5
, background: "#f0f0f0"
, tickColor: "#333333"
, ringColor: "#333333"
, ringWidth: 3
, min: l_limit_min // limiet0
, max: l_limit_max // limiet3
, intervals: l_limits // [limiet1, limiet2, limiet3]
, intervalColors: l_colors
}
}
};
<%
break;
case 3: // pie-chart
%>
var l_colors = <%=S("udr_graph_pie_colors")%>;
var effectivedata = [l_data.arr_xy];
var props = { title: l_init.title
, seriesColors: l_colors
, seriesDefaults: { renderer:$.jqplot.PieRenderer
, showDataLabels: true
, rendererOptions: { fill: true
, showDataLabels: true
, dataLabelPositionFactor: 1.2
, dataLabelCenterOn: true
}
}
, highlighter: { show: false
, useAxesFormatters: false
}
, legend: { show: true
, escapeHtml: true
, location: "ne"
}
, grid: { drawBorder: false
, shadow : false
, background: "#ffffff"
}
};
<%
break;
case 4: // LineChart
%>
var l_labels = [];
for (y=0; y<l_axes.yas.length; y++)
{
l_labels.push(l_axes.yas[y].naam);
}
var l_colors = (l_yas_count == 1? <%=S("udr_graph_colors1")%> : <%=S("udr_graph_colors2")%>);
if (report_options.seriesColors && report_options.seriesColors.lenght > 0)
l_colors = report_options.seriesColors;
var effectivedata = l_arr_y;
var props = { seriesDefaults: { pointLabels: { show: true
}
, breakOnNull: true
}
, stackSeries: false
, title: l_init.title
, seriesColors: l_colors
, legend: { show: (l_yas_count > 1)
, placement: (l_yas_count > 1?"outsideGrid" : "insideGrid")
, location: "ne"
, labels: l_labels
}
, axes: { xaxis: { renderer: $.jqplot.CategoryAxisRenderer
, ticks: l_arr_x
, label: l_xas_naam
, tickRenderer: $.jqplot.CanvasAxisTickRenderer
, tickOptions: { enableFontSupport: true
, angle: 30
}
}
, yaxis: { label: (l_yas_count == 1? l_yas_naam : "")
, tickOptions: { formatString: "%.1f"
}
}
}
, highlighter: { show: true
, showMarker: false
, tooltipAxes: "y"
, tooltipLocation: "n"
, formatString: "<table style='background-color: #cccccc' class='xjqplot-highlighter'><tr><td>%s</td></tr></table>"
}
};
<%
break;
default:
break;
}
if (graphInit.graph_type == 5) // blockgraph
{
%>
var l_limits = [];
var l_intervalColors = [];
if (report_options.seriesDefaults)
{
if ("intervals" in report_options.seriesDefaults.rendererOptions)
{
l_limits = report_options.seriesDefaults.rendererOptions.intervals;
delete report_options.seriesDefaults.rendererOptions.intervals; // Voorkom dat deze array de "effectiveprops" overschrijft.
} // De eerste waarde in het array wordt alleen gebruikt voor het minimum.
if ("intervalColors" in report_options.seriesDefaults.rendererOptions)
{
l_intervalColors = report_options.seriesDefaults.rendererOptions.intervalColors;
delete report_options.seriesDefaults.rendererOptions.intervalColors; // Voorkom dat deze array de "effectiveprops" overschrijft.
} // De eerste waarde in het array wordt alleen gebruikt voor het minimum.
}
if (l_limits.length < 3 &&l_init.limiet && l_init.limiet.length > 0 )
l_limits = l_init.limiet;
if (l_intervalColors.length != 3)
l_intervalColors = ["red"," orange", "green"];
var pivot = <%=pivot? 1 : 0%> == 1;
$(function ()
{
for (var index = 0; index < l_data.teller; index++)
{
var dialogtxt = "";
<% if (pivot)
{ %>
var teller = 0;
var equal = true;
var waarde;
for (var x in l_xxxlabel[index].scf_urlkey)
{
if (teller == 0)
waarde = l_xxxlabel[index].scf_urlkey[x];
else
equal = (waarde == l_xxxlabel[index].scf_urlkey[x]);
teller++;
if (!equal) break;
}
if (!equal)
{
dialogtxt = "<div id='scfcolpicker" + index + "' class='scfcolpicker scfcolpicker" + index + "' style='display:none'><table width='100%'>";
dialogtxt += "<thead><tr><th><%=pivotcol.substr(0, 1).toUpperCase() + pivotcol.substr(1, pivotcol.length - 1)%></th></tr></thead>";
var j = 0;
for (var s in l_xxxlabel[index].scf_urlkey)
{
dialogtxt += "<tr OnClick='openArrUrl(" + index + ", \"" + s + "\")'><td>" + s + "</td></tr>";
j++;
}
dialogtxt += "</table></div>";
}
<% } %>
// Als er intervallen zijn dan de kleur bepalen aan de hand van de waarde
// anders een kleur gebruiken uit S(udr_graph_colors1).
var bg_color = (l_limits.length ? colorValue(index) : l_colors[index % l_colors.length]);
$("#myGraph")
.append(
$('<div class="blockgraph">').css({backgroundColor: bg_color})
.html($("<span class='blockgraph-title'>").text(l_data.arr_x[index]).append("<br>"))
.append($("<span class='blockgraph-value'>").text(new Intl.NumberFormat().format(arrYValue(index).toFixed(1))))
.append(dialogtxt)
.click({index: index},
function(event)
{
$(".scfcolpicker" ).hide(); // Eerst alle scfcolpicker popup schermen verbergen.
var teller = 0;
var equal = true;
var waarde;
for (var x in l_xxxlabel[event.data.index].scf_urlkey)
{
if (teller == 0)
waarde = l_xxxlabel[event.data.index].scf_urlkey[x];
else
equal = (waarde == l_xxxlabel[event.data.index].scf_urlkey[x]);
teller++;
if (!equal) break;
}
if (pivot)
{
if (equal)
{
var url_key = waarde;
FcltMgr.openDetail(l_urllink + url_key, l_arr_x[event.data.index]);
}
else
{
event.stopPropagation();
$("#scfcolpicker" + event.data.index).show();
updateTableHeaders();
$("#scfcolpicker" + event.data.index).css("width", $("#scfcolpicker" + event.data.index + " table").width());
if (event.pageX < ($("#myGraph").width()/2))
$("#scfcolpicker" + event.data.index).css("left", 0);
else
$("#scfcolpicker" + event.data.index).css("right", $("#scfcolpicker" + event.data.index).width() - $(".blockgraph").width() + 20);
}
}
else
{
var url_key = l_xxxlabel[event.data.index][l_xas_url];
FcltMgr.openDetail(l_urllink + url_key, l_arr_x[event.data.index]);
}
}
)
)
.click(function(event){$(".scfcolpicker").hide();})
FcltMgr.resized(window);
}
$("#searchbody").click(function()
{
$(".scfcolpicker").hide();
});
$(".scfcolpicker").click(function(event)
{
event.stopPropagation();
});
});
function arrYValue(index)
{
var value = 0;
if (typeof l_data.arr_y[0] == "object")
{
for (var ix = 0; ix < l_data.arr_y.length; ix++)
{
value += l_data.arr_y[ix][index];
}
}
else
{
value = l_data.arr_y[index];
}
return value;
}
function colorValue(l_indexvalue)
{
var color;
var plimits = [];
var oplopend = true;
var teller;
for (var k = 0; k < l_limits.length; k++)
{
if (l_limits[k] != null)
{
teller = k;
break;
}
}
// Er is al getest of er twee opeenvolgende limieten zijn ingevoerd (serverside).
if (l_limits[teller] > l_limits[teller+1])
oplopend = false;
// Kleur bepalen van de tegel door naar de grenswaarden te kijken.
var yvalue = arrYValue(l_indexvalue).toFixed(1);
if (( oplopend && yvalue < l_limits[0]) ||
(!oplopend && (l_limits[0] != null && yvalue > l_limits[0]))) // Grenswaarde -/Rood.
color = "gray"; // Grijs.
else if (( oplopend && yvalue < l_limits[1]) ||
(!oplopend && (l_limits[1] != null && yvalue > l_limits[1]))) // Grenswaarde Rood/Orange.
color = l_intervalColors[0]; // Rood.
else if (( oplopend && (l_limits[2] == null || yvalue < l_limits[2])) ||
(!oplopend && yvalue > l_limits[2])) // Grenswaarde Orange/Groen.
color = l_intervalColors[1]; // Orange.
else if (( oplopend && (l_limits[3] == null || yvalue <= l_limits[3])) ||
(!oplopend && (l_limits[3] == null || yvalue >= l_limits[3]))) // Grenswaarde Groen/-.
color = l_intervalColors[2]; // Groen
else
color = "gray"; // Grijs
return color;
}
function openArrUrl(xindex, yindex)
{
$("#scfcolpicker" + xindex).hide();
FcltMgr.openDetail(l_urllink + l_xxxlabel[xindex].scf_urlkey[yindex], l_arr_x[xindex]);
}
<% }
else
{ %>
var effectiveprops = $.extend(true, props, report_options);
$(function ()
{
if (effectivedata.length && effectivedata[0].length)
{
plot1 = $.jqplot( "myGraph"
, effectivedata
, effectiveprops
);
}
else
{
document.getElementById("myGraph").innerHTML = "<p><%=L('lcl_empty_rstable')%></p>";
}
// Pointer array "rows" met referenties naar de legenda regels. Rows is dus geen kopie (clone) van de legenda.
var rows = $(".jqplot-table-legend tr");
// Array met legenda's op alfabetische volgorde zetten.
rows.sort(function(a, b)
{
return $(a).children().last().text().localeCompare($(b).children().last().text());
});
if (<%=graphInit.graph_type%> == 1)
{
// Verschuif de regels op de juiste plek en verberg de regels die niet gebruikt worden.
$.each(rows, function(index, item)
{
if (usrrap_maxresults)
{ // Kijken of alle labels wel getoond dienen te worden.
var xas_waarde;
var label = item.lastChild.innerText;
for (var k = 0; k < l_xxxlabel.length; k++)
{
if (l_xxxlabel[k][label])
{ // pivot bestaat
xas_waarde = l_xxxlabel[k][l_xas_dbs.toLowerCase()];
break; // Gevonden
}
}
var found = false;
for (var k = 0; k < l_data.arr_x.length; k++)
{
if (xas_waarde && l_data.arr_x[k] == xas_waarde)
{ // subxas_waarde bstaat.
found = true;
break; // Gevonden
}
}
$(".jqplot-table-legend tr").parent().append(item); // De parent is table (of tbody).
if (!found)
{ // De x-as waarde was niet aanwezig in de lijst die wordt weergegeven.
// Verwijderen van een item uit rows lijst die gebruikt wordt in de each is niet een goed idee (al lijkt het op het eeste gezicht te werken).
// Het kan onverwachte gebeurtenissen opleveren en dat willen we voorkomen.
// Daarom maar verbergen.
$(item).hide();
}
else
$(".jqplot-table-legend tr").parent().append(item); // De parent is table (of tbody).
}
$(".jqplot-table-legend tr").parent().append(item); // De parent is table (of tbody).
});
}
});
function toImg()
{
var imgData = $("#myGraph").jqplotToImageStr({});
document.getElementById("myGraph").innerHTML = "<img alt='<%=safe.htmlattr(L("lcl_menu_fac_graphs"))%>' src=" + imgData + ">";
$("#toImgButton").hide(); //untested
FcltMgr.alert(L("lcl_viewimagealert"));
}
<% } %>
</script>
</head>
<body id="listbody">
<%
var nobuttons = getQParamInt("nobuttons", 0) == 1;
var noheader = getQParamInt("noheader", 0) == 1;
var buttons = [];
if(!nobuttons && graphInit.graph_type != 5)
buttons.push({ icon: "fa-file-image", title: L("lcl_openimage"), action: "toImg()", id: "toImgButton" });
if (!noheader)
IFRAMER_HEADER(model.records_title, buttons);
var mygraph_height = ((widget_height != null) ? widget_height : 500) - (!noheader && buttons.length ? 32 : 0);
if (graphInit.graph_type == 5)
{
%>
<div id="myGraph"></div>
<% } else { %>
<div id="myGraph" style="height:<%=mygraph_height%>px;" ></div>
<% } %>
</body>
</html>
<%
}
%>
<% ASPPAGE_END(); %> <% ASPPAGE_END(); %>

View File

@@ -0,0 +1,294 @@
<% /*
$Revision$
$Id$
File lfmap.inc
Description: Toon een rapport als kaart/plattegrond
Note: Globale variabele 'rapport' is al gezet
*/
function fac_usrrap_list_map(model, scf_params)
{
var coltitle = getQParam("coltitle", "title");
if (!(coltitle in rapport.fields))
{
coltitle = scf_params.list.columns[0]; // eerste kolom
}
var colwaarde = getQParam("colwaarde", "waarde");
if (!(colwaarde in rapport.fields))
{
colwaarde = scf_params.list.columns[1]; // Tweede kolom
}
var colurl = getQParam("colurl", null);
var transit = "";
if ("transit" in scf_params)
transit = "&" + scf_params.transit.name + "=" + safe.url(scf_params.transit.val);
var xxx_params = { filter : scf_params.filter || shared.qs2json(model),
columns: scf_params.list.columns,
groupby: scf_params.list.groupby,
urllink: scf_params.urllink };
xxx_params.filter.showall = 1;
if (!("coordx" in rapport.fields))
{ // eerst template toevoegen
rapport.fields["coordx"] =
{
"dbs": "coordx",
"label": "Coordx",
"orglabel": "Coordx",
"fixedlabel": false,
"manual": false,
"sql": " komt zo ",
"typ": "float",
"orgtyp": "float",
"group": {
"id": "G",
"name": "N.v.t."
},
"sorting": {
"id": 3,
"name": "Automatisch"
},
"visible": "I"
};
rapport.fields["coordy"] =
{
"dbs": "coordy",
"label": "Coordy",
"orglabel": "Coordy",
"fixedlabel": false,
"manual": false,
"sql": " komt zo ",
"typ": "float",
"orgtyp": "float",
"group": {
"id": "G",
"name": "N.v.t."
},
"sorting": {
"id": 3,
"name": "Automatisch"
},
"visible": "I"
};
// Voor alg_gebouw_key en alg_locatie_key doen we al wat auto-magie
// de versie zonder alg_ ervoor komt uit de udr
if ("gebouw_key" in rapport.fields || "alg_gebouw_key" in rapport.fields)
{
var keyfld = ("gebouw_key" in rapport.fields?"gebouw_key":"alg_gebouw_key");
var keyfield = rapport.table + "." + keyfld;
rapport.fields["coordx"].sql = "(SELECT COALESCE(alg_gebouw_x, alg_locatie_x)"
+ " FROM alg_gebouw g"
+ " , alg_locatie l"
+ " WHERE g.alg_gebouw_key = " + keyfield
+ " AND g.alg_locatie_key = l.alg_locatie_key)";
rapport.fields["coordy"].sql = "(SELECT COALESCE(alg_gebouw_y, alg_locatie_y)"
+ " FROM alg_gebouw g"
+ " , alg_locatie l"
+ " WHERE g.alg_gebouw_key = " + keyfield
+ " AND g.alg_locatie_key = l.alg_locatie_key)";
}
else if ("locatie_key" in rapport.fields || "alg_locatie_key" in rapport.fields)
{
var keyfld = ("locatie_key" in rapport.fields?"locatie_key":"alg_locatie_key");
var keyfield = rapport.table + "." + keyfld;
rapport.fields["coordx"].sql = "(SELECT alg_locatie_x"
+ " FROM alg_locatie l"
+ " WHERE g.alg_locatie_key = " + keyfield;
rapport.fields["coordy"].sql = "(SELECT alg_locatie_y"
+ " FROM alg_locatie l"
+ " WHERE g.alg_locatie_key = " + keyfield;
}
else
shared.internal_error( "No suitable coordinate fields found in report");
}
if (!inArray("coordx", xxx_params.columns))
{
xxx_params.columns.push("coordx");
xxx_params.columns.push("coordy");
if (keyfld)
{
xxx_params.columns.push(keyfld); // waarom krijg ik 'Geen GROUP BY-uitdrukking.' als ik deze vooraan zet?
xxx_params.groupby.push(keyfld);
}
xxx_params.groupby.push("");
xxx_params.groupby.push("");
}
var rap_data = rapport.REST_GET(xxx_params);
var result = [];
var markerwaardemin = -1;
var markerwaardemax = -1;
var fixedradius = false;
var avgmarkerradius = 20; // straal in px voor standaard (fixed) of middelste (dynamisch) waarde
for (var i = 0; i < rap_data.length; i++)
{
var data = rap_data[i];
if (data.coordx === null || data.coordy === null)
continue;
var fclturl = null;
if (colurl)
{
fclturl = data[colurl];
}
else if (rapport.list.default_url)
{
fclturl = rapport.list.default_url + data.id;
}
// Waarde-range bepalen
if (data[colwaarde] < markerwaardemin || markerwaardemin == -1)
markerwaardemin = data[colwaarde];
if (data[colwaarde] > markerwaardemax || markerwaardemax == -1)
markerwaardemax = data[colwaarde];
// color is:
// the color as defined in the color column, else
// the color defined by waarde in relation to the limit0..limit3 definitions, else
// no color, i.e. the default
var markercolor = data.color;
if (!data.color && data[colwaarde] && rapport.limit1 && rapport.limit2)
{
var descending = (rapport.limit1 > rapport.limit2);
if (data[colwaarde]) // EN numeriek
{
if (descending)
{
markercolor = (data[colwaarde] > rapport.limit1 ? "red" :
(data[colwaarde] > rapport.limit2 ? "orange" : "green"))
}
else
{
markercolor = (data[colwaarde] > rapport.limit2 ? "green" :
(data[colwaarde] > rapport.limit1 ? "orange" : "red"))
}
}
}
if (markercolor) fixedradius = true; // ik vind en kleuren en omvang dubbelop en onzin
result.push({ title: data[coltitle],
loc: [data.coordx, data.coordy],
id: data.id,
fclturl: rapport.list.default_url?rapport.list.default_url.format(data.id):null,
waarde: data[colwaarde],
color: markercolor,
textColor: data.textcolor
});
}
var markerwaarderange = (markerwaardemax - markerwaardemin).toFixed(0);
%>
<html>
<head>
<% FCLTHeader.Generate(); %>
<style>
body {
padding: 0;
margin: 0;
}
geenhekjeaanbeginregel, #mapid {
height: 100%;
width: 100vw;
}
.datatext {
text-align: center;
padding: 2px 1px 0 1px;
font-size: 12px;
min-width: 24px;
min-height: 24px;
border-radius: 12px;
}
</style>
</head>
<body>
<div id="mapid" style='height: 500px;'></div>
<script>
var llhome = [52.155172, 5.387201]; //Onze Lieve Vrouwetoren (Amersfoort)
function resizeIframes()
{
var height = parseInt(document.documentElement.clientHeight);
alert(height);
//alert($('#mapid').height());
height = 600;
$('#mapid').height(height);
alert($('#mapid').height());
}
$(function ()
{
var map = L.map('mapid', { preferCanvas: true, zoomControl: false }).setView(llhome, 8);
var opentileurl = '<%=S("fac_lfmap_tileprovider")%>'; // https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';
// var opentileurl = 'lfosmproxy.asp?z={z}&x={x}&y={y}'; // te veel gedoe vooralsnog
var maposm = L.tileLayer(opentileurl, {
maxZoom: 18,
attribution: 'Map data &copy; <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, ' +
'<a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>',
id: 'maposm',
tileSize: 256,
zoomOffset: 0
}).addTo(map);
var xxxxdata = <%= JSON.stringify(result, null, " ") %>;
var l = new L.FeatureGroup();
map.addLayer(l);
for (var i = 0; i < xxxxdata.length; i++)
{
var data = xxxxdata[i]
//https://stackoverflow.com/questions/48872298/
var markerOpts = L.Util.extend( {radius: <%=fixedradius ? avgmarkerradius : avgmarkerradius/2+"+(data.waarde-"+markerwaardemin+")*"+avgmarkerradius+"/"+markerwaarderange %>, xxcolor:"#ff4455" }, data );
var marker = L.circleMarker(data.loc, markerOpts);
l.addLayer(marker);
if (data.waarde)
{
var text = L.tooltip({
permanent: true,
direction: 'center',
className: 'datatext'
})
.setContent(String(data.waarde) || "??")
.setLatLng(data.loc)
.addTo(l);
}
if (data.title) // wordt niet rechtstreeks door circleMarker ondersteund
{
var text2 = L.tooltip({
direction: 'top',
className: 'text2'
})
.setContent(data.title)
.setLatLng(data.loc);
marker.bindTooltip(text2);
}
}
l.on("click", function (event) {
//resizeIframes();
//return;
console.log(event);
var clickedMarker = event.layer;
if (clickedMarker.options.fclturl)
FcltMgr.openDetail(clickedMarker.options.fclturl);
});
//var height = parseInt(parent.document.documentElement.clientHeight);
//alert(height);
$('#mapid').height($(window).height());
map.fitBounds(l.getBounds(), { padding: [20, 20] });
});
</script>
</body>
<%}
%>

View File

@@ -1,228 +0,0 @@
<% /*
$Revision$
$Id$
lfmap.inc
*/
var usrrap_key = getQParamInt("usrrap_key", -1);
function fac_usrrap_list_map()
{
%>
<html>
<head>
<% FCLTHeader.Generate(); %>
<style>
geenhekjeaanbeginregel, #mapid { }
body {
padding: 0;
margin: 0;
}
geenhekjeaanbeginregel, #mapid {
height: 100%;
width: 100vw;
}
.my-custom-icon{
width: 24px !important;
height: 24px !important;
margin-left: -12px;
margin-top: -12px;
border-radius: 18px;
border: 2px solid #3F51B5;
text-align: center;
color: #3F51B5;
background-color: #fff;
font-size: 16px;
}
.circle-with-txt {
position: relative;
color: white;
font-size: 12px;
font-weight: bold;
width: 40px;
height: 40px;
}
.datatext {
text-align: center;
padding: 2px 1px 0 1px;
font-size: 12px;
min-width: 24px;
min-height: 24px;
border-radius: 12px;
}
.txt {
margin: 0;
position: absolute;
top: 50%;
left: 50%;
-ms-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
font-size: 16px;
}
</style>
</head>
<body>
<div id="mapid" style='height: 500px;'></div>
<script>
var llhome = [52.155172, 5.387201]; //Onze Lieve Vrouwetoren (Amersfoort)
function resizeIframes()
{
var height = parseInt(document.documentElement.clientHeight);
alert(height);
//alert($('#mapid').height());
height = 600;
$('#mapid').height(height);
alert($('#mapid').height());
}
$(function ()
{
var map = L.map('mapid', { preferCanvas: true, zoomControl: false }).setView(llhome, 8);
var opentileurl = 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';
var opentileurl = 'lfosmproxy.asp?z={z}&x={x}&y={y}';
var maposm = L.tileLayer(opentileurl, {
maxZoom: 18,
attribution: 'Map data &copy; <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, ' +
'<a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>',
id: 'maposm',
tileSize: 256,
zoomOffset: 0
}).addTo(map);
//var markersLayer = L.markerClusterGroup({ disableClusteringAtZoom: 11 });
//map.addLayer(markersLayer);
<%
var usrrap_key = getQParamInt("usrrap_key", -1);
if (usrrap_key > 0)
{
var rapport = model_reports(usrrap_key);
var coltitle = getQParamInt("coltitle", "title");
var colurl = getQParam("colurl", null);
var xxx_params = { filter : shared.qs2json(rapport), columns: [coltitle], groupby: [] };
xxx_params.filter.showall = 1;
xxx_params.filter.limit = 9999;
xxx_params.filter.scf_pivot = 0; // nooit (?)
var rap_data = rapport.REST_GET(xxx_params);
var result = [];
var markerwaardemin = -1;
var markerwaardemax = -1;
var fixedradius = false;
var avgmarkerradius = 20; // straal in px voor standaard (fixed) of middelste (dynamisch) waarde
for (var i = 0; i < rap_data.length; i++)
{
var data = rap_data[i];
var fclturl = null;
if (colurl)
{
fclturl = data[colurl];
}
else if (rapport.list.default_url)
{
fclturl = rapport.list.default_url + data.id;
}
// Waarde-range bepalen
if (data.waarde < markerwaardemin || markerwaardemin == -1)
markerwaardemin = data.waarde;
if (data.waarde > markerwaardemax || markerwaardemax == -1)
markerwaardemax = data.waarde;
// color is:
// the color as defined in the color column, else
// the color defined by waarde in relation to the limit0..limit3 definitions, else
// no color, i.e. the default
var markercolor = data.color;
if (!data.color && data.waarde && rapport.limit1 && rapport.limit2)
{
var descending = (rapport.limit1 > rapport.limit2);
if (data.waarde) // EN numeriek
{
if (descending)
{
markercolor = (data.waarde > rapport.limit1 ? "red" :
(data.waarde > rapport.limit2 ? "orange" : "green"))
}
else
{
markercolor = (data.waarde > rapport.limit2 ? "green" :
(data.waarde > rapport.limit1 ? "orange" : "red"))
}
}
}
if (markercolor) fixedradius = true; // ik vind en kleuren en omvang dubbelop en onzin
result.push({ title: data.title,
loc: [data.coordx, data.coordy],
id: data.id,
fclturl: rapport.list.default_url?rapport.list.default_url.format(data.id):null,
waarde: data.waarde,
color: markercolor,
textColor: data.textcolor
});
}
var markerwaarderange = (markerwaardemax - markerwaardemin).toFixed(0);
}
%> var xxxxdata = <%= JSON.stringify(result, null, " ") %>;
var l = new L.FeatureGroup();
map.addLayer(l);
for (var i = 0; i < xxxxdata.length; i++)
{
var data = xxxxdata[i]
//https://stackoverflow.com/questions/48872298/
var markerOpts = L.Util.extend( {radius: <%=fixedradius ? avgmarkerradius : avgmarkerradius/2+"+(data.waarde-"+markerwaardemin+")*"+avgmarkerradius+"/"+markerwaarderange %>, xxcolor:"#ff4455" }, data );
var marker = L.circleMarker(data.loc, markerOpts);
l.addLayer(marker);
if (data.waarde)
{
var text = L.tooltip({
permanent: true,
direction: 'center',
className: 'datatext'
})
.setContent(String(data.waarde) || "??")
.setLatLng(data.loc)
.addTo(l);
}
if (data.title) // wordt niet rechtstreeks door circleMarker ondersteund
{
var text2 = L.tooltip({
direction: 'top',
className: 'text2'
})
.setContent(data.title)
.setLatLng(data.loc);
marker.bindTooltip(text2);
}
}
l.on("click", function (event) {
//resizeIframes();
//return;
console.log(event);
var clickedMarker = event.layer;
if (clickedMarker.options.fclturl)
FcltMgr.openDetail(clickedMarker.options.fclturl);
});
map.fitBounds(l.getBounds(), { padding: [20, 20] });
// var control = L.control.layers(baseMaps, null, { collapsed: true, sortLayers: true }).addTo(map);
});
</script>
</body>
<%}
%>

View File

@@ -1,13 +1,23 @@
<%@language = "javascript" %> <%@language = "javascript" %>
<% <% /*
$Revision$
$Id$
YET UNUSED in 2022.3
File lfosmproxy.asp
Description: Proxy-bestand om max-tiles op te halen
Voorkomt dat we last krijgen van CORS(?)
Parameters: x, y, z
Note: Nog niet gebruikt in 2022.3 (er zit nog geen opruim mechanisme in)
*/
var JSON_Result = true; var JSON_Result = true;
var ANONYMOUS_Allowed = 1; var ANONYMOUS_Allowed = 1;
%> %>
<!-- #include file="../Shared/common.inc" --> <!-- #include file="../Shared/common.inc" -->
<% <%
// $Id$
// proxy voor de osm tilemap
var x = getQParamInt("x"); var x = getQParamInt("x");
var y = getQParamInt("y"); var y = getQParamInt("y");
var z = getQParamInt("z"); var z = getQParamInt("z");

View File

@@ -289,7 +289,13 @@ if (typeof NO_ADDHEADER == "undefined" && S("p3p_header"))
Response.AddHeader("P3P", S("p3p_header")); Response.AddHeader("P3P", S("p3p_header"));
if (typeof NO_ADDHEADER == "undefined" && S("csp_header") && S("csp_header") != "X") if (typeof NO_ADDHEADER == "undefined" && S("csp_header") && S("csp_header") != "X")
Response.AddHeader("Content-Security-Policy", S("csp_header")); {
if (this.CSP_EXTRADATA) // sta openstreemap tiles toe
var csp_header = S("csp_header").format(S("csp_header_extradata"));
else
var csp_header = S("csp_header").format("");
Response.AddHeader("Content-Security-Policy", csp_header);
}
if (typeof NO_ADDHEADER == "undefined" && S("referrer_policy_header") && S("referrer_policy_header") != "X") if (typeof NO_ADDHEADER == "undefined" && S("referrer_policy_header") && S("referrer_policy_header") != "X")
Response.AddHeader("Referrer-Policy", S("referrer_policy_header")); Response.AddHeader("Referrer-Policy", S("referrer_policy_header"));