territories-dashboard-lib 0.1.33b1__py3-none-any.whl → 1.1.1.dev7__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. territories_dashboard_lib/geo_lib/admin.py +3 -1
  2. territories_dashboard_lib/geo_lib/migrations/0002_geoelement_linked_to_indicator.py +18 -0
  3. territories_dashboard_lib/geo_lib/migrations/0003_geofeature_color_column_geofeature_size_column.py +23 -0
  4. territories_dashboard_lib/geo_lib/models.py +17 -0
  5. territories_dashboard_lib/geo_lib/payloads.py +7 -21
  6. territories_dashboard_lib/geo_lib/views.py +58 -53
  7. territories_dashboard_lib/indicators_lib/enums.py +61 -37
  8. territories_dashboard_lib/indicators_lib/methodo_pdf.py +6 -1
  9. territories_dashboard_lib/indicators_lib/migrations/0004_alter_indicator_min_mesh.py +18 -0
  10. territories_dashboard_lib/indicators_lib/migrations/0005_auto_20251203_1621.py +124 -0
  11. territories_dashboard_lib/indicators_lib/models.py +7 -4
  12. territories_dashboard_lib/indicators_lib/payloads.py +14 -1
  13. territories_dashboard_lib/indicators_lib/query/commons.py +90 -104
  14. territories_dashboard_lib/indicators_lib/query/comparison.py +8 -3
  15. territories_dashboard_lib/indicators_lib/query/details.py +8 -13
  16. territories_dashboard_lib/indicators_lib/query/histogram.py +6 -1
  17. territories_dashboard_lib/indicators_lib/query/indicator_card.py +12 -7
  18. territories_dashboard_lib/indicators_lib/query/top_10.py +13 -12
  19. territories_dashboard_lib/indicators_lib/query/utils.py +9 -0
  20. territories_dashboard_lib/indicators_lib/table.py +15 -12
  21. territories_dashboard_lib/indicators_lib/views.py +49 -59
  22. territories_dashboard_lib/superset_lib/logic.py +24 -25
  23. territories_dashboard_lib/superset_lib/migrations/0002_alter_filter_mesh.py +18 -0
  24. territories_dashboard_lib/tracking_lib/enums.py +1 -0
  25. territories_dashboard_lib/tracking_lib/migrations/0005_alter_page_cmp_territory_mesh_alter_page_submesh_and_more.py +28 -0
  26. territories_dashboard_lib/tracking_lib/migrations/0006_alter_event_name.py +18 -0
  27. territories_dashboard_lib/tracking_lib/payloads.py +4 -2
  28. territories_dashboard_lib/tracking_lib/views.py +7 -6
  29. territories_dashboard_lib/website_lib/conf.py +28 -0
  30. territories_dashboard_lib/website_lib/context_processors.py +5 -6
  31. territories_dashboard_lib/website_lib/migrations/0005_mainconf_meshes.py +20 -0
  32. territories_dashboard_lib/website_lib/models.py +12 -0
  33. territories_dashboard_lib/website_lib/params.py +34 -22
  34. territories_dashboard_lib/website_lib/serializers.py +1 -0
  35. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/anchor.mjs +45 -0
  36. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/comparaison/page.mjs +5 -9
  37. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/details/histogram.mjs +4 -1
  38. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/details/page.mjs +2 -7
  39. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/details/proportions.mjs +3 -2
  40. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/details/top10.mjs +4 -2
  41. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/details/utils.mjs +14 -5
  42. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/dom.mjs +0 -15
  43. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/enums.mjs +13 -10
  44. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/side_panel.mjs +1 -15
  45. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/js/pages/indicators/theme/page.mjs +5 -9
  46. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/react/indicatorMap.bundle.js +1 -1
  47. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/react/sankeyGraph.bundle.js +1 -1
  48. territories_dashboard_lib/website_lib/static/territories_dashboard_lib/website/react/vendors.bundle.js +1 -1
  49. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/layout/base.css +12 -0
  50. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/layout/header.html +1 -1
  51. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/comparaison/[theme]/page.html +4 -3
  52. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/anchor.html +14 -0
  53. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/geo_params.html +3 -3
  54. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/indicator-card.html +14 -8
  55. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/select_territory.html +32 -0
  56. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/side_panel_geo.html +8 -35
  57. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/details/components/histogram.html +1 -0
  58. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/details/components/no-data.html +1 -0
  59. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/details/components/proportions.html +1 -0
  60. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/details/components/top10.html +1 -0
  61. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/details/map.css +3 -2
  62. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/details/page.css +8 -0
  63. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/details/page.html +9 -8
  64. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/methodo/methodo.js +28 -0
  65. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/methodo/page.html +40 -0
  66. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/themes/page.html +4 -3
  67. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/sitemap/page.html +9 -0
  68. territories_dashboard_lib/website_lib/templatetags/other_filters.py +6 -3
  69. territories_dashboard_lib/website_lib/views.py +100 -0
  70. {territories_dashboard_lib-0.1.33b1.dist-info → territories_dashboard_lib-1.1.1.dev7.dist-info}/METADATA +3 -3
  71. {territories_dashboard_lib-0.1.33b1.dist-info → territories_dashboard_lib-1.1.1.dev7.dist-info}/RECORD +74 -62
  72. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/side_panel_methodo.css +0 -29
  73. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/side_panel_methodo.html +0 -45
  74. territories_dashboard_lib/website_lib/templates/territories_dashboard_lib/website/pages/indicators/components/side_panel_methodo.js +0 -19
  75. {territories_dashboard_lib-0.1.33b1.dist-info → territories_dashboard_lib-1.1.1.dev7.dist-info}/WHEEL +0 -0
  76. {territories_dashboard_lib-0.1.33b1.dist-info → territories_dashboard_lib-1.1.1.dev7.dist-info}/licenses/licence.md +0 -0
  77. {territories_dashboard_lib-0.1.33b1.dist-info → territories_dashboard_lib-1.1.1.dev7.dist-info}/top_level.txt +0 -0
