Blank
A basic version without color theming that use vanilla widgets. The widgets can be configured normally, but cannot be theme.
Dataset in use: monitoring-copy
(See it on userclub domain)
Fields in use:
dataset_id | timestamp (datetime) | size_res (numeric) | user_id | query_text | attributes | action | geo_coordinates |
---|---|---|---|---|---|---|---|
dataproviders-dataods | 2021-11-06T21:39:37+00:00 | 4662 | anonymous | page-home | search | 50.0797,-125.5892 | |
dataproviders-dataods | 2021-12-07T15:13:02+00:00 | 4655 | anonymous | page-home | search | 12.9634,77.5855 | |
dataproviders-dataods | 2021-12-07T09:35:13+00:00 | 2796 | anonymous | page-home | lookup | 48.8582,2.3387 | |
base-nationale-des-lieux-de-covoiturage-en-france | 2021-12-06T17:23:24+00:00 | 0 | anonymous | page-portail | geo | 41.9199,8.7424 |
<div ods-datetime="now">
<ods-dataset-context context="stats"
stats-dataset="ods-api-monitoring"
stats-source="monitoring"
stats-parameters="{'disjunctive.dataset_id':true}"
>
<div class="container">
<section>
<h1 class="title">
Company Data Hub's Analytics
</h1>
<p>DISCLAIMER Lorem ipsum dolor sit amet, consectetur adipisicing elit. Commodi sint, sequi ratione esse, officiis, aliquam quaerat perferendis mollitia laborum cumque molestiae aspernatur.</p>
<p >
These Analytics are based on usages made on <a href="/explore" target="_blank">Company's</a> data portal. Contact <a href=mailto:admin@mycompany.com class="link_color">Admin</a> for any additional questions.
</p>
</section>
<nav class="row row-sticky">
<div class="menu z-depth-2">
<div class="filter">
<div ods-facet-results="items"
ods-facet-results-context="stats"
ods-facet-results-facet-name="dataset_id"
ods-facet-results-sort="alphanum"
>
<ods-select placeholder="Dataset"
selected-values="stats.parameters['refine.dataset_id']"
multiple="false"
options="items"
label-modifier="name"
value-modifier="name"
>
</ods-select>
</div>
</div>
<div class="filter">
<ods-timerange context="stats"
date-format="DD MMM YYYY"
precision="day"
default-from="{{ (now|momentadd:'months':-3)|moment:'YYYY-MM-DD' }}"
default-to="{{ now|moment:'YYYY-MM-DD' }}"
stats-time-field="timestamp"
download-time-field="timestamp"
searchnoresult-time-field="timestamp"
queryresult-time-field="timestamp"
users-time-field="timestamp"
from="startDate"
to="endDate"
>
</ods-timerange>
</div>
</div>
</nav>
<section class="row">
<div class="col-md-6">
<div class="card z-depth-1">
<h2 class="title">
Portal's activity.
</h2>
<p class="subtitle">Count of daily API calls from {{ startDate|date:longDate }} to {{ endDate|date:longDate }}. See full <a href="/explore/dataset/ods-api-monitoring/?source=monitoring&disjunctive.dataset_id"> activity log.</a>
</p>
<ods-chart timescale="day" single-y-axis="true" align-month="true">
<ods-chart-query context="stats" field-x="timestamp" maxpoints="0" timescale="day">
<ods-chart-serie expression-y="size_res" chart-type="areaspline" function-y="COUNT" color="#26ADFF" label-y="Count API calls" scientific-display="true" display-values="true">
</ods-chart-serie>
</ods-chart-query>
</ods-chart>
</div>
</div>
<div class="col-md-6">
<ods-dataset-context context="download"
download-dataset="ods-api-monitoring"
download-source="monitoring"
download-parameters="{'refine.action': 'download'}"
>
<div class="card z-depth-1">
<h2 class="title">
Number of exports
</h2>
<p class="subtitle">Daily number of full dataset download, in any format.</p>
<ods-chart timescale="day"
single-y-axis="true"
align-month="true"
label-x="Automated download (bot)?">
<ods-chart-query context="download"
field-x="timestamp"
maxpoints="0"
timescale="day"
series-breakdown="bot"
category-colors="{'TRUE':'#26ADFF', 'FALSE':'#142E7B'}"
display-legend="true">
<ods-chart-serie expression-y="size_res"
chart-type="spline"
colors="'range-custom'"
function-y="COUNT"
label-y="Count exports"
scientific-display="true"
display-values="true">
</ods-chart-serie>
</ods-chart-query>
</ods-chart>
</div>
</ods-dataset-context>
</div>
</section>
<section class="row">
<div class="col-md-6">
<div class="card z-depth-1">
<h2 class="title">
Users ranked by API calls
</h2>
<p class="subtitle">Most active users by sum of all API calls, regardless of the nature of the call.</p>
<ods-chart>
<ods-chart-query context="stats" field-x="user_id" maxpoints="10" sort="serie1-1" display-legend="true">
<ods-chart-serie chart-type="pie" function-y="COUNT" scientific-display="true">
</ods-chart-serie>
</ods-chart-query>
</ods-chart>
</div>
</div>
<div class="col-md-6">
<ods-dataset-context context="download"
download-dataset="ods-api-monitoring"
download-source="monitoring"
download-parameters="{'refine.action': 'download'}"
>
{{ download.parameters['q.timerange'] = stats.parameters['q.timerange'] ; '' }}
{{ download.parameters['refine.dataset_id'] = stats.parameters['refine.dataset_id'] ; '' }}
<div class="card z-depth-1">
<h2 class="title" >
Users ranked by download count
</h2>
<p class="subtitle">Most active users only on the download action.</p>
<ods-chart>
<ods-chart-query context="download" field-x="user_id" maxpoints="10" sort="serie1-1" display-legend="true">
<ods-chart-serie chart-type="pie" function-y="COUNT" scientific-display="true">
</ods-chart-serie>
</ods-chart-query>
</ods-chart>
</div>
</ods-dataset-context>
</div>
</section>
<section class="row">
<div class="col-md-6">
<ods-dataset-context context="noresults"
noresults-dataset="ods-api-monitoring"
noresults-source="monitoring"
noresults-parameters="{'q':'nhits=0'}"
>
{{ noresults.parameters['q.timerange'] = stats.parameters['q.timerange'] ; '' }}
{{ noresults.parameters['refine.dataset_id'] = stats.parameters['refine.dataset_id'] ; '' }}
<div class="card z-depth-1">
<h2 class="title">
Text searches leading to no result
</h2>
<table class="data-table">
<thead>
<tr>
<th> Rank </th>
<th>Request</th>
<th>Occurrences</th>
</tr>
</thead>
<tbody>
<tr ods-facet-results="emptyqueriesopen"
ods-facet-results-context="noresults"
ods-facet-results-facet-name="query_text"
ng-repeat="(i,emptyquery) in emptyqueriesopen.slice(0,9)"
ng-show="emptyquery.count>5"
>
<td style="text-align:center;">{{ i+1 }}</td>
<td style="width: 100%">{{ emptyquery.name }}</td>
<td>{{ emptyquery.count }}</td>
</tr>
</tbody>
</table>
</div>
</ods-dataset-context>
</div>
<div class="col-md-6">
<ods-dataset-context context="queries"
queries-dataset="ods-api-monitoring"
queries-source="monitoring"
queries-parameters="{'q':'NOT #null(query_text)'}"
>
{{ queries.parameters['q.timerange'] = stats.parameters['q.timerange'] ; '' }}
{{ queries.parameters['refine.dataset_id'] = stats.parameters['refine.dataset_id'] ; '' }}
<div class="card z-depth-1">
<h2 class="title">
Most frequent queries
</h2>
<table class="data-table">
<thead>
<tr>
<th> Rank </th>
<th>Request</th>
<th>Occurrences</th>
</tr>
</thead>
<tbody>
<tr ods-facet-results="frequentqueries"
ods-facet-results-context="queries"
ods-facet-results-facet-name="query_text"
ng-repeat="(i,query) in frequentqueries.slice(0,10)"
ng-show="query.count>5"
>
<td style="text-align:center;">{{ i+1 }}</td>
<td style="width: 100%">{{ query.name }}</td>
<td>{{ query.count }}</td>
</tr>
</tbody>
</table>
</div>
</ods-dataset-context>
</div>
</section>
<section class="row">
<div class="col-md-6">
<div class="card z-depth-1">
<h2 class="title" >
Most active pages
</h2>
<p></p>
<ods-chart>
<ods-chart-query context="stats" field-x="attributes" maxpoints="7" sort="serie1-1">
<ods-chart-serie chart-type="bar" function-y="COUNT" color="#26ADFF" label-y="Sum of API calls" scientific-display="true" display-values="true">
</ods-chart-serie>
</ods-chart-query>
</ods-chart>
</div>
</div>
<div class="col-md-6">
<div class="card z-depth-1">
<h2 class="title">
Popular actions
</h2>
<ods-chart single-y-axis="true" align-month="true" labels-x-length="15">
<ods-chart-query context="stats" field-x="action" maxpoints="6" sort="serie1-1" >
<ods-chart-serie chart-type="bar" function-y="COUNT" color="#26ADFF" label-y="Sum of API calls" scientific-display="true" display-values="true">
</ods-chart-serie>
</ods-chart-query>
</ods-chart>
</div>
</div>
</section>
<section class="row">
<div class="col-md-12">
<div class="card z-depth-1">
<h2 class="title" >
Origin of users on Company's Data Hub
</h2>
<ods-map scroll-wheel-zoom="false"
location="5,47.27923,2.94434"
basemap="jawg.light"
toolbar-geolocation="false"
toolbar-drawing="true"
toolbar-fullscreen="true"
search-box="false"
display-control="false"
display-control-single-layer="true"
>
<ods-map-layer-group>
<ods-map-layer context="stats" color="#26ADFF" picto="ods-circle" show-marker="true" display="auto" shape-opacity="0.5" point-opacity="1" border-color="#FFFFFF" border-opacity="1" border-size="1" border-pattern="solid" caption="false" caption-picto-color="#f2cb46" title="Company Data Hub" size="4" size-min="3" size-max="5" size-function="linear"></ods-map-layer>
</ods-map-layer-group>
</ods-map>
</div>
</div>
</section>
</div>
</ods-dataset-context>
</div>
/* Import des autres stylesheets css*/
body {
background-color: #ffffff;
}
@media screen and (max-width: 992px) {
body {
padding: 0;
}
}
/* ODS Over-ride */
.row > *:first-child {
margin-left: 0;
}
.row > *:last-child {
margin-right: 0;
}
.row {
display: flex;
justify-content: center;
}
@media screen and (max-width: 992px) {
.row {
flex-direction: column;
}
.row > *:not(:last-child) {
margin-bottom: 16px;
}
}
.odswidget-charts {
margin: 0 -12px;
}
/* Utilities */
.z-depth-1 {
z-index: 1;
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14),
0 3px 1px -2px rgba(0, 0, 0, 0.12), 0 1px 5px 0 rgba(0, 0, 0, 0.2);
}
.z-depth-2 {
z-index: 2;
box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12),
0 2px 4px -1px rgba(0, 0, 0, 0.3);
}
.row-sticky {
position: sticky;
top: 0;
z-index: 20;
}
/* Elements */
section {
padding: 0 16px;
margin: 16px 0;
}
.title {
margin-bottom: 1em;
}
.subtitle {
margin-top: -1em;
}
h1.title {
font-size: 2.25rem;
}
h2.title {
font-size: 1.5rem;
}
h5.subtitle {
font-size: 1.25rem;
font-weight: 600;
margin: 0;
}
/* Components */
.menu {
display: flex;
justify-content: center;
align-items: stretch;
background: white;
border-radius: 999px;
padding: 0 16px;
margin-top: 16px;
}
@media screen and (max-width: 768px) {
.menu {
flex-direction: column;
width: 100%;
border-radius: 0;
margin: 0;
padding: 0;
}
}
.filter {
display: flex;
flex: 1 1;
align-items: center;
justify-content: flex-end;
padding: 8px;
}
.filter:not(:last-child) {
border-right: 1px solid lightgray;
}
.filter .odswidget-select {
min-width: 220px;
}
.filter > *:not(:last-child) {
margin-right: 8px;
}
.filter .odswidget-timerange {
display: flex;
}
.filter .odswidget-timerange__to,
.filter .odswidget-timerange__from {
display: flex;
justify-content: space-between;
margin-right: 16px;
}
.filter .odswidget-timerange__label {
margin-right: 8px;
}
.filter .odswidget-select-button:hover {
/*! border: 1px solid #33629C; */
}
.filter .odswidget-select-button,
.filter .odswidget-select-input {
padding: 8px;
border: none;
background: transparent;
}
.filter .odswidget-select-button:hover {
border: none;
}
.filter .odswidget-timerange__input {
border: none;
border-bottom: 1px solid lightgrey;
}
.filter .odswidget-select-dropdown-menu {
top: 32px;
}
.filter .odswidget-select-input-container {
border: none;
}
@media screen and (max-width: 768px) {
.filter {
justify-content: center;
}
.filter .odswidget-timerange {
flex-direction: column;
}
.filter .odswidget-timerange__from {
margin-bottom: 2em;
}
.filter:not(:last-child) {
width: 100%;
border-right: none;
border-bottom: 1px solid lightgray;
}
}
.card {
border-radius: 4px;
padding: 16px;
height: 100%;
}
.data-table {
width: 100%;
}
.data-table th {
background-color: #f2f3f8;
padding: 8px;
color: #142e7b;
font-weight: 300;
white-space: nowrap;
}
.data-table td a {
font-weight: 300;
}
.data-table td {
padding: 8px;
max-width: 265px;
overflow: hidden;
text-overflow: ellipsis;
}
.data-table tr {
border-top: 1px solid #dee5ef;
}
.data-table tbody tr:nth-child(-n + 3) * {
font-weight: 500;
}