diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 49a0e5b53b2..ff84408187b 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -466,7 +466,7 @@ jobs:
token: ${{ secrets.GH_INFRA_K8S_TOKEN }}
inputs: '{ "environment":"${{ secrets.GHA_K8S_CLUSTER }}", "app":"datatracker", "appVersion":"${{ env.PKG_VERSION }}", "remoteRef":"${{ github.sha }}" }'
wait-for-completion: true
- wait-for-completion-timeout: 10m
+ wait-for-completion-timeout: 30m
wait-for-completion-interval: 30s
display-workflow-run-url: false
@@ -493,6 +493,6 @@ jobs:
token: ${{ secrets.GH_INFRA_K8S_TOKEN }}
inputs: '{ "environment":"${{ secrets.GHA_K8S_CLUSTER }}", "app":"datatracker", "appVersion":"${{ env.PKG_VERSION }}", "remoteRef":"${{ github.sha }}" }'
wait-for-completion: true
- wait-for-completion-timeout: 10m
+ wait-for-completion-timeout: 30m
wait-for-completion-interval: 30s
display-workflow-run-url: false
diff --git a/.pnp.cjs b/.pnp.cjs
index 5fcce34d2f2..6c76263c7ea 100644
--- a/.pnp.cjs
+++ b/.pnp.cjs
@@ -42,6 +42,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["@fullcalendar/luxon3", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11"],\
["@fullcalendar/timegrid", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11"],\
["@fullcalendar/vue3", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11"],\
+ ["@kurkle/color", "npm:0.3.1"],\
["@parcel/optimizer-data-url", "npm:2.12.0"],\
["@parcel/transformer-inline-string", "npm:2.12.0"],\
["@parcel/transformer-sass", "npm:2.12.0"],\
@@ -56,6 +57,9 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["browserlist", "npm:1.0.1"],\
["c8", "npm:9.1.0"],\
["caniuse-lite", "npm:1.0.30001603"],\
+ ["chart.js", "npm:4.5.1"],\
+ ["chartjs-plugin-autocolors", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:0.3.1"],\
+ ["chartjs-plugin-zoom", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.2.0"],\
["d3", "npm:7.9.0"],\
["eslint", "npm:8.57.0"],\
["eslint-config-standard", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:17.1.0"],\
@@ -883,6 +887,22 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD"\
}]\
]],\
+ ["@kurkle/color", [\
+ ["npm:0.3.1", {\
+ "packageLocation": "./.yarn/cache/@kurkle-color-npm-0.3.1-174f3d038c-e6be5c081b.zip/node_modules/@kurkle/color/",\
+ "packageDependencies": [\
+ ["@kurkle/color", "npm:0.3.1"]\
+ ],\
+ "linkType": "HARD"\
+ }],\
+ ["npm:0.3.4", {\
+ "packageLocation": "./.yarn/cache/@kurkle-color-npm-0.3.4-fbd637031f-b95c6abe02.zip/node_modules/@kurkle/color/",\
+ "packageDependencies": [\
+ ["@kurkle/color", "npm:0.3.4"]\
+ ],\
+ "linkType": "HARD"\
+ }]\
+ ]],\
["@lezer/common", [\
["npm:0.15.12", {\
"packageLocation": "./.yarn/cache/@lezer-common-npm-0.15.12-62017272b0-dae6581618.zip/node_modules/@lezer/common/",\
@@ -2616,6 +2636,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD"\
}]\
]],\
+ ["@types/hammerjs", [\
+ ["npm:2.0.46", {\
+ "packageLocation": "./.yarn/cache/@types-hammerjs-npm-2.0.46-de99d4d9d1-caba6ec788.zip/node_modules/@types/hammerjs/",\
+ "packageDependencies": [\
+ ["@types/hammerjs", "npm:2.0.46"]\
+ ],\
+ "linkType": "HARD"\
+ }]\
+ ]],\
["@types/istanbul-lib-coverage", [\
["npm:2.0.4", {\
"packageLocation": "./.yarn/cache/@types-istanbul-lib-coverage-npm-2.0.4-734954bb56-a25d7589ee.zip/node_modules/@types/istanbul-lib-coverage/",\
@@ -3545,6 +3574,66 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD"\
}]\
]],\
+ ["chart.js", [\
+ ["npm:4.5.1", {\
+ "packageLocation": "./.yarn/cache/chart.js-npm-4.5.1-97698d58cc-34b35b3736.zip/node_modules/chart.js/",\
+ "packageDependencies": [\
+ ["chart.js", "npm:4.5.1"],\
+ ["@kurkle/color", "npm:0.3.4"]\
+ ],\
+ "linkType": "HARD"\
+ }]\
+ ]],\
+ ["chartjs-plugin-autocolors", [\
+ ["npm:0.3.1", {\
+ "packageLocation": "./.yarn/cache/chartjs-plugin-autocolors-npm-0.3.1-7e93d38139-de4f87b5bb.zip/node_modules/chartjs-plugin-autocolors/",\
+ "packageDependencies": [\
+ ["chartjs-plugin-autocolors", "npm:0.3.1"]\
+ ],\
+ "linkType": "SOFT"\
+ }],\
+ ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:0.3.1", {\
+ "packageLocation": "./.yarn/__virtual__/chartjs-plugin-autocolors-virtual-6e228c1a1e/0/cache/chartjs-plugin-autocolors-npm-0.3.1-7e93d38139-de4f87b5bb.zip/node_modules/chartjs-plugin-autocolors/",\
+ "packageDependencies": [\
+ ["chartjs-plugin-autocolors", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:0.3.1"],\
+ ["@kurkle/color", "npm:0.3.1"],\
+ ["@types/chart.js", null],\
+ ["@types/kurkle__color", null],\
+ ["chart.js", "npm:4.5.1"]\
+ ],\
+ "packagePeers": [\
+ "@kurkle/color",\
+ "@types/chart.js",\
+ "@types/kurkle__color",\
+ "chart.js"\
+ ],\
+ "linkType": "HARD"\
+ }]\
+ ]],\
+ ["chartjs-plugin-zoom", [\
+ ["npm:2.2.0", {\
+ "packageLocation": "./.yarn/cache/chartjs-plugin-zoom-npm-2.2.0-85aea0b81e-a540e38340.zip/node_modules/chartjs-plugin-zoom/",\
+ "packageDependencies": [\
+ ["chartjs-plugin-zoom", "npm:2.2.0"]\
+ ],\
+ "linkType": "SOFT"\
+ }],\
+ ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.2.0", {\
+ "packageLocation": "./.yarn/__virtual__/chartjs-plugin-zoom-virtual-45332d2c47/0/cache/chartjs-plugin-zoom-npm-2.2.0-85aea0b81e-a540e38340.zip/node_modules/chartjs-plugin-zoom/",\
+ "packageDependencies": [\
+ ["chartjs-plugin-zoom", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.2.0"],\
+ ["@types/chart.js", null],\
+ ["@types/hammerjs", "npm:2.0.46"],\
+ ["chart.js", "npm:4.5.1"],\
+ ["hammerjs", "npm:2.0.8"]\
+ ],\
+ "packagePeers": [\
+ "@types/chart.js",\
+ "chart.js"\
+ ],\
+ "linkType": "HARD"\
+ }]\
+ ]],\
["chokidar", [\
["npm:3.5.3", {\
"packageLocation": "./.yarn/cache/chokidar-npm-3.5.3-c5f9b0a56a-b49fcde401.zip/node_modules/chokidar/",\
@@ -5709,6 +5798,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"linkType": "HARD"\
}]\
]],\
+ ["hammerjs", [\
+ ["npm:2.0.8", {\
+ "packageLocation": "./.yarn/cache/hammerjs-npm-2.0.8-f656ba2573-b092da7d15.zip/node_modules/hammerjs/",\
+ "packageDependencies": [\
+ ["hammerjs", "npm:2.0.8"]\
+ ],\
+ "linkType": "HARD"\
+ }]\
+ ]],\
["has", [\
["npm:1.0.3", {\
"packageLocation": "./.yarn/cache/has-npm-1.0.3-b7f00631c1-b9ad53d53b.zip/node_modules/has/",\
@@ -8326,6 +8424,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["@fullcalendar/luxon3", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11"],\
["@fullcalendar/timegrid", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11"],\
["@fullcalendar/vue3", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.11"],\
+ ["@kurkle/color", "npm:0.3.1"],\
["@parcel/optimizer-data-url", "npm:2.12.0"],\
["@parcel/transformer-inline-string", "npm:2.12.0"],\
["@parcel/transformer-sass", "npm:2.12.0"],\
@@ -8340,6 +8439,9 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["browserlist", "npm:1.0.1"],\
["c8", "npm:9.1.0"],\
["caniuse-lite", "npm:1.0.30001603"],\
+ ["chart.js", "npm:4.5.1"],\
+ ["chartjs-plugin-autocolors", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:0.3.1"],\
+ ["chartjs-plugin-zoom", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.2.0"],\
["d3", "npm:7.9.0"],\
["eslint", "npm:8.57.0"],\
["eslint-config-standard", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:17.1.0"],\
diff --git a/ietf/static/js/meeting_stats.js b/ietf/static/js/meeting_stats.js
index 70b18a0f03e..cf43d08eb8a 100644
--- a/ietf/static/js/meeting_stats.js
+++ b/ietf/static/js/meeting_stats.js
@@ -1,7 +1,8 @@
// Copyright The IETF Trust 2026, All Rights Reserved
+import Chart from 'chart.js/auto'
+import autocolors from 'chartjs-plugin-autocolors'
+
document.addEventListener('DOMContentLoaded', () => {
- // Need to use autocolors plug-in else all slices are gray...
- const autocolors = window['chartjs-plugin-autocolors']
Chart.register(autocolors)
// ── Safely parse JSON data injected from Django view ──
const totalChartData = JSON.parse(document.getElementById('total-chart-data').textContent)
diff --git a/ietf/static/js/meeting_timeline.js b/ietf/static/js/meeting_timeline.js
index 161cead0ec5..713fb3ae707 100644
--- a/ietf/static/js/meeting_timeline.js
+++ b/ietf/static/js/meeting_timeline.js
@@ -1,5 +1,10 @@
// Copyright The IETF Trust 2026, All Rights Reserved
+import Chart from 'chart.js/auto'
+import zoomPlugin from 'chartjs-plugin-zoom'
+
document.addEventListener('DOMContentLoaded', () => {
+ Chart.register(zoomPlugin) // enable the zoom plugin
+
// ── Safely parse JSON data injected from Django view ──
const totalChartData = JSON.parse(document.getElementById('total-chart-data').textContent)
const inPersonChartData = JSON.parse(document.getElementById('in-person-chart-data').textContent)
@@ -50,7 +55,10 @@ document.addEventListener('DOMContentLoaded', () => {
zoom: {
wheel: { enabled: true }, // scroll to zoom
pinch: { enabled: true }, // pinch on mobile
- drag: { enabled: true }, // drag to select range
+ drag: { // drag to select range
+ enabled: true,
+ modifierKey: 'alt'
+ },
mode: 'xy', // zoom X-axis and Y-axis
},
pan: {
diff --git a/ietf/templates/stats/meeting_stats.html b/ietf/templates/stats/meeting_stats.html
index b32f5a4046b..fc41949a2ef 100644
--- a/ietf/templates/stats/meeting_stats.html
+++ b/ietf/templates/stats/meeting_stats.html
@@ -3,9 +3,6 @@
{% origin %}
{% load ietf_filters static django_bootstrap5 %}
{% block js %}
-
-
-
{{ total_chart_data|json_script:"total-chart-data" }}
{{ in_person_chart_data|json_script:"in-person-chart-data" }}
diff --git a/ietf/templates/stats/meetings_timeline.html b/ietf/templates/stats/meetings_timeline.html
index 65fb4e09c04..40f46880ccf 100644
--- a/ietf/templates/stats/meetings_timeline.html
+++ b/ietf/templates/stats/meetings_timeline.html
@@ -3,10 +3,6 @@
{% origin %}
{% load ietf_filters static django_bootstrap5 %}
{% block js %}
-
-
-
-
{{ total_chart_data|json_script:"total-chart-data" }}
{{ in_person_chart_data|json_script:"in-person-chart-data" }}
{{ stats_type|json_script:"stats-type-data" }}
diff --git a/k8s/settings_local.py b/k8s/settings_local.py
index 251f11234fd..19d0a1c2f5f 100644
--- a/k8s/settings_local.py
+++ b/k8s/settings_local.py
@@ -155,14 +155,18 @@ def _multiline_to_list(s):
EMAIL_HOST = os.environ.get("DATATRACKER_EMAIL_HOST", "localhost")
EMAIL_PORT = int(os.environ.get("DATATRACKER_EMAIL_PORT", "2025"))
+_broker_url = os.environ.get("DATATRACKER_BROKER_URL", None)
_celery_password = os.environ.get("CELERY_PASSWORD", None)
-if _celery_password is None:
- raise RuntimeError("CELERY_PASSWORD must be set")
-CELERY_BROKER_URL = "amqp://datatracker:{password}@{host}/{queue}".format(
- host=os.environ.get("RABBITMQ_HOSTNAME", "dt-rabbitmq"),
- password=_celery_password,
- queue=os.environ.get("RABBITMQ_QUEUE", "dt"),
-)
+if _broker_url is not None:
+ CELERY_BROKER_URL = _broker_url
+elif _celery_password is not None:
+ CELERY_BROKER_URL = "amqp://datatracker:{password}@{host}/{queue}".format(
+ host=os.environ.get("RABBITMQ_HOSTNAME", "dt-rabbitmq"),
+ password=_celery_password,
+ queue=os.environ.get("RABBITMQ_QUEUE", "dt"),
+ )
+else:
+ raise RuntimeError("DATATRACKER_BROKER_URL or CELERY_PASSWORD must be set")
# mailarchive API key
_mailing_list_archive_api_key = os.environ.get(
diff --git a/package.json b/package.json
index 6f61aaba29b..29ead19d239 100644
--- a/package.json
+++ b/package.json
@@ -16,12 +16,16 @@
"@fullcalendar/luxon3": "6.1.11",
"@fullcalendar/timegrid": "6.1.11",
"@fullcalendar/vue3": "6.1.11",
+ "@kurkle/color": "0.3.1",
"@popperjs/core": "2.11.8",
"@twuni/emojify": "1.0.2",
"bootstrap": "5.3.3",
"bootstrap-icons": "1.11.3",
"browser-fs-access": "0.35.0",
"caniuse-lite": "1.0.30001603",
+ "chart.js": "^4.5.1",
+ "chartjs-plugin-autocolors": "0.3.1",
+ "chartjs-plugin-zoom": "2.2.0",
"d3": "7.9.0",
"file-saver": "2.0.5",
"highcharts": "11.4.0",
diff --git a/yarn.lock b/yarn.lock
index 54768ac3913..47d675d6b9f 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -532,6 +532,20 @@ __metadata:
languageName: node
linkType: hard
+"@kurkle/color@npm:0.3.1":
+ version: 0.3.1
+ resolution: "@kurkle/color@npm:0.3.1"
+ checksum: e6be5c081bf5acfd4a1803dcd5a0733caf450e73148d5f02dc536b1ff0c60c959c23472a26c9c3c6c78ada04fb6a53c9202db9b2de8ea56f6eeec381f9cc3a1a
+ languageName: node
+ linkType: hard
+
+"@kurkle/color@npm:^0.3.0":
+ version: 0.3.4
+ resolution: "@kurkle/color@npm:0.3.4"
+ checksum: b95c6abe0241ba1745b3c84de3b464296b95ce577110b54f46e6c6dcc9a0966491533df43812bd6c66f92cf818e385d1390b280cd5851d4afb52fc37f8a6c0b9
+ languageName: node
+ linkType: hard
+
"@lezer/common@npm:^0.15.0, @lezer/common@npm:^0.15.7":
version: 0.15.12
resolution: "@lezer/common@npm:0.15.12"
@@ -1944,6 +1958,13 @@ __metadata:
languageName: node
linkType: hard
+"@types/hammerjs@npm:^2.0.45":
+ version: 2.0.46
+ resolution: "@types/hammerjs@npm:2.0.46"
+ checksum: caba6ec788d19905c71092670b58514b3d1f5eee5382bf9205e8df688d51e7857b7994e2dd7aed57fac8977bdf0e456d67fbaf23440a4385b8ce25fe2af1ec39
+ languageName: node
+ linkType: hard
+
"@types/istanbul-lib-coverage@npm:^2.0.1":
version: 2.0.4
resolution: "@types/istanbul-lib-coverage@npm:2.0.4"
@@ -2728,6 +2749,37 @@ browserlist@latest:
languageName: node
linkType: hard
+"chart.js@npm:^4.5.1":
+ version: 4.5.1
+ resolution: "chart.js@npm:4.5.1"
+ dependencies:
+ "@kurkle/color": ^0.3.0
+ checksum: 34b35b373642994b2adac197e91363625930530e29fc1baa6dbb411b5e1295f9f6572922003a0224a21a3019aec916567c1ed00c33b1373081f189fc188e5a7b
+ languageName: node
+ linkType: hard
+
+"chartjs-plugin-autocolors@npm:0.3.1":
+ version: 0.3.1
+ resolution: "chartjs-plugin-autocolors@npm:0.3.1"
+ peerDependencies:
+ "@kurkle/color": ^0.3.1
+ chart.js: ">=2"
+ checksum: de4f87b5bb3e042aa1d3de3886425bbd2340a55ca455b645569d0def602079833182ef214e205ff4466fb5ab1e708761cf37eb51ab3cd622284242c05ed94128
+ languageName: node
+ linkType: hard
+
+"chartjs-plugin-zoom@npm:2.2.0":
+ version: 2.2.0
+ resolution: "chartjs-plugin-zoom@npm:2.2.0"
+ dependencies:
+ "@types/hammerjs": ^2.0.45
+ hammerjs: ^2.0.8
+ peerDependencies:
+ chart.js: ">=3.2.0"
+ checksum: a540e3834082eeb4dedb5ec6ca381f94d7e101075c19a7b65f2a4cd2d12685b3a416e718c9cf7145799802874fb397f69b71a955dfc56b035946cde4d1eb6c8e
+ languageName: node
+ linkType: hard
+
"chokidar@npm:>=3.0.0 <4.0.0":
version: 3.5.3
resolution: "chokidar@npm:3.5.3"
@@ -4616,6 +4668,13 @@ browserlist@latest:
languageName: node
linkType: hard
+"hammerjs@npm:^2.0.8":
+ version: 2.0.8
+ resolution: "hammerjs@npm:2.0.8"
+ checksum: b092da7d1565a165d7edb53ef0ce212837a8b11f897aa3cf81a7818b66686b0ab3f4747fbce8fc8a41d1376594639ce3a054b0fd4889ca8b5b136a29ca500e27
+ languageName: node
+ linkType: hard
+
"has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2":
version: 1.0.2
resolution: "has-bigints@npm:1.0.2"
@@ -7030,6 +7089,7 @@ browserlist@latest:
"@fullcalendar/luxon3": 6.1.11
"@fullcalendar/timegrid": 6.1.11
"@fullcalendar/vue3": 6.1.11
+ "@kurkle/color": 0.3.1
"@parcel/optimizer-data-url": 2.12.0
"@parcel/transformer-inline-string": 2.12.0
"@parcel/transformer-sass": 2.12.0
@@ -7044,6 +7104,9 @@ browserlist@latest:
browserlist: latest
c8: 9.1.0
caniuse-lite: 1.0.30001603
+ chart.js: ^4.5.1
+ chartjs-plugin-autocolors: 0.3.1
+ chartjs-plugin-zoom: 2.2.0
d3: 7.9.0
eslint: 8.57.0
eslint-config-standard: 17.1.0