@@ -53,6 +53,7 @@ def serialize_indicator(indicator):
53
53
  "name": item.name,
54
54
  "label": item.label,
55
55
  "filterable": item.filterable,
56
+ "linked_to_indicator": item.linked_to_indicator,
56
57
  }
57
58
  for item in gf.items.all()
58
59
  ],
@@ -0,0 +1,45 @@
1
+ function enableAnchorLinks() {
2
+ document.querySelectorAll("button.anchor-link").forEach((button) => {
3
+ const describedBy = button.getAttribute("aria-describedby");
4
+ button.addEventListener("click", () => {
5
+ const anchor = button.dataset.anchor;
6
+ window.history.replaceState(undefined, undefined, "#" + anchor);
7
+ navigator.clipboard.writeText(window.location.href);
8
+ setTimeout(() => {
9
+ // to close the tooltip and not trigger it again when reloading the URL
10
+ button.parentElement.click();
11
+ }, 500);
12
+ });
13
+ });
14
+ }
15
+
16
+ function trackAnchorLinks() {
17
+ const buttons = document.querySelectorAll('button[data-track="true"]');
18
+ console.log("BUTTONS", buttons);
19
+ if (buttons.length === 0) return;
20
+
21
+ const observer = new IntersectionObserver((entries) => {
22
+ entries.forEach((entry) => {
23
+ if (entry.isIntersecting) {
24
+ fetch("/api/tracking/event/", {
25
+ method: "POST",
26
+ body: JSON.stringify({
27
+ indicator: entry.target.dataset.indicator,
28
+ event: "vue-resume-indicateur",
29
+ }),
30
+ });
31
+ observer.unobserve(entry.target);
32
+ }
33
+ });
34
+ });
35
+
36
+ window.addEventListener(
37
+ "scroll",
38
+ () => {
39
+ buttons.forEach((button) => observer.observe(button));
40
+ },
41
+ { once: true }
42
+ );
43
+ }
44
+
45
+ export { enableAnchorLinks, trackAnchorLinks };
@@ -2,10 +2,11 @@
2
2
  import { callData, getSearchParams } from "./data.mjs";
3
3
  import { delaySpinner, getClosestIndicator } from "../dom.mjs";
4
4
  import { handleFilterClick, initializeFilters } from "../filters.mjs";
5
- import { addSidePanelListener, openMethodoSidePanel } from "../side_panel.mjs";
5
+ import { addSidePanelListener } from "../side_panel.mjs";
6
6
 
