diff --git a/.github/workflows/build-base-app.yml b/.github/workflows/build-base-app.yml index 6bc771def..9ee2aec9c 100644 --- a/.github/workflows/build-base-app.yml +++ b/.github/workflows/build-base-app.yml @@ -17,7 +17,7 @@ jobs: packages: write steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Set up QEMU uses: docker/setup-qemu-action@v2 diff --git a/.github/workflows/build-celery-worker.yml b/.github/workflows/build-celery-worker.yml index 87a7d1851..0144f6d90 100644 --- a/.github/workflows/build-celery-worker.yml +++ b/.github/workflows/build-celery-worker.yml @@ -19,7 +19,7 @@ jobs: packages: write steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Set up QEMU uses: docker/setup-qemu-action@v2 diff --git a/.github/workflows/build-mq-broker.yml b/.github/workflows/build-mq-broker.yml index 2ba41bb9c..10f171284 100644 --- a/.github/workflows/build-mq-broker.yml +++ b/.github/workflows/build-mq-broker.yml @@ -18,7 +18,7 @@ jobs: packages: write steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Set up QEMU uses: docker/setup-qemu-action@v2 diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 2ed7034d6..4bd7362c4 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -26,12 +26,12 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Initialize CodeQL - uses: github/codeql-action/init@v1 + uses: github/codeql-action/init@v2 with: languages: ${{ matrix.language }} - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 + uses: github/codeql-action/analyze@v2 diff --git a/.pnp.cjs b/.pnp.cjs index 414b8bbfe..444bdca20 100644 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -37,6 +37,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@fullcalendar/bootstrap5", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.4"],\ ["@fullcalendar/core", "npm:6.1.4"],\ ["@fullcalendar/daygrid", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.4"],\ + ["@fullcalendar/icalendar", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.4"],\ ["@fullcalendar/interaction", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.4"],\ ["@fullcalendar/list", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.4"],\ ["@fullcalendar/luxon2", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.4"],\ @@ -67,6 +68,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["file-saver", "npm:2.0.5"],\ ["highcharts", "npm:10.3.3"],\ ["html-validate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:7.13.1"],\ + ["ical.js", "npm:1.5.0"],\ ["jquery", "npm:3.6.3"],\ ["jquery-migrate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.0"],\ ["jquery-ui-dist", "npm:1.13.2"],\ @@ -92,6 +94,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["shepherd.js", "npm:10.0.1"],\ ["slugify", "npm:1.6.5"],\ ["sortablejs", "npm:1.15.0"],\ + ["vanillajs-datepicker", "npm:1.3.1"],\ ["vite", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.2.5"],\ ["vue", "npm:3.2.47"],\ ["vue-router", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.1.6"],\ @@ -313,6 +316,32 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["@fullcalendar/icalendar", [\ + ["npm:6.1.4", {\ + "packageLocation": "./.yarn/cache/@fullcalendar-icalendar-npm-6.1.4-8f5c41e738-4ec2ed9092.zip/node_modules/@fullcalendar/icalendar/",\ + "packageDependencies": [\ + ["@fullcalendar/icalendar", "npm:6.1.4"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.4", {\ + "packageLocation": "./.yarn/__virtual__/@fullcalendar-icalendar-virtual-d4c1c240a9/0/cache/@fullcalendar-icalendar-npm-6.1.4-8f5c41e738-4ec2ed9092.zip/node_modules/@fullcalendar/icalendar/",\ + "packageDependencies": [\ + ["@fullcalendar/icalendar", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.4"],\ + ["@fullcalendar/core", "npm:6.1.4"],\ + ["@types/fullcalendar__core", null],\ + ["@types/ical.js", null],\ + ["ical.js", "npm:1.5.0"]\ + ],\ + "packagePeers": [\ + "@fullcalendar/core",\ + "@types/fullcalendar__core",\ + "@types/ical.js",\ + "ical.js"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["@fullcalendar/interaction", [\ ["npm:6.1.4", {\ "packageLocation": "./.yarn/cache/@fullcalendar-interaction-npm-6.1.4-a5a798ee1e-5e282ba36b.zip/node_modules/@fullcalendar/interaction/",\ @@ -490,6 +519,18 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["@jridgewell/gen-mapping", [\ + ["npm:0.3.2", {\ + "packageLocation": "./.yarn/cache/@jridgewell-gen-mapping-npm-0.3.2-c64eeb4a4e-1832707a1c.zip/node_modules/@jridgewell/gen-mapping/",\ + "packageDependencies": [\ + ["@jridgewell/gen-mapping", "npm:0.3.2"],\ + ["@jridgewell/set-array", "npm:1.1.2"],\ + ["@jridgewell/sourcemap-codec", "npm:1.4.14"],\ + ["@jridgewell/trace-mapping", "npm:0.3.17"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["@jridgewell/resolve-uri", [\ ["npm:3.1.0", {\ "packageLocation": "./.yarn/cache/@jridgewell-resolve-uri-npm-3.1.0-6ff2351e61-b5ceaaf9a1.zip/node_modules/@jridgewell/resolve-uri/",\ @@ -499,6 +540,26 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["@jridgewell/set-array", [\ + ["npm:1.1.2", {\ + "packageLocation": "./.yarn/cache/@jridgewell-set-array-npm-1.1.2-45b82d7fb6-69a84d5980.zip/node_modules/@jridgewell/set-array/",\ + "packageDependencies": [\ + ["@jridgewell/set-array", "npm:1.1.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@jridgewell/source-map", [\ + ["npm:0.3.2", {\ + "packageLocation": "./.yarn/cache/@jridgewell-source-map-npm-0.3.2-6fd1f37b22-1b83f0eb94.zip/node_modules/@jridgewell/source-map/",\ + "packageDependencies": [\ + ["@jridgewell/source-map", "npm:0.3.2"],\ + ["@jridgewell/gen-mapping", "npm:0.3.2"],\ + ["@jridgewell/trace-mapping", "npm:0.3.17"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["@jridgewell/sourcemap-codec", [\ ["npm:1.4.14", {\ "packageLocation": "./.yarn/cache/@jridgewell-sourcemap-codec-npm-1.4.14-f5f0630788-61100637b6.zip/node_modules/@jridgewell/sourcemap-codec/",\ @@ -517,6 +578,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@jridgewell/sourcemap-codec", "npm:1.4.14"]\ ],\ "linkType": "HARD"\ + }],\ + ["npm:0.3.17", {\ + "packageLocation": "./.yarn/cache/@jridgewell-trace-mapping-npm-0.3.17-57578fd48c-9d703b859c.zip/node_modules/@jridgewell/trace-mapping/",\ + "packageDependencies": [\ + ["@jridgewell/trace-mapping", "npm:0.3.17"],\ + ["@jridgewell/resolve-uri", "npm:3.1.0"],\ + ["@jridgewell/sourcemap-codec", "npm:1.4.14"]\ + ],\ + "linkType": "HARD"\ }]\ ]],\ ["@juggle/resize-observer", [\ @@ -1249,7 +1319,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@parcel/source-map", "npm:2.1.1"],\ ["@parcel/utils", "npm:2.8.3"],\ ["nullthrows", "npm:1.1.1"],\ - ["terser", "npm:5.13.1"]\ + ["terser", "npm:5.16.5"]\ ],\ "linkType": "HARD"\ }]\ @@ -5242,10 +5312,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["http-cache-semantics", [\ - ["npm:4.1.0", {\ - "packageLocation": "./.yarn/cache/http-cache-semantics-npm-4.1.0-860520a31f-974de94a81.zip/node_modules/http-cache-semantics/",\ + ["npm:4.1.1", {\ + "packageLocation": "./.yarn/cache/http-cache-semantics-npm-4.1.1-1120131375-83ac0bc60b.zip/node_modules/http-cache-semantics/",\ "packageDependencies": [\ - ["http-cache-semantics", "npm:4.1.0"]\ + ["http-cache-semantics", "npm:4.1.1"]\ ],\ "linkType": "HARD"\ }]\ @@ -5297,6 +5367,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["ical.js", [\ + ["npm:1.5.0", {\ + "packageLocation": "./.yarn/cache/ical.js-npm-1.5.0-5ba1c69420-51df7a01f4.zip/node_modules/ical.js/",\ + "packageDependencies": [\ + ["ical.js", "npm:1.5.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["iconv-lite", [\ ["npm:0.6.3", {\ "packageLocation": "./.yarn/cache/iconv-lite-npm-0.6.3-24b8aae27e-3f60d47a5c.zip/node_modules/iconv-lite/",\ @@ -5899,10 +5978,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["json5", [\ - ["npm:1.0.1", {\ - "packageLocation": "./.yarn/cache/json5-npm-1.0.1-647fc8794b-e76ea23dbb.zip/node_modules/json5/",\ + ["npm:1.0.2", {\ + "packageLocation": "./.yarn/cache/json5-npm-1.0.2-9607f93e30-866458a8c5.zip/node_modules/json5/",\ "packageDependencies": [\ - ["json5", "npm:1.0.1"],\ + ["json5", "npm:1.0.2"],\ ["minimist", "npm:1.2.6"]\ ],\ "linkType": "HARD"\ @@ -6120,15 +6199,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["lodash.sortby", [\ - ["npm:4.7.0", {\ - "packageLocation": "./.yarn/cache/lodash.sortby-npm-4.7.0-fda8ab950d-db170c9396.zip/node_modules/lodash.sortby/",\ - "packageDependencies": [\ - ["lodash.sortby", "npm:4.7.0"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["lru-cache", [\ ["npm:6.0.0", {\ "packageLocation": "./.yarn/cache/lru-cache-npm-6.0.0-b4c8668fe1-f97f499f89.zip/node_modules/lru-cache/",\ @@ -6182,7 +6252,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["make-fetch-happen", "npm:10.1.5"],\ ["agentkeepalive", "npm:4.2.1"],\ ["cacache", "npm:16.1.0"],\ - ["http-cache-semantics", "npm:4.1.0"],\ + ["http-cache-semantics", "npm:4.1.1"],\ ["http-proxy-agent", "npm:5.0.0"],\ ["https-proxy-agent", "npm:5.0.1"],\ ["is-lambda", "npm:1.0.1"],\ @@ -7450,6 +7520,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@fullcalendar/bootstrap5", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.4"],\ ["@fullcalendar/core", "npm:6.1.4"],\ ["@fullcalendar/daygrid", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.4"],\ + ["@fullcalendar/icalendar", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.4"],\ ["@fullcalendar/interaction", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.4"],\ ["@fullcalendar/list", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.4"],\ ["@fullcalendar/luxon2", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.4"],\ @@ -7480,6 +7551,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["file-saver", "npm:2.0.5"],\ ["highcharts", "npm:10.3.3"],\ ["html-validate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:7.13.1"],\ + ["ical.js", "npm:1.5.0"],\ ["jquery", "npm:3.6.3"],\ ["jquery-migrate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.0"],\ ["jquery-ui-dist", "npm:1.13.2"],\ @@ -7505,6 +7577,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["shepherd.js", "npm:10.0.1"],\ ["slugify", "npm:1.6.5"],\ ["sortablejs", "npm:1.15.0"],\ + ["vanillajs-datepicker", "npm:1.3.1"],\ ["vite", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.2.5"],\ ["vue", "npm:3.2.47"],\ ["vue-router", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.1.6"],\ @@ -7836,14 +7909,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["source-map", "npm:0.6.1"]\ ],\ "linkType": "HARD"\ - }],\ - ["npm:0.8.0-beta.0", {\ - "packageLocation": "./.yarn/cache/source-map-npm-0.8.0-beta.0-688a309e94-e94169be64.zip/node_modules/source-map/",\ - "packageDependencies": [\ - ["source-map", "npm:0.8.0-beta.0"],\ - ["whatwg-url", "npm:7.1.0"]\ - ],\ - "linkType": "HARD"\ }]\ ]],\ ["source-map-js", [\ @@ -8063,13 +8128,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["terser", [\ - ["npm:5.13.1", {\ - "packageLocation": "./.yarn/cache/terser-npm-5.13.1-c7df10bd07-0b1f5043cf.zip/node_modules/terser/",\ + ["npm:5.16.5", {\ + "packageLocation": "./.yarn/cache/terser-npm-5.16.5-b3f4101afe-f2c1a087fa.zip/node_modules/terser/",\ "packageDependencies": [\ - ["terser", "npm:5.13.1"],\ + ["terser", "npm:5.16.5"],\ + ["@jridgewell/source-map", "npm:0.3.2"],\ ["acorn", "npm:8.7.1"],\ ["commander", "npm:2.20.3"],\ - ["source-map", "npm:0.8.0-beta.0"],\ ["source-map-support", "npm:0.5.21"]\ ],\ "linkType": "HARD"\ @@ -8142,16 +8207,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["tr46", [\ - ["npm:1.0.1", {\ - "packageLocation": "./.yarn/cache/tr46-npm-1.0.1-9547f343a4-96d4ed46bc.zip/node_modules/tr46/",\ - "packageDependencies": [\ - ["tr46", "npm:1.0.1"],\ - ["punycode", "npm:2.1.1"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["treemate", [\ ["npm:0.3.11", {\ "packageLocation": "./.yarn/cache/treemate-npm-0.3.11-7be66c23fc-0c6ccbc6c5.zip/node_modules/treemate/",\ @@ -8167,7 +8222,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "packageDependencies": [\ ["tsconfig-paths", "npm:3.14.1"],\ ["@types/json5", "npm:0.0.29"],\ - ["json5", "npm:1.0.1"],\ + ["json5", "npm:1.0.2"],\ ["minimist", "npm:1.2.6"],\ ["strip-bom", "npm:3.0.0"]\ ],\ @@ -8296,6 +8351,15 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ + ["vanillajs-datepicker", [\ + ["npm:1.3.1", {\ + "packageLocation": "./.yarn/cache/vanillajs-datepicker-npm-1.3.1-75a9d66ea4-c01ea7ec70.zip/node_modules/vanillajs-datepicker/",\ + "packageDependencies": [\ + ["vanillajs-datepicker", "npm:1.3.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ ["vdirs", [\ ["npm:0.1.8", {\ "packageLocation": "./.yarn/cache/vdirs-npm-0.1.8-59a32a98d6-a7be8ccad3.zip/node_modules/vdirs/",\ @@ -8550,27 +8614,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { "linkType": "HARD"\ }]\ ]],\ - ["webidl-conversions", [\ - ["npm:4.0.2", {\ - "packageLocation": "./.yarn/cache/webidl-conversions-npm-4.0.2-1d159e6409-c93d8dfe90.zip/node_modules/webidl-conversions/",\ - "packageDependencies": [\ - ["webidl-conversions", "npm:4.0.2"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ - ["whatwg-url", [\ - ["npm:7.1.0", {\ - "packageLocation": "./.yarn/cache/whatwg-url-npm-7.1.0-d6cae01571-fecb07c872.zip/node_modules/whatwg-url/",\ - "packageDependencies": [\ - ["whatwg-url", "npm:7.1.0"],\ - ["lodash.sortby", "npm:4.7.0"],\ - ["tr46", "npm:1.0.1"],\ - ["webidl-conversions", "npm:4.0.2"]\ - ],\ - "linkType": "HARD"\ - }]\ - ]],\ ["which", [\ ["npm:2.0.2", {\ "packageLocation": "./.yarn/cache/which-npm-2.0.2-320ddf72f7-1a5c563d3c.zip/node_modules/which/",\ diff --git a/.yarn/cache/@fullcalendar-icalendar-npm-6.1.4-8f5c41e738-4ec2ed9092.zip b/.yarn/cache/@fullcalendar-icalendar-npm-6.1.4-8f5c41e738-4ec2ed9092.zip new file mode 100644 index 000000000..09dce1e18 Binary files /dev/null and b/.yarn/cache/@fullcalendar-icalendar-npm-6.1.4-8f5c41e738-4ec2ed9092.zip differ diff --git a/.yarn/cache/@jridgewell-gen-mapping-npm-0.3.2-c64eeb4a4e-1832707a1c.zip b/.yarn/cache/@jridgewell-gen-mapping-npm-0.3.2-c64eeb4a4e-1832707a1c.zip new file mode 100644 index 000000000..e030e7e42 Binary files /dev/null and b/.yarn/cache/@jridgewell-gen-mapping-npm-0.3.2-c64eeb4a4e-1832707a1c.zip differ diff --git a/.yarn/cache/@jridgewell-set-array-npm-1.1.2-45b82d7fb6-69a84d5980.zip b/.yarn/cache/@jridgewell-set-array-npm-1.1.2-45b82d7fb6-69a84d5980.zip new file mode 100644 index 000000000..3b901fc14 Binary files /dev/null and b/.yarn/cache/@jridgewell-set-array-npm-1.1.2-45b82d7fb6-69a84d5980.zip differ diff --git a/.yarn/cache/@jridgewell-source-map-npm-0.3.2-6fd1f37b22-1b83f0eb94.zip b/.yarn/cache/@jridgewell-source-map-npm-0.3.2-6fd1f37b22-1b83f0eb94.zip new file mode 100644 index 000000000..cdc4bd0e2 Binary files /dev/null and b/.yarn/cache/@jridgewell-source-map-npm-0.3.2-6fd1f37b22-1b83f0eb94.zip differ diff --git a/.yarn/cache/@jridgewell-trace-mapping-npm-0.3.17-57578fd48c-9d703b859c.zip b/.yarn/cache/@jridgewell-trace-mapping-npm-0.3.17-57578fd48c-9d703b859c.zip new file mode 100644 index 000000000..29e13633c Binary files /dev/null and b/.yarn/cache/@jridgewell-trace-mapping-npm-0.3.17-57578fd48c-9d703b859c.zip differ diff --git a/.yarn/cache/http-cache-semantics-npm-4.1.0-860520a31f-974de94a81.zip b/.yarn/cache/http-cache-semantics-npm-4.1.0-860520a31f-974de94a81.zip deleted file mode 100644 index ed85c1c4c..000000000 Binary files a/.yarn/cache/http-cache-semantics-npm-4.1.0-860520a31f-974de94a81.zip and /dev/null differ diff --git a/.yarn/cache/http-cache-semantics-npm-4.1.1-1120131375-83ac0bc60b.zip b/.yarn/cache/http-cache-semantics-npm-4.1.1-1120131375-83ac0bc60b.zip new file mode 100644 index 000000000..19f1e0a20 Binary files /dev/null and b/.yarn/cache/http-cache-semantics-npm-4.1.1-1120131375-83ac0bc60b.zip differ diff --git a/.yarn/cache/ical.js-npm-1.5.0-5ba1c69420-51df7a01f4.zip b/.yarn/cache/ical.js-npm-1.5.0-5ba1c69420-51df7a01f4.zip new file mode 100644 index 000000000..7aa64acf0 Binary files /dev/null and b/.yarn/cache/ical.js-npm-1.5.0-5ba1c69420-51df7a01f4.zip differ diff --git a/.yarn/cache/json5-npm-1.0.1-647fc8794b-e76ea23dbb.zip b/.yarn/cache/json5-npm-1.0.1-647fc8794b-e76ea23dbb.zip deleted file mode 100644 index cc70df522..000000000 Binary files a/.yarn/cache/json5-npm-1.0.1-647fc8794b-e76ea23dbb.zip and /dev/null differ diff --git a/.yarn/cache/json5-npm-1.0.2-9607f93e30-866458a8c5.zip b/.yarn/cache/json5-npm-1.0.2-9607f93e30-866458a8c5.zip new file mode 100644 index 000000000..aa52eb045 Binary files /dev/null and b/.yarn/cache/json5-npm-1.0.2-9607f93e30-866458a8c5.zip differ diff --git a/.yarn/cache/lodash.sortby-npm-4.7.0-fda8ab950d-db170c9396.zip b/.yarn/cache/lodash.sortby-npm-4.7.0-fda8ab950d-db170c9396.zip deleted file mode 100644 index 915d1f2fc..000000000 Binary files a/.yarn/cache/lodash.sortby-npm-4.7.0-fda8ab950d-db170c9396.zip and /dev/null differ diff --git a/.yarn/cache/source-map-npm-0.8.0-beta.0-688a309e94-e94169be64.zip b/.yarn/cache/source-map-npm-0.8.0-beta.0-688a309e94-e94169be64.zip deleted file mode 100644 index 877220ab4..000000000 Binary files a/.yarn/cache/source-map-npm-0.8.0-beta.0-688a309e94-e94169be64.zip and /dev/null differ diff --git a/.yarn/cache/terser-npm-5.13.1-c7df10bd07-0b1f5043cf.zip b/.yarn/cache/terser-npm-5.13.1-c7df10bd07-0b1f5043cf.zip deleted file mode 100644 index b8f30c7ef..000000000 Binary files a/.yarn/cache/terser-npm-5.13.1-c7df10bd07-0b1f5043cf.zip and /dev/null differ diff --git a/.yarn/cache/terser-npm-5.16.5-b3f4101afe-f2c1a087fa.zip b/.yarn/cache/terser-npm-5.16.5-b3f4101afe-f2c1a087fa.zip new file mode 100644 index 000000000..e7b665654 Binary files /dev/null and b/.yarn/cache/terser-npm-5.16.5-b3f4101afe-f2c1a087fa.zip differ diff --git a/.yarn/cache/tr46-npm-1.0.1-9547f343a4-96d4ed46bc.zip b/.yarn/cache/tr46-npm-1.0.1-9547f343a4-96d4ed46bc.zip deleted file mode 100644 index 3130815a0..000000000 Binary files a/.yarn/cache/tr46-npm-1.0.1-9547f343a4-96d4ed46bc.zip and /dev/null differ diff --git a/.yarn/cache/vanillajs-datepicker-npm-1.3.1-75a9d66ea4-c01ea7ec70.zip b/.yarn/cache/vanillajs-datepicker-npm-1.3.1-75a9d66ea4-c01ea7ec70.zip new file mode 100644 index 000000000..3926d112d Binary files /dev/null and b/.yarn/cache/vanillajs-datepicker-npm-1.3.1-75a9d66ea4-c01ea7ec70.zip differ diff --git a/.yarn/cache/webidl-conversions-npm-4.0.2-1d159e6409-c93d8dfe90.zip b/.yarn/cache/webidl-conversions-npm-4.0.2-1d159e6409-c93d8dfe90.zip deleted file mode 100644 index a75f5ee65..000000000 Binary files a/.yarn/cache/webidl-conversions-npm-4.0.2-1d159e6409-c93d8dfe90.zip and /dev/null differ diff --git a/.yarn/cache/whatwg-url-npm-7.1.0-d6cae01571-fecb07c872.zip b/.yarn/cache/whatwg-url-npm-7.1.0-d6cae01571-fecb07c872.zip deleted file mode 100644 index 9f2181485..000000000 Binary files a/.yarn/cache/whatwg-url-npm-7.1.0-d6cae01571-fecb07c872.zip and /dev/null differ diff --git a/client/agenda/AgendaQuickAccess.vue b/client/agenda/AgendaQuickAccess.vue index 8823ca13e..d080e5dd4 100644 --- a/client/agenda/AgendaQuickAccess.vue +++ b/client/agenda/AgendaQuickAccess.vue @@ -74,7 +74,6 @@ size='large' :show-arrow='true' trigger='click' - @select='downloadIcs' ) n-button.mt-2( id='agenda-quickaccess-addtocal-btn' @@ -141,14 +140,26 @@ const route = useRoute() const downloadIcsOptions = [ { - label: 'Subscribe... (webcal)', key: 'subscribe', - icon: () => h('i', { class: 'bi bi-calendar-week text-blue' }) + type: 'render', + render: () => h('a', { + class: 'agenda-quickaccess-callinks', + href: `webcal://${window.location.host}${icsLink.value}` + }, [ + h('i', { class: 'bi bi-calendar-week text-blue' }), + h('span', 'Subscribe... (webcal)') + ]) }, { - label: 'Download... (.ics)', key: 'download', - icon: () => h('i', { class: 'bi bi-arrow-down-square' }) + type: 'render', + render: () => h('a', { + class: 'agenda-quickaccess-callinks', + href: icsLink.value + }, [ + h('i', { class: 'bi bi-arrow-down-square' }), + h('span', 'Download... (.ics)') + ]) } ] @@ -158,6 +169,17 @@ const shortMode = computed(() => { return siteStore.viewport <= 1350 }) +const icsLink = computed(() => { + if (agendaStore.pickerMode) { + const sessionKeywords = agendaStore.scheduleAdjusted.map(s => s.sessionKeyword) + return `${getUrl('meetingCalIcs', { meetingNumber: agendaStore.meeting.number })}?show=${sessionKeywords.join(',')}` + } else if (agendaStore.selectedCatSubs.length > 0) { + return `${getUrl('meetingCalIcs', { meetingNumber: agendaStore.meeting.number })}?show=${agendaStore.selectedCatSubs.join(',')}` + } else { + return `${getUrl('meetingCalIcs', { meetingNumber: agendaStore.meeting.number })}` + } +}) + // METHODS function pickerStart () { @@ -177,24 +199,6 @@ function pickerDiscard () { } } -function downloadIcs (key) { - message.loading('Generating calendar file... Download will begin shortly.') - let icsUrl = '' - if (agendaStore.pickerMode) { - const sessionKeywords = agendaStore.scheduleAdjusted.map(s => s.sessionKeyword) - icsUrl = `${getUrl('meetingCalIcs', { meetingNumber: agendaStore.meeting.number })}?show=${sessionKeywords.join(',')}` - } else if (agendaStore.selectedCatSubs.length > 0) { - icsUrl = `${getUrl('meetingCalIcs', { meetingNumber: agendaStore.meeting.number })}?show=${agendaStore.selectedCatSubs.join(',')}` - } else { - icsUrl = `${getUrl('meetingCalIcs', { meetingNumber: agendaStore.meeting.number })}` - } - if (key === 'subscribe') { - window.location.assign(`webcal://${window.location.host}${icsUrl}`) - } else { - window.location.assign(icsUrl) - } -} - function scrollToDay (dayId, ev) { ev.preventDefault() document.getElementById(`agenda-day-${dayId}`)?.scrollIntoView(true) @@ -284,5 +288,24 @@ function scrollToNow (ev) { margin-top: 15px; margin-bottom: 15px; } + + &-callinks { + padding: 8px 16px; + display: flex; + text-decoration: none; + align-items: center; + + &:hover, &:focus { + text-decoration: underline; + } + + > i { + font-size: var(--n-font-size); + } + + > span { + margin-left: 12px; + } + } } diff --git a/client/agenda/AgendaScheduleList.vue b/client/agenda/AgendaScheduleList.vue index 3897e1d62..12003b866 100644 --- a/client/agenda/AgendaScheduleList.vue +++ b/client/agenda/AgendaScheduleList.vue @@ -263,7 +263,7 @@ const meetingEvents = computed(() => { key: `sesshd-${item.id}`, displayType: 'session-head', timeslot: itemTimeSlot, - name: `${item.adjustedStart.toFormat('cccc')} ${item.slotName}`, + name: `${item.adjustedStart.setZone(agendaStore.meeting.timezone).toFormat('cccc')} ${item.slotName}`, cssClasses: 'agenda-table-display-session-head' + (isLive ? ' agenda-table-live' : '') }) } diff --git a/dev/coverage-action/package-lock.json b/dev/coverage-action/package-lock.json index 8841a57fe..190666667 100644 --- a/dev/coverage-action/package-lock.json +++ b/dev/coverage-action/package-lock.json @@ -14,7 +14,7 @@ "chart.js": "3.7.1", "chartjs-node-canvas": "4.1.6", "lodash": "4.17.21", - "luxon": "2.3.1" + "luxon": "2.5.2" }, "devDependencies": { "eslint": "7.32.0", @@ -1734,9 +1734,9 @@ "dev": true }, "node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "dependencies": { "minimist": "^1.2.0" @@ -1800,9 +1800,9 @@ } }, "node_modules/luxon": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.3.1.tgz", - "integrity": "sha512-I8vnjOmhXsMSlNMZlMkSOvgrxKJl0uOsEzdGgGNZuZPaS9KlefpE9KV95QFftlJSC+1UyCC9/I69R02cz/zcCA==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.5.2.tgz", + "integrity": "sha512-Yg7/RDp4nedqmLgyH0LwgGRvMEKVzKbUdkBYyCosbHgJ+kaOUx0qzSiSatVc3DFygnirTPYnMM2P5dg2uH1WvA==", "engines": { "node": ">=12" } @@ -3993,9 +3993,9 @@ "dev": true }, "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "requires": { "minimist": "^1.2.0" @@ -4047,9 +4047,9 @@ } }, "luxon": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.3.1.tgz", - "integrity": "sha512-I8vnjOmhXsMSlNMZlMkSOvgrxKJl0uOsEzdGgGNZuZPaS9KlefpE9KV95QFftlJSC+1UyCC9/I69R02cz/zcCA==" + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-2.5.2.tgz", + "integrity": "sha512-Yg7/RDp4nedqmLgyH0LwgGRvMEKVzKbUdkBYyCosbHgJ+kaOUx0qzSiSatVc3DFygnirTPYnMM2P5dg2uH1WvA==" }, "make-dir": { "version": "3.1.0", diff --git a/dev/coverage-action/package.json b/dev/coverage-action/package.json index 9e7417fe6..be9cf2528 100644 --- a/dev/coverage-action/package.json +++ b/dev/coverage-action/package.json @@ -11,7 +11,7 @@ "chart.js": "3.7.1", "chartjs-node-canvas": "4.1.6", "lodash": "4.17.21", - "luxon": "2.3.1" + "luxon": "2.5.2" }, "devDependencies": { "eslint": "7.32.0", diff --git a/dev/diff/package-lock.json b/dev/diff/package-lock.json index 96ce2b548..26e2756cc 100644 --- a/dev/diff/package-lock.json +++ b/dev/diff/package-lock.json @@ -15,7 +15,7 @@ "keypress": "^0.2.1", "listr2": "^5.0.2", "lodash-es": "^4.17.21", - "luxon": "^3.0.1", + "luxon": "^3.2.1", "pretty-bytes": "^6.0.0", "tar": "^6.1.11", "yargs": "^17.5.1" @@ -666,9 +666,9 @@ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "node_modules/http2-wrapper": { "version": "2.1.11", @@ -1007,9 +1007,9 @@ } }, "node_modules/luxon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.0.1.tgz", - "integrity": "sha512-hF3kv0e5gwHQZKz4wtm4c+inDtyc7elkanAsBq+fundaCdUBNJB1dHEGUZIM6SfSBUlbVFduPwEtNjFK8wLtcw==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.2.1.tgz", + "integrity": "sha512-QrwPArQCNLAKGO/C+ZIilgIuDnEnKx5QYODdDtbFaxzsbZcc/a7WFq7MhsVYgRlwawLtvOUESTlfJ+hc/USqPg==", "engines": { "node": ">=12" } @@ -1985,9 +1985,9 @@ "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" }, "http2-wrapper": { "version": "2.1.11", @@ -2219,9 +2219,9 @@ "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==" }, "luxon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.0.1.tgz", - "integrity": "sha512-hF3kv0e5gwHQZKz4wtm4c+inDtyc7elkanAsBq+fundaCdUBNJB1dHEGUZIM6SfSBUlbVFduPwEtNjFK8wLtcw==" + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.2.1.tgz", + "integrity": "sha512-QrwPArQCNLAKGO/C+ZIilgIuDnEnKx5QYODdDtbFaxzsbZcc/a7WFq7MhsVYgRlwawLtvOUESTlfJ+hc/USqPg==" }, "mimic-fn": { "version": "2.1.0", diff --git a/dev/diff/package.json b/dev/diff/package.json index 43d37545f..c4c587729 100644 --- a/dev/diff/package.json +++ b/dev/diff/package.json @@ -11,7 +11,7 @@ "keypress": "^0.2.1", "listr2": "^5.0.2", "lodash-es": "^4.17.21", - "luxon": "^3.0.1", + "luxon": "^3.2.1", "pretty-bytes": "^6.0.0", "tar": "^6.1.11", "yargs": "^17.5.1" diff --git a/ietf/doc/utils_search.py b/ietf/doc/utils_search.py index 0353d5296..00046ed30 100644 --- a/ietf/doc/utils_search.py +++ b/ietf/doc/utils_search.py @@ -251,7 +251,6 @@ def prepare_document_table(request, docs, query=None, max_results=200): if query and hasattr(query, "urlencode"): # fed a Django QueryDict d = query.copy() for h in meta['headers']: - h["sort_url"] = "?" + d.urlencode() if h['key'] == sort_key: h['sorted'] = True if sort_reversed: @@ -262,5 +261,6 @@ def prepare_document_table(request, docs, query=None, max_results=200): d["sort"] = "-" + h["key"] else: d["sort"] = h["key"] + h["sort_url"] = "?" + d.urlencode() return (docs, meta) diff --git a/ietf/group/tests_js.py b/ietf/group/tests_js.py index 1c7f9fc9a..7c51c2331 100644 --- a/ietf/group/tests_js.py +++ b/ietf/group/tests_js.py @@ -100,8 +100,8 @@ class MilestoneTests(IetfSeleniumTestCase): # fill in the edit milestone form desc_input.send_keys(description) - due_input.send_keys(due_date.strftime('%m %Y\n')) # \n closes the date selector self._search_draft_and_locate_result(draft_input, draft_search_string, draft).click() + due_input.send_keys(due_date.strftime('%m %Y')) self._click_milestone_submit_button('Review') result_row = self._assert_milestone_changed() @@ -165,7 +165,7 @@ class MilestoneTests(IetfSeleniumTestCase): # modify the fields new_due_date = (milestone.due + datetime.timedelta(days=31)).strftime('%m %Y') due_field.clear() - due_field.send_keys(new_due_date + '\n') + due_field.send_keys(new_due_date) self._search_draft_and_locate_result(draft_input, draft_search_string, draft).click() @@ -189,4 +189,4 @@ class MilestoneTests(IetfSeleniumTestCase): gms = self.group.groupmilestone_set.first() self.assertEqual(gms.desc, expected_desc) self.assertEqual(gms.due.strftime('%m %Y'), expected_due_date) - self.assertCountEqual(expected_docs, gms.docs.all()) \ No newline at end of file + self.assertCountEqual(expected_docs, gms.docs.all()) diff --git a/ietf/ietfauth/views.py b/ietf/ietfauth/views.py index fb6aec433..9adb62b31 100644 --- a/ietf/ietfauth/views.py +++ b/ietf/ietfauth/views.py @@ -777,7 +777,7 @@ def apikey_create(request): @person_required def apikey_disable(request): person = request.user.person - choices = [ (k.hash(), str(k)) for k in person.apikeys.all() ] + choices = [ (k.hash(), str(k)) for k in person.apikeys.exclude(valid=False) ] # class KeyDeleteForm(forms.Form): hash = forms.ChoiceField(label='Key', choices=choices) diff --git a/ietf/ipr/tests.py b/ietf/ipr/tests.py index 3afb47bbf..fd07821af 100644 --- a/ietf/ipr/tests.py +++ b/ietf/ipr/tests.py @@ -591,7 +591,7 @@ I would like to revoke this declaration. get_payload_text(outbox[len_before + 1]).replace('\n', ' ') ) self.assertIn(f'{settings.IDTRACKER_BASE_URL}{urlreverse("ietf.ipr.views.showlist")}', get_payload_text(outbox[len_before]).replace('\n',' ')) - self.assertIn(f'{settings.IDTRACKER_BASE_URL}{urlreverse("ietf.ipr.views.history",kwargs=dict(id=ipr.pk))}', get_payload_text(outbox[len_before+1]).replace('\n',' ')) + self.assertIn(f'{settings.IDTRACKER_BASE_URL}{urlreverse("ietf.ipr.views.show",kwargs=dict(id=ipr.pk))}', get_payload_text(outbox[len_before+1]).replace('\n',' ')) def test_notify_generic(self): RoleFactory(name_id='ad',group__acronym='gen') diff --git a/ietf/meeting/helpers.py b/ietf/meeting/helpers.py index a266efafa..e3f4874f4 100644 --- a/ietf/meeting/helpers.py +++ b/ietf/meeting/helpers.py @@ -826,7 +826,7 @@ def get_announcement_initial(meeting, is_change=False): desc=desc, date=meeting.date, change=change) - body = render_to_string('meeting/interim_announcement.txt', locals()) + body = render_to_string('meeting/interim_announcement.txt', locals() | {"settings": settings}) initial['body'] = body return initial diff --git a/ietf/meeting/models.py b/ietf/meeting/models.py index b6c6b52b4..c883e5b00 100644 --- a/ietf/meeting/models.py +++ b/ietf/meeting/models.py @@ -298,26 +298,6 @@ class Meeting(models.Model): self._proceedings_format_version = version # save this for later return self._proceedings_format_version - @property - def session_constraintnames(self): - """Gets a list of the constraint names that should be used for this meeting - - Anticipated that this will soon become a many-to-many relationship with ConstraintName - (see issue #2770). Making this a @property allows use of the .all(), .filter(), etc, - so that other code should not need changes when this is replaced. - """ - try: - mtg_num = int(self.number) - except ValueError: - mtg_num = None # should not come up, but this method should not fail - if mtg_num is None or mtg_num >= 106: - # These meetings used the old 'conflic?' constraint types labeled as though - # they were the new types. - slugs = ('chair_conflict', 'tech_overlap', 'key_participant') - else: - slugs = ('conflict', 'conflic2', 'conflic3') - return ConstraintName.objects.filter(slug__in=slugs) - def base_url(self): return "/meeting/%s" % (self.number, ) diff --git a/ietf/meeting/tests_views.py b/ietf/meeting/tests_views.py index c945e8bb9..5785e24a1 100644 --- a/ietf/meeting/tests_views.py +++ b/ietf/meeting/tests_views.py @@ -4510,10 +4510,11 @@ class InterimTests(TestCase): if sess: timeslot = sess.official_timeslotassignment().timeslot self.assertIn(timeslot.time.strftime('%Y-%m-%d'), announcement_text) - self.assertIn( - '(%s to %s UTC)' % ( + self.assertRegex( + announcement_text, + r'(%s\s+to\s+%s\s+UTC)' % ( timeslot.utc_start_time().strftime('%H:%M'),timeslot.utc_end_time().strftime('%H:%M') - ), announcement_text) + )) # Count number of sessions listed if base_session and extra_session: expected_session_matches = 3 diff --git a/ietf/secr/sreq/views.py b/ietf/secr/sreq/views.py index 8091835f5..3f2521f2e 100644 --- a/ietf/secr/sreq/views.py +++ b/ietf/secr/sreq/views.py @@ -3,6 +3,7 @@ import datetime +import inflect from collections import defaultdict, OrderedDict from django.conf import settings @@ -105,18 +106,29 @@ def get_lock_message(meeting=None): meeting = get_meeting(days=14) return meeting.session_request_lock_message -def get_requester_text(person,group): - ''' - This function takes a Person object and a Group object and returns the text to use in the - session request notification email, ie. Joe Smith, a Chair of the ancp working group - ''' - roles = group.role_set.filter(name__in=('chair','secr'),person=person) + +def get_requester_text(person, group): + """ + This function takes a Person object and a Group object and returns the text to use + in the session request notification email, ie. Joe Smith, a Chair of the ancp + working group + """ + roles = group.role_set.filter(name__in=("chair", "secr", "ad"), person=person) if roles: - return '%s, a %s of the %s working group' % (person.ascii, roles[0].name, group.acronym) - if group.parent and group.parent.role_set.filter(name='ad',person=person): - return '%s, a %s Area Director' % (person.ascii, group.parent.acronym.upper()) - if person.role_set.filter(name='secr',group__acronym='secretariat'): - return '%s, on behalf of the %s working group' % (person.ascii, group.acronym) + rolename = str(roles[0].name) + return "%s, %s of the %s %s" % ( + person.name, + inflect.engine().a(rolename), + group.acronym.upper(), + group.type.verbose_name, + ) + if person.role_set.filter(name="secr", group__acronym="secretariat"): + return "%s, on behalf of the %s %s" % ( + person.name, + group.acronym.upper(), + group.type.verbose_name, + ) + def save_conflicts(group, meeting, conflicts, name): ''' diff --git a/ietf/secr/templates/sreq/session_request_notification.txt b/ietf/secr/templates/sreq/session_request_notification.txt index db2006040..a41f20244 100644 --- a/ietf/secr/templates/sreq/session_request_notification.txt +++ b/ietf/secr/templates/sreq/session_request_notification.txt @@ -1,5 +1,5 @@ {% load ams_filters %} -{{ header }} meeting session request has just been submitted by {{ requester }}. +{% filter wordwrap:78 %}{{ header }} meeting session request has just been submitted by {{ requester }}.{% endfilter %} {% include "includes/session_info.txt" %} diff --git a/ietf/static/css/datepicker.scss b/ietf/static/css/datepicker.scss index c25b790e0..21d6aac24 100644 --- a/ietf/static/css/datepicker.scss +++ b/ietf/static/css/datepicker.scss @@ -1,683 +1,2 @@ -/*! - * Datepicker for Bootstrap v1.9.0 (https://github.com/uxsolutions/bootstrap-datepicker) - * - * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) - */ - - .datepicker { - border-radius: 4px; - direction: ltr; - } - .datepicker-inline { - width: 220px; - } - .datepicker-rtl { - direction: rtl; - } - .datepicker-rtl.dropdown-menu { - left: auto; - } - .datepicker-rtl table tr td span { - float: right; - } - .datepicker-dropdown { - top: 0; - left: 0; - padding: 4px; - } - .datepicker-dropdown:before { - content: ''; - display: inline-block; - border-left: 7px solid transparent; - border-right: 7px solid transparent; - border-bottom: 7px solid rgba(0, 0, 0, 0.15); - border-top: 0; - border-bottom-color: rgba(0, 0, 0, 0.2); - position: absolute; - } - .datepicker-dropdown:after { - content: ''; - display: inline-block; - border-left: 6px solid transparent; - border-right: 6px solid transparent; - border-bottom: 6px solid #fff; - border-top: 0; - position: absolute; - } - .datepicker-dropdown.datepicker-orient-left:before { - left: 6px; - } - .datepicker-dropdown.datepicker-orient-left:after { - left: 7px; - } - .datepicker-dropdown.datepicker-orient-right:before { - right: 6px; - } - .datepicker-dropdown.datepicker-orient-right:after { - right: 7px; - } - .datepicker-dropdown.datepicker-orient-bottom:before { - top: -7px; - } - .datepicker-dropdown.datepicker-orient-bottom:after { - top: -6px; - } - .datepicker-dropdown.datepicker-orient-top:before { - bottom: -7px; - border-bottom: 0; - border-top: 7px solid rgba(0, 0, 0, 0.15); - } - .datepicker-dropdown.datepicker-orient-top:after { - bottom: -6px; - border-bottom: 0; - border-top: 6px solid #fff; - } - .datepicker table { - margin: 0; - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - } - .datepicker table tr td, - .datepicker table tr th { - text-align: center; - width: 30px; - height: 30px; - border-radius: 4px; - border: none; - } - .table-striped .datepicker table tr td, - .table-striped .datepicker table tr th { - background-color: transparent; - } - .datepicker table tr td.old, - .datepicker table tr td.new { - color: #777777; - } - .datepicker table tr td.day:hover, - .datepicker table tr td.focused { - background: #eeeeee; - cursor: pointer; - } - .datepicker table tr td.disabled, - .datepicker table tr td.disabled:hover { - background: none; - color: #777777; - cursor: default; - } - .datepicker table tr td.highlighted { - color: #000; - background-color: #d9edf7; - border-color: #85c5e5; - border-radius: 0; - } - .datepicker table tr td.highlighted:focus, - .datepicker table tr td.highlighted.focus { - color: #000; - background-color: #afd9ee; - border-color: #298fc2; - } - .datepicker table tr td.highlighted:hover { - color: #000; - background-color: #afd9ee; - border-color: #52addb; - } - .datepicker table tr td.highlighted:active, - .datepicker table tr td.highlighted.active { - color: #000; - background-color: #afd9ee; - border-color: #52addb; - } - .datepicker table tr td.highlighted:active:hover, - .datepicker table tr td.highlighted.active:hover, - .datepicker table tr td.highlighted:active:focus, - .datepicker table tr td.highlighted.active:focus, - .datepicker table tr td.highlighted:active.focus, - .datepicker table tr td.highlighted.active.focus { - color: #000; - background-color: #91cbe8; - border-color: #298fc2; - } - .datepicker table tr td.highlighted.disabled:hover, - .datepicker table tr td.highlighted[disabled]:hover, - fieldset[disabled] .datepicker table tr td.highlighted:hover, - .datepicker table tr td.highlighted.disabled:focus, - .datepicker table tr td.highlighted[disabled]:focus, - fieldset[disabled] .datepicker table tr td.highlighted:focus, - .datepicker table tr td.highlighted.disabled.focus, - .datepicker table tr td.highlighted[disabled].focus, - fieldset[disabled] .datepicker table tr td.highlighted.focus { - background-color: #d9edf7; - border-color: #85c5e5; - } - .datepicker table tr td.highlighted.focused { - background: #afd9ee; - } - .datepicker table tr td.highlighted.disabled, - .datepicker table tr td.highlighted.disabled:active { - background: #d9edf7; - color: #777777; - } - .datepicker table tr td.today { - color: #000; - background-color: #ffdb99; - border-color: #ffb733; - } - .datepicker table tr td.today:focus, - .datepicker table tr td.today.focus { - color: #000; - background-color: #ffc966; - border-color: #b37400; - } - .datepicker table tr td.today:hover { - color: #000; - background-color: #ffc966; - border-color: #f59e00; - } - .datepicker table tr td.today:active, - .datepicker table tr td.today.active { - color: #000; - background-color: #ffc966; - border-color: #f59e00; - } - .datepicker table tr td.today:active:hover, - .datepicker table tr td.today.active:hover, - .datepicker table tr td.today:active:focus, - .datepicker table tr td.today.active:focus, - .datepicker table tr td.today:active.focus, - .datepicker table tr td.today.active.focus { - color: #000; - background-color: #ffbc42; - border-color: #b37400; - } - .datepicker table tr td.today.disabled:hover, - .datepicker table tr td.today[disabled]:hover, - fieldset[disabled] .datepicker table tr td.today:hover, - .datepicker table tr td.today.disabled:focus, - .datepicker table tr td.today[disabled]:focus, - fieldset[disabled] .datepicker table tr td.today:focus, - .datepicker table tr td.today.disabled.focus, - .datepicker table tr td.today[disabled].focus, - fieldset[disabled] .datepicker table tr td.today.focus { - background-color: #ffdb99; - border-color: #ffb733; - } - .datepicker table tr td.today.focused { - background: #ffc966; - } - .datepicker table tr td.today.disabled, - .datepicker table tr td.today.disabled:active { - background: #ffdb99; - color: #777777; - } - .datepicker table tr td.range { - color: #000; - background-color: #eeeeee; - border-color: #bbbbbb; - border-radius: 0; - } - .datepicker table tr td.range:focus, - .datepicker table tr td.range.focus { - color: #000; - background-color: #d5d5d5; - border-color: #7c7c7c; - } - .datepicker table tr td.range:hover { - color: #000; - background-color: #d5d5d5; - border-color: #9d9d9d; - } - .datepicker table tr td.range:active, - .datepicker table tr td.range.active { - color: #000; - background-color: #d5d5d5; - border-color: #9d9d9d; - } - .datepicker table tr td.range:active:hover, - .datepicker table tr td.range.active:hover, - .datepicker table tr td.range:active:focus, - .datepicker table tr td.range.active:focus, - .datepicker table tr td.range:active.focus, - .datepicker table tr td.range.active.focus { - color: #000; - background-color: #c3c3c3; - border-color: #7c7c7c; - } - .datepicker table tr td.range.disabled:hover, - .datepicker table tr td.range[disabled]:hover, - fieldset[disabled] .datepicker table tr td.range:hover, - .datepicker table tr td.range.disabled:focus, - .datepicker table tr td.range[disabled]:focus, - fieldset[disabled] .datepicker table tr td.range:focus, - .datepicker table tr td.range.disabled.focus, - .datepicker table tr td.range[disabled].focus, - fieldset[disabled] .datepicker table tr td.range.focus { - background-color: #eeeeee; - border-color: #bbbbbb; - } - .datepicker table tr td.range.focused { - background: #d5d5d5; - } - .datepicker table tr td.range.disabled, - .datepicker table tr td.range.disabled:active { - background: #eeeeee; - color: #777777; - } - .datepicker table tr td.range.highlighted { - color: #000; - background-color: #e4eef3; - border-color: #9dc1d3; - } - .datepicker table tr td.range.highlighted:focus, - .datepicker table tr td.range.highlighted.focus { - color: #000; - background-color: #c1d7e3; - border-color: #4b88a6; - } - .datepicker table tr td.range.highlighted:hover { - color: #000; - background-color: #c1d7e3; - border-color: #73a6c0; - } - .datepicker table tr td.range.highlighted:active, - .datepicker table tr td.range.highlighted.active { - color: #000; - background-color: #c1d7e3; - border-color: #73a6c0; - } - .datepicker table tr td.range.highlighted:active:hover, - .datepicker table tr td.range.highlighted.active:hover, - .datepicker table tr td.range.highlighted:active:focus, - .datepicker table tr td.range.highlighted.active:focus, - .datepicker table tr td.range.highlighted:active.focus, - .datepicker table tr td.range.highlighted.active.focus { - color: #000; - background-color: #a8c8d8; - border-color: #4b88a6; - } - .datepicker table tr td.range.highlighted.disabled:hover, - .datepicker table tr td.range.highlighted[disabled]:hover, - fieldset[disabled] .datepicker table tr td.range.highlighted:hover, - .datepicker table tr td.range.highlighted.disabled:focus, - .datepicker table tr td.range.highlighted[disabled]:focus, - fieldset[disabled] .datepicker table tr td.range.highlighted:focus, - .datepicker table tr td.range.highlighted.disabled.focus, - .datepicker table tr td.range.highlighted[disabled].focus, - fieldset[disabled] .datepicker table tr td.range.highlighted.focus { - background-color: #e4eef3; - border-color: #9dc1d3; - } - .datepicker table tr td.range.highlighted.focused { - background: #c1d7e3; - } - .datepicker table tr td.range.highlighted.disabled, - .datepicker table tr td.range.highlighted.disabled:active { - background: #e4eef3; - color: #777777; - } - .datepicker table tr td.range.today { - color: #000; - background-color: #f7ca77; - border-color: #f1a417; - } - .datepicker table tr td.range.today:focus, - .datepicker table tr td.range.today.focus { - color: #000; - background-color: #f4b747; - border-color: #815608; - } - .datepicker table tr td.range.today:hover { - color: #000; - background-color: #f4b747; - border-color: #bf800c; - } - .datepicker table tr td.range.today:active, - .datepicker table tr td.range.today.active { - color: #000; - background-color: #f4b747; - border-color: #bf800c; - } - .datepicker table tr td.range.today:active:hover, - .datepicker table tr td.range.today.active:hover, - .datepicker table tr td.range.today:active:focus, - .datepicker table tr td.range.today.active:focus, - .datepicker table tr td.range.today:active.focus, - .datepicker table tr td.range.today.active.focus { - color: #000; - background-color: #f2aa25; - border-color: #815608; - } - .datepicker table tr td.range.today.disabled:hover, - .datepicker table tr td.range.today[disabled]:hover, - fieldset[disabled] .datepicker table tr td.range.today:hover, - .datepicker table tr td.range.today.disabled:focus, - .datepicker table tr td.range.today[disabled]:focus, - fieldset[disabled] .datepicker table tr td.range.today:focus, - .datepicker table tr td.range.today.disabled.focus, - .datepicker table tr td.range.today[disabled].focus, - fieldset[disabled] .datepicker table tr td.range.today.focus { - background-color: #f7ca77; - border-color: #f1a417; - } - .datepicker table tr td.range.today.disabled, - .datepicker table tr td.range.today.disabled:active { - background: #f7ca77; - color: #777777; - } - .datepicker table tr td.selected, - .datepicker table tr td.selected.highlighted { - color: #fff; - background-color: #777777; - border-color: #555555; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - } - .datepicker table tr td.selected:focus, - .datepicker table tr td.selected.highlighted:focus, - .datepicker table tr td.selected.focus, - .datepicker table tr td.selected.highlighted.focus { - color: #fff; - background-color: #5e5e5e; - border-color: #161616; - } - .datepicker table tr td.selected:hover, - .datepicker table tr td.selected.highlighted:hover { - color: #fff; - background-color: #5e5e5e; - border-color: #373737; - } - .datepicker table tr td.selected:active, - .datepicker table tr td.selected.highlighted:active, - .datepicker table tr td.selected.active, - .datepicker table tr td.selected.highlighted.active { - color: #fff; - background-color: #5e5e5e; - border-color: #373737; - } - .datepicker table tr td.selected:active:hover, - .datepicker table tr td.selected.highlighted:active:hover, - .datepicker table tr td.selected.active:hover, - .datepicker table tr td.selected.highlighted.active:hover, - .datepicker table tr td.selected:active:focus, - .datepicker table tr td.selected.highlighted:active:focus, - .datepicker table tr td.selected.active:focus, - .datepicker table tr td.selected.highlighted.active:focus, - .datepicker table tr td.selected:active.focus, - .datepicker table tr td.selected.highlighted:active.focus, - .datepicker table tr td.selected.active.focus, - .datepicker table tr td.selected.highlighted.active.focus { - color: #fff; - background-color: #4c4c4c; - border-color: #161616; - } - .datepicker table tr td.selected.disabled:hover, - .datepicker table tr td.selected.highlighted.disabled:hover, - .datepicker table tr td.selected[disabled]:hover, - .datepicker table tr td.selected.highlighted[disabled]:hover, - fieldset[disabled] .datepicker table tr td.selected:hover, - fieldset[disabled] .datepicker table tr td.selected.highlighted:hover, - .datepicker table tr td.selected.disabled:focus, - .datepicker table tr td.selected.highlighted.disabled:focus, - .datepicker table tr td.selected[disabled]:focus, - .datepicker table tr td.selected.highlighted[disabled]:focus, - fieldset[disabled] .datepicker table tr td.selected:focus, - fieldset[disabled] .datepicker table tr td.selected.highlighted:focus, - .datepicker table tr td.selected.disabled.focus, - .datepicker table tr td.selected.highlighted.disabled.focus, - .datepicker table tr td.selected[disabled].focus, - .datepicker table tr td.selected.highlighted[disabled].focus, - fieldset[disabled] .datepicker table tr td.selected.focus, - fieldset[disabled] .datepicker table tr td.selected.highlighted.focus { - background-color: #777777; - border-color: #555555; - } - .datepicker table tr td.active, - .datepicker table tr td.active.highlighted { - color: #fff; - background-color: #337ab7; - border-color: #2e6da4; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - } - .datepicker table tr td.active:focus, - .datepicker table tr td.active.highlighted:focus, - .datepicker table tr td.active.focus, - .datepicker table tr td.active.highlighted.focus { - color: #fff; - background-color: #286090; - border-color: #122b40; - } - .datepicker table tr td.active:hover, - .datepicker table tr td.active.highlighted:hover { - color: #fff; - background-color: #286090; - border-color: #204d74; - } - .datepicker table tr td.active:active, - .datepicker table tr td.active.highlighted:active, - .datepicker table tr td.active.active, - .datepicker table tr td.active.highlighted.active { - color: #fff; - background-color: #286090; - border-color: #204d74; - } - .datepicker table tr td.active:active:hover, - .datepicker table tr td.active.highlighted:active:hover, - .datepicker table tr td.active.active:hover, - .datepicker table tr td.active.highlighted.active:hover, - .datepicker table tr td.active:active:focus, - .datepicker table tr td.active.highlighted:active:focus, - .datepicker table tr td.active.active:focus, - .datepicker table tr td.active.highlighted.active:focus, - .datepicker table tr td.active:active.focus, - .datepicker table tr td.active.highlighted:active.focus, - .datepicker table tr td.active.active.focus, - .datepicker table tr td.active.highlighted.active.focus { - color: #fff; - background-color: #204d74; - border-color: #122b40; - } - .datepicker table tr td.active.disabled:hover, - .datepicker table tr td.active.highlighted.disabled:hover, - .datepicker table tr td.active[disabled]:hover, - .datepicker table tr td.active.highlighted[disabled]:hover, - fieldset[disabled] .datepicker table tr td.active:hover, - fieldset[disabled] .datepicker table tr td.active.highlighted:hover, - .datepicker table tr td.active.disabled:focus, - .datepicker table tr td.active.highlighted.disabled:focus, - .datepicker table tr td.active[disabled]:focus, - .datepicker table tr td.active.highlighted[disabled]:focus, - fieldset[disabled] .datepicker table tr td.active:focus, - fieldset[disabled] .datepicker table tr td.active.highlighted:focus, - .datepicker table tr td.active.disabled.focus, - .datepicker table tr td.active.highlighted.disabled.focus, - .datepicker table tr td.active[disabled].focus, - .datepicker table tr td.active.highlighted[disabled].focus, - fieldset[disabled] .datepicker table tr td.active.focus, - fieldset[disabled] .datepicker table tr td.active.highlighted.focus { - background-color: #337ab7; - border-color: #2e6da4; - } - .datepicker table tr td span { - display: block; - width: 23%; - height: 54px; - line-height: 54px; - float: left; - margin: 1%; - cursor: pointer; - border-radius: 4px; - } - .datepicker table tr td span:hover, - .datepicker table tr td span.focused { - background: #eeeeee; - } - .datepicker table tr td span.disabled, - .datepicker table tr td span.disabled:hover { - background: none; - color: #777777; - cursor: default; - } - .datepicker table tr td span.active, - .datepicker table tr td span.active:hover, - .datepicker table tr td span.active.disabled, - .datepicker table tr td span.active.disabled:hover { - color: #fff; - background-color: #337ab7; - border-color: #2e6da4; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - } - .datepicker table tr td span.active:focus, - .datepicker table tr td span.active:hover:focus, - .datepicker table tr td span.active.disabled:focus, - .datepicker table tr td span.active.disabled:hover:focus, - .datepicker table tr td span.active.focus, - .datepicker table tr td span.active:hover.focus, - .datepicker table tr td span.active.disabled.focus, - .datepicker table tr td span.active.disabled:hover.focus { - color: #fff; - background-color: #286090; - border-color: #122b40; - } - .datepicker table tr td span.active:hover, - .datepicker table tr td span.active:hover:hover, - .datepicker table tr td span.active.disabled:hover, - .datepicker table tr td span.active.disabled:hover:hover { - color: #fff; - background-color: #286090; - border-color: #204d74; - } - .datepicker table tr td span.active:active, - .datepicker table tr td span.active:hover:active, - .datepicker table tr td span.active.disabled:active, - .datepicker table tr td span.active.disabled:hover:active, - .datepicker table tr td span.active.active, - .datepicker table tr td span.active:hover.active, - .datepicker table tr td span.active.disabled.active, - .datepicker table tr td span.active.disabled:hover.active { - color: #fff; - background-color: #286090; - border-color: #204d74; - } - .datepicker table tr td span.active:active:hover, - .datepicker table tr td span.active:hover:active:hover, - .datepicker table tr td span.active.disabled:active:hover, - .datepicker table tr td span.active.disabled:hover:active:hover, - .datepicker table tr td span.active.active:hover, - .datepicker table tr td span.active:hover.active:hover, - .datepicker table tr td span.active.disabled.active:hover, - .datepicker table tr td span.active.disabled:hover.active:hover, - .datepicker table tr td span.active:active:focus, - .datepicker table tr td span.active:hover:active:focus, - .datepicker table tr td span.active.disabled:active:focus, - .datepicker table tr td span.active.disabled:hover:active:focus, - .datepicker table tr td span.active.active:focus, - .datepicker table tr td span.active:hover.active:focus, - .datepicker table tr td span.active.disabled.active:focus, - .datepicker table tr td span.active.disabled:hover.active:focus, - .datepicker table tr td span.active:active.focus, - .datepicker table tr td span.active:hover:active.focus, - .datepicker table tr td span.active.disabled:active.focus, - .datepicker table tr td span.active.disabled:hover:active.focus, - .datepicker table tr td span.active.active.focus, - .datepicker table tr td span.active:hover.active.focus, - .datepicker table tr td span.active.disabled.active.focus, - .datepicker table tr td span.active.disabled:hover.active.focus { - color: #fff; - background-color: #204d74; - border-color: #122b40; - } - .datepicker table tr td span.active.disabled:hover, - .datepicker table tr td span.active:hover.disabled:hover, - .datepicker table tr td span.active.disabled.disabled:hover, - .datepicker table tr td span.active.disabled:hover.disabled:hover, - .datepicker table tr td span.active[disabled]:hover, - .datepicker table tr td span.active:hover[disabled]:hover, - .datepicker table tr td span.active.disabled[disabled]:hover, - .datepicker table tr td span.active.disabled:hover[disabled]:hover, - fieldset[disabled] .datepicker table tr td span.active:hover, - fieldset[disabled] .datepicker table tr td span.active:hover:hover, - fieldset[disabled] .datepicker table tr td span.active.disabled:hover, - fieldset[disabled] .datepicker table tr td span.active.disabled:hover:hover, - .datepicker table tr td span.active.disabled:focus, - .datepicker table tr td span.active:hover.disabled:focus, - .datepicker table tr td span.active.disabled.disabled:focus, - .datepicker table tr td span.active.disabled:hover.disabled:focus, - .datepicker table tr td span.active[disabled]:focus, - .datepicker table tr td span.active:hover[disabled]:focus, - .datepicker table tr td span.active.disabled[disabled]:focus, - .datepicker table tr td span.active.disabled:hover[disabled]:focus, - fieldset[disabled] .datepicker table tr td span.active:focus, - fieldset[disabled] .datepicker table tr td span.active:hover:focus, - fieldset[disabled] .datepicker table tr td span.active.disabled:focus, - fieldset[disabled] .datepicker table tr td span.active.disabled:hover:focus, - .datepicker table tr td span.active.disabled.focus, - .datepicker table tr td span.active:hover.disabled.focus, - .datepicker table tr td span.active.disabled.disabled.focus, - .datepicker table tr td span.active.disabled:hover.disabled.focus, - .datepicker table tr td span.active[disabled].focus, - .datepicker table tr td span.active:hover[disabled].focus, - .datepicker table tr td span.active.disabled[disabled].focus, - .datepicker table tr td span.active.disabled:hover[disabled].focus, - fieldset[disabled] .datepicker table tr td span.active.focus, - fieldset[disabled] .datepicker table tr td span.active:hover.focus, - fieldset[disabled] .datepicker table tr td span.active.disabled.focus, - fieldset[disabled] .datepicker table tr td span.active.disabled:hover.focus { - background-color: #337ab7; - border-color: #2e6da4; - } - .datepicker table tr td span.old, - .datepicker table tr td span.new { - color: #777777; - } - .datepicker .datepicker-switch { - width: 145px; - } - .datepicker .datepicker-switch, - .datepicker .prev, - .datepicker .next, - .datepicker tfoot tr th { - cursor: pointer; - } - .datepicker .datepicker-switch:hover, - .datepicker .prev:hover, - .datepicker .next:hover, - .datepicker tfoot tr th:hover { - background: #eeeeee; - } - .datepicker .prev.disabled, - .datepicker .next.disabled { - visibility: hidden; - } - .datepicker .cw { - font-size: 10px; - width: 12px; - padding: 0 2px 0 5px; - vertical-align: middle; - } - .input-group.date .input-group-addon { - cursor: pointer; - } - .input-daterange { - width: 100%; - } - .input-daterange input { - text-align: center; - } - .input-daterange input:first-child { - border-radius: 3px 0 0 3px; - } - .input-daterange input:last-child { - border-radius: 0 3px 3px 0; - } - .input-daterange .input-group-addon { - width: auto; - min-width: 16px; - padding: 4px 5px; - line-height: 1.42857143; - border-width: 1px 0; - margin-left: -5px; - margin-right: -5px; - } - /*# sourceMappingURL=bootstrap-datepicker3.css.map */ +@import "vanillajs-datepicker/sass/index-bs5"; +@import "vanillajs-datepicker/sass/datepicker-bs5"; diff --git a/ietf/static/js/datepicker.js b/ietf/static/js/datepicker.js index 1fe6d0314..43d80acb5 100644 --- a/ietf/static/js/datepicker.js +++ b/ietf/static/js/datepicker.js @@ -1,2039 +1,54 @@ -/*! - * Datepicker for Bootstrap v1.9.0 (https://github.com/uxsolutions/bootstrap-datepicker) - * - * Licensed under the Apache License v2.0 (http://www.apache.org/licenses/LICENSE-2.0) - */ +import { + Datepicker +} from 'vanillajs-datepicker'; -(function(factory){ - if (typeof define === 'function' && define.amd) { - define(['jquery'], factory); - } else if (typeof exports === 'object') { - factory(require('jquery')); - } else { - factory(jQuery); - } -}(function($, undefined){ - function UTCDate(){ - return new Date(Date.UTC.apply(Date, arguments)); - } - function UTCToday(){ - var today = new Date(); - return UTCDate(today.getFullYear(), today.getMonth(), today.getDate()); - } - function isUTCEquals(date1, date2) { - return ( - date1.getUTCFullYear() === date2.getUTCFullYear() && - date1.getUTCMonth() === date2.getUTCMonth() && - date1.getUTCDate() === date2.getUTCDate() - ); - } - function alias(method, deprecationMsg){ - return function(){ - if (deprecationMsg !== undefined) { - $.fn.datepicker.deprecated(deprecationMsg); - } +global.enable_datepicker = function (el) { + // we need to translate from bootstrap-datepicker options to + // vanillajs-datepicker options + const view_mode = { + day: 0, + days: 0, + month: 1, + months: 1, + year: 2, + years: 2, + decade: 3, + decades: 3 + }; - return this[method].apply(this, arguments); - }; - } - function isValidDate(d) { - return d && !isNaN(d.getTime()); - } - - var DateArray = (function(){ - var extras = { - get: function(i){ - return this.slice(i)[0]; - }, - contains: function(d){ - // Array.indexOf is not cross-browser; - // $.inArray doesn't work with Dates - var val = d && d.valueOf(); - for (var i=0, l=this.length; i < l; i++) - // Use date arithmetic to allow dates with different times to match - if (0 <= this[i].valueOf() - val && this[i].valueOf() - val < 1000*60*60*24) - return i; - return -1; - }, - remove: function(i){ - this.splice(i,1); - }, - replace: function(new_array){ - if (!new_array) - return; - if (!Array.isArray(new_array)) - new_array = [new_array]; - this.clear(); - this.push.apply(this, new_array); - }, - clear: function(){ - this.length = 0; - }, - copy: function(){ - var a = new DateArray(); - a.replace(this); - return a; - } - }; - - return function(){ - var a = []; - a.push.apply(a, arguments); - $.extend(a, extras); - return a; - }; - })(); - - - // Picker object - - var Datepicker = function(element, options){ - $.data(element, 'datepicker', this); - - this._events = []; - this._secondaryEvents = []; - - this._process_options(options); - - this.dates = new DateArray(); - this.viewDate = this.o.defaultViewDate; - this.focusDate = null; - - this.element = $(element); - this.isInput = this.element.is('input'); - this.inputField = this.isInput ? this.element : this.element.find('input'); - this.component = this.element.hasClass('date') ? this.element.find('.add-on, .input-group-addon, .input-group-append, .input-group-prepend, .btn') : false; - if (this.component && this.component.length === 0) - this.component = false; - this.isInline = !this.component && this.element.is('div'); - - this.picker = $(DPGlobal.template); - - // Checking templates and inserting - if (this._check_template(this.o.templates.leftArrow)) { - this.picker.find('.prev').html(this.o.templates.leftArrow); - } - - if (this._check_template(this.o.templates.rightArrow)) { - this.picker.find('.next').html(this.o.templates.rightArrow); - } - - this._buildEvents(); - this._attachEvents(); - - if (this.isInline){ - this.picker.addClass('datepicker-inline').appendTo(this.element); - } - else { - this.picker.addClass('datepicker-dropdown dropdown-menu'); - } - - if (this.o.rtl){ - this.picker.addClass('datepicker-rtl'); - } - - if (this.o.calendarWeeks) { - this.picker.find('.datepicker-days .datepicker-switch, thead .datepicker-title, tfoot .today, tfoot .clear') - .attr('colspan', function(i, val){ - return Number(val) + 1; - }); - } - - this._process_options({ - startDate: this._o.startDate, - endDate: this._o.endDate, - daysOfWeekDisabled: this.o.daysOfWeekDisabled, - daysOfWeekHighlighted: this.o.daysOfWeekHighlighted, - datesDisabled: this.o.datesDisabled - }); - - this._allow_update = false; - this.setViewMode(this.o.startView); - this._allow_update = true; - - this.fillDow(); - this.fillMonths(); - - this.update(); - - if (this.isInline){ - this.show(); - } - }; - - Datepicker.prototype = { - constructor: Datepicker, - - _resolveViewName: function(view){ - $.each(DPGlobal.viewModes, function(i, viewMode){ - if (view === i || $.inArray(view, viewMode.names) !== -1){ - view = i; - return false; - } - }); - - return view; - }, - - _resolveDaysOfWeek: function(daysOfWeek){ - if (!Array.isArray(daysOfWeek)) - daysOfWeek = daysOfWeek.split(/[,\s]*/); - return $.map(daysOfWeek, Number); - }, - - _check_template: function(tmp){ - try { - // If empty - if (tmp === undefined || tmp === "") { - return false; - } - // If no html, everything ok - if ((tmp.match(/[<>]/g) || []).length <= 0) { - return true; - } - // Checking if html is fine - var jDom = $(tmp); - return jDom.length > 0; - } - catch (ex) { - return false; - } - }, - - _process_options: function(opts){ - // Store raw options for reference - this._o = $.extend({}, this._o, opts); - // Processed options - var o = this.o = $.extend({}, this._o); - - // Check if "de-DE" style date is available, if not language should - // fallback to 2 letter code eg "de" - var lang = o.language; - if (!dates[lang]){ - lang = lang.split('-')[0]; - if (!dates[lang]) - lang = defaults.language; - } - o.language = lang; - - // Retrieve view index from any aliases - o.startView = this._resolveViewName(o.startView); - o.minViewMode = this._resolveViewName(o.minViewMode); - o.maxViewMode = this._resolveViewName(o.maxViewMode); - - // Check view is between min and max - o.startView = Math.max(this.o.minViewMode, Math.min(this.o.maxViewMode, o.startView)); - - // true, false, or Number > 0 - if (o.multidate !== true){ - o.multidate = Number(o.multidate) || false; - if (o.multidate !== false) - o.multidate = Math.max(0, o.multidate); - } - o.multidateSeparator = String(o.multidateSeparator); - - o.weekStart %= 7; - o.weekEnd = (o.weekStart + 6) % 7; - - var format = DPGlobal.parseFormat(o.format); - if (o.startDate !== -Infinity){ - if (!!o.startDate){ - if (o.startDate instanceof Date) - o.startDate = this._local_to_utc(this._zero_time(o.startDate)); - else - o.startDate = DPGlobal.parseDate(o.startDate, format, o.language, o.assumeNearbyYear); - } - else { - o.startDate = -Infinity; - } - } - if (o.endDate !== Infinity){ - if (!!o.endDate){ - if (o.endDate instanceof Date) - o.endDate = this._local_to_utc(this._zero_time(o.endDate)); - else - o.endDate = DPGlobal.parseDate(o.endDate, format, o.language, o.assumeNearbyYear); - } - else { - o.endDate = Infinity; - } - } - - o.daysOfWeekDisabled = this._resolveDaysOfWeek(o.daysOfWeekDisabled||[]); - o.daysOfWeekHighlighted = this._resolveDaysOfWeek(o.daysOfWeekHighlighted||[]); - - o.datesDisabled = o.datesDisabled||[]; - if (!Array.isArray(o.datesDisabled)) { - o.datesDisabled = o.datesDisabled.split(','); - } - o.datesDisabled = $.map(o.datesDisabled, function(d){ - return DPGlobal.parseDate(d, format, o.language, o.assumeNearbyYear); - }); - - var plc = String(o.orientation).toLowerCase().split(/\s+/g), - _plc = o.orientation.toLowerCase(); - plc = $.grep(plc, function(word){ - return /^auto|left|right|top|bottom$/.test(word); - }); - o.orientation = {x: 'auto', y: 'auto'}; - if (!_plc || _plc === 'auto') - ; // no action - else if (plc.length === 1){ - switch (plc[0]){ - case 'top': - case 'bottom': - o.orientation.y = plc[0]; - break; - case 'left': - case 'right': - o.orientation.x = plc[0]; - break; - } - } - else { - _plc = $.grep(plc, function(word){ - return /^left|right$/.test(word); - }); - o.orientation.x = _plc[0] || 'auto'; - - _plc = $.grep(plc, function(word){ - return /^top|bottom$/.test(word); - }); - o.orientation.y = _plc[0] || 'auto'; - } - if (o.defaultViewDate instanceof Date || typeof o.defaultViewDate === 'string') { - o.defaultViewDate = DPGlobal.parseDate(o.defaultViewDate, format, o.language, o.assumeNearbyYear); - } else if (o.defaultViewDate) { - var year = o.defaultViewDate.year || new Date().getFullYear(); - var month = o.defaultViewDate.month || 0; - var day = o.defaultViewDate.day || 1; - o.defaultViewDate = UTCDate(year, month, day); - } else { - o.defaultViewDate = UTCToday(); - } - }, - _applyEvents: function(evs){ - for (var i=0, el, ch, ev; i < evs.length; i++){ - el = evs[i][0]; - if (evs[i].length === 2){ - ch = undefined; - ev = evs[i][1]; - } else if (evs[i].length === 3){ - ch = evs[i][1]; - ev = evs[i][2]; - } - el.on(ev, ch); - } - }, - _unapplyEvents: function(evs){ - for (var i=0, el, ev, ch; i < evs.length; i++){ - el = evs[i][0]; - if (evs[i].length === 2){ - ch = undefined; - ev = evs[i][1]; - } else if (evs[i].length === 3){ - ch = evs[i][1]; - ev = evs[i][2]; - } - el.off(ev, ch); - } - }, - _buildEvents: function(){ - var events = { - keyup: $.proxy(function(e){ - if ($.inArray(e.keyCode, [27, 37, 39, 38, 40, 32, 13, 9]) === -1) - this.update(); - }, this), - keydown: $.proxy(this.keydown, this), - paste: $.proxy(this.paste, this) + let options = { + buttonClass: "btn" + }; + if (el.dataset.dateFormat) { + options = { ...options, + format: el.dataset.dateFormat + }; + if (!el.dataset.dateFormat.includes("dd")) { + options = { ...options, + pickLevel: 1 }; - - if (this.o.showOnFocus === true) { - events.focus = $.proxy(this.show, this); - } - - if (this.isInput) { // single input - this._events = [ - [this.element, events] - ]; - } - // component: input + button - else if (this.component && this.inputField.length) { - this._events = [ - // For components that are not readonly, allow keyboard nav - [this.inputField, events], - [this.component, { - click: $.proxy(this.show, this) - }] - ]; - } - else { - this._events = [ - [this.element, { - click: $.proxy(this.show, this), - keydown: $.proxy(this.keydown, this) - }] - ]; - } - this._events.push( - // Component: listen for blur on element descendants - [this.element, '*', { - blur: $.proxy(function(e){ - this._focused_from = e.target; - }, this) - }], - // Input: listen for blur on element - [this.element, { - blur: $.proxy(function(e){ - this._focused_from = e.target; - }, this) - }] - ); - - if (this.o.immediateUpdates) { - // Trigger input updates immediately on changed year/month - this._events.push([this.element, { - 'changeYear changeMonth': $.proxy(function(e){ - this.update(e.date); - }, this) - }]); - } - - this._secondaryEvents = [ - [this.picker, { - click: $.proxy(this.click, this) - }], - [this.picker, '.prev, .next', { - click: $.proxy(this.navArrowsClick, this) - }], - [this.picker, '.day:not(.disabled)', { - click: $.proxy(this.dayCellClick, this) - }], - [$(window), { - resize: $.proxy(this.place, this) - }], - [$(document), { - 'mousedown touchstart': $.proxy(function(e){ - // Clicked outside the datepicker, hide it - if (!( - this.element.is(e.target) || - this.element.find(e.target).length || - this.picker.is(e.target) || - this.picker.find(e.target).length || - this.isInline - )){ - this.hide(); - } - }, this) - }] - ]; - }, - _attachEvents: function(){ - this._detachEvents(); - this._applyEvents(this._events); - }, - _detachEvents: function(){ - this._unapplyEvents(this._events); - }, - _attachSecondaryEvents: function(){ - this._detachSecondaryEvents(); - this._applyEvents(this._secondaryEvents); - }, - _detachSecondaryEvents: function(){ - this._unapplyEvents(this._secondaryEvents); - }, - _trigger: function(event, altdate){ - var date = altdate || this.dates.get(-1), - local_date = this._utc_to_local(date); - - this.element.trigger({ - type: event, - date: local_date, - viewMode: this.viewMode, - dates: $.map(this.dates, this._utc_to_local), - format: $.proxy(function(ix, format){ - if (arguments.length === 0){ - ix = this.dates.length - 1; - format = this.o.format; - } else if (typeof ix === 'string'){ - format = ix; - ix = this.dates.length - 1; - } - format = format || this.o.format; - var date = this.dates.get(ix); - return DPGlobal.formatDate(date, format, this.o.language); - }, this) - }); - }, - - show: function(){ - if (this.inputField.is(':disabled') || (this.inputField.prop('readonly') && this.o.enableOnReadonly === false)) - return; - if (!this.isInline) - this.picker.appendTo(this.o.container); - this.place(); - this.picker.show(); - this._attachSecondaryEvents(); - this._trigger('show'); - if ((window.navigator.msMaxTouchPoints || 'ontouchstart' in document) && this.o.disableTouchKeyboard) { - $(this.element).blur(); - } - return this; - }, - - hide: function(){ - if (this.isInline || !this.picker.is(':visible')) - return this; - this.focusDate = null; - this.picker.hide().detach(); - this._detachSecondaryEvents(); - this.setViewMode(this.o.startView); - - if (this.o.forceParse && this.inputField.val()) - this.setValue(); - this._trigger('hide'); - return this; - }, - - destroy: function(){ - this.hide(); - this._detachEvents(); - this._detachSecondaryEvents(); - this.picker.remove(); - delete this.element.data().datepicker; - if (!this.isInput){ - delete this.element.data().date; - } - return this; - }, - - paste: function(e){ - var dateString; - if (e.originalEvent.clipboardData && e.originalEvent.clipboardData.types - && $.inArray('text/plain', e.originalEvent.clipboardData.types) !== -1) { - dateString = e.originalEvent.clipboardData.getData('text/plain'); - } else if (window.clipboardData) { - dateString = window.clipboardData.getData('Text'); - } else { - return; - } - this.setDate(dateString); - this.update(); - e.preventDefault(); - }, - - _utc_to_local: function(utc){ - if (!utc) { - return utc; - } - - var local = new Date(utc.getTime() + (utc.getTimezoneOffset() * 60000)); - - if (local.getTimezoneOffset() !== utc.getTimezoneOffset()) { - local = new Date(utc.getTime() + (local.getTimezoneOffset() * 60000)); - } - - return local; - }, - _local_to_utc: function(local){ - return local && new Date(local.getTime() - (local.getTimezoneOffset()*60000)); - }, - _zero_time: function(local){ - return local && new Date(local.getFullYear(), local.getMonth(), local.getDate()); - }, - _zero_utc_time: function(utc){ - return utc && UTCDate(utc.getUTCFullYear(), utc.getUTCMonth(), utc.getUTCDate()); - }, - - getDates: function(){ - return $.map(this.dates, this._utc_to_local); - }, - - getUTCDates: function(){ - return $.map(this.dates, function(d){ - return new Date(d); - }); - }, - - getDate: function(){ - return this._utc_to_local(this.getUTCDate()); - }, - - getUTCDate: function(){ - var selected_date = this.dates.get(-1); - if (selected_date !== undefined) { - return new Date(selected_date); - } else { - return null; - } - }, - - clearDates: function(){ - this.inputField.val(''); - this.update(); - this._trigger('changeDate'); - - if (this.o.autoclose) { - this.hide(); - } - }, - - setDates: function(){ - var args = Array.isArray(arguments[0]) ? arguments[0] : arguments; - this.update.apply(this, args); - this._trigger('changeDate'); - this.setValue(); - return this; - }, - - setUTCDates: function(){ - var args = Array.isArray(arguments[0]) ? arguments[0] : arguments; - this.setDates.apply(this, $.map(args, this._utc_to_local)); - return this; - }, - - setDate: alias('setDates'), - setUTCDate: alias('setUTCDates'), - remove: alias('destroy', 'Method `remove` is deprecated and will be removed in version 2.0. Use `destroy` instead'), - - setValue: function(){ - var formatted = this.getFormattedDate(); - this.inputField.val(formatted); - return this; - }, - - getFormattedDate: function(format){ - if (format === undefined) - format = this.o.format; - - var lang = this.o.language; - return $.map(this.dates, function(d){ - return DPGlobal.formatDate(d, format, lang); - }).join(this.o.multidateSeparator); - }, - - getStartDate: function(){ - return this.o.startDate; - }, - - setStartDate: function(startDate){ - this._process_options({startDate: startDate}); - this.update(); - this.updateNavArrows(); - return this; - }, - - getEndDate: function(){ - return this.o.endDate; - }, - - setEndDate: function(endDate){ - this._process_options({endDate: endDate}); - this.update(); - this.updateNavArrows(); - return this; - }, - - setDaysOfWeekDisabled: function(daysOfWeekDisabled){ - this._process_options({daysOfWeekDisabled: daysOfWeekDisabled}); - this.update(); - return this; - }, - - setDaysOfWeekHighlighted: function(daysOfWeekHighlighted){ - this._process_options({daysOfWeekHighlighted: daysOfWeekHighlighted}); - this.update(); - return this; - }, - - setDatesDisabled: function(datesDisabled){ - this._process_options({datesDisabled: datesDisabled}); - this.update(); - return this; - }, - - place: function(){ - if (this.isInline) - return this; - var calendarWidth = this.picker.outerWidth(), - calendarHeight = this.picker.outerHeight(), - visualPadding = 10, - container = $(this.o.container), - windowWidth = container.width(), - scrollTop = this.o.container === 'body' ? $(document).scrollTop() : container.scrollTop(), - appendOffset = container.offset(); - - var parentsZindex = [0]; - this.element.parents().each(function(){ - var itemZIndex = $(this).css('z-index'); - if (itemZIndex !== 'auto' && Number(itemZIndex) !== 0) parentsZindex.push(Number(itemZIndex)); - }); - var zIndex = Math.max.apply(Math, parentsZindex) + this.o.zIndexOffset; - var offset = this.component ? this.component.parent().offset() : this.element.offset(); - var height = this.component ? this.component.outerHeight(true) : this.element.outerHeight(false); - var width = this.component ? this.component.outerWidth(true) : this.element.outerWidth(false); - var left = offset.left - appendOffset.left; - var top = offset.top - appendOffset.top; - - if (this.o.container !== 'body') { - top += scrollTop; - } - - this.picker.removeClass( - 'datepicker-orient-top datepicker-orient-bottom '+ - 'datepicker-orient-right datepicker-orient-left' - ); - - if (this.o.orientation.x !== 'auto'){ - this.picker.addClass('datepicker-orient-' + this.o.orientation.x); - if (this.o.orientation.x === 'right') - left -= calendarWidth - width; - } - // auto x orientation is best-placement: if it crosses a window - // edge, fudge it sideways - else { - if (offset.left < 0) { - // component is outside the window on the left side. Move it into visible range - this.picker.addClass('datepicker-orient-left'); - left -= offset.left - visualPadding; - } else if (left + calendarWidth > windowWidth) { - // the calendar passes the widow right edge. Align it to component right side - this.picker.addClass('datepicker-orient-right'); - left += width - calendarWidth; - } else { - if (this.o.rtl) { - // Default to right - this.picker.addClass('datepicker-orient-right'); - } else { - // Default to left - this.picker.addClass('datepicker-orient-left'); - } - } - } - - // auto y orientation is best-situation: top or bottom, no fudging, - // decision based on which shows more of the calendar - var yorient = this.o.orientation.y, - top_overflow; - if (yorient === 'auto'){ - top_overflow = -scrollTop + top - calendarHeight; - yorient = top_overflow < 0 ? 'bottom' : 'top'; - } - - this.picker.addClass('datepicker-orient-' + yorient); - if (yorient === 'top') - top -= calendarHeight + parseInt(this.picker.css('padding-top')); - else - top += height; - - if (this.o.rtl) { - var right = windowWidth - (left + width); - this.picker.css({ - top: top, - right: right, - zIndex: zIndex - }); - } else { - this.picker.css({ - top: top, - left: left, - zIndex: zIndex - }); - } - return this; - }, - - _allow_update: true, - update: function(){ - if (!this._allow_update) - return this; - - var oldDates = this.dates.copy(), - dates = [], - fromArgs = false; - if (arguments.length){ - $.each(arguments, $.proxy(function(i, date){ - if (date instanceof Date) - date = this._local_to_utc(date); - dates.push(date); - }, this)); - fromArgs = true; - } else { - dates = this.isInput - ? this.element.val() - : this.element.data('date') || this.inputField.val(); - if (dates && this.o.multidate) - dates = dates.split(this.o.multidateSeparator); - else - dates = [dates]; - delete this.element.data().date; - } - - dates = $.map(dates, $.proxy(function(date){ - return DPGlobal.parseDate(date, this.o.format, this.o.language, this.o.assumeNearbyYear); - }, this)); - dates = $.grep(dates, $.proxy(function(date){ - return ( - !this.dateWithinRange(date) || - !date - ); - }, this), true); - this.dates.replace(dates); - - if (this.o.updateViewDate) { - if (this.dates.length) - this.viewDate = new Date(this.dates.get(-1)); - else if (this.viewDate < this.o.startDate) - this.viewDate = new Date(this.o.startDate); - else if (this.viewDate > this.o.endDate) - this.viewDate = new Date(this.o.endDate); - else - this.viewDate = this.o.defaultViewDate; - } - - if (fromArgs){ - // setting date by clicking - this.setValue(); - this.element.change(); - } - else if (this.dates.length){ - // setting date by typing - if (String(oldDates) !== String(this.dates) && fromArgs) { - this._trigger('changeDate'); - this.element.change(); - } - } - if (!this.dates.length && oldDates.length) { - this._trigger('clearDate'); - this.element.change(); - } - - this.fill(); - return this; - }, - - fillDow: function(){ - if (this.o.showWeekDays) { - var dowCnt = this.o.weekStart, - html = ''; - if (this.o.calendarWeeks){ - html += ' '; - } - while (dowCnt < this.o.weekStart + 7){ - html += ''+dates[this.o.language].daysMin[(dowCnt++)%7]+''; - } - html += ''; - this.picker.find('.datepicker-days thead').append(html); - } - }, - - fillMonths: function(){ - var localDate = this._utc_to_local(this.viewDate); - var html = ''; - var focused; - for (var i = 0; i < 12; i++){ - focused = localDate && localDate.getMonth() === i ? ' focused' : ''; - html += '' + dates[this.o.language].monthsShort[i] + ''; - } - this.picker.find('.datepicker-months td').html(html); - }, - - setRange: function(range){ - if (!range || !range.length) - delete this.range; - else - this.range = $.map(range, function(d){ - return d.valueOf(); - }); - this.fill(); - }, - - getClassNames: function(date){ - var cls = [], - year = this.viewDate.getUTCFullYear(), - month = this.viewDate.getUTCMonth(), - today = UTCToday(); - if (date.getUTCFullYear() < year || (date.getUTCFullYear() === year && date.getUTCMonth() < month)){ - cls.push('old'); - } else if (date.getUTCFullYear() > year || (date.getUTCFullYear() === year && date.getUTCMonth() > month)){ - cls.push('new'); - } - if (this.focusDate && date.valueOf() === this.focusDate.valueOf()) - cls.push('focused'); - // Compare internal UTC date with UTC today, not local today - if (this.o.todayHighlight && isUTCEquals(date, today)) { - cls.push('today'); - } - if (this.dates.contains(date) !== -1) - cls.push('active'); - if (!this.dateWithinRange(date)){ - cls.push('disabled'); - } - if (this.dateIsDisabled(date)){ - cls.push('disabled', 'disabled-date'); - } - if ($.inArray(date.getUTCDay(), this.o.daysOfWeekHighlighted) !== -1){ - cls.push('highlighted'); - } - - if (this.range){ - if (date > this.range[0] && date < this.range[this.range.length-1]){ - cls.push('range'); - } - if ($.inArray(date.valueOf(), this.range) !== -1){ - cls.push('selected'); - } - if (date.valueOf() === this.range[0]){ - cls.push('range-start'); } - if (date.valueOf() === this.range[this.range.length-1]){ - cls.push('range-end'); - } - } - return cls; - }, - - _fill_yearsView: function(selector, cssClass, factor, year, startYear, endYear, beforeFn){ - var html = ''; - var step = factor / 10; - var view = this.picker.find(selector); - var startVal = Math.floor(year / factor) * factor; - var endVal = startVal + step * 9; - var focusedVal = Math.floor(this.viewDate.getFullYear() / step) * step; - var selected = $.map(this.dates, function(d){ - return Math.floor(d.getUTCFullYear() / step) * step; - }); - - var classes, tooltip, before; - for (var currVal = startVal - step; currVal <= endVal + step; currVal += step) { - classes = [cssClass]; - tooltip = null; - - if (currVal === startVal - step) { - classes.push('old'); - } else if (currVal === endVal + step) { - classes.push('new'); - } - if ($.inArray(currVal, selected) !== -1) { - classes.push('active'); - } - if (currVal < startYear || currVal > endYear) { - classes.push('disabled'); - } - if (currVal === focusedVal) { - classes.push('focused'); - } - - if (beforeFn !== $.noop) { - before = beforeFn(new Date(currVal, 0, 1)); - if (before === undefined) { - before = {}; - } else if (typeof before === 'boolean') { - before = {enabled: before}; - } else if (typeof before === 'string') { - before = {classes: before}; - } - if (before.enabled === false) { - classes.push('disabled'); - } - if (before.classes) { - classes = classes.concat(before.classes.split(/\s+/)); - } - if (before.tooltip) { - tooltip = before.tooltip; - } - } - - html += '' + currVal + ''; - } - - view.find('.datepicker-switch').text(startVal + '-' + endVal); - view.find('td').html(html); - }, - - fill: function(){ - var d = new Date(this.viewDate), - year = d.getUTCFullYear(), - month = d.getUTCMonth(), - startYear = this.o.startDate !== -Infinity ? this.o.startDate.getUTCFullYear() : -Infinity, - startMonth = this.o.startDate !== -Infinity ? this.o.startDate.getUTCMonth() : -Infinity, - endYear = this.o.endDate !== Infinity ? this.o.endDate.getUTCFullYear() : Infinity, - endMonth = this.o.endDate !== Infinity ? this.o.endDate.getUTCMonth() : Infinity, - todaytxt = dates[this.o.language].today || dates['en'].today || '', - cleartxt = dates[this.o.language].clear || dates['en'].clear || '', - titleFormat = dates[this.o.language].titleFormat || dates['en'].titleFormat, - todayDate = UTCToday(), - titleBtnVisible = (this.o.todayBtn === true || this.o.todayBtn === 'linked') && todayDate >= this.o.startDate && todayDate <= this.o.endDate && !this.weekOfDateIsDisabled(todayDate), - tooltip, - before; - if (isNaN(year) || isNaN(month)) - return; - this.picker.find('.datepicker-days .datepicker-switch') - .text(DPGlobal.formatDate(d, titleFormat, this.o.language)); - this.picker.find('tfoot .today') - .text(todaytxt) - .css('display', titleBtnVisible ? 'table-cell' : 'none'); - this.picker.find('tfoot .clear') - .text(cleartxt) - .css('display', this.o.clearBtn === true ? 'table-cell' : 'none'); - this.picker.find('thead .datepicker-title') - .text(this.o.title) - .css('display', typeof this.o.title === 'string' && this.o.title !== '' ? 'table-cell' : 'none'); - this.updateNavArrows(); - this.fillMonths(); - var prevMonth = UTCDate(year, month, 0), - day = prevMonth.getUTCDate(); - prevMonth.setUTCDate(day - (prevMonth.getUTCDay() - this.o.weekStart + 7)%7); - var nextMonth = new Date(prevMonth); - if (prevMonth.getUTCFullYear() < 100){ - nextMonth.setUTCFullYear(prevMonth.getUTCFullYear()); - } - nextMonth.setUTCDate(nextMonth.getUTCDate() + 42); - nextMonth = nextMonth.valueOf(); - var html = []; - var weekDay, clsName; - while (prevMonth.valueOf() < nextMonth){ - weekDay = prevMonth.getUTCDay(); - if (weekDay === this.o.weekStart){ - html.push(''); - if (this.o.calendarWeeks){ - // ISO 8601: First week contains first thursday. - // ISO also states week starts on Monday, but we can be more abstract here. - var - // Start of current week: based on weekstart/current date - ws = new Date(+prevMonth + (this.o.weekStart - weekDay - 7) % 7 * 864e5), - // Thursday of this week - th = new Date(Number(ws) + (7 + 4 - ws.getUTCDay()) % 7 * 864e5), - // First Thursday of year, year from thursday - yth = new Date(Number(yth = UTCDate(th.getUTCFullYear(), 0, 1)) + (7 + 4 - yth.getUTCDay()) % 7 * 864e5), - // Calendar week: ms between thursdays, div ms per day, div 7 days - calWeek = (th - yth) / 864e5 / 7 + 1; - html.push(''+ calWeek +''); - } - } - clsName = this.getClassNames(prevMonth); - clsName.push('day'); - - var content = prevMonth.getUTCDate(); - - if (this.o.beforeShowDay !== $.noop){ - before = this.o.beforeShowDay(this._utc_to_local(prevMonth)); - if (before === undefined) - before = {}; - else if (typeof before === 'boolean') - before = {enabled: before}; - else if (typeof before === 'string') - before = {classes: before}; - if (before.enabled === false) - clsName.push('disabled'); - if (before.classes) - clsName = clsName.concat(before.classes.split(/\s+/)); - if (before.tooltip) - tooltip = before.tooltip; - if (before.content) - content = before.content; - } - - //Check if uniqueSort exists (supported by jquery >=1.12 and >=2.2) - //Fallback to unique function for older jquery versions - if (typeof $.uniqueSort === "function") { - clsName = $.uniqueSort(clsName); - } else { - clsName = $.unique(clsName); - } - - html.push('' + content + ''); - tooltip = null; - if (weekDay === this.o.weekEnd){ - html.push(''); - } - prevMonth.setUTCDate(prevMonth.getUTCDate() + 1); - } - this.picker.find('.datepicker-days tbody').html(html.join('')); - - var monthsTitle = dates[this.o.language].monthsTitle || dates['en'].monthsTitle || 'Months'; - var months = this.picker.find('.datepicker-months') - .find('.datepicker-switch') - .text(this.o.maxViewMode < 2 ? monthsTitle : year) - .end() - .find('tbody span').removeClass('active'); - - $.each(this.dates, function(i, d){ - if (d.getUTCFullYear() === year) - months.eq(d.getUTCMonth()).addClass('active'); - }); - - if (year < startYear || year > endYear){ - months.addClass('disabled'); - } - if (year === startYear){ - months.slice(0, startMonth).addClass('disabled'); - } - if (year === endYear){ - months.slice(endMonth+1).addClass('disabled'); - } - - if (this.o.beforeShowMonth !== $.noop){ - var that = this; - $.each(months, function(i, month){ - var moDate = new Date(year, i, 1); - var before = that.o.beforeShowMonth(moDate); - if (before === undefined) - before = {}; - else if (typeof before === 'boolean') - before = {enabled: before}; - else if (typeof before === 'string') - before = {classes: before}; - if (before.enabled === false && !$(month).hasClass('disabled')) - $(month).addClass('disabled'); - if (before.classes) - $(month).addClass(before.classes); - if (before.tooltip) - $(month).prop('title', before.tooltip); - }); - } - - // Generating decade/years picker - this._fill_yearsView( - '.datepicker-years', - 'year', - 10, - year, - startYear, - endYear, - this.o.beforeShowYear - ); - - // Generating century/decades picker - this._fill_yearsView( - '.datepicker-decades', - 'decade', - 100, - year, - startYear, - endYear, - this.o.beforeShowDecade - ); - - // Generating millennium/centuries picker - this._fill_yearsView( - '.datepicker-centuries', - 'century', - 1000, - year, - startYear, - endYear, - this.o.beforeShowCentury - ); - }, - - updateNavArrows: function(){ - if (!this._allow_update) - return; - - var d = new Date(this.viewDate), - year = d.getUTCFullYear(), - month = d.getUTCMonth(), - startYear = this.o.startDate !== -Infinity ? this.o.startDate.getUTCFullYear() : -Infinity, - startMonth = this.o.startDate !== -Infinity ? this.o.startDate.getUTCMonth() : -Infinity, - endYear = this.o.endDate !== Infinity ? this.o.endDate.getUTCFullYear() : Infinity, - endMonth = this.o.endDate !== Infinity ? this.o.endDate.getUTCMonth() : Infinity, - prevIsDisabled, - nextIsDisabled, - factor = 1; - switch (this.viewMode){ - case 4: - factor *= 10; - /* falls through */ - case 3: - factor *= 10; - /* falls through */ - case 2: - factor *= 10; - /* falls through */ - case 1: - prevIsDisabled = Math.floor(year / factor) * factor <= startYear; - nextIsDisabled = Math.floor(year / factor) * factor + factor > endYear; - break; - case 0: - prevIsDisabled = year <= startYear && month <= startMonth; - nextIsDisabled = year >= endYear && month >= endMonth; - break; - } - - this.picker.find('.prev').toggleClass('disabled', prevIsDisabled); - this.picker.find('.next').toggleClass('disabled', nextIsDisabled); - }, - - click: function(e){ - e.preventDefault(); - e.stopPropagation(); - - var target, dir, day, year, month; - target = $(e.target); - - // Clicked on the switch - if (target.hasClass('datepicker-switch') && this.viewMode !== this.o.maxViewMode){ - this.setViewMode(this.viewMode + 1); - } - - // Clicked on today button - if (target.hasClass('today') && !target.hasClass('day')){ - this.setViewMode(0); - this._setDate(UTCToday(), this.o.todayBtn === 'linked' ? null : 'view'); - } - - // Clicked on clear button - if (target.hasClass('clear')){ - this.clearDates(); - } - - if (!target.hasClass('disabled')){ - // Clicked on a month, year, decade, century - if (target.hasClass('month') - || target.hasClass('year') - || target.hasClass('decade') - || target.hasClass('century')) { - this.viewDate.setUTCDate(1); - - day = 1; - if (this.viewMode === 1){ - month = target.parent().find('span').index(target); - year = this.viewDate.getUTCFullYear(); - this.viewDate.setUTCMonth(month); - } else { - month = 0; - year = Number(target.text()); - this.viewDate.setUTCFullYear(year); - } - - this._trigger(DPGlobal.viewModes[this.viewMode - 1].e, this.viewDate); - - if (this.viewMode === this.o.minViewMode){ - this._setDate(UTCDate(year, month, day)); - } else { - this.setViewMode(this.viewMode - 1); - this.fill(); - } - } - } - - if (this.picker.is(':visible') && this._focused_from){ - this._focused_from.focus(); - } - delete this._focused_from; - }, - - dayCellClick: function(e){ - var $target = $(e.currentTarget); - var timestamp = $target.data('date'); - var date = new Date(timestamp); - - if (this.o.updateViewDate) { - if (date.getUTCFullYear() !== this.viewDate.getUTCFullYear()) { - this._trigger('changeYear', this.viewDate); - } - - if (date.getUTCMonth() !== this.viewDate.getUTCMonth()) { - this._trigger('changeMonth', this.viewDate); - } - } - this._setDate(date); - }, - - // Clicked on prev or next - navArrowsClick: function(e){ - var $target = $(e.currentTarget); - var dir = $target.hasClass('prev') ? -1 : 1; - if (this.viewMode !== 0){ - dir *= DPGlobal.viewModes[this.viewMode].navStep * 12; - } - this.viewDate = this.moveMonth(this.viewDate, dir); - this._trigger(DPGlobal.viewModes[this.viewMode].e, this.viewDate); - this.fill(); - }, - - _toggle_multidate: function(date){ - var ix = this.dates.contains(date); - if (!date){ - this.dates.clear(); - } - - if (ix !== -1){ - if (this.o.multidate === true || this.o.multidate > 1 || this.o.toggleActive){ - this.dates.remove(ix); - } - } else if (this.o.multidate === false) { - this.dates.clear(); - this.dates.push(date); - } - else { - this.dates.push(date); - } - - if (typeof this.o.multidate === 'number') - while (this.dates.length > this.o.multidate) - this.dates.remove(0); - }, - - _setDate: function(date, which){ - if (!which || which === 'date') - this._toggle_multidate(date && new Date(date)); - if ((!which && this.o.updateViewDate) || which === 'view') - this.viewDate = date && new Date(date); - - this.fill(); - this.setValue(); - if (!which || which !== 'view') { - this._trigger('changeDate'); - } - this.inputField.trigger('change'); - if (this.o.autoclose && (!which || which === 'date')){ - this.hide(); - } - }, - - moveDay: function(date, dir){ - var newDate = new Date(date); - newDate.setUTCDate(date.getUTCDate() + dir); - - return newDate; - }, - - moveWeek: function(date, dir){ - return this.moveDay(date, dir * 7); - }, - - moveMonth: function(date, dir){ - if (!isValidDate(date)) - return this.o.defaultViewDate; - if (!dir) - return date; - var new_date = new Date(date.valueOf()), - day = new_date.getUTCDate(), - month = new_date.getUTCMonth(), - mag = Math.abs(dir), - new_month, test; - dir = dir > 0 ? 1 : -1; - if (mag === 1){ - test = dir === -1 - // If going back one month, make sure month is not current month - // (eg, Mar 31 -> Feb 31 == Feb 28, not Mar 02) - ? function(){ - return new_date.getUTCMonth() === month; - } - // If going forward one month, make sure month is as expected - // (eg, Jan 31 -> Feb 31 == Feb 28, not Mar 02) - : function(){ - return new_date.getUTCMonth() !== new_month; - }; - new_month = month + dir; - new_date.setUTCMonth(new_month); - // Dec -> Jan (12) or Jan -> Dec (-1) -- limit expected date to 0-11 - new_month = (new_month + 12) % 12; - } - else { - // For magnitudes >1, move one month at a time... - for (var i=0; i < mag; i++) - // ...which might decrease the day (eg, Jan 31 to Feb 28, etc)... - new_date = this.moveMonth(new_date, dir); - // ...then reset the day, keeping it in the new month - new_month = new_date.getUTCMonth(); - new_date.setUTCDate(day); - test = function(){ - return new_month !== new_date.getUTCMonth(); - }; - } - // Common date-resetting loop -- if date is beyond end of month, make it - // end of month - while (test()){ - new_date.setUTCDate(--day); - new_date.setUTCMonth(new_month); - } - return new_date; - }, - - moveYear: function(date, dir){ - return this.moveMonth(date, dir*12); - }, - - moveAvailableDate: function(date, dir, fn){ - do { - date = this[fn](date, dir); - - if (!this.dateWithinRange(date)) - return false; - - fn = 'moveDay'; - } - while (this.dateIsDisabled(date)); - - return date; - }, - - weekOfDateIsDisabled: function(date){ - return $.inArray(date.getUTCDay(), this.o.daysOfWeekDisabled) !== -1; - }, - - dateIsDisabled: function(date){ - return ( - this.weekOfDateIsDisabled(date) || - $.grep(this.o.datesDisabled, function(d){ - return isUTCEquals(date, d); - }).length > 0 - ); - }, - - dateWithinRange: function(date){ - return date >= this.o.startDate && date <= this.o.endDate; - }, - - keydown: function(e){ - if (!this.picker.is(':visible')){ - if (e.keyCode === 40 || e.keyCode === 27) { // allow down to re-show picker - this.show(); - e.stopPropagation(); - } - return; - } - var dateChanged = false, - dir, newViewDate, - focusDate = this.focusDate || this.viewDate; - switch (e.keyCode){ - case 27: // escape - if (this.focusDate){ - this.focusDate = null; - this.viewDate = this.dates.get(-1) || this.viewDate; - this.fill(); - } - else - this.hide(); - e.preventDefault(); - e.stopPropagation(); - break; - case 37: // left - case 38: // up - case 39: // right - case 40: // down - if (!this.o.keyboardNavigation || this.o.daysOfWeekDisabled.length === 7) - break; - dir = e.keyCode === 37 || e.keyCode === 38 ? -1 : 1; - if (this.viewMode === 0) { - if (e.ctrlKey){ - newViewDate = this.moveAvailableDate(focusDate, dir, 'moveYear'); - - if (newViewDate) - this._trigger('changeYear', this.viewDate); - } else if (e.shiftKey){ - newViewDate = this.moveAvailableDate(focusDate, dir, 'moveMonth'); - - if (newViewDate) - this._trigger('changeMonth', this.viewDate); - } else if (e.keyCode === 37 || e.keyCode === 39){ - newViewDate = this.moveAvailableDate(focusDate, dir, 'moveDay'); - } else if (!this.weekOfDateIsDisabled(focusDate)){ - newViewDate = this.moveAvailableDate(focusDate, dir, 'moveWeek'); - } - } else if (this.viewMode === 1) { - if (e.keyCode === 38 || e.keyCode === 40) { - dir = dir * 4; - } - newViewDate = this.moveAvailableDate(focusDate, dir, 'moveMonth'); - } else if (this.viewMode === 2) { - if (e.keyCode === 38 || e.keyCode === 40) { - dir = dir * 4; - } - newViewDate = this.moveAvailableDate(focusDate, dir, 'moveYear'); - } - if (newViewDate){ - this.focusDate = this.viewDate = newViewDate; - this.setValue(); - this.fill(); - e.preventDefault(); - } - break; - case 13: // enter - if (!this.o.forceParse) - break; - focusDate = this.focusDate || this.dates.get(-1) || this.viewDate; - if (this.o.keyboardNavigation) { - this._toggle_multidate(focusDate); - dateChanged = true; - } - this.focusDate = null; - this.viewDate = this.dates.get(-1) || this.viewDate; - this.setValue(); - this.fill(); - if (this.picker.is(':visible')){ - e.preventDefault(); - e.stopPropagation(); - if (this.o.autoclose) - this.hide(); - } - break; - case 9: // tab - this.focusDate = null; - this.viewDate = this.dates.get(-1) || this.viewDate; - this.fill(); - this.hide(); - break; - } - if (dateChanged){ - if (this.dates.length) - this._trigger('changeDate'); - else - this._trigger('clearDate'); - this.inputField.trigger('change'); - } - }, - - setViewMode: function(viewMode){ - this.viewMode = viewMode; - this.picker - .children('div') - .hide() - .filter('.datepicker-' + DPGlobal.viewModes[this.viewMode].clsName) - .show(); - this.updateNavArrows(); - this._trigger('changeViewMode', new Date(this.viewDate)); - } - }; - - var DateRangePicker = function(element, options){ - $.data(element, 'datepicker', this); - this.element = $(element); - this.inputs = $.map(options.inputs, function(i){ - return i.jquery ? i[0] : i; - }); - delete options.inputs; - - this.keepEmptyValues = options.keepEmptyValues; - delete options.keepEmptyValues; - - datepickerPlugin.call($(this.inputs), options) - .on('changeDate', $.proxy(this.dateUpdated, this)); - - this.pickers = $.map(this.inputs, function(i){ - return $.data(i, 'datepicker'); - }); - this.updateDates(); - }; - DateRangePicker.prototype = { - updateDates: function(){ - this.dates = $.map(this.pickers, function(i){ - return i.getUTCDate(); - }); - this.updateRanges(); - }, - updateRanges: function(){ - var range = $.map(this.dates, function(d){ - return d.valueOf(); - }); - $.each(this.pickers, function(i, p){ - p.setRange(range); - }); - }, - clearDates: function(){ - $.each(this.pickers, function(i, p){ - p.clearDates(); - }); - }, - dateUpdated: function(e){ - // `this.updating` is a workaround for preventing infinite recursion - // between `changeDate` triggering and `setUTCDate` calling. Until - // there is a better mechanism. - if (this.updating) - return; - this.updating = true; - - var dp = $.data(e.target, 'datepicker'); - - if (dp === undefined) { - return; - } - - var new_date = dp.getUTCDate(), - keep_empty_values = this.keepEmptyValues, - i = $.inArray(e.target, this.inputs), - j = i - 1, - k = i + 1, - l = this.inputs.length; - if (i === -1) - return; - - $.each(this.pickers, function(i, p){ - if (!p.getUTCDate() && (p === dp || !keep_empty_values)) - p.setUTCDate(new_date); - }); - - if (new_date < this.dates[j]){ - // Date being moved earlier/left - while (j >= 0 && new_date < this.dates[j]){ - this.pickers[j--].setUTCDate(new_date); - } - } else if (new_date > this.dates[k]){ - // Date being moved later/right - while (k < l && new_date > this.dates[k]){ - this.pickers[k++].setUTCDate(new_date); - } - } - this.updateDates(); - - delete this.updating; - }, - destroy: function(){ - $.map(this.pickers, function(p){ p.destroy(); }); - $(this.inputs).off('changeDate', this.dateUpdated); - delete this.element.data().datepicker; - }, - remove: alias('destroy', 'Method `remove` is deprecated and will be removed in version 2.0. Use `destroy` instead') - }; - - function opts_from_el(el, prefix){ - // Derive options from element data-attrs - var data = $(el).data(), - out = {}, inkey, - replace = new RegExp('^' + prefix.toLowerCase() + '([A-Z])'); - prefix = new RegExp('^' + prefix.toLowerCase()); - function re_lower(_,a){ - return a.toLowerCase(); - } - for (var key in data) - if (prefix.test(key)){ - inkey = key.replace(replace, re_lower); - out[inkey] = data[key]; - } - return out; - } - - function opts_from_locale(lang){ - // Derive options from locale plugins - var out = {}; - // Check if "de-DE" style date is available, if not language should - // fallback to 2 letter code eg "de" - if (!dates[lang]){ - lang = lang.split('-')[0]; - if (!dates[lang]) - return; - } - var d = dates[lang]; - $.each(locale_opts, function(i,k){ - if (k in d) - out[k] = d[k]; - }); - return out; - } - - var old = $.fn.datepicker; - var datepickerPlugin = function(option){ - var args = Array.apply(null, arguments); - args.shift(); - var internal_return; - this.each(function(){ - var $this = $(this), - data = $this.data('datepicker'), - options = typeof option === 'object' && option; - if (!data){ - var elopts = opts_from_el(this, 'date'), - // Preliminary options - xopts = $.extend({}, defaults, elopts, options), - locopts = opts_from_locale(xopts.language), - // Options priority: js args, data-attrs, locales, defaults - opts = $.extend({}, defaults, locopts, elopts, options); - if ($this.hasClass('input-daterange') || opts.inputs){ - $.extend(opts, { - inputs: opts.inputs || $this.find('input').toArray() - }); - data = new DateRangePicker(this, opts); - } - else { - data = new Datepicker(this, opts); - } - $this.data('datepicker', data); - } - if (typeof option === 'string' && typeof data[option] === 'function'){ - internal_return = data[option].apply(data, args); - } - }); - - if ( - internal_return === undefined || - internal_return instanceof Datepicker || - internal_return instanceof DateRangePicker - ) - return this; - - if (this.length > 1) - throw new Error('Using only allowed for the collection of a single element (' + option + ' function)'); - else - return internal_return; - }; - $.fn.datepicker = datepickerPlugin; - - var defaults = $.fn.datepicker.defaults = { - assumeNearbyYear: false, - autoclose: false, - beforeShowDay: $.noop, - beforeShowMonth: $.noop, - beforeShowYear: $.noop, - beforeShowDecade: $.noop, - beforeShowCentury: $.noop, - calendarWeeks: false, - clearBtn: false, - toggleActive: false, - daysOfWeekDisabled: [], - daysOfWeekHighlighted: [], - datesDisabled: [], - endDate: Infinity, - forceParse: true, - format: 'mm/dd/yyyy', - keepEmptyValues: false, - keyboardNavigation: true, - language: 'en', - minViewMode: 0, - maxViewMode: 4, - multidate: false, - multidateSeparator: ',', - orientation: "auto", - rtl: false, - startDate: -Infinity, - startView: 0, - todayBtn: false, - todayHighlight: false, - updateViewDate: true, - weekStart: 0, - disableTouchKeyboard: false, - enableOnReadonly: true, - showOnFocus: true, - zIndexOffset: 10, - container: 'body', - immediateUpdates: false, - title: '', - templates: { - leftArrow: '«', - rightArrow: '»' - }, - showWeekDays: true - }; - var locale_opts = $.fn.datepicker.locale_opts = [ - 'format', - 'rtl', - 'weekStart' - ]; - $.fn.datepicker.Constructor = Datepicker; - var dates = $.fn.datepicker.dates = { - en: { - days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], - daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], - daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"], - months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], - monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], - today: "Today", - clear: "Clear", - titleFormat: "MM yyyy" - } - }; - - var DPGlobal = { - viewModes: [ - { - names: ['days', 'month'], - clsName: 'days', - e: 'changeMonth' - }, - { - names: ['months', 'year'], - clsName: 'months', - e: 'changeYear', - navStep: 1 - }, - { - names: ['years', 'decade'], - clsName: 'years', - e: 'changeDecade', - navStep: 10 - }, - { - names: ['decades', 'century'], - clsName: 'decades', - e: 'changeCentury', - navStep: 100 - }, - { - names: ['centuries', 'millennium'], - clsName: 'centuries', - e: 'changeMillennium', - navStep: 1000 - } - ], - validParts: /dd?|DD?|mm?|MM?|yy(?:yy)?/g, - nonpunctuation: /[^ -\/:-@\u5e74\u6708\u65e5\[-`{-~\t\n\r]+/g, - parseFormat: function(format){ - if (typeof format.toValue === 'function' && typeof format.toDisplay === 'function') - return format; - // IE treats \0 as a string end in inputs (truncating the value), - // so it's a bad format delimiter, anyway - var separators = format.replace(this.validParts, '\0').split('\0'), - parts = format.match(this.validParts); - if (!separators || !separators.length || !parts || parts.length === 0){ - throw new Error("Invalid date format."); - } - return {separators: separators, parts: parts}; - }, - parseDate: function(date, format, language, assumeNearby){ - if (!date) - return undefined; - if (date instanceof Date) - return date; - if (typeof format === 'string') - format = DPGlobal.parseFormat(format); - if (format.toValue) - return format.toValue(date, format, language); - var fn_map = { - d: 'moveDay', - m: 'moveMonth', - w: 'moveWeek', - y: 'moveYear' - }, - dateAliases = { - yesterday: '-1d', - today: '+0d', - tomorrow: '+1d' - }, - parts, part, dir, i, fn; - if (date in dateAliases){ - date = dateAliases[date]; - } - if (/^[\-+]\d+[dmwy]([\s,]+[\-+]\d+[dmwy])*$/i.test(date)){ - parts = date.match(/([\-+]\d+)([dmwy])/gi); - date = new Date(); - for (i=0; i < parts.length; i++){ - part = parts[i].match(/([\-+]\d+)([dmwy])/i); - dir = Number(part[1]); - fn = fn_map[part[2].toLowerCase()]; - date = Datepicker.prototype[fn](date, dir); - } - return Datepicker.prototype._zero_utc_time(date); - } - - parts = date && date.match(this.nonpunctuation) || []; - - function applyNearbyYear(year, threshold){ - if (threshold === true) - threshold = 10; - - // if year is 2 digits or less, than the user most likely is trying to get a recent century - if (year < 100){ - year += 2000; - // if the new year is more than threshold years in advance, use last century - if (year > ((new Date()).getFullYear()+threshold)){ - year -= 100; - } - } - - return year; - } - - var parsed = {}, - setters_order = ['yyyy', 'yy', 'M', 'MM', 'm', 'mm', 'd', 'dd'], - setters_map = { - yyyy: function(d,v){ - return d.setUTCFullYear(assumeNearby ? applyNearbyYear(v, assumeNearby) : v); - }, - m: function(d,v){ - if (isNaN(d)) - return d; - v -= 1; - while (v < 0) v += 12; - v %= 12; - d.setUTCMonth(v); - while (d.getUTCMonth() !== v) - d.setUTCDate(d.getUTCDate()-1); - return d; - }, - d: function(d,v){ - return d.setUTCDate(v); - } - }, - val, filtered; - setters_map['yy'] = setters_map['yyyy']; - setters_map['M'] = setters_map['MM'] = setters_map['mm'] = setters_map['m']; - setters_map['dd'] = setters_map['d']; - date = UTCToday(); - var fparts = format.parts.slice(); - // Remove noop parts - if (parts.length !== fparts.length){ - fparts = $(fparts).filter(function(i,p){ - return $.inArray(p, setters_order) !== -1; - }).toArray(); - } - // Process remainder - function match_part(){ - var m = this.slice(0, parts[i].length), - p = parts[i].slice(0, m.length); - return m.toLowerCase() === p.toLowerCase(); - } - if (parts.length === fparts.length){ - var cnt; - for (i=0, cnt = fparts.length; i < cnt; i++){ - val = parseInt(parts[i], 10); - part = fparts[i]; - if (isNaN(val)){ - switch (part){ - case 'MM': - filtered = $(dates[language].months).filter(match_part); - val = $.inArray(filtered[0], dates[language].months) + 1; - break; - case 'M': - filtered = $(dates[language].monthsShort).filter(match_part); - val = $.inArray(filtered[0], dates[language].monthsShort) + 1; - break; - } - } - parsed[part] = val; - } - var _date, s; - for (i=0; i < setters_order.length; i++){ - s = setters_order[i]; - if (s in parsed && !isNaN(parsed[s])){ - _date = new Date(date); - setters_map[s](_date, parsed[s]); - if (!isNaN(_date)) - date = _date; - } - } - } - return date; - }, - formatDate: function(date, format, language){ - if (!date) - return ''; - if (typeof format === 'string') - format = DPGlobal.parseFormat(format); - if (format.toDisplay) - return format.toDisplay(date, format, language); - var val = { - d: date.getUTCDate(), - D: dates[language].daysShort[date.getUTCDay()], - DD: dates[language].days[date.getUTCDay()], - m: date.getUTCMonth() + 1, - M: dates[language].monthsShort[date.getUTCMonth()], - MM: dates[language].months[date.getUTCMonth()], - yy: date.getUTCFullYear().toString().substring(2), - yyyy: date.getUTCFullYear() - }; - val.dd = (val.d < 10 ? '0' : '') + val.d; - val.mm = (val.m < 10 ? '0' : '') + val.m; - date = []; - var seps = $.extend([], format.separators); - for (var i=0, cnt = format.parts.length; i <= cnt; i++){ - if (seps.length) - date.push(seps.shift()); - date.push(val[format.parts[i]]); - } - return date.join(''); - }, - headTemplate: ''+ - ''+ - ''+ - ''+ - ''+ - ''+defaults.templates.leftArrow+''+ - ''+ - ''+defaults.templates.rightArrow+''+ - ''+ - '', - contTemplate: '', - footTemplate: ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - ''+ - '' - }; - DPGlobal.template = '
'+ - '
'+ - ''+ - DPGlobal.headTemplate+ - ''+ - DPGlobal.footTemplate+ - '
'+ - '
'+ - '
'+ - ''+ - DPGlobal.headTemplate+ - DPGlobal.contTemplate+ - DPGlobal.footTemplate+ - '
'+ - '
'+ - '
'+ - ''+ - DPGlobal.headTemplate+ - DPGlobal.contTemplate+ - DPGlobal.footTemplate+ - '
'+ - '
'+ - '
'+ - ''+ - DPGlobal.headTemplate+ - DPGlobal.contTemplate+ - DPGlobal.footTemplate+ - '
'+ - '
'+ - '
'+ - ''+ - DPGlobal.headTemplate+ - DPGlobal.contTemplate+ - DPGlobal.footTemplate+ - '
'+ - '
'+ - '
'; - - $.fn.datepicker.DPGlobal = DPGlobal; - - - /* DATEPICKER NO CONFLICT - * =================== */ - - $.fn.datepicker.noConflict = function(){ - $.fn.datepicker = old; - return this; - }; - - /* DATEPICKER VERSION - * =================== */ - $.fn.datepicker.version = '1.9.0'; - - $.fn.datepicker.deprecated = function(msg){ - var console = window.console; - if (console && console.warn) { - console.warn('DEPRECATED: ' + msg); - } - }; - - - /* DATEPICKER DATA-API - * ================== */ - - $(document).on( - 'focus.datepicker.data-api click.datepicker.data-api', - '[data-provide="datepicker"]', - function(e){ - var $this = $(this); - if ($this.data('datepicker')) - return; - e.preventDefault(); - // component click requires us to explicitly show it - datepickerPlugin.call($this, 'show'); - } - ); - $(function(){ - datepickerPlugin.call($('[data-provide="datepicker-inline"]')); - }); - -})); + } + if (el.dataset.dateMinViewMode && view_mode[el.dataset.dateMinViewMode]) { + options = { ...options, + startView: view_mode[el.dataset.dateMinViewMode] + }; + } + if (el.dataset.dateViewMode && view_mode[el.dataset.dateViewMode]) { + options = { ...options, + maxView: view_mode[el.dataset.dateViewMode] + }; + } + if (el.dataset.dateAutoclose) { + options = { ...options, + autohide: el.dataset.dateAutoclose + }; + } + + new Datepicker(el, options); +} + +document.addEventListener("DOMContentLoaded", function () { + const elems = document.querySelectorAll('[data-provide="datepicker"]'); + elems.forEach(el => enable_datepicker(el)); +}); diff --git a/ietf/static/js/edit-milestones.js b/ietf/static/js/edit-milestones.js index 2a7e2ce2a..2b64900d6 100644 --- a/ietf/static/js/edit-milestones.js +++ b/ietf/static/js/edit-milestones.js @@ -134,6 +134,11 @@ $(document) window.setupSelect2Field($(this)); // from select2-field.js }); + new_edit_milestone.find("[data-provide='datepicker']") + .each(function () { + enable_datepicker($(this)[0]); // from datepicker.js + }); + if (!group_uses_milestone_dates) { setOrderControlValue(); } @@ -231,4 +236,4 @@ $(document) var el = document.getElementById('dragdropcontainer'); Sortable.create(el, options); } - }); \ No newline at end of file + }); diff --git a/ietf/static/js/fullcalendar.js b/ietf/static/js/fullcalendar.js index 276a31caa..dfdad730e 100644 --- a/ietf/static/js/fullcalendar.js +++ b/ietf/static/js/fullcalendar.js @@ -1,7 +1,9 @@ import { Calendar } from '@fullcalendar/core'; import dayGridPlugin from '@fullcalendar/daygrid'; -import bootstrap5Plugin from '@fullcalendar/bootstrap5' +import iCalendarPlugin from '@fullcalendar/icalendar'; +import bootstrap5Plugin from '@fullcalendar/bootstrap5'; global.FullCalendar = Calendar; global.dayGridPlugin = dayGridPlugin; +global.iCalendarPlugin = iCalendarPlugin; global.bootstrap5Plugin = bootstrap5Plugin; diff --git a/ietf/templates/doc/document_draft.html b/ietf/templates/doc/document_draft.html index 72256b632..b38225dd4 100644 --- a/ietf/templates/doc/document_draft.html +++ b/ietf/templates/doc/document_draft.html @@ -13,7 +13,7 @@ title="Document changes" href="/feed/document-changes/{{ name }}/"> + content="{{ doc.title }} {% if doc.get_state_slug == 'rfc' and not snapshot %}(RFC {{ rfc_number }}{% if published %}, {{ doc.pub_date|date:'F Y' }}{% endif %}{% if obsoleted_by %}; obsoleted by {% for rel in obsoleted_by %}{{ rel.source.canonical_name|prettystdname}}{% if not forloop.last%}, {% endif %}{% endfor %}{% endif %}){% endif %}"> {% endblock %} {% block morecss %}.inline { display: inline; }{% endblock %} {% block title %} diff --git a/ietf/templates/doc/document_html.html b/ietf/templates/doc/document_html.html index 9823a0d37..7ee8f8124 100644 --- a/ietf/templates/doc/document_html.html +++ b/ietf/templates/doc/document_html.html @@ -34,7 +34,7 @@ href="/feed/document-changes/{{ doc.name }}/"> diff --git a/ietf/templates/doc/drafts_in_iesg_process.html b/ietf/templates/doc/drafts_in_iesg_process.html index 528678118..def5e98cb 100644 --- a/ietf/templates/doc/drafts_in_iesg_process.html +++ b/ietf/templates/doc/drafts_in_iesg_process.html @@ -55,7 +55,7 @@
Action holder{{ doc.documentactionholder_set.all|pluralize }}: {% for action_holder in doc.documentactionholder_set.all %} - {% person_link action_holder.person title=action_holder.role_for_doc %} {{ action_holder|action_holder_badge }}{% if not forloop.last %},{% endif %} + {% person_link action_holder.person title=action_holder.role_for_doc %}{% if action_holder|action_holder_badge %} {{ action_holder|action_holder_badge }}{% endif %}{% if not forloop.last %},{% endif %} {% endfor %} {% endif %} {% if doc.note %} diff --git a/ietf/templates/ietfauth/apikeys.html b/ietf/templates/ietfauth/apikeys.html index ab6194151..5ac7f6f45 100644 --- a/ietf/templates/ietfauth/apikeys.html +++ b/ietf/templates/ietfauth/apikeys.html @@ -37,9 +37,9 @@ {{ key.created }} {{ key.latest }} {{ key.count }} - {{ key.valid }} + {{ key.valid }} - {{ key.hash }} + {{ key.hash }} {% if key.valid %} @@ -63,4 +63,4 @@ {% endblock %} {% block js %} -{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/ietf/templates/ipr/posted_document_email.txt b/ietf/templates/ipr/posted_document_email.txt index 397b686b2..1c56e8dea 100644 --- a/ietf/templates/ipr/posted_document_email.txt +++ b/ietf/templates/ipr/posted_document_email.txt @@ -6,7 +6,7 @@ Cc: {{ cc_email }} Dear {{ to_name }}: {% filter wordwrap:78 %} -An IPR disclosure that pertains to your {{ doc_info }} was submitted to the IETF Secretariat on {{ ipr.get_latest_event_submitted.time|date:"Y-m-d" }} and has been posted on the "IETF Page of Intellectual Property Rights Disclosures" ({{ settings.IDTRACKER_BASE_URL }}{% url "ietf.ipr.views.history" id=ipr.pk %}). The title of the IPR disclosure is "{{ ipr.title }}" +An IPR disclosure that pertains to your {{ doc_info }} was submitted to the IETF Secretariat on {{ ipr.get_latest_event_submitted.time|date:"Y-m-d" }} and has been posted on the "IETF Page of Intellectual Property Rights Disclosures" ({{ settings.IDTRACKER_BASE_URL }}{% url "ietf.ipr.views.show" id=ipr.pk %}). The title of the IPR disclosure is "{{ ipr.title }}" {% endfilter %} Thank you diff --git a/ietf/templates/meeting/agenda.txt b/ietf/templates/meeting/agenda.txt index 7f612cfd9..d00be80d1 100644 --- a/ietf/templates/meeting/agenda.txt +++ b/ietf/templates/meeting/agenda.txt @@ -23,7 +23,7 @@ {% endif %}{% if item.slot_type.slug == 'regular' %}{% ifchanged %} {{ item.timeslot.time|date:"Hi" }}-{{ item.timeslot.end_time|date:"Hi" }} {{ item.timeslot.name }} -{% endifchanged %}{{ item.timeslot.location.name|ljust:14 }} {{ item.session.group_parent_at_the_time.acronym|upper|ljust:4 }} {{ item.session.group_at_the_time.acronym|ljust:10 }} {{ item.session.group_at_the_time.name }} {% if item.session.group_at_the_time.state_id == "bof" %}BOF{% elif item.session.group_at_the_time.type_id == "wg" %}WG{% endif %}{% if item.session.agenda_note %} - {{ item.session.agenda_note }}{% endif %}{% if item.session.current_status == 'canceled' %} *** CANCELLED ***{% elif item.session.current_status == 'resched' %} *** RESCHEDULED{% if item.session.rescheduled_to %} TO {{ item.session.rescheduled_to.time|date:"l G:i"|upper }}-{{ item.session.rescheduled_to.end_time|date:"G:i" }}{% endif %} ***{% endif %} +{% endifchanged %}{{ item.timeslot.location.name|truncatechars:18|ljust:18 }} {% if item.session.group_parent_at_the_time %}{{ item.session.group_parent_at_the_time.acronym|upper|truncatechars:6|ljust:6 }}{% else %} {% endif %} {{ item.session.group_at_the_time.acronym|truncatechars:12|ljust:12 }} {{ item.session.group_at_the_time.name }} {% if item.session.group_at_the_time.state_id == "bof" %}BOF{% elif item.session.group_at_the_time.type_id == "wg" %}WG{% endif %}{% if item.session.agenda_note %} - {{ item.session.agenda_note }}{% endif %}{% if item.session.current_status == 'canceled' %} *** CANCELLED ***{% elif item.session.current_status == 'resched' %} *** RESCHEDULED{% if item.session.rescheduled_to %} TO {{ item.session.rescheduled_to.time|date:"l G:i"|upper }}-{{ item.session.rescheduled_to.end_time|date:"G:i" }}{% endif %} ***{% endif %} {% endif %}{% if item.slot_type.slug == "break" %} {{ item.timeslot.time|date:"Hi" }}-{{ item.timeslot.end_time|date:"Hi" }} {{ item.timeslot.name }}{% if schedule.meeting.break_area and item.timeslot.show_location %} - {{ schedule.meeting.break_area }}{% endif %}{% endif %}{% if item.slot_type.slug == "other" %} {{ item.timeslot.time|date:"Hi" }}-{{ item.timeslot.end_time|date:"Hi" }} {{ item.timeslot.name }} - {{ item.timeslot.location.name }}{% endif %}{% endfor %} diff --git a/ietf/templates/meeting/important-dates.html b/ietf/templates/meeting/important-dates.html index 659154759..749df532d 100644 --- a/ietf/templates/meeting/important-dates.html +++ b/ietf/templates/meeting/important-dates.html @@ -81,7 +81,30 @@ {% endif %} {% endfor %} +
{% endblock %} {% block js %} + + {% endblock %} \ No newline at end of file diff --git a/ietf/templates/meeting/interim_announcement.txt b/ietf/templates/meeting/interim_announcement.txt index f9d5394c3..6ea2e4c9d 100644 --- a/ietf/templates/meeting/interim_announcement.txt +++ b/ietf/templates/meeting/interim_announcement.txt @@ -1,8 +1,6 @@ {% load ietf_filters tz %}{% timezone meeting.tz %}{% if is_change %}MEETING DETAILS HAVE CHANGED. SEE LATEST DETAILS BELOW. -{% endif %}The {{ group.name }} ({{ group.acronym }}) {% if group.type.slug == 'wg' and group.state.slug == 'bof' %}BOF{% else %}{{group.type.name}}{% endif %} will hold -{% if assignments.count == 1 %}a{% if meeting.city %}n {% else %} virtual {% endif %}interim meeting on {{ meeting.date }} from {{ assignments.first.timeslot.time | date:"H:i" }} to {{ assignments.first.timeslot.end_time | date:"H:i" }} {{ meeting.time_zone}}{% if meeting.time_zone != 'UTC' %} ({{ assignments.first.timeslot.time | utc | date:"H:i" }} to {{ assignments.first.timeslot.end_time | utc | date:"H:i" }} UTC){% endif %}. -{% else %}a multi-day {% if not meeting.city %}virtual {% endif %}interim meeting. +{% endif %}{% filter wordwrap:78 %}The {{ group.name }} ({{ group.acronym }}) {% if group.type.slug == 'wg' and group.state.slug == 'bof' %}BOF{% else %}{{group.type.name}}{% endif %} will hold {% if assignments.count == 1 %}a{% if meeting.city %}n {% else %} virtual {% endif %}interim meeting on {{ meeting.date }} from {{ assignments.first.timeslot.time | date:"H:i" }} to {{ assignments.first.timeslot.end_time | date:"H:i" }} {{ meeting.time_zone}}{% if meeting.time_zone != 'UTC' %} ({{ assignments.first.timeslot.time | utc | date:"H:i" }} to {{ assignments.first.timeslot.end_time | utc | date:"H:i" }} UTC){% endif %}.{% else %}a multi-day {% if not meeting.city %}virtual {% endif %}interim meeting. {% for assignment in assignments %}Session {{ forloop.counter }}: {{ assignment.timeslot.time | date:"Y-m-d" }} {{ assignment.timeslot.time | date:"H:i" }} to {{ assignment.timeslot.end_time | date:"H:i" }} {{ meeting.time_zone }}{% if meeting.time_zone != 'UTC' %}({{ assignment.timeslot.time | utc | date:"H:i" }} to {{ assignment.timeslot.end_time | utc | date:"H:i" }} UTC){% endif %} @@ -10,11 +8,15 @@ {% if meeting.city %}Meeting Location: {{ meeting.city }}, {{ meeting.country }} -{% endif %}Agenda: +{% endif %}{% endfilter %} +Agenda: {{ meeting.session_set.first.agenda | document_content | default_if_none:"(No agenda submitted)" }} Information about remote participation: -{{ meeting.session_set.first.remote_instructions }} +{{ meeting.session_set.first.remote_instructions.rstrip }} -{{ meeting.session_set.first.agenda_note }} -{% endtimezone %} \ No newline at end of file +{{ meeting.session_set.first.agenda_note.rstrip|wordwrap:78 }}{% endtimezone %} + +-- +A calendar subscription for all {{ group.acronym }} meetings is available at +{{ settings.IDTRACKER_BASE_URL }}{% url 'ietf.meeting.views.upcoming_ical' %}?show={{ group.acronym }} diff --git a/ietf/templates/submit/announce_to_lists.txt b/ietf/templates/submit/announce_to_lists.txt index 35cf8fa6b..b45c4a1eb 100644 --- a/ietf/templates/submit/announce_to_lists.txt +++ b/ietf/templates/submit/announce_to_lists.txt @@ -1,16 +1,15 @@ {% autoescape off %} -A New Internet-Draft is available from the on-line Internet-Drafts directories. -{% if submission.group %}This Internet-Draft is a work item of the {{ submission.group.name }}{% if submission.group.type.name %} {{ submission.group.type.name }}{% endif %} of the {% if submission.group.type_id == "rg" %}IRTF{% else %}IETF{% endif %}.{% endif %} +{% filter wordwrap:78 %}A New Internet-Draft is available from the on-line Internet-Drafts directories.{% if submission.group %} This Internet-Draft is a work item of the {{ submission.group.name }} ({{ submission.group.acronym|upper }}){% if submission.group.type.name %} {{ submission.group.type.name }}{% endif %} of the {% if submission.group.type_id == "rg" %}IRTF{% else %}IETF{% endif %}.{% endif %}{% endfilter %} - Title : {{ submission.title }} - Author{{ submission.authors|pluralize:" ,s" }} : {% for author in submission.authors %}{{ author.name }}{% if not forloop.last %} - {% endif %}{% endfor %} - Filename : {{ submission.name }}-{{ submission.rev }}.txt - Pages : {{ submission.pages }} - Date : {{ submission.submission_date|date:"Y-m-d" }} + Title : {{ submission.title }} + Author{{ submission.authors|pluralize:" ,s" }} : {% for author in submission.authors %}{{ author.name }}{% if not forloop.last %} + {% endif %}{% endfor %} + Filename : {{ submission.name }}-{{ submission.rev }}.txt + Pages : {{ submission.pages }} + Date : {{ submission.submission_date|date:"Y-m-d" }} Abstract: -{{ submission.abstract }} +{{ submission.abstract.rstrip }} The IETF datatracker status page for this Internet-Draft is: {{ settings.IDTRACKER_BASE_URL }}{% url 'ietf.doc.views_doc.document_main' name=submission.name %} @@ -23,6 +22,5 @@ There is also an htmlized version available at: A diff from the previous version is available at: {{settings.RFCDIFF_BASE_URL}}?url2={{ submission.name }}-{{ submission.rev }} {% endif %} - Internet-Drafts are also available by rsync at rsync.ietf.org::internet-drafts {% endautoescape %} diff --git a/package.json b/package.json index 1373fa2ce..dc6742afa 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "@fullcalendar/bootstrap5": "6.1.4", "@fullcalendar/core": "6.1.4", "@fullcalendar/daygrid": "6.1.4", + "@fullcalendar/icalendar": "6.1.4", "@fullcalendar/interaction": "6.1.4", "@fullcalendar/list": "6.1.4", "@fullcalendar/luxon2": "6.1.4", @@ -24,6 +25,7 @@ "d3": "7.8.2", "file-saver": "2.0.5", "highcharts": "10.3.3", + "ical.js": "1.5.0", "jquery": "3.6.3", "jquery-ui-dist": "1.13.2", "js-cookie": "3.0.1", @@ -44,6 +46,7 @@ "shepherd.js": "10.0.1", "slugify": "1.6.5", "sortablejs": "1.15.0", + "vanillajs-datepicker": "1.3.1", "vue": "3.2.47", "vue-router": "4.1.6", "zxcvbn": "4.4.2" diff --git a/playwright/helpers/meeting.js b/playwright/helpers/meeting.js index c627bf1c9..29d748d64 100644 --- a/playwright/helpers/meeting.js +++ b/playwright/helpers/meeting.js @@ -121,6 +121,7 @@ let lastSessionId = 25000 let lastRecordingId = 150000 function createEvent ({ name = '', + slotName = '', startDateTime, duration = '1h', area, @@ -152,6 +153,7 @@ function createEvent ({ acronym: group.keyword, duration: typeof duration === 'string' ? ms(duration) / 1000 : duration, name: eventName, + slotName: slotName, startDateTime: startDateTime.toISO({ includeOffset: false, suppressMilliseconds: true }), status, type, @@ -514,7 +516,7 @@ module.exports = { _.times(8, () => { // 8 lanes per session time const { area, ...group } = daySessions.pop() schedule.push(createEvent({ - name: 'Session I', + slotName: 'Session I', startDateTime: curDay.set({ hour: 10 }), duration: '2h', type: 'regular', @@ -543,7 +545,7 @@ module.exports = { _.times(8, () => { // 8 lanes per session time const { area, ...group } = daySessions.pop() schedule.push(createEvent({ - name: 'Session II', + slotName: 'Session II', startDateTime: curDay.set({ hour: 13, minute: 30 }), duration: '1h', type: 'regular', @@ -574,7 +576,7 @@ module.exports = { _.times(8, () => { // 8 lanes per session time const { area, ...group } = daySessions.pop() schedule.push(createEvent({ - name: 'Session III', + slotName: 'Session III', startDateTime: curDay.set({ hour: 15 }), duration: '2h', type: 'regular', diff --git a/playwright/package-lock.json b/playwright/package-lock.json index 79f43ee88..eaebd3073 100644 --- a/playwright/package-lock.json +++ b/playwright/package-lock.json @@ -9,7 +9,7 @@ "@faker-js/faker": "7.6.0", "lodash": "4.17.21", "lodash-es": "4.17.21", - "luxon": "3.1.0", + "luxon": "3.2.1", "ms": "2.1.3", "seedrandom": "3.0.5", "slugify": "1.6.5" @@ -2243,9 +2243,9 @@ } }, "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", "dev": true }, "node_modules/http-proxy-agent": { @@ -2795,9 +2795,9 @@ "dev": true }, "node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "dependencies": { "minimist": "^1.2.0" @@ -2923,9 +2923,9 @@ } }, "node_modules/luxon": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.1.0.tgz", - "integrity": "sha512-7w6hmKC0/aoWnEsmPCu5Br54BmbmUp5GfcqBxQngRcXJ+q5fdfjEzn7dxmJh2YdDhgW8PccYtlWKSv4tQkrTQg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.2.1.tgz", + "integrity": "sha512-QrwPArQCNLAKGO/C+ZIilgIuDnEnKx5QYODdDtbFaxzsbZcc/a7WFq7MhsVYgRlwawLtvOUESTlfJ+hc/USqPg==", "engines": { "node": ">=12" } @@ -4035,9 +4035,9 @@ } }, "node_modules/rc-config-loader/node_modules/json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "bin": { "json5": "lib/cli.js" @@ -6781,9 +6781,9 @@ } }, "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", "dev": true }, "http-proxy-agent": { @@ -7191,9 +7191,9 @@ "dev": true }, "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "requires": { "minimist": "^1.2.0" @@ -7286,9 +7286,9 @@ } }, "luxon": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.1.0.tgz", - "integrity": "sha512-7w6hmKC0/aoWnEsmPCu5Br54BmbmUp5GfcqBxQngRcXJ+q5fdfjEzn7dxmJh2YdDhgW8PccYtlWKSv4tQkrTQg==" + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.2.1.tgz", + "integrity": "sha512-QrwPArQCNLAKGO/C+ZIilgIuDnEnKx5QYODdDtbFaxzsbZcc/a7WFq7MhsVYgRlwawLtvOUESTlfJ+hc/USqPg==" }, "make-fetch-happen": { "version": "10.2.1", @@ -8124,9 +8124,9 @@ }, "dependencies": { "json5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true } } diff --git a/playwright/package.json b/playwright/package.json index 1306837b6..b7c876620 100644 --- a/playwright/package.json +++ b/playwright/package.json @@ -20,7 +20,7 @@ "@faker-js/faker": "7.6.0", "lodash": "4.17.21", "lodash-es": "4.17.21", - "luxon": "3.1.0", + "luxon": "3.2.1", "ms": "2.1.3", "seedrandom": "3.0.5", "slugify": "1.6.5" diff --git a/playwright/tests/meeting/agenda.spec.js b/playwright/tests/meeting/agenda.spec.js index 1c5a82f18..a68fdeff2 100644 --- a/playwright/tests/meeting/agenda.spec.js +++ b/playwright/tests/meeting/agenda.spec.js @@ -138,6 +138,7 @@ test.describe('past - desktop', () => { .setLocale(BROWSER_LOCALE) .toFormat('DD \'at\' T ZZZZ') await expect(page.locator('.agenda h6').first()).toContainText(localDateTime) + await expect(page.locator('.agenda .agenda-table-display-session-head .agenda-table-cell-name').first()).toContainText('Monday Session I') // Switch to UTC await tzUtcBtnLocator.click() await expect(tzUtcBtnLocator).toHaveClass(/n-button--primary-type/) @@ -148,10 +149,12 @@ test.describe('past - desktop', () => { .toFormat('DD \'at\' T ZZZZ') await expect(page.locator('.agenda h6').first()).toContainText(utcDateTime) await expect(page.locator('.agenda .agenda-timezone-ddn')).toContainText('UTC') + await expect(page.locator('.agenda .agenda-table-display-session-head .agenda-table-cell-name').first()).toContainText('Monday Session I') // Switch back to meeting timezone await tzMeetingBtnLocator.click() await expect(tzMeetingBtnLocator).toHaveClass(/n-button--primary-type/) await expect(page.locator('.agenda .agenda-timezone-ddn')).toContainText('Tokyo') + await expect(page.locator('.agenda .agenda-table-display-session-head .agenda-table-cell-name').first()).toContainText('Monday Session I') }) }) @@ -925,7 +928,7 @@ test.describe('past - desktop', () => { test('agenda add to calendar', async ({ page }) => { await expect(page.locator('#agenda-quickaccess-addtocal-btn')).toContainText('Add to your calendar') await page.locator('#agenda-quickaccess-addtocal-btn').click() - const ddnLocator = page.locator('.n-dropdown-menu > .n-dropdown-option') + const ddnLocator = page.locator('.n-dropdown-menu > div > a.agenda-quickaccess-callinks') await expect(ddnLocator).toHaveCount(2) await expect(ddnLocator.first()).toContainText('Subscribe') await expect(ddnLocator.last()).toContainText('Download') diff --git a/requirements.txt b/requirements.txt index 9248beb4e..d3989d3f2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -35,6 +35,7 @@ gunicorn>=20.1.0 hashids>=1.3.1 html2text>=2020.1.16 # Used only to clean comment field of secr/sreq html5lib>=1.1 # Only used in tests +inflect>= 6.0.2 jsonfield>=3.1.0 # for SubmissionCheck. This is https://github.com/bradjasper/django-jsonfield/. jwcrypto>=1.2 # for signed notifications - this is aspirational, and is not really used. logging_tree>=1.9 # Used only by the showloggers management command diff --git a/yarn.lock b/yarn.lock index e34805f13..243bd0992 100644 --- a/yarn.lock +++ b/yarn.lock @@ -148,6 +148,16 @@ __metadata: languageName: node linkType: hard +"@fullcalendar/icalendar@npm:6.1.4": + version: 6.1.4 + resolution: "@fullcalendar/icalendar@npm:6.1.4" + peerDependencies: + "@fullcalendar/core": ~6.1.4 + ical.js: ^1.4.0 + checksum: 4ec2ed9092bf963dd889ffb01dd5ec6c956810e3b791a16a3d5c4bd0b303850757ad03b000c79d026ed8f7a9dbc53b673743c4eec0b8901bc4030a56d718f94c + languageName: node + linkType: hard + "@fullcalendar/interaction@npm:6.1.4": version: 6.1.4 resolution: "@fullcalendar/interaction@npm:6.1.4" @@ -245,14 +255,42 @@ __metadata: languageName: node linkType: hard -"@jridgewell/resolve-uri@npm:^3.0.3": +"@jridgewell/gen-mapping@npm:^0.3.0": + version: 0.3.2 + resolution: "@jridgewell/gen-mapping@npm:0.3.2" + dependencies: + "@jridgewell/set-array": ^1.0.1 + "@jridgewell/sourcemap-codec": ^1.4.10 + "@jridgewell/trace-mapping": ^0.3.9 + checksum: 1832707a1c476afebe4d0fbbd4b9434fdb51a4c3e009ab1e9938648e21b7a97049fa6009393bdf05cab7504108413441df26d8a3c12193996e65493a4efb6882 + languageName: node + linkType: hard + +"@jridgewell/resolve-uri@npm:3.1.0, @jridgewell/resolve-uri@npm:^3.0.3": version: 3.1.0 resolution: "@jridgewell/resolve-uri@npm:3.1.0" checksum: b5ceaaf9a110fcb2780d1d8f8d4a0bfd216702f31c988d8042e5f8fbe353c55d9b0f55a1733afdc64806f8e79c485d2464680ac48a0d9fcadb9548ee6b81d267 languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.4.10": +"@jridgewell/set-array@npm:^1.0.1": + version: 1.1.2 + resolution: "@jridgewell/set-array@npm:1.1.2" + checksum: 69a84d5980385f396ff60a175f7177af0b8da4ddb81824cb7016a9ef914eee9806c72b6b65942003c63f7983d4f39a5c6c27185bbca88eb4690b62075602e28e + languageName: node + linkType: hard + +"@jridgewell/source-map@npm:^0.3.2": + version: 0.3.2 + resolution: "@jridgewell/source-map@npm:0.3.2" + dependencies: + "@jridgewell/gen-mapping": ^0.3.0 + "@jridgewell/trace-mapping": ^0.3.9 + checksum: 1b83f0eb944e77b70559a394d5d3b3f98a81fcc186946aceb3ef42d036762b52ef71493c6c0a3b7c1d2f08785f53ba2df1277fe629a06e6109588ff4cdcf7482 + languageName: node + linkType: hard + +"@jridgewell/sourcemap-codec@npm:1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.10": version: 1.4.14 resolution: "@jridgewell/sourcemap-codec@npm:1.4.14" checksum: 61100637b6d173d3ba786a5dff019e1a74b1f394f323c1fee337ff390239f053b87266c7a948777f4b1ee68c01a8ad0ab61e5ff4abb5a012a0b091bec391ab97 @@ -269,6 +307,16 @@ __metadata: languageName: node linkType: hard +"@jridgewell/trace-mapping@npm:^0.3.9": + version: 0.3.17 + resolution: "@jridgewell/trace-mapping@npm:0.3.17" + dependencies: + "@jridgewell/resolve-uri": 3.1.0 + "@jridgewell/sourcemap-codec": 1.4.14 + checksum: 9d703b859cff5cd83b7308fd457a431387db5db96bd781a63bf48e183418dd9d3d44e76b9e4ae13237f6abeeb25d739ec9215c1d5bfdd08f66f750a50074a339 + languageName: node + linkType: hard + "@juggle/resize-observer@npm:^3.3.1": version: 3.3.1 resolution: "@juggle/resize-observer@npm:3.3.1" @@ -4163,9 +4211,9 @@ browserlist@latest: linkType: hard "http-cache-semantics@npm:^4.1.0": - version: 4.1.0 - resolution: "http-cache-semantics@npm:4.1.0" - checksum: 974de94a81c5474be07f269f9fd8383e92ebb5a448208223bfb39e172a9dbc26feff250192ecc23b9593b3f92098e010406b0f24bd4d588d631f80214648ed42 + version: 4.1.1 + resolution: "http-cache-semantics@npm:4.1.1" + checksum: 83ac0bc60b17a3a36f9953e7be55e5c8f41acc61b22583060e8dedc9dd5e3607c823a88d0926f9150e571f90946835c7fe150732801010845c72cd8bbff1a236 languageName: node linkType: hard @@ -4212,6 +4260,13 @@ browserlist@latest: languageName: node linkType: hard +"ical.js@npm:1.5.0": + version: 1.5.0 + resolution: "ical.js@npm:1.5.0" + checksum: 51df7a01f462dc8a02b3c3c28acb288756071044c4a8b56ff5179995bb219e569e72cfedac6f4ab03dc643be34f5d88c09a7d79c4be6ba8a7623b7336eecb110 + languageName: node + linkType: hard + "iconv-lite@npm:0.6, iconv-lite@npm:^0.6.2": version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" @@ -4720,13 +4775,13 @@ browserlist@latest: linkType: hard "json5@npm:^1.0.1": - version: 1.0.1 - resolution: "json5@npm:1.0.1" + version: 1.0.2 + resolution: "json5@npm:1.0.2" dependencies: minimist: ^1.2.0 bin: json5: lib/cli.js - checksum: e76ea23dbb8fc1348c143da628134a98adf4c5a4e8ea2adaa74a80c455fc2cdf0e2e13e6398ef819bfe92306b610ebb2002668ed9fc1af386d593691ef346fc3 + checksum: 866458a8c58a95a49bef3adba929c625e82532bcff1fe93f01d29cb02cac7c3fe1f4b79951b7792c2da9de0b32871a8401a6e3c5b36778ad852bf5b8a61165d7 languageName: node linkType: hard @@ -4935,13 +4990,6 @@ browserlist@latest: languageName: node linkType: hard -"lodash.sortby@npm:^4.7.0": - version: 4.7.0 - resolution: "lodash.sortby@npm:4.7.0" - checksum: db170c9396d29d11fe9a9f25668c4993e0c1331bcb941ddbd48fb76f492e732add7f2a47cfdf8e9d740fa59ac41bbfaf931d268bc72aab3ab49e9f89354d718c - languageName: node - linkType: hard - "lodash@npm:4.17.21, lodash@npm:^4.17.21": version: 4.17.21 resolution: "lodash@npm:4.17.21" @@ -6143,6 +6191,7 @@ browserlist@latest: "@fullcalendar/bootstrap5": 6.1.4 "@fullcalendar/core": 6.1.4 "@fullcalendar/daygrid": 6.1.4 + "@fullcalendar/icalendar": 6.1.4 "@fullcalendar/interaction": 6.1.4 "@fullcalendar/list": 6.1.4 "@fullcalendar/luxon2": 6.1.4 @@ -6173,6 +6222,7 @@ browserlist@latest: file-saver: 2.0.5 highcharts: 10.3.3 html-validate: 7.13.1 + ical.js: 1.5.0 jquery: 3.6.3 jquery-migrate: 3.4.0 jquery-ui-dist: 1.13.2 @@ -6198,6 +6248,7 @@ browserlist@latest: shepherd.js: 10.0.1 slugify: 1.6.5 sortablejs: 1.15.0 + vanillajs-datepicker: 1.3.1 vite: 3.2.5 vue: 3.2.47 vue-router: 4.1.6 @@ -6518,15 +6569,6 @@ browserlist@latest: languageName: node linkType: hard -"source-map@npm:~0.8.0-beta.0": - version: 0.8.0-beta.0 - resolution: "source-map@npm:0.8.0-beta.0" - dependencies: - whatwg-url: ^7.0.0 - checksum: e94169be6461ab0ac0913313ad1719a14c60d402bd22b0ad96f4a6cffd79130d91ab5df0a5336a326b04d2df131c1409f563c9dc0d21a6ca6239a44b6c8dbd92 - languageName: node - linkType: hard - "sourcemap-codec@npm:^1.4.8": version: 1.4.8 resolution: "sourcemap-codec@npm:1.4.8" @@ -6700,16 +6742,16 @@ browserlist@latest: linkType: hard "terser@npm:^5.2.0": - version: 5.13.1 - resolution: "terser@npm:5.13.1" + version: 5.16.5 + resolution: "terser@npm:5.16.5" dependencies: + "@jridgewell/source-map": ^0.3.2 acorn: ^8.5.0 commander: ^2.20.0 - source-map: ~0.8.0-beta.0 source-map-support: ~0.5.20 bin: terser: bin/terser - checksum: 0b1f5043cf5c3973005fe2ae4ff3be82511c336a6430599dacd4e2acf77c974d4474b0f1eec4823977c1f33823147e736ff712ca8e098bee3db25946480fa29d + checksum: f2c1a087fac7f4ff04b1b4e79bffc52e2fc0b068b98912bfcc0b341184c284c30c19ed73f76ac92b225b71668f7f8fc586d99a7e50a29cdc1c916cb1265522ec languageName: node linkType: hard @@ -6768,15 +6810,6 @@ browserlist@latest: languageName: node linkType: hard -"tr46@npm:^1.0.1": - version: 1.0.1 - resolution: "tr46@npm:1.0.1" - dependencies: - punycode: ^2.1.0 - checksum: 96d4ed46bc161db75dbf9247a236ea0bfcaf5758baae6749e92afab0bc5a09cb59af21788ede7e55080f2bf02dce3e4a8f2a484cc45164e29f4b5e68f7cbcc1a - languageName: node - linkType: hard - "treemate@npm:^0.3.11": version: 0.3.11 resolution: "treemate@npm:0.3.11" @@ -6901,6 +6934,13 @@ browserlist@latest: languageName: node linkType: hard +"vanillajs-datepicker@npm:1.3.1": + version: 1.3.1 + resolution: "vanillajs-datepicker@npm:1.3.1" + checksum: c01ea7ec70de94441a3b7760ff6ce8a06b38c6197c2cc68568e69afc8c80f4e45419358ab99e328daf58663ff2a42bb818314f4279095db7aaec18a9e995d5f2 + languageName: node + linkType: hard + "vdirs@npm:^0.1.4, vdirs@npm:^0.1.8": version: 0.1.8 resolution: "vdirs@npm:0.1.8" @@ -7065,24 +7105,6 @@ browserlist@latest: languageName: node linkType: hard -"webidl-conversions@npm:^4.0.2": - version: 4.0.2 - resolution: "webidl-conversions@npm:4.0.2" - checksum: c93d8dfe908a0140a4ae9c0ebc87a33805b416a33ee638a605b551523eec94a9632165e54632f6d57a39c5f948c4bab10e0e066525e9a4b87a79f0d04fbca374 - languageName: node - linkType: hard - -"whatwg-url@npm:^7.0.0": - version: 7.1.0 - resolution: "whatwg-url@npm:7.1.0" - dependencies: - lodash.sortby: ^4.7.0 - tr46: ^1.0.1 - webidl-conversions: ^4.0.2 - checksum: fecb07c87290b47d2ec2fb6d6ca26daad3c9e211e0e531dd7566e7ff95b5b3525a57d4f32640ad4adf057717e0c215731db842ad761e61d947e81010e05cf5fd - languageName: node - linkType: hard - "which-boxed-primitive@npm:^1.0.2": version: 1.0.2 resolution: "which-boxed-primitive@npm:1.0.2"