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