7
7
  import { exportImageAsync } from "../export-graph.mjs";
8
8
  import { exportToCSV } from "../export.mjs";
9
+ import { enableAnchorLinks, trackAnchorLinks } from "../anchor.mjs";
9
10
 
10
11
  Chart.register(
11
12
  Chart.CategoryScale,
@@ -43,14 +44,6 @@ document.querySelectorAll(".indicator-card").forEach((indicatorCard) => {
43
44
  callData(indicator);
44
45
  });
45
46
  });
46
-
47
- indicatorCard
48
- .querySelectorAll('button[aria-controls="slide-panel-methodo"]')
49
- .forEach((button) => {
50
- button.addEventListener("click", () => {
51
- openMethodoSidePanel(indicator, button);
52
- });
53
- });
54
47
  });
55
48
 
56
49
  document
@@ -105,3 +98,6 @@ document.addEventListener("DOMContentLoaded", () => {
105
98
  });
106
99
  addSidePanelListener();
107
100
  });
101
+
102
+ enableAnchorLinks();
103
+ trackAnchorLinks();
@@ -8,7 +8,7 @@ import {
8
8
  } from "../enums.mjs";
9
9
  import { makeChart, setBackgroundInDatasets } from "../utils.mjs";
10
10
 
11
- import { addEmptyGraphMessage } from "./utils.mjs";
11
+ import { addEmptyGraphMessage, removeEmptyGraphMessage } from "./utils.mjs";
12
12
  import { formatIndicatorValue } from "../format.mjs";
13
13
 
14
14
  function getDatalabels(dataset, mesh) {
@@ -94,9 +94,12 @@ export function makeHistogramChart(indicator) {
94
94
  const { datasetsHistogramBarChart: dataset, deciles } = histogramData;
95
95
 
96
96
  const ctx = document.getElementById("histogramChart");
97
+
97
98
  if (Object.keys(dataset).length === 0) {
98
99
  addEmptyGraphMessage(ctx);
99
100
  return;
101
+ } else {
102
+ removeEmptyGraphMessage(ctx);
100
103
  }
101
104
 
102
105
  const labels = deciles.map((decile) => formatIndicatorValue(decile));
@@ -7,7 +7,7 @@ import {
7
7
  updateFiltersReminder,
8
8
  updateUrlWithFilters,
9
9
  } from "../filters.mjs";
10
- import { addSidePanelListener, openMethodoSidePanel } from "../side_panel.mjs";
10
+ import { addSidePanelListener } from "../side_panel.mjs";
11
11
 
12
12
  import { exportImageAsync } from "../export-graph.mjs";
13
13
  import { exportToCSV } from "../export.mjs";
@@ -33,12 +33,7 @@ initializeFilters(indicator);
33
33
  callData(indicator);
34
34
  makeMap(indicator);
35
35
  makeSankeyGraph(indicator);
36
- const openMethodoButton = document.querySelector(
37
- 'button[aria-controls="slide-panel-methodo"]'
38
- );
39
- openMethodoButton.addEventListener("click", () => {
40
- openMethodoSidePanel(indicator, openMethodoButton);
41
- });
36
+
42
37
  document.querySelectorAll(".filter-tag").forEach((button) => {
43
38
  button.addEventListener("click", async () => {
44
39
  await handleFilterClick(indicator);
@@ -2,7 +2,7 @@ import { getIndicatorDataScript, getParams } from "../dom.mjs";
2
2
  import { getToolTip, makeChart, setBackgroundInDatasets } from "../utils.mjs";
3
3
 
4
4
  import { COLORS } from "../enums.mjs";
5
- import { addEmptyGraphMessage } from "./utils.mjs";
5
+ import { addEmptyGraphMessage, removeEmptyGraphMessage } from "./utils.mjs";
6
6
  import { formatIndicatorValue } from "../format.mjs";
7
7
 
8
8
  function getPlugins(indicator, total) {
@@ -67,6 +67,8 @@ function makeProportionsChart(indicator) {
67
67
  if (datasets.length === 0 || emptyDatasets) {
68
68
  addEmptyGraphMessage(ctx);
69
69
  return;
70
+ } else {
71
+ removeEmptyGraphMessage(ctx);
70
72
  }
71
73
 
72
74
  const total = datasets.map((d) => d.data[0]).reduce((a, b) => a + b, 0);
@@ -92,7 +94,6 @@ function makeProportionsChart(indicator) {
92
94
  },
93
95
  },
94
96
  };
95
-
96
97
  makeChart(ctx, "bar", data, options);
97
98
  }
98
99
 
@@ -1,6 +1,6 @@
1
1
  import { getToolTip, makeChart, setBackgroundInDatasets } from "../utils.mjs";
2
2
 
3
- import { addEmptyGraphMessage } from "./utils.mjs";
3
+ import { addEmptyGraphMessage, removeEmptyGraphMessage } from "./utils.mjs";
4
4
  import { formatIndicatorValue } from "../format.mjs";
5
5
  import { getIndicatorDataScript } from "../dom.mjs";
6
6
 
@@ -40,9 +40,11 @@ function makeTop10Chart(indicator) {
40
40
  datasets,
41
41
  };
42
42
 
43
- if (data.labels.length === 0) {
43
+ if (data.labels.length === 0 || datasets.length === 0) {
44
44
  addEmptyGraphMessage(ctx);
45
45
  return;
46
+ } else {
47
+ removeEmptyGraphMessage(ctx);
46
48
  }
47
49
 
48
50
  const options = {
@@ -1,8 +1,17 @@
1
1
  function addEmptyGraphMessage(ctx) {
2
- const div = document.createElement("div");
3
- div.textContent =
4
- "Il n'y a pas assez de données pour afficher le graphique.";
5
- ctx.parentNode.insertBefore(div, ctx);
2
+ const oldChart = Chart.getChart(ctx);
3
+ if (oldChart) {
4
+ oldChart.destroy();
5
+ }
6
+ const noMessageDiv =
7
+ ctx.parentElement.parentElement.querySelector(".no-data-message");
8
+ if (noMessageDiv) noMessageDiv.dataset.show = "true";
6
9
  }
7
10
 
8
- export { addEmptyGraphMessage };
11
+ function removeEmptyGraphMessage(ctx) {
12
+ const noMessageDiv =
13
+ ctx.parentElement.parentElement.querySelector(".no-data-message");
14
+ if (noMessageDiv) noMessageDiv.dataset.show = "false";
15
+ }
16
+
17
+ export { addEmptyGraphMessage, removeEmptyGraphMessage };
@@ -1,17 +1,3 @@
1
- function fillMethodoSidePanel(indicator) {
2
- const container = document.getElementById(
3
- "slide-panel-content-methodo-markdown"
4
- );
5
- container.innerHTML = indicator.methodo_html;
6
- const exportButton = document.getElementById("methodo-export-button");
7
- exportButton.dataset.indicatorName = indicator.name;
8
- exportButton.dataset.indicatorTitle = indicator.title;
9
- document.getElementById("slide-panel-methodo-indicator-title").textContent =
10
- indicator.title;
11
- document.getElementById("slide-panel-methodo-theme-title").textContent =
12
- indicator.theme;
13
- }
14
-
15
1
  function getClosestIndicator(element) {
16
2
  const indicatorId = element.closest(".indicator-card").dataset.indicator;
17
3
  return JSON.parse(document.getElementById(indicatorId).textContent);
@@ -81,7 +67,6 @@ function delaySpinner() {
81
67
  export {
82
68
  delaySpinner,
83
69
  getClosestIndicator,
84
- fillMethodoSidePanel,
85
70
  makeIndicatorDataScript,
86
71
  getIndicatorDataScript,
87
72
  getIsAlternativeUnit,
@@ -2,11 +2,12 @@ const THOUSANDS = "k";
2
2
  const MILLIONS = "M";
3
3
 
4
4
  const MeshLevel = {
5
- National: "fr",
6
- Region: "reg",
7
- Department: "dep",
8
- Epci: "epci",
9
- Town: "com",
5
+ fr: "fr",
6
+ reg: "reg",
7
+ dep: "dep",
8
+ epci: "epci",
9
+ com: "com",
10
+ aom: "aom",
10
11
  };
11
12
 
12
13
  const COLORS = {
@@ -76,16 +77,18 @@ const PATTERNS = [
76
77
 
77
78
  function getMeshLevelTitle(meshLevel) {
78
79
  switch (meshLevel) {
79
- case MeshLevel.Region:
80
+ case MeshLevel.reg:
80
81
  return "Région";
81
- case MeshLevel.Department:
82
+ case MeshLevel.dep:
82
83
  return "Département";
83
- case MeshLevel.Epci:
84
+ case MeshLevel.epci:
84
85
  return "Intercommunalité";
85
- case MeshLevel.Town:
86
+ case MeshLevel.com:
86
87
  return "Commune";
87
- case MeshLevel.National:
88
+ case MeshLevel.fr:
88
89
  return "France entière";
90
+ case MeshLevel.aom:
91
+ return "AOM";
89
92
  }
90
93
  }
91
94
 
@@ -1,22 +1,13 @@
1
- import { fillMethodoSidePanel } from "./dom.mjs";
2
-
3
1
  let buttonWhichOpenedPanel = null;
4
2
 
5
3
  function closeSidePanel() {
6
4
  const sidePanelGeo = document.getElementById("slide-panel-geo");
7
- const sidePanelMethodo = document.getElementById("slide-panel-methodo");
8
5
  sidePanelGeo.classList.remove("tdbmd-slide-panel--show");
9
- sidePanelMethodo.classList.remove("tdbmd-slide-panel--show");
10
6
  if (sidePanelGeo.style.display === "block") {
11
7
  setTimeout(() => {
12
8
  sidePanelGeo.style.display = "none";
13
9
  }, 500);
14
10
  }
15
- if (sidePanelMethodo.style.display === "block") {
16
- setTimeout(() => {
17
- sidePanelMethodo.style.display = "none";
18
- }, 500);
19
- }
20
11
  document.querySelectorAll(".validate-territory-btn").forEach((btn) => {
21
12
  delete btn.dataset.comparison;
22
13
  });
@@ -73,11 +64,6 @@ function releaseFocusTrap() {
73
64
  document.removeEventListener("keydown", focusTrapListener);
74
65
  }
75
66
 
76
- function openMethodoSidePanel(indicator, button) {
77
- fillMethodoSidePanel(indicator);
78
- openSidePanel(button, "methodo");
79
- }
80
-
81
67
  function addSidePanelListener() {
82
68
  const button = document.querySelector(
83
69
  'button[aria-controls="slide-panel-geo"][data-comparison="false"]'
@@ -100,4 +86,4 @@ function addSidePanelListener() {
100
86
  });
101
87
  }
102
88
 
103
- export { openMethodoSidePanel, addSidePanelListener };
89
+ export { addSidePanelListener };
@@ -13,7 +13,7 @@ import {
13
13
  handleFilterClick,
14
14
  initializeFilters,
15
15
  } from "../filters.mjs";
16
- import { addSidePanelListener, openMethodoSidePanel } from "../side_panel.mjs";
16
+ import { addSidePanelListener } from "../side_panel.mjs";
17
17
 
18
18
  import { exportImageAsync } from "../export-graph.mjs";
19
19
  import { exportToCSV } from "../export.mjs";
@@ -21,6 +21,7 @@ import { exportToCSV } from "../export.mjs";
21
21
  import { updateHistoryDOM } from "./history.mjs";
22
22
  import { updateMainValueDOM } from "./main-value.mjs";
23
23
  import { updateStatisticsDOM } from "./statistics.mjs";
24
+ import { enableAnchorLinks, trackAnchorLinks } from "../anchor.mjs";
24
25
 
25
26
  Chart.register(
26
27
  Chart.CategoryScale,
@@ -117,14 +118,6 @@ document.querySelectorAll(".indicator-card").forEach((indicatorCard) => {
117
118
  toggleIndicatorUnit(event.target);
118
119
  });
119
120
  });
120
-
121
- indicatorCard
122
- .querySelectorAll('button[aria-controls="slide-panel-methodo"]')
123
- .forEach((button) => {
124
- button.addEventListener("click", () => {
125
- openMethodoSidePanel(indicator, button);
126
- });
127
- });
128
121
  });
129
122
 
130
123
  document.addEventListener("DOMContentLoaded", () => {
@@ -162,3 +155,6 @@ document
162
155
  button.removeAttribute("disabled");
163
156
  });
164
157
  });
158
+
159
+ enableAnchorLinks();
160
+ trackAnchorLinks();