From 1b821a37906dc21f8d5c56f1ea2d25ddc9629b79 Mon Sep 17 00:00:00 2001 From: Jie Li Date: Sun, 23 Oct 2022 10:47:23 -0400 Subject: [PATCH 01/95] Set up file structure 1 --- package-lock.json | 13 +++++++++++++ package.json | 3 +++ site/css/framework.css | 0 site/index.html | 40 ++++++++++++++++++++++++++++++++++++++++ site/js/edit.js | 0 site/js/list-loader.js | 0 site/js/map.js | 0 7 files changed, 56 insertions(+) create mode 100644 site/css/framework.css create mode 100644 site/index.html create mode 100644 site/js/edit.js create mode 100644 site/js/list-loader.js create mode 100644 site/js/map.js diff --git a/package-lock.json b/package-lock.json index 02ef655..ed7b5dc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,9 @@ "name": "school-explorer", "version": "1.0.0", "license": "ISC", + "dependencies": { + "papaparse": "^5.3.2" + }, "devDependencies": { "eslint": "^8.22.0", "http-server": "^14.1.1", @@ -4870,6 +4873,11 @@ "node": ">=6" } }, + "node_modules/papaparse": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.3.2.tgz", + "integrity": "sha512-6dNZu0Ki+gyV0eBsFKJhYr+MdQYAzFUGlBMNj3GNrmHxmz1lfRa24CjFObPXtjcetlOv5Ad299MhIK0znp3afw==" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -10372,6 +10380,11 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, + "papaparse": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.3.2.tgz", + "integrity": "sha512-6dNZu0Ki+gyV0eBsFKJhYr+MdQYAzFUGlBMNj3GNrmHxmz1lfRa24CjFObPXtjcetlOv5Ad299MhIK0znp3afw==" + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", diff --git a/package.json b/package.json index 3a52e5f..b70795f 100644 --- a/package.json +++ b/package.json @@ -27,5 +27,8 @@ "jest-puppeteer": "^6.1.1", "stylelint": "^14.11.0", "stylelint-config-standard": "^28.0.0" + }, + "dependencies": { + "papaparse": "^5.3.2" } } diff --git a/site/css/framework.css b/site/css/framework.css new file mode 100644 index 0000000..e69de29 diff --git a/site/index.html b/site/index.html new file mode 100644 index 0000000..3e81e46 --- /dev/null +++ b/site/index.html @@ -0,0 +1,40 @@ + + + + Canvasser + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + + + + + + \ No newline at end of file diff --git a/site/js/edit.js b/site/js/edit.js new file mode 100644 index 0000000..e69de29 diff --git a/site/js/list-loader.js b/site/js/list-loader.js new file mode 100644 index 0000000..e69de29 diff --git a/site/js/map.js b/site/js/map.js new file mode 100644 index 0000000..e69de29 From 0a61d6c72134fb83b45627d9edb3fd08e3c10588 Mon Sep 17 00:00:00 2001 From: Jie Li Date: Mon, 24 Oct 2022 04:34:32 -0400 Subject: [PATCH 02/95] list-loader & CSS --- bin/geocoder.ipynb | 73 +++++++++++++++ site/css/banner.css | 18 ++++ site/css/basic-info-panel.css | 52 ++++++++++ site/css/list-filters.css | 15 +++ site/css/list-loader.css | 59 ++++++++++++ site/css/main-box.css | 43 +++++++++ site/css/main.css | 99 +++++++++++++++++++ site/css/map.css | 6 ++ site/css/search-box.css | 15 +++ site/css/voter-list.css | 52 ++++++++++ site/edit.html | 19 ++++ site/index.html | 172 +++++++++++++++++++++++++++++++++- site/js/list-loader.js | 139 +++++++++++++++++++++++++++ site/js/map.js | 40 ++++++++ 14 files changed, 798 insertions(+), 4 deletions(-) create mode 100644 bin/geocoder.ipynb create mode 100644 site/css/banner.css create mode 100644 site/css/basic-info-panel.css create mode 100644 site/css/list-filters.css create mode 100644 site/css/list-loader.css create mode 100644 site/css/main-box.css create mode 100644 site/css/main.css create mode 100644 site/css/map.css create mode 100644 site/css/search-box.css create mode 100644 site/css/voter-list.css create mode 100644 site/edit.html diff --git a/bin/geocoder.ipynb b/bin/geocoder.ipynb new file mode 100644 index 0000000..f31f58b --- /dev/null +++ b/bin/geocoder.ipynb @@ -0,0 +1,73 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "df = pd.read_csv(\"../site/data/voters_lists/0101test.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 -75.16145216099994,39.92993551500007\n", + "1 -75.16149719599997,39.93145038500006\n", + "2 -75.16143961899996,39.92998664800007\n", + "3 -75.15865174799995,39.93162562100008\n", + "4 -75.16168658199996,39.93004896100007\n", + " ... \n", + "521 -75.16234616099996,39.92970272300005\n", + "522 -75.15959113499997,39.93104925500006\n", + "523 -75.15932014999999,39.93228303300003\n", + "524 -75.15947777399998,39.93155817300004\n", + "525 -75.15947777399998,39.93155817300004\n", + "Name: TIGER/Line Lng/Lat, Length: 526, dtype: object" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df[\"TIGER/Line Lng/Lat\"]" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3.9.13 ('musa-550-fall-2022')", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.13" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "82331f546391311e04de82455d6ddfe42af9f79fe3961e72f749472e4fc4cc58" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/site/css/banner.css b/site/css/banner.css new file mode 100644 index 0000000..4e7b08a --- /dev/null +++ b/site/css/banner.css @@ -0,0 +1,18 @@ +#banner-component { + position: fixed; + background-color: #fff; + height: 5vh; + width: 100vw; + border-bottom: 3px solid #0d59a9; + z-index: 99999; +} + +#banner-component p { + color: #0d59a9; + font-size: 1.3em; + margin: 0; + line-height: 5vh; + font-weight: 800; + text-align: center; + vertical-align: middle; +} \ No newline at end of file diff --git a/site/css/basic-info-panel.css b/site/css/basic-info-panel.css new file mode 100644 index 0000000..ef2344b --- /dev/null +++ b/site/css/basic-info-panel.css @@ -0,0 +1,52 @@ +#basic-panel-component { + position: relative; + height: 10em; + background-color: white; +} + +#basic-panel-component * { +} + +#basic-panel-component .panel { + padding: 0.2rem; + display: grid; + grid-template: repeat(6, 1fr) / repeat(5, 1fr); +} + +#panel-name { + display: flex; + align-items: center; + grid-area: 1/1/3/4; + font-weight: 800; + font-size: 1.4rem; + vertical-align: middle; + line-height: + width: 10; + text-size-adjust: 80%; +} + +#panel-status { + grid-area: 1/4/4/6; + display: flex; + flex-wrap: wrap; + align-items: center; +} + +#panel-status .button { + height: 1.8rem; + margin: 0.2rem; +} + +.button-long { + width: 3rem; +} + +.button-short { + width: 1.8rem; +} + +#panel-address { + display: flex; + grid-area: 3/1/4/4; + align-items: center; +} \ No newline at end of file diff --git a/site/css/list-filters.css b/site/css/list-filters.css new file mode 100644 index 0000000..59226cd --- /dev/null +++ b/site/css/list-filters.css @@ -0,0 +1,15 @@ +#list-filter-component { + position: relative; + float: right; + right: 0; + height: 2.5em; + width: 8.5rem; + z-index: 999; +} + +#list-filter-component .button { + width: 1.7rem; + margin: 0 0.1rem; + border-bottom-width: 3px; + border-radius: 0 0 0.5rem 0.5rem; +} diff --git a/site/css/list-loader.css b/site/css/list-loader.css new file mode 100644 index 0000000..5cd9224 --- /dev/null +++ b/site/css/list-loader.css @@ -0,0 +1,59 @@ +#list-loader-component { + position: relative; + height: 3.2em; + width: 10rem; + float: left; + z-index: 999; + margin: 0; +} + +#list-loader-hidable-chunk { + transition: transform 0.5s; + z-index: 1; + height: 100%; +} + +#list-loader-component .hide-show { + font-size: 3rem; + width: 1.5rem; + line-height: 0.5; + border-bottom-width: 3px; + border-radius: 0 0 0.5rem 0.5rem; +} + +#list-loader-component .input-container { + height: 2em; + float: left; + margin-left: 0.3rem; +} + +#list-loader-component .input-container input { + height: 100%; + width: 4.6rem; + font-size: 0.9rem; +} + +#list-loader-load { + border-right-width: 3px; + border-radius: 0 0.5rem 0.5rem 0; + width: 1.7rem; + float: left; + margin-left: 0.2em; +} + +#list-loader-load .tooltiptext { + color: #0d59a9; + text-align: center; + width: 8em; + height: 1rem; + padding: 0.2rem 0.5rem; + position: absolute; + bottom: 120%; + left: 60%; + font-weight: 500; + font-size: 0.8rem; +} + +#list-loader-load:hover .tooltiptext { + visibility: visible; +} diff --git a/site/css/main-box.css b/site/css/main-box.css new file mode 100644 index 0000000..4f2463e --- /dev/null +++ b/site/css/main-box.css @@ -0,0 +1,43 @@ +.main-box { + position: relative; + top: 8vh; + height: 30vh; + z-index: 9999; + margin: 0 1rem; +} + +@media only screen and (max-width: 400px) { + .main-box { + margin: 0 0.2rem; + } +} + +@media only screen and (min-width: 600px) { + .main-box { + width: 60%; + } +} + +@media only screen and (min-width: 768px) { + .main-box { + width: 40%; + } +} + +@media only screen and (min-width: 900px) { + .main-box { + width: 30%; + margin: 0 2rem; + } +} + +@media only screen and (min-width: 1400px) { + .main-box { + width: 25%; + margin: 0 3rem; + } +} + +#bottom-component { + top: 45vh; +} \ No newline at end of file diff --git a/site/css/main.css b/site/css/main.css new file mode 100644 index 0000000..816757c --- /dev/null +++ b/site/css/main.css @@ -0,0 +1,99 @@ +html { + font-family: Roboto, sans-serif; +} + +.component-margin-left { + margin-left: 1rem; +} + +.component-margin-right { + margin-right: 1rem; +} + +@media only screen and (max-width: 400px) { + .component-margin-left { + margin-left: 0.5rem; + } + + .component-margin-right { + margin-right: 0.5rem; + } +} + +@media only screen and (min-width: 768px) { + .component-margin-left { + margin-left: 2rem; + } + + .component-margin-right { + margin-right: 2rem; + } +} + +.button { + background-color: #0d59a9; + width: 2rem; + height: 2rem; + font-size: 1.8rem; + float: left; + color: #fff; + border: 1.5px solid #0d59a9; + cursor: pointer; + text-align: center; + vertical-align: middle; +} + +.hide-show { + width: 2.2rem; + height: 2rem; +} + +input[type="text"] { + width: 100%; + border: 1.5px solid #0d59a9; + padding-left: 0.5rem; + color: #0d59a9; + border-bottom-width: 3px; + border-radius: 0 0 0.5em 0.5em; + font-size: 1rem; +} + +input:focus { + background-color: #fff; + border: 3px solid #0d59a9; + outline: none; + border-bottom-width: 3px; + border-radius: 0 0 0.5em 0.5em; +} + +.hidable-container { + overflow-x: hidden; + height: 100%; +} + +.fix-height { + height: 2em; +} + +.tooltiptext { + visibility: hidden; + background-color: #fff; + text-align: center; + border-radius: 6px; + padding: 0.2rem 0.5rem; + position: absolute; + z-index: 99999; + bottom: 120%; + font-weight: 500; + font-size: 0.8rem; +} + +.panel { + height: 100%; + border: 1.5px solid #0d59a9; + padding-left: 0.5rem; + color: #0d59a9; + border-bottom-width: 3px; + border-radius: 0 0 0.5em 0.5em; + font-size: 1rem; +} \ No newline at end of file diff --git a/site/css/map.css b/site/css/map.css new file mode 100644 index 0000000..3380d2a --- /dev/null +++ b/site/css/map.css @@ -0,0 +1,6 @@ +#map-component { + position: fixed; + width: 99vw; + height: 99vh; + z-index: 0; +} diff --git a/site/css/search-box.css b/site/css/search-box.css new file mode 100644 index 0000000..7b45ffb --- /dev/null +++ b/site/css/search-box.css @@ -0,0 +1,15 @@ +#search-box-component { + position: relative; + height: 6.5em; + z-index: 999; +} + +#search-box-component .input-container { + height: 2.1rem; + margin-right: 0.8rem; +} + +#search-box-component .input-container input { + height: 100%; + font-size: 0.9rem; +} \ No newline at end of file diff --git a/site/css/voter-list.css b/site/css/voter-list.css new file mode 100644 index 0000000..b903336 --- /dev/null +++ b/site/css/voter-list.css @@ -0,0 +1,52 @@ +#voter-list-component { + position: relative; + background-color: white; +} + +#voter-list-component .panel { + max-height: 10rem; + overflow: auto; +} + +#voter-list-component ul { + display: block; + margin-right: 0.5rem; + padding: 0.1rem 0.4rem 0 0.2rem; + overflow: hidden; +} + +#voter-list-component li { + padding: 0.2rem; + border-bottom: 1px solid #bbb; + height: 1.3rem; + overflow: hidden; + width: 30rem; +} + +#voter-list-component li .list-name { + position: relative; + font-weight: 600; + float: left; + margin-right: 1rem; + font-size: 0.9rem; +} + +#voter-list-component li .list-address { + position: relative; + float: left; + margin-right: 1rem; + font-size: 0.8rem; + vertical-align: baseline; + top: 0.05rem; +} + +#voter-list-component .button { + height: 1.1rem; + width: 1.1rem; + border-radius: 0.1rem; + margin-right: 0.4rem; +} + +#voter-list-component .scroll-container { + max-height: 30; +} \ No newline at end of file diff --git a/site/edit.html b/site/edit.html new file mode 100644 index 0000000..d876e85 --- /dev/null +++ b/site/edit.html @@ -0,0 +1,19 @@ + + + + Information + + + + + + + +
+ + + + + + + \ No newline at end of file diff --git a/site/index.html b/site/index.html index 3e81e46..3c72011 100644 --- a/site/index.html +++ b/site/index.html @@ -16,13 +16,172 @@ + + + + + + + + + - -
+ + + +
+ +
+ +
+ +
+
+ chevron_left +
+ + +
+
+ +
+ +
+ +
+ done_all +
+
Load List
+
+
+
+
+
+ + +
+
+
+
+
+
+
+ + +
+ + +
+
+ +
+
+ + +
+
+
+
    +
  • +
    Michael Lazar
    +
    13355 Noel Rd
    +
    +
    +
    +
    +
  • +
  • +
    Myron BaƱez
    +
    3600 Market
    +
    +
    +
    +
    +
  • +
  • +
    Yihan Zhang
    +
    1500 Chestnut
    +
    +
    +
    +
    +
  • +
  • +
    Nicholas Hand
    +
    3700 Lancaster
    +
    +
    +
    +
    +
  • +
  • +
    Leonardo da Vinci
    +
    3700 Florence
    +
    +
    +
    +
    +
  • +
  • +
    Jie Li
    +
    3700 Lancaster
    +
    +
    +
    +
    +
  • +
  • +
    David Kim
    +
    1254 Spring Garden
    +
    +
    +
    +
    +
  • +
  • +
    Some Other People
    +
    888 Random
    +
    +
    +
    +
    +
  • +
+
+ +
+ +
+ +
+ +
+ +
+
+
+ THIS PERSON HAS A LONG NAME +
+
+
+
+
+
+
+
+
3600 Market Street
+
+
+ @@ -32,9 +191,14 @@ - + + + + + - + + \ No newline at end of file diff --git a/site/js/list-loader.js b/site/js/list-loader.js index e69de29..1b3d20a 100644 --- a/site/js/list-loader.js +++ b/site/js/list-loader.js @@ -0,0 +1,139 @@ +/* +Hide and Show List Loader +*/ + +import { showVotersOnMap } from "./map.js"; +import { baseMap } from "./map.js"; + +let hideButton = document.querySelector("#list-loader-hide"); +let hidableChunk = document.querySelector("#list-loader-hidable-chunk"); + +let hidden = 0; + +hideButton.addEventListener("click", ( ) => { + if(hidden == 0) { + hidableChunk.style.transform = "translateX(-16em)"; + hideButton.innerHTML = ` + chevron_right + `; + hidden = 1; + } else { + hidableChunk.style.transform = "translateX(0em)"; + hideButton.innerHTML = ` + chevron_left + `; + hidden = 0; + } +}); + + +/* +Load List +*/ + +let loadButton = document.querySelector("#list-loader-load"); +let toolTip = document.querySelector("#list-loader-load").querySelector(".tooltiptext"); + + +// Util function to make sure coords are valid +function coordsAreValid(lng, lat) { + let result = false; + if(typeof(lng) == "number" && typeof(lat) == "number") { + if(lng < -73 && lng > -77 && lat < 41 && lat > 38) { + result = true; + } + } + return result; +} + +// Function to change button tooltip depending on input +function errorTooltip(inputNumber) { + let interruptLoad = false; + if(inputNumber.length == 0) { + toolTip.innerHTML = `
Empty input
`; + console.log(toolTip); + interruptLoad = true; + } else if(inputNumber.length != 4) { + toolTip.innerHTML = `
Wrong digits
`; + interruptLoad = true; + } + return interruptLoad; +} + +// Function to make feature collection +function makeVoterFeatureCollection(data) { + + // Construct a geojson empty frame + const voters = { + type: "FeatureCollection", + features: [], + }; + + // Write into geojson + for(let i = 0; i < data.length; i++) { + let thisLngLat = data[i]["TIGER/Line Lng/Lat"]; + if(typeof(thisLngLat) == "string"){ + + let thisLng = Number(thisLngLat.split(",")[0]); + let thisLat = Number(thisLngLat.split(",")[1]); + + if(coordsAreValid(thisLng, thisLat)) { + voters.features.push( { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [thisLng, thisLat], + }, + "properties": { + "id": data[i]["ID Number"], + "last_name": data[i]["Last Name"], + "first_name": data[i]["First Name"], + "address": data[i]["TIGER/Line Matched Address"], + }, + }); + } + } + } + return voters; +} + +loadButton.addEventListener("click", ( ) => { + + // Get input list number + let inputNumber = document.querySelector("#list-loader-input").value.replace(/\s/g, ''); + if(errorTooltip(inputNumber)) { return } + + let path = './data/voters_lists/' + inputNumber + '.csv'; + + // Fetch the particular CSV file + fetch(path) + .then(resp => { + // If the file exists + if(resp.ok) { + return resp.text(); + } else { + // If the file doesn't exist, then show in tooltip + toolTip.innerHTML = `
Wrong number
`; + return; + } + }) + .then(text => { + const data = Papa.parse(text, { header: true }).data; + + // Make a FeatureCollection + const voters = makeVoterFeatureCollection(data); + + // Show voters on the map + showVotersOnMap(voters); + baseMap.fitBounds(baseMap.voterLayers.getBounds()); + }); +}); + + +// Refresh tooltip text when mouse moves out +loadButton.addEventListener("mouseout", ( ) => { + toolTip.innerHTML = `
Load List
`; +}); + +console.log(document.querySelector("#test")); + diff --git a/site/js/map.js b/site/js/map.js index e69de29..57b471f 100644 --- a/site/js/map.js +++ b/site/js/map.js @@ -0,0 +1,40 @@ +/* +INITIALIZE BASE MAP TO SHOW +*/ + +let baseMapComponent = document.querySelector("#map-component"); +export let baseMap = L.map(baseMapComponent, { zoomControl: false }).setView([40, -75.15], 11); +L.tileLayer('https://tiles.stadiamaps.com/tiles/alidade_smooth/{z}/{x}/{y}{r}.png?api_key=10b978ef-d3a8-4d87-84d7-9233488f7d37', { + maxZoom: 20, + attribution: '© Stadia Maps, © OpenMapTiles © OpenStreetMap contributors', +}).addTo(baseMap); + +/* +FUNCTION TO SHOW VOTERS ON THE MAP +*/ + +function showVotersOnMap(voters) { + if(baseMap.voterLayers !== undefined) { + baseMap.removeLayer(baseMap.schoolLayers); + } + baseMap.voterLayers = L.geoJSON(voters, { + pointToLayer: (point, latLng) => L.circleMarker(latLng), + style: { + radius: 7, + color: "#0d59a9", + stroke: true, + opacity: 0.5, + weight: 1, + }, + }) + .on("click", (e) => { + console.log(e.layer.feature.properties.id); + }) + .bindPopup(point => point.feature.properties.last_name) + .addTo(baseMap); +} + + +export { + showVotersOnMap, +}; \ No newline at end of file From dd5d0ccd9db8de6fce28c66d023fed103a2d1a8b Mon Sep 17 00:00:00 2001 From: Jie Li Date: Mon, 24 Oct 2022 04:36:46 -0400 Subject: [PATCH 03/95] correction --- site/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/index.html b/site/index.html index 3c72011..281b1d8 100644 --- a/site/index.html +++ b/site/index.html @@ -82,7 +82,7 @@
- +
From 480c529f0973f6de5c4f5198115ce46c23ae4a4b Mon Sep 17 00:00:00 2001 From: Jie Li Date: Mon, 24 Oct 2022 04:38:22 -0400 Subject: [PATCH 04/95] correction --- site/css/list-loader.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/css/list-loader.css b/site/css/list-loader.css index 5cd9224..85a97c9 100644 --- a/site/css/list-loader.css +++ b/site/css/list-loader.css @@ -3,7 +3,7 @@ height: 3.2em; width: 10rem; float: left; - z-index: 999; + z-index: 99999; margin: 0; } From d1de4f022089d0f84b789ca2e9fe1bd6f7e029d5 Mon Sep 17 00:00:00 2001 From: Jie Li Date: Mon, 24 Oct 2022 16:50:05 -0400 Subject: [PATCH 05/95] data structure --- site/css/basic-info-panel.css | 9 +++++---- site/index.html | 5 +++++ site/js/{edit.js => basic-info-panel.js} | 0 site/js/custom-lists.js | 0 site/js/list-filters.js | 0 site/js/save-edit.js | 0 site/js/search-box.js | 0 site/js/voter-list.js | 0 8 files changed, 10 insertions(+), 4 deletions(-) rename site/js/{edit.js => basic-info-panel.js} (100%) create mode 100644 site/js/custom-lists.js create mode 100644 site/js/list-filters.js create mode 100644 site/js/save-edit.js create mode 100644 site/js/search-box.js create mode 100644 site/js/voter-list.js diff --git a/site/css/basic-info-panel.css b/site/css/basic-info-panel.css index ef2344b..14232a7 100644 --- a/site/css/basic-info-panel.css +++ b/site/css/basic-info-panel.css @@ -5,10 +5,11 @@ } #basic-panel-component * { + border: 1px solid black; } #basic-panel-component .panel { - padding: 0.2rem; + padding: 0.5rem 1rem 0 1rem; display: grid; grid-template: repeat(6, 1fr) / repeat(5, 1fr); } @@ -20,9 +21,9 @@ font-weight: 800; font-size: 1.4rem; vertical-align: middle; - line-height: - width: 10; - text-size-adjust: 80%; + text-size-adjust: auto; + white-space: nowrap; + flex-wrap: nowrap; } #panel-status { diff --git a/site/index.html b/site/index.html index 281b1d8..f110ec2 100644 --- a/site/index.html +++ b/site/index.html @@ -199,6 +199,11 @@ + + + + + \ No newline at end of file diff --git a/site/js/edit.js b/site/js/basic-info-panel.js similarity index 100% rename from site/js/edit.js rename to site/js/basic-info-panel.js diff --git a/site/js/custom-lists.js b/site/js/custom-lists.js new file mode 100644 index 0000000..e69de29 diff --git a/site/js/list-filters.js b/site/js/list-filters.js new file mode 100644 index 0000000..e69de29 diff --git a/site/js/save-edit.js b/site/js/save-edit.js new file mode 100644 index 0000000..e69de29 diff --git a/site/js/search-box.js b/site/js/search-box.js new file mode 100644 index 0000000..e69de29 diff --git a/site/js/voter-list.js b/site/js/voter-list.js new file mode 100644 index 0000000..e69de29 From 56d3df4c051c9d50af586d5a3b00afeebe3d4eb7 Mon Sep 17 00:00:00 2001 From: Jie Li Date: Wed, 26 Oct 2022 22:15:27 -0400 Subject: [PATCH 06/95] Formatting --- site/css/banner.css | 2 +- site/css/basic-info-panel.css | 24 +++++--- site/css/framework.css | 0 site/css/list-loader.css | 4 ++ site/css/main-box.css | 13 +---- site/css/main.css | 11 +++- site/css/map.css | 4 +- site/css/voter-list.css | 39 ++++++++++--- site/index.html | 12 +++- site/js/list-loader.js | 101 ++++++++++++++++++---------------- site/js/map.js | 2 +- site/js/voter-list-expand.js | 29 ++++++++++ 12 files changed, 159 insertions(+), 82 deletions(-) delete mode 100644 site/css/framework.css create mode 100644 site/js/voter-list-expand.js diff --git a/site/css/banner.css b/site/css/banner.css index 4e7b08a..e50267d 100644 --- a/site/css/banner.css +++ b/site/css/banner.css @@ -4,7 +4,7 @@ height: 5vh; width: 100vw; border-bottom: 3px solid #0d59a9; - z-index: 99999; + z-index: 99; } #banner-component p { diff --git a/site/css/basic-info-panel.css b/site/css/basic-info-panel.css index 14232a7..38a261b 100644 --- a/site/css/basic-info-panel.css +++ b/site/css/basic-info-panel.css @@ -1,15 +1,16 @@ +#bottom-component { + float: right; +} + #basic-panel-component { position: relative; height: 10em; background-color: white; } -#basic-panel-component * { - border: 1px solid black; -} - #basic-panel-component .panel { - padding: 0.5rem 1rem 0 1rem; + background-color: white; + padding: 0.5rem 0.5rem 0; display: grid; grid-template: repeat(6, 1fr) / repeat(5, 1fr); } @@ -21,9 +22,14 @@ font-weight: 800; font-size: 1.4rem; vertical-align: middle; - text-size-adjust: auto; white-space: nowrap; - flex-wrap: nowrap; + text-align: justify; + overflow-x: auto; +} + +#panel-name span { + width: 100%; + display: inline-block; } #panel-status { @@ -39,11 +45,11 @@ } .button-long { - width: 3rem; + width: 30%; } .button-short { - width: 1.8rem; + width: 20%; } #panel-address { diff --git a/site/css/framework.css b/site/css/framework.css deleted file mode 100644 index e69de29..0000000 diff --git a/site/css/list-loader.css b/site/css/list-loader.css index 85a97c9..5963f19 100644 --- a/site/css/list-loader.css +++ b/site/css/list-loader.css @@ -57,3 +57,7 @@ #list-loader-load:hover .tooltiptext { visibility: visible; } + +.tooltip-content { + z-index: 9999; +} \ No newline at end of file diff --git a/site/css/main-box.css b/site/css/main-box.css index 4f2463e..a0a9d2a 100644 --- a/site/css/main-box.css +++ b/site/css/main-box.css @@ -8,7 +8,7 @@ @media only screen and (max-width: 400px) { .main-box { - margin: 0 0.2rem; + margin: 0 0.5rem; } } @@ -24,14 +24,7 @@ } } -@media only screen and (min-width: 900px) { - .main-box { - width: 30%; - margin: 0 2rem; - } -} - -@media only screen and (min-width: 1400px) { +@media only screen and (min-width: 1200px) { .main-box { width: 25%; margin: 0 3rem; @@ -39,5 +32,5 @@ } #bottom-component { - top: 45vh; + top: 43vh; } \ No newline at end of file diff --git a/site/css/main.css b/site/css/main.css index 816757c..b629780 100644 --- a/site/css/main.css +++ b/site/css/main.css @@ -2,6 +2,13 @@ html { font-family: Roboto, sans-serif; } +body { + height: 100vh; + width: 100vw; + padding: 0; + margin: 0; +} + .component-margin-left { margin-left: 1rem; } @@ -41,6 +48,8 @@ html { cursor: pointer; text-align: center; vertical-align: middle; + border-bottom-width: 3px; + border-radius: 0 0 0.5rem 0.5rem; } .hide-show { @@ -82,7 +91,7 @@ input:focus { border-radius: 6px; padding: 0.2rem 0.5rem; position: absolute; - z-index: 99999; + z-index: 999999; bottom: 120%; font-weight: 500; font-size: 0.8rem; diff --git a/site/css/map.css b/site/css/map.css index 3380d2a..8d9365f 100644 --- a/site/css/map.css +++ b/site/css/map.css @@ -1,6 +1,6 @@ #map-component { position: fixed; - width: 99vw; - height: 99vh; + width: 100vw; + height: 100vh; z-index: 0; } diff --git a/site/css/voter-list.css b/site/css/voter-list.css index b903336..b34f3f5 100644 --- a/site/css/voter-list.css +++ b/site/css/voter-list.css @@ -1,26 +1,44 @@ #voter-list-component { position: relative; - background-color: white; + border-radius: 0 0 0.5em 0.5em; + display: flex; + flex-direction: column; } #voter-list-component .panel { - max-height: 10rem; overflow: auto; + background-color: white; + padding-bottom: 0.05rem; +} + +#voter-list-component .scroll-container { + max-height: 18vh; + overflow: auto; + transition: max-height 0.75s; +} + +#voter-list-component .scroll-container-expanded { + max-height: 30vh; + transition: max-height 0.5s; +} + +#voter-list-component .scroll-container-expanded-long { + max-height: 75vh; + transition: max-height 1s; } #voter-list-component ul { display: block; margin-right: 0.5rem; padding: 0.1rem 0.4rem 0 0.2rem; - overflow: hidden; } #voter-list-component li { padding: 0.2rem; border-bottom: 1px solid #bbb; height: 1.3rem; - overflow: hidden; - width: 30rem; + display: block; + width: 28rem; } #voter-list-component li .list-name { @@ -41,12 +59,15 @@ } #voter-list-component .button { + font-size: 0.8rem; + height: 1.3rem; + margin-left: auto; + margin-right: auto; +} + +#voter-list-component .panel .button { height: 1.1rem; width: 1.1rem; border-radius: 0.1rem; margin-right: 0.4rem; } - -#voter-list-component .scroll-container { - max-height: 30; -} \ No newline at end of file diff --git a/site/index.html b/site/index.html index f110ec2..f877298 100644 --- a/site/index.html +++ b/site/index.html @@ -15,7 +15,6 @@ - @@ -160,6 +159,11 @@
+ +
+ expand_more +
+
@@ -170,6 +174,7 @@
THIS PERSON HAS A LONG NAME +
@@ -200,10 +205,11 @@ - - + + + \ No newline at end of file diff --git a/site/js/list-loader.js b/site/js/list-loader.js index 1b3d20a..0c73eb7 100644 --- a/site/js/list-loader.js +++ b/site/js/list-loader.js @@ -8,21 +8,22 @@ import { baseMap } from "./map.js"; let hideButton = document.querySelector("#list-loader-hide"); let hidableChunk = document.querySelector("#list-loader-hidable-chunk"); -let hidden = 0; +// A variable to store whether the list loader component is currently hidden +let loaderElIsHidden = 0; hideButton.addEventListener("click", ( ) => { - if(hidden == 0) { + if(loaderElIsHidden == 0) { hidableChunk.style.transform = "translateX(-16em)"; hideButton.innerHTML = ` chevron_right `; - hidden = 1; + loaderElIsHidden = 1; } else { hidableChunk.style.transform = "translateX(0em)"; hideButton.innerHTML = ` chevron_left `; - hidden = 0; + loaderElIsHidden = 0; } }); @@ -31,9 +32,22 @@ hideButton.addEventListener("click", ( ) => { Load List */ -let loadButton = document.querySelector("#list-loader-load"); -let toolTip = document.querySelector("#list-loader-load").querySelector(".tooltiptext"); +let loadButtonEl = document.querySelector("#list-loader-load"); +let toolTipEl = document.querySelector("#list-loader-load").querySelector(".tooltiptext"); +// Function to change button tooltip depending on input +function errorTooltip(inputNumber) { + let interruptLoad = false; + if(inputNumber.length == 0) { + toolTipEl.innerHTML = `
Empty input
`; + console.log(toolTipEl); + interruptLoad = true; + } else if(inputNumber.length != 4) { + toolTipEl.innerHTML = `
Wrong digits
`; + interruptLoad = true; + } + return interruptLoad; +} // Util function to make sure coords are valid function coordsAreValid(lng, lat) { @@ -46,21 +60,8 @@ function coordsAreValid(lng, lat) { return result; } -// Function to change button tooltip depending on input -function errorTooltip(inputNumber) { - let interruptLoad = false; - if(inputNumber.length == 0) { - toolTip.innerHTML = `
Empty input
`; - console.log(toolTip); - interruptLoad = true; - } else if(inputNumber.length != 4) { - toolTip.innerHTML = `
Wrong digits
`; - interruptLoad = true; - } - return interruptLoad; -} - -// Function to make feature collection +// Function to make feature collection out of the imported data +// Record only key information function makeVoterFeatureCollection(data) { // Construct a geojson empty frame @@ -94,11 +95,36 @@ function makeVoterFeatureCollection(data) { } } } + + console.log(voters); return voters; } -loadButton.addEventListener("click", ( ) => { +// Function to check if fetch is successful. If so, do fetch; if not, show on tooltip +function checkFetchStatus(resp) { + if(resp.ok) { + return resp.text(); + } else { + // If the file doesn't exist, then show in tooltip + toolTipEl.innerHTML = `
Wrong number
`; + return; + } +} + +// Function: what happens after successful fetch +function loadVoterData(text) { + const data = Papa.parse(text, { header: true }).data; + + // Make a FeatureCollection + const voters = makeVoterFeatureCollection(data); + // Show voters on the map + showVotersOnMap(voters); + baseMap.fitBounds(baseMap.voterLayers.getBounds()); +} + +// Function on what happens when clicking on load button +function onLoadButtonClick() { // Get input list number let inputNumber = document.querySelector("#list-loader-input").value.replace(/\s/g, ''); if(errorTooltip(inputNumber)) { return } @@ -107,33 +133,16 @@ loadButton.addEventListener("click", ( ) => { // Fetch the particular CSV file fetch(path) - .then(resp => { - // If the file exists - if(resp.ok) { - return resp.text(); - } else { - // If the file doesn't exist, then show in tooltip - toolTip.innerHTML = `
Wrong number
`; - return; - } - }) - .then(text => { - const data = Papa.parse(text, { header: true }).data; - - // Make a FeatureCollection - const voters = makeVoterFeatureCollection(data); - - // Show voters on the map - showVotersOnMap(voters); - baseMap.fitBounds(baseMap.voterLayers.getBounds()); - }); -}); + .then(checkFetchStatus) + .then(loadVoterData); +} +// Add event listener to the load button +loadButtonEl.addEventListener("click", onLoadButtonClick); // Refresh tooltip text when mouse moves out -loadButton.addEventListener("mouseout", ( ) => { - toolTip.innerHTML = `
Load List
`; +loadButtonEl.addEventListener("mouseout", ( ) => { + toolTipEl.innerHTML = `
Load List
`; }); -console.log(document.querySelector("#test")); diff --git a/site/js/map.js b/site/js/map.js index 57b471f..e323f10 100644 --- a/site/js/map.js +++ b/site/js/map.js @@ -6,7 +6,7 @@ let baseMapComponent = document.querySelector("#map-component"); export let baseMap = L.map(baseMapComponent, { zoomControl: false }).setView([40, -75.15], 11); L.tileLayer('https://tiles.stadiamaps.com/tiles/alidade_smooth/{z}/{x}/{y}{r}.png?api_key=10b978ef-d3a8-4d87-84d7-9233488f7d37', { maxZoom: 20, - attribution: '© Stadia Maps, © OpenMapTiles © OpenStreetMap contributors', + attribution: '© Stadia Maps, © OpenStreetMap contributors', }).addTo(baseMap); /* diff --git a/site/js/voter-list-expand.js b/site/js/voter-list-expand.js new file mode 100644 index 0000000..24b4a07 --- /dev/null +++ b/site/js/voter-list-expand.js @@ -0,0 +1,29 @@ +let expandButton = document.querySelector("#list-expand-button"); +let listContainer = document.querySelector("#voter-list-component").querySelector(".scroll-container"); +export let listExpanded; +listExpanded = 0; + +expandButton.addEventListener("click", ( ) => { + + // If currently not expanded, expand it + if(listExpanded == 0) { + const mediaQuery = window.matchMedia("(min-width: 1200px)"); + + if(mediaQuery.matches) { + listContainer.classList.add("scroll-container-expanded-long"); + } else { + listContainer.classList.add("scroll-container-expanded"); + } + + expandButton.innerHTML = `expand_less`; + + listExpanded = 1; + + } else { + listContainer.className = "scroll-container"; + + expandButton.innerHTML = `expand_more`; + + listExpanded = 0; + } +}); \ No newline at end of file From cd1df25c71c4584bd39999ef2d3b4ab8d041a871 Mon Sep 17 00:00:00 2001 From: Jie Li Date: Sun, 30 Oct 2022 10:38:56 -0400 Subject: [PATCH 07/95] change formatting --- site/css/basic-info-panel.css | 17 +++++++++++------ site/css/edit-button.css | 4 ++++ site/index.html | 8 ++++++-- site/js/edit-button.js | 0 4 files changed, 21 insertions(+), 8 deletions(-) create mode 100644 site/css/edit-button.css create mode 100644 site/js/edit-button.js diff --git a/site/css/basic-info-panel.css b/site/css/basic-info-panel.css index 38a261b..0a8801f 100644 --- a/site/css/basic-info-panel.css +++ b/site/css/basic-info-panel.css @@ -27,11 +27,6 @@ overflow-x: auto; } -#panel-name span { - width: 100%; - display: inline-block; -} - #panel-status { grid-area: 1/4/4/6; display: flex; @@ -54,6 +49,16 @@ #panel-address { display: flex; - grid-area: 3/1/4/4; + grid-area: 3/1/4/3; + align-items: center; + font-size: 0.8rem; +} + +#panel-add-to-list { + font-size: 0.8rem; + display: flex; align-items: center; + justify-content: center; + width: 80%; + height: 80%; } \ No newline at end of file diff --git a/site/css/edit-button.css b/site/css/edit-button.css new file mode 100644 index 0000000..92cb32a --- /dev/null +++ b/site/css/edit-button.css @@ -0,0 +1,4 @@ +#edit-button { + + +} \ No newline at end of file diff --git a/site/index.html b/site/index.html index f877298..4c1fb8f 100644 --- a/site/index.html +++ b/site/index.html @@ -171,10 +171,10 @@
+
Edit
THIS PERSON HAS A LONG NAME -
@@ -183,7 +183,11 @@
-
3600 Market Street
+
+ 3600 Market Street, Philadelphia PA + +
+
Add To
diff --git a/site/js/edit-button.js b/site/js/edit-button.js new file mode 100644 index 0000000..e69de29 From d4bc3ce3d3867e2890a8d32e5ad48decdda351af Mon Sep 17 00:00:00 2001 From: Jie Li Date: Sun, 30 Oct 2022 11:38:42 -0400 Subject: [PATCH 08/95] update --- site/js/list-loader.js | 1 + site/js/search-box.js | 6 ++++++ site/js/selected-voter.js | 3 +++ site/js/voter-list.js | 6 ++++++ 4 files changed, 16 insertions(+) create mode 100644 site/js/selected-voter.js diff --git a/site/js/list-loader.js b/site/js/list-loader.js index 0c73eb7..df30895 100644 --- a/site/js/list-loader.js +++ b/site/js/list-loader.js @@ -121,6 +121,7 @@ function loadVoterData(text) { // Show voters on the map showVotersOnMap(voters); baseMap.fitBounds(baseMap.voterLayers.getBounds()); + showVotersInList(data); } // Function on what happens when clicking on load button diff --git a/site/js/search-box.js b/site/js/search-box.js index e69de29..a678595 100644 --- a/site/js/search-box.js +++ b/site/js/search-box.js @@ -0,0 +1,6 @@ +// add event listener to search box + +function onSearchBoxInput() { + showVotersInList(); + +} \ No newline at end of file diff --git a/site/js/selected-voter.js b/site/js/selected-voter.js new file mode 100644 index 0000000..9d1d378 --- /dev/null +++ b/site/js/selected-voter.js @@ -0,0 +1,3 @@ +function highlightVoter(id) { + +} \ No newline at end of file diff --git a/site/js/voter-list.js b/site/js/voter-list.js index e69de29..a66b606 100644 --- a/site/js/voter-list.js +++ b/site/js/voter-list.js @@ -0,0 +1,6 @@ +function showVotersInList(data) { + ; + // Should add event listener on every voter in the list + // Use something to store the id of the selected voter +} + From 60d373b7fea9741bfd8d85e25da02bf6d57df0c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Myron=20Ba=C3=B1ez?= Date: Sun, 30 Oct 2022 11:39:12 -0400 Subject: [PATCH 09/95] search box filter --- site/index.html | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/site/index.html b/site/index.html index 4c1fb8f..89e9ae9 100644 --- a/site/index.html +++ b/site/index.html @@ -81,7 +81,7 @@
- +
@@ -216,4 +216,25 @@ + + + \ No newline at end of file From 0f96d5d57dcf8a332cdaba42bb0d7729ad1e7f50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Myron=20Ba=C3=B1ez?= Date: Sun, 30 Oct 2022 12:24:14 -0400 Subject: [PATCH 10/95] voter list function --- site/js/htmlelement.js | 36 ++++++++++++++++++++++++++++++++++++ site/js/list-loader.js | 1 + site/js/voter-list.js | 25 ++++++++++++++++++++++--- 3 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 site/js/htmlelement.js diff --git a/site/js/htmlelement.js b/site/js/htmlelement.js new file mode 100644 index 0000000..821f7c6 --- /dev/null +++ b/site/js/htmlelement.js @@ -0,0 +1,36 @@ +/* ==================== +The following two functions take a string of HTML and create DOM element objects +representing the tags, using the `template` feature of HTML. See the following +for more information: https://stackoverflow.com/a/35385518/123776 +==================== */ + +/* eslint-disable no-unused-vars */ + +/** + * @param {String} HTML representing a single element + * @return {Element} + */ + function htmlToElement(html) { + const template = document.createElement('template'); + const trimmedHtml = html.trim(); // Never return a text node of whitespace as the result + template.innerHTML = trimmedHtml; + return template.content.firstChild; + } + + /** + * @param {String} HTML representing any number of sibling elements + * @return {NodeList} + */ + function htmlToElements(html) { + const template = document.createElement('template'); + template.innerHTML = html; + return template.content.childNodes; + } + + window.htmlToElement = htmlToElement; + window.htmlToElements = htmlToElements; + + export { + htmlToElement, + htmlToElements, + }; \ No newline at end of file diff --git a/site/js/list-loader.js b/site/js/list-loader.js index df30895..374b2fe 100644 --- a/site/js/list-loader.js +++ b/site/js/list-loader.js @@ -4,6 +4,7 @@ Hide and Show List Loader import { showVotersOnMap } from "./map.js"; import { baseMap } from "./map.js"; +import { showVotersInList } from './voter-list.js'; let hideButton = document.querySelector("#list-loader-hide"); let hidableChunk = document.querySelector("#list-loader-hidable-chunk"); diff --git a/site/js/voter-list.js b/site/js/voter-list.js index a66b606..73f1b23 100644 --- a/site/js/voter-list.js +++ b/site/js/voter-list.js @@ -1,6 +1,25 @@ +// function showVotersInList(data) { +// ; +// // Should add event listener on every voter in the list +// // Use something to store the id of the selected voter +// } + +import { htmlToElement } from './htmlelement.js'; + +let voterList = document.querySelector('#voter-list'); + function showVotersInList(data) { - ; - // Should add event listener on every voter in the list - // Use something to store the id of the selected voter + voterList.innerHTML = ''; + + for (const voters of data) { + const html = ` +
for (i = 0; i < li.length; i++) { - a = li[i].getElementsByClassName("list-name")[0]; - txtValue = a.textContent || a.innerText; + a = li[i].getElementsByClassName("voter-name-list")[0]; + txtValue = a.innerText; if (txtValue.toUpperCase().indexOf(filter) > -1) { li[i].style.display = ""; } else { li[i].style.display = "none"; } + } } diff --git a/site/js/list-loader.js b/site/js/list-loader.js index 374b2fe..99e2a94 100644 --- a/site/js/list-loader.js +++ b/site/js/list-loader.js @@ -145,6 +145,4 @@ loadButtonEl.addEventListener("click", onLoadButtonClick); // Refresh tooltip text when mouse moves out loadButtonEl.addEventListener("mouseout", ( ) => { toolTipEl.innerHTML = `
Load List
`; -}); - - +}); \ No newline at end of file diff --git a/site/js/search-box.js b/site/js/search-box.js index a678595..e21a88a 100644 --- a/site/js/search-box.js +++ b/site/js/search-box.js @@ -1,6 +1,27 @@ -// add event listener to search box +// // add event listener to search box +// import voters from '../data/list-loader.js'; +// import { showVotersInList } from './voter-list'; +// import { voterList } from './voter-list'; -function onSearchBoxInput() { - showVotersInList(); - -} \ No newline at end of file +// let voterNameFilter = document.querySelector('#search-box-input'); + +// // function onSearchBoxInput() { +// // showVotersInList(); +// // } + +// function onSearchBoxInput() { +// // showVotersInList(); +// let filteredVoter = voters; +// const text = voterNameFilter.value; +// filteredVoter = filteredVoter.filter(function(voter) { +// const name = voter['First Name'].toLowerCase(); +// const hasText = name.includes(text); +// return hasText; +// }); +// return filteredVoter; +// } + +// voterNameFilter.addEventListener('input', () => { +// const filteredVoter = onSearchBoxInput(); +// showVotersInList(filteredVoter, voterList); +// }); \ No newline at end of file diff --git a/site/js/selected-voter.js b/site/js/selected-voter.js index 9d1d378..8000c6f 100644 --- a/site/js/selected-voter.js +++ b/site/js/selected-voter.js @@ -1,3 +1,2 @@ -function highlightVoter(id) { - -} \ No newline at end of file +// function highlightVoter(id) { +// } \ No newline at end of file diff --git a/site/js/voter-list.js b/site/js/voter-list.js index 73f1b23..58d8f84 100644 --- a/site/js/voter-list.js +++ b/site/js/voter-list.js @@ -11,9 +11,10 @@ let voterList = document.querySelector('#voter-list'); function showVotersInList(data) { voterList.innerHTML = ''; - for (const voters of data) { + for (const voter of data) { + const space = ' '; const html = ` -
  • ${voter['First Name'] + space + voter['Last Name']}
  • `; const li = htmlToElement(html); voterList.append(li); @@ -22,4 +23,5 @@ function showVotersInList(data) { export { showVotersInList, + voterList, }; \ No newline at end of file From 5513b47d8220a6936e82bb4bf506c5d9723600ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Myron=20Ba=C3=B1ez?= Date: Sun, 30 Oct 2022 19:48:46 -0400 Subject: [PATCH 12/95] attempt at search box and removing former search filter --- site/index.html | 8 ++++---- site/js/search-box.js | 38 +++++++++++++++++++++----------------- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/site/index.html b/site/index.html index ab39648..65ab871 100644 --- a/site/index.html +++ b/site/index.html @@ -81,7 +81,7 @@
    - +
    @@ -217,7 +217,7 @@ - --> \ No newline at end of file diff --git a/site/js/search-box.js b/site/js/search-box.js index e21a88a..4c42398 100644 --- a/site/js/search-box.js +++ b/site/js/search-box.js @@ -1,27 +1,31 @@ -// // add event listener to search box -// import voters from '../data/list-loader.js'; +// // // add event listener to search box +// // import data from '../data/list-loader.js'; // import { showVotersInList } from './voter-list'; // import { voterList } from './voter-list'; // let voterNameFilter = document.querySelector('#search-box-input'); +// let filteredVoter = data +// // // function onSearchBoxInput() { +// // // showVotersInList(); +// // // } -// // function onSearchBoxInput() { -// // showVotersInList(); +// // function onSearchBoxInput(data) { +// // // showVotersInList(); +// // let filteredVoter = data; +// // const text = voterNameFilter.value; +// // filteredVoter = filteredVoter.filter(function(voter) { +// // const name = voter['First Name'].toLowerCase(); +// // const hasText = name.includes(text); +// // return hasText; +// // }); +// // return filteredVoter; // // } // function onSearchBoxInput() { -// // showVotersInList(); -// let filteredVoter = voters; -// const text = voterNameFilter.value; -// filteredVoter = filteredVoter.filter(function(voter) { -// const name = voter['First Name'].toLowerCase(); -// const hasText = name.includes(text); -// return hasText; -// }); -// return filteredVoter; +// showVotersInList(filteredVoter, voterList); // } -// voterNameFilter.addEventListener('input', () => { -// const filteredVoter = onSearchBoxInput(); -// showVotersInList(filteredVoter, voterList); -// }); \ No newline at end of file +// // voterNameFilter.addEventListener('input', () => { +// // const filteredVoter = onSearchBoxInput(); +// // showVotersInList(filteredVoter, voterList); +// // }); \ No newline at end of file From 0d123cf41d822a7b64fb7a28165112e4d6d338da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Myron=20Ba=C3=B1ez?= Date: Tue, 1 Nov 2022 21:31:40 -0400 Subject: [PATCH 13/95] adjusted search box --- site/js/list-loader.js | 2 +- site/js/search-box.js | 48 ++++++++++++++++++------------------------ 2 files changed, 22 insertions(+), 28 deletions(-) diff --git a/site/js/list-loader.js b/site/js/list-loader.js index 99e2a94..2320b86 100644 --- a/site/js/list-loader.js +++ b/site/js/list-loader.js @@ -145,4 +145,4 @@ loadButtonEl.addEventListener("click", onLoadButtonClick); // Refresh tooltip text when mouse moves out loadButtonEl.addEventListener("mouseout", ( ) => { toolTipEl.innerHTML = `
    Load List
    `; -}); \ No newline at end of file +}); diff --git a/site/js/search-box.js b/site/js/search-box.js index 4c42398..31dff51 100644 --- a/site/js/search-box.js +++ b/site/js/search-box.js @@ -1,31 +1,25 @@ // // // add event listener to search box -// // import data from '../data/list-loader.js'; -// import { showVotersInList } from './voter-list'; -// import { voterList } from './voter-list'; - -// let voterNameFilter = document.querySelector('#search-box-input'); -// let filteredVoter = data -// // // function onSearchBoxInput() { -// // // showVotersInList(); -// // // } - -// // function onSearchBoxInput(data) { -// // // showVotersInList(); -// // let filteredVoter = data; -// // const text = voterNameFilter.value; -// // filteredVoter = filteredVoter.filter(function(voter) { -// // const name = voter['First Name'].toLowerCase(); -// // const hasText = name.includes(text); -// // return hasText; -// // }); -// // return filteredVoter; -// // } - // function onSearchBoxInput() { -// showVotersInList(filteredVoter, voterList); +// showVotersInList(); // } -// // voterNameFilter.addEventListener('input', () => { -// // const filteredVoter = onSearchBoxInput(); -// // showVotersInList(filteredVoter, voterList); -// // }); \ No newline at end of file +// import { data } from './list-loader.js'; +import { showVotersInList } from './voter-list.js'; +import { voterList } from './voter-list.js'; + +let voterNameFilter = document.querySelector('#search-box-input'); + +function onSearchBoxInput(data) { + let filteredVoter = data; + const text = voterNameFilter.value; + filteredVoter = filteredVoter.filter(function(voter) { + const name = voter['First Name'].toLowerCase(); + const hasText = name.includes(text); + return hasText; + }); + return filteredVoter; +} +voterNameFilter.addEventListener('input', () => { + const filteredVoter = onSearchBoxInput(); + showVotersInList(filteredVoter, voterList); +}); \ No newline at end of file From f3ebcc8199eb1e4cf453594634e009356591a370 Mon Sep 17 00:00:00 2001 From: Leejere Date: Wed, 2 Nov 2022 13:33:41 -0400 Subject: [PATCH 14/95] test local storage --- site/css/list-filters.css | 2 +- site/js/list-loader.js | 17 +++++++++++++++++ site/js/search-box.js | 3 ++- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/site/css/list-filters.css b/site/css/list-filters.css index 59226cd..f36b11e 100644 --- a/site/css/list-filters.css +++ b/site/css/list-filters.css @@ -4,7 +4,7 @@ right: 0; height: 2.5em; width: 8.5rem; - z-index: 999; + z-index: 99999; } #list-filter-component .button { diff --git a/site/js/list-loader.js b/site/js/list-loader.js index 2320b86..1bc3593 100644 --- a/site/js/list-loader.js +++ b/site/js/list-loader.js @@ -116,6 +116,8 @@ function checkFetchStatus(resp) { function loadVoterData(text) { const data = Papa.parse(text, { header: true }).data; + localStorage.setItem("thisList", JSON.stringify(data)); + // Make a FeatureCollection const voters = makeVoterFeatureCollection(data); @@ -146,3 +148,18 @@ loadButtonEl.addEventListener("click", onLoadButtonClick); loadButtonEl.addEventListener("mouseout", ( ) => { toolTipEl.innerHTML = `
    Load List
    `; }); + +// TEST + +let testEl = document.querySelector("#list-filter-component"); + +let thisListData; + +testEl.addEventListener("click", ( ) => { + let listFromStorage = localStorage.getItem("thisList"); + thisListData = JSON.parse(listFromStorage || "{}"); + + console.log(thisListData); +}); + +// END TEST \ No newline at end of file diff --git a/site/js/search-box.js b/site/js/search-box.js index 31dff51..80286fe 100644 --- a/site/js/search-box.js +++ b/site/js/search-box.js @@ -22,4 +22,5 @@ function onSearchBoxInput(data) { voterNameFilter.addEventListener('input', () => { const filteredVoter = onSearchBoxInput(); showVotersInList(filteredVoter, voterList); -}); \ No newline at end of file +}); + From 50ceef484cd11aa9bfd5543f8b38f13060eab6c8 Mon Sep 17 00:00:00 2001 From: Leejere Date: Wed, 2 Nov 2022 14:04:33 -0400 Subject: [PATCH 15/95] fixed voter data --- site/js/list-loader.js | 18 +++--------------- site/js/search-box.js | 16 +++++++++++++++- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/site/js/list-loader.js b/site/js/list-loader.js index 1bc3593..fc93862 100644 --- a/site/js/list-loader.js +++ b/site/js/list-loader.js @@ -112,9 +112,11 @@ function checkFetchStatus(resp) { } } +export let data; + // Function: what happens after successful fetch function loadVoterData(text) { - const data = Papa.parse(text, { header: true }).data; + data = Papa.parse(text, { header: true }).data; localStorage.setItem("thisList", JSON.stringify(data)); @@ -149,17 +151,3 @@ loadButtonEl.addEventListener("mouseout", ( ) => { toolTipEl.innerHTML = `
    Load List
    `; }); -// TEST - -let testEl = document.querySelector("#list-filter-component"); - -let thisListData; - -testEl.addEventListener("click", ( ) => { - let listFromStorage = localStorage.getItem("thisList"); - thisListData = JSON.parse(listFromStorage || "{}"); - - console.log(thisListData); -}); - -// END TEST \ No newline at end of file diff --git a/site/js/search-box.js b/site/js/search-box.js index 80286fe..d7639ad 100644 --- a/site/js/search-box.js +++ b/site/js/search-box.js @@ -3,7 +3,7 @@ // showVotersInList(); // } -// import { data } from './list-loader.js'; +import { data } from './list-loader.js'; import { showVotersInList } from './voter-list.js'; import { voterList } from './voter-list.js'; @@ -24,3 +24,17 @@ voterNameFilter.addEventListener('input', () => { showVotersInList(filteredVoter, voterList); }); +// TEST + +let testEl = document.querySelector("#list-filter-component"); + +let thisListData; + +testEl.addEventListener("click", ( ) => { + let listFromStorage = localStorage.getItem("thisList"); + thisListData = JSON.parse(listFromStorage || "{}"); + + console.log(data); +}); + +// END TEST \ No newline at end of file From 41df7a6168b7e2fe76dde588129c9c12a4ac9ad9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Myron=20Ba=C3=B1ez?= Date: Thu, 3 Nov 2022 17:18:38 -0400 Subject: [PATCH 16/95] finished search box --- site/index.html | 42 ++++++++++++++++++++++++------------------ site/js/list-loader.js | 2 +- site/js/search-box.js | 41 +++++++++++++++++++++-------------------- 3 files changed, 46 insertions(+), 39 deletions(-) diff --git a/site/index.html b/site/index.html index 65ab871..5f6e13c 100644 --- a/site/index.html +++ b/site/index.html @@ -217,24 +217,30 @@ - +// for (let i = 0; i < li.length; i++) { +// newArray.push(li[i].innerText); +// } +// console.log(newArray.splice(0,-1)); +// // for (i = 0; i < li.length; i++) { +// // a = li[i].getElementsByClassName("voter-name-list")[0]; +// // txtValue = a.innerHTML || a.innerText; +// // if (txtValue.toUpperCase().indexOf(filter) > -1) { +// // li[i].style.display = ""; +// // } else { +// // li[i].style.display = "none"; +// // } + +// // } +// } +// const voterNameFilter = document.querySelectorAll('.voter-list-name'); + \ No newline at end of file diff --git a/site/js/list-loader.js b/site/js/list-loader.js index fc93862..aecf111 100644 --- a/site/js/list-loader.js +++ b/site/js/list-loader.js @@ -116,7 +116,7 @@ export let data; // Function: what happens after successful fetch function loadVoterData(text) { - data = Papa.parse(text, { header: true }).data; + data = Papa.parse(text, { header: true, skipEmptyLines: true }).data; localStorage.setItem("thisList", JSON.stringify(data)); diff --git a/site/js/search-box.js b/site/js/search-box.js index d7639ad..54c1a48 100644 --- a/site/js/search-box.js +++ b/site/js/search-box.js @@ -7,34 +7,35 @@ import { data } from './list-loader.js'; import { showVotersInList } from './voter-list.js'; import { voterList } from './voter-list.js'; -let voterNameFilter = document.querySelector('#search-box-input'); +// TEST +// let testEl = document.querySelector("#list-filter-component"); +// let thisListData; + +// testEl.addEventListener("click", ( ) => { +// let listFromStorage = localStorage.getItem("thisList"); +// thisListData = JSON.parse(listFromStorage || "{}"); +// console.log(data); +// }); +// END TEST + +let voterInputBox = document.querySelector('#search-box-input'); function onSearchBoxInput(data) { let filteredVoter = data; - const text = voterNameFilter.value; + const text = voterInputBox.value.toLowerCase(); filteredVoter = filteredVoter.filter(function(voter) { - const name = voter['First Name'].toLowerCase(); - const hasText = name.includes(text); + const firstName = voter['First Name'].toLowerCase(); + const lastName = voter['Last Name'].toLowerCase(); + const hasText = firstName.includes(text) || lastName.includes(text); return hasText; }); return filteredVoter; } -voterNameFilter.addEventListener('input', () => { - const filteredVoter = onSearchBoxInput(); - showVotersInList(filteredVoter, voterList); -}); -// TEST - -let testEl = document.querySelector("#list-filter-component"); - -let thisListData; - -testEl.addEventListener("click", ( ) => { - let listFromStorage = localStorage.getItem("thisList"); - thisListData = JSON.parse(listFromStorage || "{}"); - - console.log(data); +voterInputBox.addEventListener("input", ( ) => { + const filteredVoter = onSearchBoxInput(data); + showVotersInList(filteredVoter, voterList); }); -// END TEST \ No newline at end of file +// notes with mjumbe +// papa parse is reading the last line of each csv as a person \ No newline at end of file From 2af955a4038812617581438121123d3970d7b087 Mon Sep 17 00:00:00 2001 From: Leejere Date: Sat, 5 Nov 2022 13:01:45 -0400 Subject: [PATCH 17/95] update --- site/js/list-loader.js | 4 ++-- site/js/search-box.js | 46 +++++++++++++++++------------------------- 2 files changed, 20 insertions(+), 30 deletions(-) diff --git a/site/js/list-loader.js b/site/js/list-loader.js index aecf111..3a7dcfe 100644 --- a/site/js/list-loader.js +++ b/site/js/list-loader.js @@ -116,9 +116,9 @@ export let data; // Function: what happens after successful fetch function loadVoterData(text) { - data = Papa.parse(text, { header: true, skipEmptyLines: true }).data; - localStorage.setItem("thisList", JSON.stringify(data)); + // Note skipEmptyLines: true; cleaning up the CSV + data = Papa.parse(text, { header: true, skipEmptyLines: true }).data; // Make a FeatureCollection const voters = makeVoterFeatureCollection(data); diff --git a/site/js/search-box.js b/site/js/search-box.js index 54c1a48..9525fcf 100644 --- a/site/js/search-box.js +++ b/site/js/search-box.js @@ -1,41 +1,31 @@ -// // // add event listener to search box -// function onSearchBoxInput() { -// showVotersInList(); -// } - import { data } from './list-loader.js'; import { showVotersInList } from './voter-list.js'; import { voterList } from './voter-list.js'; -// TEST -// let testEl = document.querySelector("#list-filter-component"); -// let thisListData; - -// testEl.addEventListener("click", ( ) => { -// let listFromStorage = localStorage.getItem("thisList"); -// thisListData = JSON.parse(listFromStorage || "{}"); -// console.log(data); -// }); -// END TEST - -let voterInputBox = document.querySelector('#search-box-input'); +let voterInputBoxEl = document.querySelector('#search-box-input'); -function onSearchBoxInput(data) { +// Filter by the input of search box +// Search by first name or last name +function filterByName() { let filteredVoter = data; - const text = voterInputBox.value.toLowerCase(); + const inputText = voterInputBoxEl.value.toLowerCase(); + filteredVoter = filteredVoter.filter(function(voter) { - const firstName = voter['First Name'].toLowerCase(); - const lastName = voter['Last Name'].toLowerCase(); - const hasText = firstName.includes(text) || lastName.includes(text); - return hasText; - }); - return filteredVoter; + const firstName = voter['First Name'].toLowerCase(); + const lastName = voter['Last Name'].toLowerCase(); + const hasInputText = firstName.includes(inputText) || lastName.includes(inputText); + return hasInputText; + }); + return filteredVoter; } -voterInputBox.addEventListener("input", ( ) => { - const filteredVoter = onSearchBoxInput(data); +// What happens when searchbox has input +function onSearchBoxInput() { + const filteredVoter = filterByName(); showVotersInList(filteredVoter, voterList); -}); +} + +voterInputBoxEl.addEventListener("input", onSearchBoxInput); // notes with mjumbe // papa parse is reading the last line of each csv as a person \ No newline at end of file From ed992eb0c578921dc95cce7d64b6c27ea2fc1a09 Mon Sep 17 00:00:00 2001 From: Leejere Date: Sat, 5 Nov 2022 13:48:26 -0400 Subject: [PATCH 18/95] make list-loader readable; fulfilling 2 requirements --- site/js/list-loader.js | 52 +++++++++++++++++++++++++++++++----------- site/js/search-box.js | 2 -- 2 files changed, 39 insertions(+), 15 deletions(-) diff --git a/site/js/list-loader.js b/site/js/list-loader.js index 3a7dcfe..7aaa483 100644 --- a/site/js/list-loader.js +++ b/site/js/list-loader.js @@ -6,29 +6,30 @@ import { showVotersOnMap } from "./map.js"; import { baseMap } from "./map.js"; import { showVotersInList } from './voter-list.js'; -let hideButton = document.querySelector("#list-loader-hide"); -let hidableChunk = document.querySelector("#list-loader-hidable-chunk"); +// DOM elements +let hideButtonEl = document.querySelector("#list-loader-hide"); +let hidableChunkEl = document.querySelector("#list-loader-hidable-chunk"); +let listNumberInputEl = document.querySelector("#list-loader-input"); // A variable to store whether the list loader component is currently hidden let loaderElIsHidden = 0; -hideButton.addEventListener("click", ( ) => { +hideButtonEl.addEventListener("click", ( ) => { if(loaderElIsHidden == 0) { - hidableChunk.style.transform = "translateX(-16em)"; - hideButton.innerHTML = ` + hidableChunkEl.style.transform = "translateX(-16em)"; + hideButtonEl.innerHTML = ` chevron_right `; loaderElIsHidden = 1; } else { - hidableChunk.style.transform = "translateX(0em)"; - hideButton.innerHTML = ` + hidableChunkEl.style.transform = "translateX(0em)"; + hideButtonEl.innerHTML = ` chevron_left `; loaderElIsHidden = 0; } }); - /* Load List */ @@ -101,23 +102,35 @@ function makeVoterFeatureCollection(data) { return voters; } -// Function to check if fetch is successful. If so, do fetch; if not, show on tooltip +/* Function to check if fetch is successful. +If so, do fetch; if not, show on tooltip */ function checkFetchStatus(resp) { if(resp.ok) { return resp.text(); } else { // If the file doesn't exist, then show in tooltip toolTipEl.innerHTML = `
    Wrong number
    `; - return; + return false; } } +// This is a global object to store the current list of voters export let data; -// Function: what happens after successful fetch +/* Function: what happens after successful fetch: +1. Make the data using Papaparse, and store it by updating the global variable "data" +2. When having the data, make a geometry object, which has voter IDs, using makeVoterFeatureCollection(data) +3. Show voters on the map +4. Show voters in the list +*/ function loadVoterData(text) { + if(text == false) { + return; + } // Note skipEmptyLines: true; cleaning up the CSV + /* notes with Mjumbe: + Papa Parse is reading the last line of each csv as a person */ data = Papa.parse(text, { header: true, skipEmptyLines: true }).data; // Make a FeatureCollection @@ -129,10 +142,16 @@ function loadVoterData(text) { showVotersInList(data); } -// Function on what happens when clicking on load button +/* Function on what happens when clicking on load button +1. Read the list number +2. If the number is wrong (wrong digits, empty, etc.), go to errorTooltip +3. If the number is fine, make a path, and fetch +4. Check fetch status using checkFetchStatus +5. If check success, load data using loadVoterData; otherwise, show error tooltip +*/ function onLoadButtonClick() { // Get input list number - let inputNumber = document.querySelector("#list-loader-input").value.replace(/\s/g, ''); + let inputNumber = listNumberInputEl.value.replace(/\s/g, ''); if(errorTooltip(inputNumber)) { return } let path = './data/voters_lists/' + inputNumber + '.csv'; @@ -151,3 +170,10 @@ loadButtonEl.addEventListener("mouseout", ( ) => { toolTipEl.innerHTML = `
    Load List
    `; }); +/* +Requirement: +There should be an input element on the page where you can enter a voter file number. +Save the input DOM element in a variable named voterFileInput attached to the global window object. +*/ + +window.voterFileInput = listNumberInputEl; \ No newline at end of file diff --git a/site/js/search-box.js b/site/js/search-box.js index 9525fcf..5676b29 100644 --- a/site/js/search-box.js +++ b/site/js/search-box.js @@ -27,5 +27,3 @@ function onSearchBoxInput() { voterInputBoxEl.addEventListener("input", onSearchBoxInput); -// notes with mjumbe -// papa parse is reading the last line of each csv as a person \ No newline at end of file From 40a89b2a4fbf4013de8f31f75c54f686ee357077 Mon Sep 17 00:00:00 2001 From: Leejere Date: Sat, 5 Nov 2022 13:51:43 -0400 Subject: [PATCH 19/95] update voter list to fulfill requirement --- site/js/list-loader.js | 14 +++++++++++--- site/js/voter-list.js | 9 ++++++++- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/site/js/list-loader.js b/site/js/list-loader.js index 7aaa483..46ca64e 100644 --- a/site/js/list-loader.js +++ b/site/js/list-loader.js @@ -10,6 +10,8 @@ import { showVotersInList } from './voter-list.js'; let hideButtonEl = document.querySelector("#list-loader-hide"); let hidableChunkEl = document.querySelector("#list-loader-hidable-chunk"); let listNumberInputEl = document.querySelector("#list-loader-input"); +let loadButtonEl = document.querySelector("#list-loader-load"); +let toolTipEl = document.querySelector("#list-loader-load").querySelector(".tooltiptext"); // A variable to store whether the list loader component is currently hidden let loaderElIsHidden = 0; @@ -34,8 +36,7 @@ hideButtonEl.addEventListener("click", ( ) => { Load List */ -let loadButtonEl = document.querySelector("#list-loader-load"); -let toolTipEl = document.querySelector("#list-loader-load").querySelector(".tooltiptext"); + // Function to change button tooltip depending on input function errorTooltip(inputNumber) { @@ -176,4 +177,11 @@ There should be an input element on the page where you can enter a voter file nu Save the input DOM element in a variable named voterFileInput attached to the global window object. */ -window.voterFileInput = listNumberInputEl; \ No newline at end of file +window.voterFileInput = listNumberInputEl; + +/* +Requirement: +There should be a button that will load the voter file number given in the voterFileInput when clicked. Save the button DOM element in a variable named voterFileLoadButton attached to the global window object. +*/ + +window.voterFileLoadButton = loadButtonEl; \ No newline at end of file diff --git a/site/js/voter-list.js b/site/js/voter-list.js index 58d8f84..3d4c7a6 100644 --- a/site/js/voter-list.js +++ b/site/js/voter-list.js @@ -24,4 +24,11 @@ function showVotersInList(data) { export { showVotersInList, voterList, -}; \ No newline at end of file +}; + +/* +Requirement: +The list's DOM element should be available on the global +*/ + +window.voterList = voterList; \ No newline at end of file From be8a7155aa08e2b7e1db45012a3b36e7b7cf846c Mon Sep 17 00:00:00 2001 From: Leejere Date: Sat, 5 Nov 2022 14:31:33 -0400 Subject: [PATCH 20/95] load list automatically from based on local storage --- site/index.html | 26 ---------------------- site/js/list-loader.js | 49 +++++++++++++++++++++++++++++------------- site/js/map.js | 14 ++++++++---- site/js/search-box.js | 3 +-- 4 files changed, 45 insertions(+), 47 deletions(-) diff --git a/site/index.html b/site/index.html index 5f6e13c..9ba2d21 100644 --- a/site/index.html +++ b/site/index.html @@ -217,30 +217,4 @@ - - \ No newline at end of file diff --git a/site/js/list-loader.js b/site/js/list-loader.js index 46ca64e..2ee23c3 100644 --- a/site/js/list-loader.js +++ b/site/js/list-loader.js @@ -1,11 +1,11 @@ -/* -Hide and Show List Loader -*/ - import { showVotersOnMap } from "./map.js"; import { baseMap } from "./map.js"; import { showVotersInList } from './voter-list.js'; +/* +Hide and Show List Loader +*/ + // DOM elements let hideButtonEl = document.querySelector("#list-loader-hide"); let hidableChunkEl = document.querySelector("#list-loader-hidable-chunk"); @@ -13,6 +13,9 @@ let listNumberInputEl = document.querySelector("#list-loader-input"); let loadButtonEl = document.querySelector("#list-loader-load"); let toolTipEl = document.querySelector("#list-loader-load").querySelector(".tooltiptext"); +// Create a global object to store current input number +let inputNumber; + // A variable to store whether the list loader component is currently hidden let loaderElIsHidden = 0; @@ -36,8 +39,6 @@ hideButtonEl.addEventListener("click", ( ) => { Load List */ - - // Function to change button tooltip depending on input function errorTooltip(inputNumber) { let interruptLoad = false; @@ -107,6 +108,7 @@ function makeVoterFeatureCollection(data) { If so, do fetch; if not, show on tooltip */ function checkFetchStatus(resp) { if(resp.ok) { + localStorage.setItem("current-list", inputNumber); return resp.text(); } else { // If the file doesn't exist, then show in tooltip @@ -141,26 +143,43 @@ function loadVoterData(text) { showVotersOnMap(voters); baseMap.fitBounds(baseMap.voterLayers.getBounds()); showVotersInList(data); + + window.data = data; +} + +/* Function on what happens when clicking on load button +1. Make a path, and fetch +2. Check fetch status using checkFetchStatus +3. If check success, load data using loadVoterData; otherwise, show error tooltip +*/ +function loadByListNumber(inputNumber) { + let path = './data/voters_lists/' + inputNumber + '.csv'; + + // Fetch the particular CSV file + fetch(path) + .then(checkFetchStatus) + .then(loadVoterData); } /* Function on what happens when clicking on load button 1. Read the list number 2. If the number is wrong (wrong digits, empty, etc.), go to errorTooltip -3. If the number is fine, make a path, and fetch -4. Check fetch status using checkFetchStatus -5. If check success, load data using loadVoterData; otherwise, show error tooltip +3. If the number is fine, go to loadByListNumber; */ function onLoadButtonClick() { // Get input list number - let inputNumber = listNumberInputEl.value.replace(/\s/g, ''); + inputNumber = listNumberInputEl.value.replace(/\s/g, ''); if(errorTooltip(inputNumber)) { return } + loadByListNumber(inputNumber); +} - let path = './data/voters_lists/' + inputNumber + '.csv'; +/* +Automatically load list from local storage +*/ - // Fetch the particular CSV file - fetch(path) - .then(checkFetchStatus) - .then(loadVoterData); +let autoList = localStorage.getItem("current-list" || "{}"); +if(autoList.length == 4) { + console.log(autoList); } // Add event listener to the load button diff --git a/site/js/map.js b/site/js/map.js index e323f10..2c1ea28 100644 --- a/site/js/map.js +++ b/site/js/map.js @@ -2,8 +2,8 @@ INITIALIZE BASE MAP TO SHOW */ -let baseMapComponent = document.querySelector("#map-component"); -export let baseMap = L.map(baseMapComponent, { zoomControl: false }).setView([40, -75.15], 11); +let baseMapEl = document.querySelector("#map-component"); +export let baseMap = L.map(baseMapEl, { zoomControl: false }).setView([40, -75.15], 11); L.tileLayer('https://tiles.stadiamaps.com/tiles/alidade_smooth/{z}/{x}/{y}{r}.png?api_key=10b978ef-d3a8-4d87-84d7-9233488f7d37', { maxZoom: 20, attribution: '© Stadia Maps, © OpenStreetMap contributors', @@ -34,7 +34,13 @@ function showVotersOnMap(voters) { .addTo(baseMap); } - export { showVotersOnMap, -}; \ No newline at end of file +}; + +/* Requirement: +A leaflet map to show voter locations; +The leaflet map object should be available on the global window; +*/ + +window.voterMap = baseMap; \ No newline at end of file diff --git a/site/js/search-box.js b/site/js/search-box.js index 5676b29..aaa664b 100644 --- a/site/js/search-box.js +++ b/site/js/search-box.js @@ -25,5 +25,4 @@ function onSearchBoxInput() { showVotersInList(filteredVoter, voterList); } -voterInputBoxEl.addEventListener("input", onSearchBoxInput); - +voterInputBoxEl.addEventListener("input", onSearchBoxInput); \ No newline at end of file From a5ea7447b07fa8ad4a11f26ad07aa0c52bc4392d Mon Sep 17 00:00:00 2001 From: Leejere Date: Sat, 5 Nov 2022 16:22:26 -0400 Subject: [PATCH 21/95] make voter list grouped by address --- site/css/voter-list.css | 32 ++++++++++++--------- site/index.html | 64 ----------------------------------------- site/js/list-loader.js | 4 +-- site/js/search-box.js | 2 +- site/js/voter-list.js | 55 ++++++++++++++++++++++++++++++----- 5 files changed, 69 insertions(+), 88 deletions(-) diff --git a/site/css/voter-list.css b/site/css/voter-list.css index b34f3f5..5d5d59e 100644 --- a/site/css/voter-list.css +++ b/site/css/voter-list.css @@ -1,14 +1,12 @@ #voter-list-component { position: relative; - border-radius: 0 0 0.5em 0.5em; display: flex; flex-direction: column; } #voter-list-component .panel { - overflow: auto; background-color: white; - padding-bottom: 0.05rem; + padding: 0 0.5rem 0.05rem 0.5rem; } #voter-list-component .scroll-container { @@ -34,33 +32,39 @@ } #voter-list-component li { - padding: 0.2rem; + padding: 0.3rem; border-bottom: 1px solid #bbb; height: 1.3rem; - display: block; + display: flex; + justify-content: flex-start; + align-items: center; width: 28rem; } -#voter-list-component li .list-name { - position: relative; - font-weight: 600; - float: left; +#voter-list-component .list-address { margin-right: 1rem; - font-size: 0.9rem; + font-size: 0.8rem; + padding-top: 0.8rem; + height: 1rem; + vertical-align: baseline; + border-bottom: 0 solid #bbb; } -#voter-list-component li .list-address { +#voter-list-component li .list-name { position: relative; + font-weight: 600; float: left; margin-right: 1rem; - font-size: 0.8rem; - vertical-align: baseline; - top: 0.05rem; + font-size: 1rem; + vertical-align: center; } #voter-list-component .button { font-size: 0.8rem; height: 1.3rem; +} + +#voter-list-component #list-expand-button { margin-left: auto; margin-right: auto; } diff --git a/site/index.html b/site/index.html index 9ba2d21..c103ef9 100644 --- a/site/index.html +++ b/site/index.html @@ -90,70 +90,6 @@
      -
    • -
      Michael Lazar
      -
      13355 Noel Rd
      -
      -
      -
      -
      -
    • -
    • -
      Myron BaƱez
      -
      3600 Market
      -
      -
      -
      -
      -
    • -
    • -
      Yihan Zhang
      -
      1500 Chestnut
      -
      -
      -
      -
      -
    • -
    • -
      Nicholas Hand
      -
      3700 Lancaster
      -
      -
      -
      -
      -
    • -
    • -
      Leonardo da Vinci
      -
      3700 Florence
      -
      -
      -
      -
      -
    • -
    • -
      Jie Li
      -
      3700 Lancaster
      -
      -
      -
      -
      -
    • -
    • -
      David Kim
      -
      1254 Spring Garden
      -
      -
      -
      -
      -
    • -
    • -
      Some Other People
      -
      888 Random
      -
      -
      -
      -
      -
    diff --git a/site/js/list-loader.js b/site/js/list-loader.js index 2ee23c3..95cc822 100644 --- a/site/js/list-loader.js +++ b/site/js/list-loader.js @@ -108,7 +108,6 @@ function makeVoterFeatureCollection(data) { If so, do fetch; if not, show on tooltip */ function checkFetchStatus(resp) { if(resp.ok) { - localStorage.setItem("current-list", inputNumber); return resp.text(); } else { // If the file doesn't exist, then show in tooltip @@ -159,6 +158,7 @@ function loadByListNumber(inputNumber) { fetch(path) .then(checkFetchStatus) .then(loadVoterData); + localStorage.setItem("current-list", inputNumber); } /* Function on what happens when clicking on load button @@ -179,7 +179,7 @@ Automatically load list from local storage let autoList = localStorage.getItem("current-list" || "{}"); if(autoList.length == 4) { - console.log(autoList); + loadByListNumber(autoList); } // Add event listener to the load button diff --git a/site/js/search-box.js b/site/js/search-box.js index aaa664b..e2da5f0 100644 --- a/site/js/search-box.js +++ b/site/js/search-box.js @@ -22,7 +22,7 @@ function filterByName() { // What happens when searchbox has input function onSearchBoxInput() { const filteredVoter = filterByName(); - showVotersInList(filteredVoter, voterList); + showVotersInList(filteredVoter); } voterInputBoxEl.addEventListener("input", onSearchBoxInput); \ No newline at end of file diff --git a/site/js/voter-list.js b/site/js/voter-list.js index 3d4c7a6..7a61efd 100644 --- a/site/js/voter-list.js +++ b/site/js/voter-list.js @@ -8,16 +8,57 @@ import { htmlToElement } from './htmlelement.js'; let voterList = document.querySelector('#voter-list'); +// Function to turn array of voters into a two-level array grouped by address +// Use reduce; Initiate address if not already; append voter to address +function groupByKey(data, key) { + let dataGroupedByAddress = data.reduce((grouped, thisItem) => { + let thisCategory = thisItem[key]; + grouped[thisCategory] = grouped[thisCategory] || []; // Initialize if not existing + grouped[thisCategory].push(thisItem); + return grouped; + }, {}); + + return dataGroupedByAddress; +} + +// The output voters are grouped by their addresses +// Show address +function addAddressToList(address) { + const addressEl = htmlToElement(` +
  • + ${address} +
  • + `); + voterList.append(addressEl); +} + +// Function to show voters by each address +function addVotersByAddress(votersByThisAddress) { + for(const voter of votersByThisAddress) { + const voterEl = htmlToElement(` +
  • +
    ${voter["First Name"]} ${voter["Last Name"]}
    +
    +
    +
    +
    +
  • + `); + voterList.append(voterEl); + } +} + function showVotersInList(data) { + // First empty out existing voter list voterList.innerHTML = ''; - for (const voter of data) { - const space = ' '; - const html = ` -
  • ${voter['First Name'] + space + voter['Last Name']}
  • - `; - const li = htmlToElement(html); - voterList.append(li); + let dataGroupedByAddress = groupByKey(data, "Street Name"); + let addressKeys = Object.keys(dataGroupedByAddress); + + for(const address of addressKeys) { + addAddressToList(address); + let votersByThisAddress = dataGroupedByAddress[address]; + addVotersByAddress(votersByThisAddress); } } From 055606709fdf93f65a6aa09f4f5fa701e7e82533 Mon Sep 17 00:00:00 2001 From: Leejere Date: Sat, 5 Nov 2022 16:43:13 -0400 Subject: [PATCH 22/95] update voter list grouped by address --- site/css/voter-list.css | 2 +- site/js/list-loader.js | 17 ++++++++++++++++- site/js/voter-list.js | 2 +- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/site/css/voter-list.css b/site/css/voter-list.css index 5d5d59e..38c318a 100644 --- a/site/css/voter-list.css +++ b/site/css/voter-list.css @@ -44,7 +44,7 @@ #voter-list-component .list-address { margin-right: 1rem; font-size: 0.8rem; - padding-top: 0.8rem; + padding-top: 1rem; height: 1rem; vertical-align: baseline; border-bottom: 0 solid #bbb; diff --git a/site/js/list-loader.js b/site/js/list-loader.js index 95cc822..df626a4 100644 --- a/site/js/list-loader.js +++ b/site/js/list-loader.js @@ -119,6 +119,14 @@ function checkFetchStatus(resp) { // This is a global object to store the current list of voters export let data; +// Function to add short address to each voter in data +function makeShortAddress(data) { + for(let voter of data) { + voter["short_address"] = `${voter["House Number"]} ${voter["Street Name"]}`; + } + return(data); +} + /* Function: what happens after successful fetch: 1. Make the data using Papaparse, and store it by updating the global variable "data" 2. When having the data, make a geometry object, which has voter IDs, using makeVoterFeatureCollection(data) @@ -135,6 +143,9 @@ function loadVoterData(text) { Papa Parse is reading the last line of each csv as a person */ data = Papa.parse(text, { header: true, skipEmptyLines: true }).data; + // Create new property: combine house number with street name + data = makeShortAddress(data); + // Make a FeatureCollection const voters = makeVoterFeatureCollection(data); @@ -143,6 +154,8 @@ function loadVoterData(text) { baseMap.fitBounds(baseMap.voterLayers.getBounds()); showVotersInList(data); + // Store current list number to local storage to be loaded the next time + localStorage.setItem("current-list", inputNumber); window.data = data; } @@ -154,11 +167,13 @@ function loadVoterData(text) { function loadByListNumber(inputNumber) { let path = './data/voters_lists/' + inputNumber + '.csv'; + // Set the input box placeholder + listNumberInputEl.placeholder = `${inputNumber}`; + // Fetch the particular CSV file fetch(path) .then(checkFetchStatus) .then(loadVoterData); - localStorage.setItem("current-list", inputNumber); } /* Function on what happens when clicking on load button diff --git a/site/js/voter-list.js b/site/js/voter-list.js index 7a61efd..7e2c5bc 100644 --- a/site/js/voter-list.js +++ b/site/js/voter-list.js @@ -52,7 +52,7 @@ function showVotersInList(data) { // First empty out existing voter list voterList.innerHTML = ''; - let dataGroupedByAddress = groupByKey(data, "Street Name"); + let dataGroupedByAddress = groupByKey(data, "short_address"); let addressKeys = Object.keys(dataGroupedByAddress); for(const address of addressKeys) { From 26a6b5a6282873f54edc311ca547a9d5a7d4ce60 Mon Sep 17 00:00:00 2001 From: Leejere Date: Sat, 5 Nov 2022 18:54:40 -0400 Subject: [PATCH 23/95] highlight list item when selected --- site/css/voter-list.css | 30 ++++++++++++++++++++++++- site/js/main.js | 3 +++ site/js/save-edit.js | 3 +++ site/js/voter-list.js | 50 ++++++++++++++++++++++++++++++++--------- 4 files changed, 74 insertions(+), 12 deletions(-) create mode 100644 site/js/main.js diff --git a/site/css/voter-list.css b/site/css/voter-list.css index 38c318a..546bea0 100644 --- a/site/css/voter-list.css +++ b/site/css/voter-list.css @@ -34,7 +34,7 @@ #voter-list-component li { padding: 0.3rem; border-bottom: 1px solid #bbb; - height: 1.3rem; + height: 1.5rem; display: flex; justify-content: flex-start; align-items: center; @@ -50,6 +50,18 @@ border-bottom: 0 solid #bbb; } +#voter-list-component .list-voter:hover { + background-color: #eee; +} + +#voter-list-component .list-selected { + background-color: #0d59a9; +} + +#voter-list-component .list-selected:hover { + background-color: #0d59a9; +} + #voter-list-component li .list-name { position: relative; font-weight: 600; @@ -59,11 +71,27 @@ vertical-align: center; } +#voter-list-component .list-selected .list-name { + color: #fff; +} + #voter-list-component .button { font-size: 0.8rem; height: 1.3rem; } +#voter-list-component .list-icon { + background-color: #fff; + border-color: #fff; + color: #0d59a9; + vertical-align: center; + text-align: center; +} + +#voter-list-component .list-icon .material-symbols-outlined { + font-size: 1.2rem; +} + #voter-list-component #list-expand-button { margin-left: auto; margin-right: auto; diff --git a/site/js/main.js b/site/js/main.js new file mode 100644 index 0000000..68affbb --- /dev/null +++ b/site/js/main.js @@ -0,0 +1,3 @@ +// Create a local storage that stores which list to load +// Every time the page reopens, should read the stored list + diff --git a/site/js/save-edit.js b/site/js/save-edit.js index e69de29..a22f7ee 100644 --- a/site/js/save-edit.js +++ b/site/js/save-edit.js @@ -0,0 +1,3 @@ +// An object to store all the edits made to specific voters + +export let changeRecord = JSON.parse(localStorage.getItem("change-racord") || "{}"); diff --git a/site/js/voter-list.js b/site/js/voter-list.js index 7e2c5bc..1c7d982 100644 --- a/site/js/voter-list.js +++ b/site/js/voter-list.js @@ -1,13 +1,12 @@ -// function showVotersInList(data) { -// ; -// // Should add event listener on every voter in the list -// // Use something to store the id of the selected voter -// } - import { htmlToElement } from './htmlelement.js'; +// import { changeRecord } from "./save-edit"; +// DOM obj of voter list let voterList = document.querySelector('#voter-list'); +// DOM obj of each voter list item +let voterListItemsEl; + // Function to turn array of voters into a two-level array grouped by address // Use reduce; Initiate address if not already; append voter to address function groupByKey(data, key) { @@ -32,16 +31,43 @@ function addAddressToList(address) { voterList.append(addressEl); } +let selectedVoterId; + +// Function: highlight selected voter in the list +function highlightVoterInList(thisListItem) { + // Initialize: remove all existing highlighted voters, if any + for(const listItem of voterListItemsEl) { + listItem.className = "list-voter"; + } + // Highlight selected voter + thisListItem.classList.add("list-selected"); +} + +// Function: prepare the voterlist, i.e., add event listener +function listPrepare(voterListItemsEl) { + for(const thisListItem of voterListItemsEl) { + thisListItem.addEventListener("click", () => { + highlightVoterInList(thisListItem); + selectedVoterId = thisListItem.title; + console.log(selectedVoterId); + }); + } +} + // Function to show voters by each address function addVotersByAddress(votersByThisAddress) { for(const voter of votersByThisAddress) { const voterEl = htmlToElement(` -
  • +
  • ${voter["First Name"]} ${voter["Last Name"]}
    -
    -
    -
    -
    +
    + + hourglass_top + +
    +
    +
    +
  • `); voterList.append(voterEl); @@ -60,6 +86,8 @@ function showVotersInList(data) { let votersByThisAddress = dataGroupedByAddress[address]; addVotersByAddress(votersByThisAddress); } + voterListItemsEl = document.querySelectorAll(".list-voter"); + listPrepare(voterListItemsEl); } export { From 6aeb2c722654ba7d1fc994cd5f4b1c3a5d6bf30a Mon Sep 17 00:00:00 2001 From: Leejere Date: Sat, 5 Nov 2022 19:24:35 -0400 Subject: [PATCH 24/95] update voter list; still on button CSS --- site/css/voter-list.css | 36 +++++++++++++++++++++++++++++++++--- site/js/voter-list.js | 30 +++++++++++++++++++++++------- 2 files changed, 56 insertions(+), 10 deletions(-) diff --git a/site/css/voter-list.css b/site/css/voter-list.css index 546bea0..a34a02b 100644 --- a/site/css/voter-list.css +++ b/site/css/voter-list.css @@ -80,15 +80,45 @@ height: 1.3rem; } -#voter-list-component .list-icon { +#voter-list-component .status-icon { + height: 1.1rem; + width: 1.1rem; + border-radius: 0.1rem; + margin-right: 0.4rem; + float: left; + border: 1.5px solid #0d59a9; + cursor: pointer; + text-align: center; + vertical-align: middle; + border-bottom-width: 3px; background-color: #fff; border-color: #fff; color: #0d59a9; - vertical-align: center; + font-size: 0.9rem; + font-weight: 800; +} + +#voter-list-component .party-icon { + min-width: 2rem; + height: 1.3rem; + float: left; + border: 1.5px solid #0d59a9; + cursor: pointer; text-align: center; + vertical-align: middle; + border-bottom-width: 3px; + border-radius: 0 0 0.5rem 0.5rem; + background-color: #fff; + border-color: #fff; + color: #0d59a9; + font-size: 1rem; + font-weight: 800; + display: flex; + align-items: center; + justify-content: center; } -#voter-list-component .list-icon .material-symbols-outlined { +#voter-list-component .status-icon .material-symbols-outlined { font-size: 1.2rem; } diff --git a/site/js/voter-list.js b/site/js/voter-list.js index 1c7d982..b3774bf 100644 --- a/site/js/voter-list.js +++ b/site/js/voter-list.js @@ -1,5 +1,5 @@ import { htmlToElement } from './htmlelement.js'; -// import { changeRecord } from "./save-edit"; +import { changeRecord } from "./save-edit.js"; // DOM obj of voter list let voterList = document.querySelector('#voter-list'); @@ -54,18 +54,34 @@ function listPrepare(voterListItemsEl) { } } +function getStatusIcon(voterId) { + const status = changeRecord[voterId] || "pending"; + + // Default icon: pending hourglass + let statusIcon = `hourglass_top`; + if(status == "pending") { + statusIcon = `hourglass_top`; + } // Other icons to be added + return(statusIcon); +} + // Function to show voters by each address function addVotersByAddress(votersByThisAddress) { for(const voter of votersByThisAddress) { + + // Get current voter ID + const voterId = voter["ID Number"]; + + // Check status of this voter + const statusIcon = getStatusIcon(voterId); + + // Check party affiliation + const voterEl = htmlToElement(`
  • ${voter["First Name"]} ${voter["Last Name"]}
    -
    - - hourglass_top - -
    -
    +
    ${statusIcon}
    +
    d
  • From 2024e0268ba1678ff96b2ce76d6e7f973051791f Mon Sep 17 00:00:00 2001 From: Leejere Date: Sun, 6 Nov 2022 01:08:59 -0500 Subject: [PATCH 25/95] draft finished - voter list icons --- site/css/map.css | 2 +- site/css/voter-list.css | 60 ++++++++++++++++++++--------------------- site/js/voter-list.js | 60 ++++++++++++++++++++++++++++++++--------- 3 files changed, 79 insertions(+), 43 deletions(-) diff --git a/site/css/map.css b/site/css/map.css index 8d9365f..fde121d 100644 --- a/site/css/map.css +++ b/site/css/map.css @@ -1,6 +1,6 @@ #map-component { position: fixed; width: 100vw; - height: 100vh; + height: 98vh; z-index: 0; } diff --git a/site/css/voter-list.css b/site/css/voter-list.css index a34a02b..80c658b 100644 --- a/site/css/voter-list.css +++ b/site/css/voter-list.css @@ -80,46 +80,30 @@ height: 1.3rem; } -#voter-list-component .status-icon { - height: 1.1rem; - width: 1.1rem; - border-radius: 0.1rem; - margin-right: 0.4rem; - float: left; - border: 1.5px solid #0d59a9; - cursor: pointer; - text-align: center; - vertical-align: middle; - border-bottom-width: 3px; +#voter-list-component .list-icon { background-color: #fff; - border-color: #fff; - color: #0d59a9; + float: left; + height: 1.1rem; + margin: 0.3rem; + min-width: 1.5rem; font-size: 0.9rem; font-weight: 800; -} - -#voter-list-component .party-icon { - min-width: 2rem; - height: 1.3rem; - float: left; - border: 1.5px solid #0d59a9; - cursor: pointer; + padding: 0.15rem 0.05rem; text-align: center; - vertical-align: middle; - border-bottom-width: 3px; - border-radius: 0 0 0.5rem 0.5rem; - background-color: #fff; - border-color: #fff; - color: #0d59a9; - font-size: 1rem; - font-weight: 800; display: flex; align-items: center; justify-content: center; + line-height: 0.8rem; + border-radius: 0 0 0.3rem 0.3rem; + border: 1.25px solid #0d59a9; + border-bottom-width: 2.5px; } -#voter-list-component .status-icon .material-symbols-outlined { +#voter-list-component .material-symbols-outlined { font-size: 1.2rem; + text-align: center; + margin-left: auto; + margin-right: auto; } #voter-list-component #list-expand-button { @@ -133,3 +117,19 @@ border-radius: 0.1rem; margin-right: 0.4rem; } + +.icon-ok-color { + color: #15b88a; +} + +.icon-democrat-color { + color: #0d59a9; +} + +.icon-republican-color { + color: #e96a46; +} + +.icon-oth-party-color { + color: #c1c1c1; +} \ No newline at end of file diff --git a/site/js/voter-list.js b/site/js/voter-list.js index b3774bf..36eb66f 100644 --- a/site/js/voter-list.js +++ b/site/js/voter-list.js @@ -54,15 +54,47 @@ function listPrepare(voterListItemsEl) { } } -function getStatusIcon(voterId) { - const status = changeRecord[voterId] || "pending"; +// Function to get the canvassing status (visited, pendign, etc.) for each voter +function getCanvassStatusIcon(voterId) { + const canvassStatus = changeRecord[voterId] || "pending"; // Default icon: pending hourglass - let statusIcon = `hourglass_top`; - if(status == "pending") { - statusIcon = `hourglass_top`; + let canvassStatusIcon = `hourglass_top`; + if(canvassStatus == "pending") { + canvassStatusIcon = `hourglass_top`; } // Other icons to be added - return(statusIcon); + return(canvassStatusIcon); +} + +// Function to get the voter status (active or inactive) for each voter +function getVoterStatusIcon(voter) { + const activeVoterIcon = `check_circle`; + const inactiveVoterIcon = `check_circle`; + + const voterStatusIcon = voter["Voter Status"] == "A" ? activeVoterIcon : inactiveVoterIcon; + + return voterStatusIcon; +} + +// Function to get the party for each voter +function getPartyColor(voter) { + const democratColor = "icon-democrat-color"; + const republicanColor = "icon-republican-color"; + const otherPartyColor = "icon-oth-party-color"; + + let partyColor; + switch(voter["Party Code"]) { + case "D": + partyColor = democratColor; + break; + case "R": + partyColor = republicanColor; + break; + default: + partyColor = otherPartyColor; + } + + return partyColor; } // Function to show voters by each address @@ -72,18 +104,22 @@ function addVotersByAddress(votersByThisAddress) { // Get current voter ID const voterId = voter["ID Number"]; - // Check status of this voter - const statusIcon = getStatusIcon(voterId); + // Get voter status icon + const voterStatusIcon = getVoterStatusIcon(voter); + + // Check canvassing status of this voter and get the icon + const canvassStatusIcon = getCanvassStatusIcon(voterId); // Check party affiliation + const party = voter["Party Code"]; + const partyColor = getPartyColor(voter); const voterEl = htmlToElement(`
  • ${voter["First Name"]} ${voter["Last Name"]}
    -
    ${statusIcon}
    -
    d
    -
    -
    +
    ${canvassStatusIcon}
    +
    ${voterStatusIcon}
    +
    ${party}
  • `); voterList.append(voterEl); From 8e7573058094388b9352aeac11df749a31516f4d Mon Sep 17 00:00:00 2001 From: Leejere Date: Sun, 6 Nov 2022 01:31:43 -0500 Subject: [PATCH 26/95] search also by address; enable multi-word search --- site/index.html | 2 +- site/js/search-box.js | 35 ++++++++++++++++++++++++++--------- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/site/index.html b/site/index.html index c103ef9..588bf9a 100644 --- a/site/index.html +++ b/site/index.html @@ -81,7 +81,7 @@
    - +
    diff --git a/site/js/search-box.js b/site/js/search-box.js index e2da5f0..0d8daab 100644 --- a/site/js/search-box.js +++ b/site/js/search-box.js @@ -1,27 +1,44 @@ import { data } from './list-loader.js'; import { showVotersInList } from './voter-list.js'; -import { voterList } from './voter-list.js'; let voterInputBoxEl = document.querySelector('#search-box-input'); +// Step in filter by search box; match if an individual voter fulfills the filter +function matchInput(voter, inputText) { + + // Split the input text into individual words + const keyWords = inputText.split(" ").map(s => s.replace(/\s/g, "")); + + // Match with first name, last name, and short address + const firstName = voter['First Name'].toLowerCase(); + const lastName = voter['Last Name'].toLowerCase(); + const shortAddress = voter["short_address"].toLowerCase(); + + // Rule 1: each word should be matched + // Rule 2: either match with first name, or last name, or address + let includesKeyword = keyWords.map(word => { + let eachWordMatch = firstName.includes(word) || lastName.includes(word) || shortAddress.includes(word); + return eachWordMatch; + }); + return !includesKeyword.includes(false); +} + // Filter by the input of search box -// Search by first name or last name -function filterByName() { +// Search by first name or last name or short address +function filterByNameAddress() { let filteredVoter = data; const inputText = voterInputBoxEl.value.toLowerCase(); - filteredVoter = filteredVoter.filter(function(voter) { - const firstName = voter['First Name'].toLowerCase(); - const lastName = voter['Last Name'].toLowerCase(); - const hasInputText = firstName.includes(inputText) || lastName.includes(inputText); - return hasInputText; + filteredVoter = filteredVoter.filter((voter) => { + let isMatched = matchInput(voter, inputText); + return isMatched; }); return filteredVoter; } // What happens when searchbox has input function onSearchBoxInput() { - const filteredVoter = filterByName(); + const filteredVoter = filterByNameAddress(); showVotersInList(filteredVoter); } From 8c28de2ad8637f75260f5514ad774a0e7563f8d4 Mon Sep 17 00:00:00 2001 From: Leejere Date: Sun, 6 Nov 2022 22:09:05 -0500 Subject: [PATCH 27/95] load 0101 automatically if not specified --- site/js/list-loader.js | 2 +- site/js/voter-list.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/site/js/list-loader.js b/site/js/list-loader.js index df626a4..b43388a 100644 --- a/site/js/list-loader.js +++ b/site/js/list-loader.js @@ -192,7 +192,7 @@ function onLoadButtonClick() { Automatically load list from local storage */ -let autoList = localStorage.getItem("current-list" || "{}"); +let autoList = localStorage.getItem("current-list") || "0101"; if(autoList.length == 4) { loadByListNumber(autoList); } diff --git a/site/js/voter-list.js b/site/js/voter-list.js index 36eb66f..01182b9 100644 --- a/site/js/voter-list.js +++ b/site/js/voter-list.js @@ -69,7 +69,7 @@ function getCanvassStatusIcon(voterId) { // Function to get the voter status (active or inactive) for each voter function getVoterStatusIcon(voter) { const activeVoterIcon = `check_circle`; - const inactiveVoterIcon = `check_circle`; + const inactiveVoterIcon = `close`; const voterStatusIcon = voter["Voter Status"] == "A" ? activeVoterIcon : inactiveVoterIcon; From 40512717b081e5d525fc0d25d79b38799877d8f7 Mon Sep 17 00:00:00 2001 From: Leejere Date: Sun, 6 Nov 2022 22:32:02 -0500 Subject: [PATCH 28/95] fixed a bug --- site/css/map.css | 2 +- site/js/list-loader.js | 18 ++++++++++++------ site/js/map.js | 4 ++-- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/site/css/map.css b/site/css/map.css index fde121d..8d9365f 100644 --- a/site/css/map.css +++ b/site/css/map.css @@ -1,6 +1,6 @@ #map-component { position: fixed; width: 100vw; - height: 98vh; + height: 100vh; z-index: 0; } diff --git a/site/js/list-loader.js b/site/js/list-loader.js index b43388a..ac89ada 100644 --- a/site/js/list-loader.js +++ b/site/js/list-loader.js @@ -69,7 +69,7 @@ function coordsAreValid(lng, lat) { function makeVoterFeatureCollection(data) { // Construct a geojson empty frame - const voters = { + let voters = { type: "FeatureCollection", features: [], }; @@ -99,8 +99,6 @@ function makeVoterFeatureCollection(data) { } } } - - console.log(voters); return voters; } @@ -138,16 +136,21 @@ function loadVoterData(text) { if(text == false) { return; } + // Note skipEmptyLines: true; cleaning up the CSV /* notes with Mjumbe: Papa Parse is reading the last line of each csv as a person */ + data = {}; + data = Papa.parse(text, { header: true, skipEmptyLines: true }).data; // Create new property: combine house number with street name data = makeShortAddress(data); + console.log("data is"); // Make a FeatureCollection const voters = makeVoterFeatureCollection(data); + console.log(voters); // Show voters on the map showVotersOnMap(voters); @@ -192,11 +195,14 @@ function onLoadButtonClick() { Automatically load list from local storage */ -let autoList = localStorage.getItem("current-list") || "0101"; -if(autoList.length == 4) { - loadByListNumber(autoList); +let autoList = localStorage.getItem("current-list") || "{}"; +if(autoList == "{}" || autoList == undefined || autoList.length != 4) { + autoList = "0101"; } +loadByListNumber(autoList); + + // Add event listener to the load button loadButtonEl.addEventListener("click", onLoadButtonClick); diff --git a/site/js/map.js b/site/js/map.js index 2c1ea28..1b9a00e 100644 --- a/site/js/map.js +++ b/site/js/map.js @@ -14,8 +14,8 @@ FUNCTION TO SHOW VOTERS ON THE MAP */ function showVotersOnMap(voters) { - if(baseMap.voterLayers !== undefined) { - baseMap.removeLayer(baseMap.schoolLayers); + if(baseMap.voterLayers != undefined) { + baseMap.removeLayer(baseMap.voterLayers); } baseMap.voterLayers = L.geoJSON(voters, { pointToLayer: (point, latLng) => L.circleMarker(latLng), From 581dcc0a17c46f998e1a791ce79d9005f17ee50d Mon Sep 17 00:00:00 2001 From: Leejere Date: Sun, 6 Nov 2022 22:43:29 -0500 Subject: [PATCH 29/95] adjust zoom bounds to fit viewport, because of the existence of voter list --- site/js/list-loader.js | 2 +- site/js/map.js | 26 +++++++++++++++++++++++--- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/site/js/list-loader.js b/site/js/list-loader.js index ac89ada..28521ba 100644 --- a/site/js/list-loader.js +++ b/site/js/list-loader.js @@ -154,7 +154,7 @@ function loadVoterData(text) { // Show voters on the map showVotersOnMap(voters); - baseMap.fitBounds(baseMap.voterLayers.getBounds()); + showVotersInList(data); // Store current list number to local storage to be loaded the next time diff --git a/site/js/map.js b/site/js/map.js index 1b9a00e..3e44155 100644 --- a/site/js/map.js +++ b/site/js/map.js @@ -13,6 +13,25 @@ L.tileLayer('https://tiles.stadiamaps.com/tiles/alidade_smooth/{z}/{x}/{y}{r}.pn FUNCTION TO SHOW VOTERS ON THE MAP */ +// What happens when voter marker gets clicked +function voterMarkerOnClick(event) { + console.log(event.layer.feature.properties.id); +} + +// Adjust bounds +function getAdjustedBounds(layers) { + let bounds = layers.getBounds(); + let adjustRatio = 0.15; + const northLat = bounds._northEast.lat; + const southLat = bounds._southWest.lat; + const latRange = northLat - southLat; + const adjustAmount = latRange * adjustRatio; + bounds._southWest.lat = southLat + adjustAmount; + bounds._northEast.lat = northLat + adjustAmount; + + return bounds; +} + function showVotersOnMap(voters) { if(baseMap.voterLayers != undefined) { baseMap.removeLayer(baseMap.voterLayers); @@ -27,11 +46,12 @@ function showVotersOnMap(voters) { weight: 1, }, }) - .on("click", (e) => { - console.log(e.layer.feature.properties.id); - }) + .on("click", voterMarkerOnClick) .bindPopup(point => point.feature.properties.last_name) .addTo(baseMap); + + let bounds = getAdjustedBounds(baseMap.voterLayers); + baseMap.fitBounds(bounds); } export { From cce119673403bb2934ba17078e6a0d6f6ee3ee91 Mon Sep 17 00:00:00 2001 From: Leejere Date: Mon, 7 Nov 2022 01:30:45 -0500 Subject: [PATCH 30/95] finish highlight voter system 1. Use global variable selectedVoter to store the currently voter selected. If no voter is selected at the moment, variable is undefined 2. Whenever a click on the voter list or on the map happens: 2.1 Check if newly selected is the same as the current. 2.1.1 If same, update selectedVoter to undefined -> use unhighlightVoter function 2.1.2 If same, update selectedVoter. unhighlight current voter, highlight new voter --- site/js/list-loader.js | 30 ++++++---- site/js/map.js | 18 ++++-- site/js/search-box.js | 6 +- site/js/selected-voter.js | 117 +++++++++++++++++++++++++++++++++++++- site/js/voter-list.js | 21 ++----- 5 files changed, 158 insertions(+), 34 deletions(-) diff --git a/site/js/list-loader.js b/site/js/list-loader.js index 28521ba..d6426cc 100644 --- a/site/js/list-loader.js +++ b/site/js/list-loader.js @@ -1,5 +1,5 @@ import { showVotersOnMap } from "./map.js"; -import { baseMap } from "./map.js"; +import { fitMap } from "./map.js"; import { showVotersInList } from './voter-list.js'; /* @@ -19,6 +19,15 @@ let inputNumber; // A variable to store whether the list loader component is currently hidden let loaderElIsHidden = 0; +// This is a global object to store the current list of voters +export let data; +export let votersFeature; + +// We should also have two objects to store the filtered data and filtered feature collection +// These are used in all the filters +export let filteredData; +export let filteredVotersFeature; + hideButtonEl.addEventListener("click", ( ) => { if(loaderElIsHidden == 0) { hidableChunkEl.style.transform = "translateX(-16em)"; @@ -69,7 +78,7 @@ function coordsAreValid(lng, lat) { function makeVoterFeatureCollection(data) { // Construct a geojson empty frame - let voters = { + const voters = { type: "FeatureCollection", features: [], }; @@ -114,9 +123,6 @@ function checkFetchStatus(resp) { } } -// This is a global object to store the current list of voters -export let data; - // Function to add short address to each voter in data function makeShortAddress(data) { for(let voter of data) { @@ -141,19 +147,23 @@ function loadVoterData(text) { /* notes with Mjumbe: Papa Parse is reading the last line of each csv as a person */ data = {}; - data = Papa.parse(text, { header: true, skipEmptyLines: true }).data; // Create new property: combine house number with street name data = makeShortAddress(data); - console.log("data is"); + + // Initialize filteredData + filteredData = data; // Make a FeatureCollection - const voters = makeVoterFeatureCollection(data); - console.log(voters); + votersFeature = makeVoterFeatureCollection(data); + + // Initialize filteredVoters + filteredVotersFeature = votersFeature; // Show voters on the map - showVotersOnMap(voters); + showVotersOnMap(votersFeature); + fitMap(); showVotersInList(data); diff --git a/site/js/map.js b/site/js/map.js index 3e44155..589e12f 100644 --- a/site/js/map.js +++ b/site/js/map.js @@ -1,3 +1,5 @@ +import { onSelectAction } from "./selected-voter.js"; + /* INITIALIZE BASE MAP TO SHOW */ @@ -15,7 +17,7 @@ FUNCTION TO SHOW VOTERS ON THE MAP // What happens when voter marker gets clicked function voterMarkerOnClick(event) { - console.log(event.layer.feature.properties.id); + onSelectAction(event.layer.feature.properties.id); } // Adjust bounds @@ -32,6 +34,13 @@ function getAdjustedBounds(layers) { return bounds; } +// Fit map to bounds +function fitMap() { + // Fit voters on the map + let bounds = getAdjustedBounds(baseMap.voterLayers); + baseMap.fitBounds(bounds); +} + function showVotersOnMap(voters) { if(baseMap.voterLayers != undefined) { baseMap.removeLayer(baseMap.voterLayers); @@ -40,7 +49,7 @@ function showVotersOnMap(voters) { pointToLayer: (point, latLng) => L.circleMarker(latLng), style: { radius: 7, - color: "#0d59a9", + color: "#aaaaaa", stroke: true, opacity: 0.5, weight: 1, @@ -49,13 +58,12 @@ function showVotersOnMap(voters) { .on("click", voterMarkerOnClick) .bindPopup(point => point.feature.properties.last_name) .addTo(baseMap); - - let bounds = getAdjustedBounds(baseMap.voterLayers); - baseMap.fitBounds(bounds); } export { showVotersOnMap, + fitMap, + voterMarkerOnClick, }; /* Requirement: diff --git a/site/js/search-box.js b/site/js/search-box.js index 0d8daab..4a896c7 100644 --- a/site/js/search-box.js +++ b/site/js/search-box.js @@ -3,6 +3,8 @@ import { showVotersInList } from './voter-list.js'; let voterInputBoxEl = document.querySelector('#search-box-input'); + + // Step in filter by search box; match if an individual voter fulfills the filter function matchInput(voter, inputText) { @@ -38,8 +40,8 @@ function filterByNameAddress() { // What happens when searchbox has input function onSearchBoxInput() { - const filteredVoter = filterByNameAddress(); - showVotersInList(filteredVoter); + const filteredData = filterByNameAddress(); + showVotersInList(filteredData); } voterInputBoxEl.addEventListener("input", onSearchBoxInput); \ No newline at end of file diff --git a/site/js/selected-voter.js b/site/js/selected-voter.js index 8000c6f..6d69cc5 100644 --- a/site/js/selected-voter.js +++ b/site/js/selected-voter.js @@ -1,2 +1,115 @@ -// function highlightVoter(id) { -// } \ No newline at end of file +/* +1. Use global variable selectedVoter to store the currently voter selected. + If no voter is selected at the moment, variable is undefined +2. Whenever a click on the voter list or on the map happens: + 2.1 Check if newly selected is the same as the current. + 2.1.1 If same, update selectedVoter to undefined -> use unhighlightVoter function + 2.1.2 If same, update selectedVoter. unhighlight current voter, highlight new voter +*/ + +import { voterListItemsEl } from "./voter-list.js"; +import { baseMap } from "./map.js"; +import { showVotersOnMap } from "./map.js"; +import { filteredVotersFeature } from "./list-loader.js"; +import { voterMarkerOnClick } from "./map.js"; + +/* +The unhighlight function is made of two parts: +unhighlight voter in the list, and unhighlight voter on the map +*/ + +// Initialize the variable to store which voter is currently selected +export let selectedVoter = undefined; + +// Unhighlight all the voters +function unhighlightVoterInList() { + for(const listItem of voterListItemsEl) { + listItem.className = "list-voter"; + } +} + +function unhighlightVoterOnMap() { + // First remove the highlight layer + // Then re-run showVotersOnMap + // because previously when a voter was highlighted, its regular marker was removed + if(baseMap.highlightLayer !== undefined) { + baseMap.removeLayer(baseMap.highlightLayer); + } + showVotersOnMap(filteredVotersFeature); + window.testF = filteredVotersFeature; +} + +function unhighlightVoter() { + unhighlightVoterInList(); + unhighlightVoterOnMap(); +} + +/* +The highlight function is made of two parts: +highlight voter in list, and highlight voter on map +*/ + +function highlightVoterInList(thisId) { + // Initialize: remove all existing highlighted voters, if any + unhighlightVoterInList(); + // Highlight selected voter + let thisListItem = Array.from(voterListItemsEl).find(item => item.title == thisId); + thisListItem.classList.add("list-selected"); +} + +function highlightVoterOnMap(thisId) { + + // First remove the existing highlight voter, if existing + unhighlightVoterOnMap(); + + let selectedFeature; + + // Then remove the regular marker of the selected voter + for(let entry of Object.entries(baseMap.voterLayers._layers)) { + if(entry[1].feature.properties.id == thisId) { + selectedFeature = entry[1].feature; + baseMap.removeLayer(entry[1]); + break; + } + } + + // Then show this highlighted voter on the map + baseMap.highlightLayer = L.geoJSON(selectedFeature, { + pointToLayer: (point, latLng) => L.circleMarker(latLng), + style: { + radius: 10, + color: "#0d59a9", + fillColor: "#0d59a9", + stroke: true, + opacity: 1, + fillOpacity: 0.7, + weight: 2, + }, + }) + .on("click", voterMarkerOnClick) + .addTo(baseMap); + +} + +function highlightVoter(thisId) { + highlightVoterInList(thisId); + highlightVoterOnMap(thisId); +} + +// Main. This function gets called whenever a "select" action is made +// i.e., clicking on a list item, or on a map marker + +// Either highlight new voter and update selectedVoter, or unhighlight current voter +function onSelectAction(thisId) { + + if(selectedVoter != undefined && thisId == selectedVoter) { + unhighlightVoter(); + } else { + highlightVoter(thisId); + selectedVoter = thisId; + } +} + +export { + onSelectAction, +}; \ No newline at end of file diff --git a/site/js/voter-list.js b/site/js/voter-list.js index 01182b9..90b42aa 100644 --- a/site/js/voter-list.js +++ b/site/js/voter-list.js @@ -1,11 +1,13 @@ import { htmlToElement } from './htmlelement.js'; import { changeRecord } from "./save-edit.js"; +import { onSelectAction } from "./selected-voter.js"; // DOM obj of voter list let voterList = document.querySelector('#voter-list'); // DOM obj of each voter list item -let voterListItemsEl; +// Not defined yet; defined in showVotersInList; +export let voterListItemsEl; // Function to turn array of voters into a two-level array grouped by address // Use reduce; Initiate address if not already; append voter to address @@ -31,25 +33,13 @@ function addAddressToList(address) { voterList.append(addressEl); } -let selectedVoterId; - -// Function: highlight selected voter in the list -function highlightVoterInList(thisListItem) { - // Initialize: remove all existing highlighted voters, if any - for(const listItem of voterListItemsEl) { - listItem.className = "list-voter"; - } - // Highlight selected voter - thisListItem.classList.add("list-selected"); -} // Function: prepare the voterlist, i.e., add event listener function listPrepare(voterListItemsEl) { for(const thisListItem of voterListItemsEl) { thisListItem.addEventListener("click", () => { - highlightVoterInList(thisListItem); - selectedVoterId = thisListItem.title; - console.log(selectedVoterId); + let thisId = thisListItem.title; + onSelectAction(thisId); }); } } @@ -139,6 +129,7 @@ function showVotersInList(data) { addVotersByAddress(votersByThisAddress); } voterListItemsEl = document.querySelectorAll(".list-voter"); + window.voterListItemsEl = voterListItemsEl; listPrepare(voterListItemsEl); } From e613dbd4092fbef5525ef58c9bf4d9b59d6722ea Mon Sep 17 00:00:00 2001 From: Leejere Date: Mon, 7 Nov 2022 03:50:50 -0500 Subject: [PATCH 31/95] search box filter also applied to map markers --- site/js/list-filters.js | 31 +++++++++++++ site/js/list-loader.js | 64 ++------------------------ site/js/map.js | 97 +++++++++++++++++++++++++++++++-------- site/js/search-box.js | 15 +++--- site/js/selected-voter.js | 6 +-- 5 files changed, 125 insertions(+), 88 deletions(-) diff --git a/site/js/list-filters.js b/site/js/list-filters.js index e69de29..eaf47d4 100644 --- a/site/js/list-filters.js +++ b/site/js/list-filters.js @@ -0,0 +1,31 @@ +/* +This script contains the links to all the filters. +Every time a filter is applied, changed, or taken off, +we should calculate a new filtered data by applying all the filters. + +Once all the filters are applied, update the voter list and voter map + +Sequence: +eventlistener -> function: 1. apply all filters on by one, 2. update voter list and map +*/ + +import { data } from "./list-loader.js"; +import { filterByNameAddress } from "./search-box.js"; +import { showVotersInList } from "./voter-list.js"; +import { showVotersOnMap } from "./map.js"; + +//import { makeVoterFeatureCollection } from "./map.js"; + +// Initialize +export let filteredData; + +/* +Search box filter +*/ + +import { voterInputBoxEl } from "./search-box.js"; +voterInputBoxEl.addEventListener("input", ( ) => { + filteredData = filterByNameAddress(data); + showVotersInList(filteredData); + showVotersOnMap(filteredData); +}); \ No newline at end of file diff --git a/site/js/list-loader.js b/site/js/list-loader.js index d6426cc..5cfc8d6 100644 --- a/site/js/list-loader.js +++ b/site/js/list-loader.js @@ -1,6 +1,7 @@ import { showVotersOnMap } from "./map.js"; import { fitMap } from "./map.js"; import { showVotersInList } from './voter-list.js'; +import { makeVoterFeatureCollection } from "./map.js"; /* Hide and Show List Loader @@ -23,11 +24,7 @@ let loaderElIsHidden = 0; export let data; export let votersFeature; -// We should also have two objects to store the filtered data and filtered feature collection -// These are used in all the filters -export let filteredData; -export let filteredVotersFeature; - +// The list loader thing can be hidden (not very important) hideButtonEl.addEventListener("click", ( ) => { if(loaderElIsHidden == 0) { hidableChunkEl.style.transform = "translateX(-16em)"; @@ -62,55 +59,6 @@ function errorTooltip(inputNumber) { return interruptLoad; } -// Util function to make sure coords are valid -function coordsAreValid(lng, lat) { - let result = false; - if(typeof(lng) == "number" && typeof(lat) == "number") { - if(lng < -73 && lng > -77 && lat < 41 && lat > 38) { - result = true; - } - } - return result; -} - -// Function to make feature collection out of the imported data -// Record only key information -function makeVoterFeatureCollection(data) { - - // Construct a geojson empty frame - const voters = { - type: "FeatureCollection", - features: [], - }; - - // Write into geojson - for(let i = 0; i < data.length; i++) { - let thisLngLat = data[i]["TIGER/Line Lng/Lat"]; - if(typeof(thisLngLat) == "string"){ - - let thisLng = Number(thisLngLat.split(",")[0]); - let thisLat = Number(thisLngLat.split(",")[1]); - - if(coordsAreValid(thisLng, thisLat)) { - voters.features.push( { - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [thisLng, thisLat], - }, - "properties": { - "id": data[i]["ID Number"], - "last_name": data[i]["Last Name"], - "first_name": data[i]["First Name"], - "address": data[i]["TIGER/Line Matched Address"], - }, - }); - } - } - } - return voters; -} - /* Function to check if fetch is successful. If so, do fetch; if not, show on tooltip */ function checkFetchStatus(resp) { @@ -152,17 +100,11 @@ function loadVoterData(text) { // Create new property: combine house number with street name data = makeShortAddress(data); - // Initialize filteredData - filteredData = data; - // Make a FeatureCollection votersFeature = makeVoterFeatureCollection(data); - // Initialize filteredVoters - filteredVotersFeature = votersFeature; - // Show voters on the map - showVotersOnMap(votersFeature); + showVotersOnMap(data); fitMap(); showVotersInList(data); diff --git a/site/js/map.js b/site/js/map.js index 589e12f..453c319 100644 --- a/site/js/map.js +++ b/site/js/map.js @@ -11,6 +11,58 @@ L.tileLayer('https://tiles.stadiamaps.com/tiles/alidade_smooth/{z}/{x}/{y}{r}.pn attribution: '© Stadia Maps, © OpenStreetMap contributors', }).addTo(baseMap); +/* +FUNCTION TO MAKE FEATURE COLLECTION FROM DATA +*/ + +// Util function to make sure coords are valid +function coordsAreValid(lng, lat) { + let result = false; + if(typeof(lng) == "number" && typeof(lat) == "number") { + if(lng < -73 && lng > -77 && lat < 41 && lat > 38) { + result = true; + } + } + return result; +} +// Function to make feature collection out of the imported data +// Record only key information +function makeVoterFeatureCollection(thisData) { + + // Construct a geojson empty frame + const voters = { + type: "FeatureCollection", + features: [], + }; + + // Write into geojson + for(let i = 0; i < thisData.length; i++) { + let thisLngLat = thisData[i]["TIGER/Line Lng/Lat"]; + if(typeof(thisLngLat) == "string"){ + + let thisLng = Number(thisLngLat.split(",")[0]); + let thisLat = Number(thisLngLat.split(",")[1]); + + if(coordsAreValid(thisLng, thisLat)) { + voters.features.push( { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [thisLng, thisLat], + }, + "properties": { + "id": thisData[i]["ID Number"], + "last_name": thisData[i]["Last Name"], + "first_name": thisData[i]["First Name"], + "address": thisData[i]["TIGER/Line Matched Address"], + }, + }); + } + } + } + return voters; +} + /* FUNCTION TO SHOW VOTERS ON THE MAP */ @@ -20,7 +72,33 @@ function voterMarkerOnClick(event) { onSelectAction(event.layer.feature.properties.id); } +function showVotersOnMap(thisData) { + let voterFeatures = makeVoterFeatureCollection(thisData); + if(baseMap.voterLayers != undefined) { + baseMap.removeLayer(baseMap.voterLayers); + } + baseMap.voterLayers = L.geoJSON(voterFeatures, { + pointToLayer: (point, latLng) => L.circleMarker(latLng), + style: { + radius: 7, + color: "#aaaaaa", + stroke: true, + opacity: 0.5, + weight: 1, + }, + }) + .on("click", voterMarkerOnClick) + .bindPopup(point => point.feature.properties.last_name) + .addTo(baseMap); +} + +/* +FUNCTION THAT ZOOM TO CURRENT BOUNDS +*/ + // Adjust bounds +// We have a voter list which blocks part of the view port +// Therefore we need to move the bounds a bit northward function getAdjustedBounds(layers) { let bounds = layers.getBounds(); let adjustRatio = 0.15; @@ -41,29 +119,12 @@ function fitMap() { baseMap.fitBounds(bounds); } -function showVotersOnMap(voters) { - if(baseMap.voterLayers != undefined) { - baseMap.removeLayer(baseMap.voterLayers); - } - baseMap.voterLayers = L.geoJSON(voters, { - pointToLayer: (point, latLng) => L.circleMarker(latLng), - style: { - radius: 7, - color: "#aaaaaa", - stroke: true, - opacity: 0.5, - weight: 1, - }, - }) - .on("click", voterMarkerOnClick) - .bindPopup(point => point.feature.properties.last_name) - .addTo(baseMap); -} export { showVotersOnMap, fitMap, voterMarkerOnClick, + makeVoterFeatureCollection, }; /* Requirement: diff --git a/site/js/search-box.js b/site/js/search-box.js index 4a896c7..c792ba6 100644 --- a/site/js/search-box.js +++ b/site/js/search-box.js @@ -1,9 +1,7 @@ import { data } from './list-loader.js'; import { showVotersInList } from './voter-list.js'; -let voterInputBoxEl = document.querySelector('#search-box-input'); - - +export let voterInputBoxEl = document.querySelector('#search-box-input'); // Step in filter by search box; match if an individual voter fulfills the filter function matchInput(voter, inputText) { @@ -27,7 +25,7 @@ function matchInput(voter, inputText) { // Filter by the input of search box // Search by first name or last name or short address -function filterByNameAddress() { +function filterByNameAddress(data) { let filteredVoter = data; const inputText = voterInputBoxEl.value.toLowerCase(); @@ -40,8 +38,13 @@ function filterByNameAddress() { // What happens when searchbox has input function onSearchBoxInput() { - const filteredData = filterByNameAddress(); + const filteredData = filterByNameAddress(data); showVotersInList(filteredData); } -voterInputBoxEl.addEventListener("input", onSearchBoxInput); \ No newline at end of file +//voterInputBoxEl.addEventListener("input", onSearchBoxInput); + +export { + onSearchBoxInput, + filterByNameAddress, +}; \ No newline at end of file diff --git a/site/js/selected-voter.js b/site/js/selected-voter.js index 6d69cc5..f36b106 100644 --- a/site/js/selected-voter.js +++ b/site/js/selected-voter.js @@ -10,7 +10,7 @@ import { voterListItemsEl } from "./voter-list.js"; import { baseMap } from "./map.js"; import { showVotersOnMap } from "./map.js"; -import { filteredVotersFeature } from "./list-loader.js"; +import { filteredData } from "./list-filters.js"; import { voterMarkerOnClick } from "./map.js"; /* @@ -35,8 +35,7 @@ function unhighlightVoterOnMap() { if(baseMap.highlightLayer !== undefined) { baseMap.removeLayer(baseMap.highlightLayer); } - showVotersOnMap(filteredVotersFeature); - window.testF = filteredVotersFeature; + showVotersOnMap(filteredData); } function unhighlightVoter() { @@ -104,6 +103,7 @@ function onSelectAction(thisId) { if(selectedVoter != undefined && thisId == selectedVoter) { unhighlightVoter(); + selectedVoter = undefined; } else { highlightVoter(thisId); selectedVoter = thisId; From 846b48fb439ab4254b38e3b505ea9829bb64fde2 Mon Sep 17 00:00:00 2001 From: Leejere Date: Mon, 7 Nov 2022 03:56:25 -0500 Subject: [PATCH 32/95] reorganize all filters dedicated script for all filters. Initialized a variable filteredData to denote filtered data; every time a filter is applied, changed, or taken off, we should use data and run it through all the filters one by one, before updating the voter list and voter map --- site/js/list-filters.js | 14 +++++++++++++- site/js/search-box.js | 18 +++--------------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/site/js/list-filters.js b/site/js/list-filters.js index eaf47d4..3fbdcf3 100644 --- a/site/js/list-filters.js +++ b/site/js/list-filters.js @@ -19,13 +19,25 @@ import { showVotersOnMap } from "./map.js"; // Initialize export let filteredData; +/* +A function that includes all the filters +*/ + +function allFilters(data) { + let filtered = data; + filtered = filterByNameAddress(data); + // More filters to come... + + return filtered; +} + /* Search box filter */ import { voterInputBoxEl } from "./search-box.js"; voterInputBoxEl.addEventListener("input", ( ) => { - filteredData = filterByNameAddress(data); + filteredData = allFilters(data); showVotersInList(filteredData); showVotersOnMap(filteredData); }); \ No newline at end of file diff --git a/site/js/search-box.js b/site/js/search-box.js index c792ba6..db89572 100644 --- a/site/js/search-box.js +++ b/site/js/search-box.js @@ -1,6 +1,3 @@ -import { data } from './list-loader.js'; -import { showVotersInList } from './voter-list.js'; - export let voterInputBoxEl = document.querySelector('#search-box-input'); // Step in filter by search box; match if an individual voter fulfills the filter @@ -26,25 +23,16 @@ function matchInput(voter, inputText) { // Filter by the input of search box // Search by first name or last name or short address function filterByNameAddress(data) { - let filteredVoter = data; + let filtered = data; const inputText = voterInputBoxEl.value.toLowerCase(); - filteredVoter = filteredVoter.filter((voter) => { + filtered = filtered.filter((voter) => { let isMatched = matchInput(voter, inputText); return isMatched; }); - return filteredVoter; -} - -// What happens when searchbox has input -function onSearchBoxInput() { - const filteredData = filterByNameAddress(data); - showVotersInList(filteredData); + return filtered; } -//voterInputBoxEl.addEventListener("input", onSearchBoxInput); - export { - onSearchBoxInput, filterByNameAddress, }; \ No newline at end of file From 7a69df10e7aece04ce9ed146ce14e4d75d251288 Mon Sep 17 00:00:00 2001 From: Leejere Date: Mon, 7 Nov 2022 04:24:38 -0500 Subject: [PATCH 33/95] fixed a bug in selected-voters.js when unhighlighting, filteredData may be undefined because no filter has been applied yet. In this case, use raw data --- site/js/list-filters.js | 2 +- site/js/list-loader.js | 8 ++------ site/js/map.js | 3 ++- site/js/selected-voter.js | 10 +++++++++- site/js/voter-list.js | 12 +++++++++--- 5 files changed, 23 insertions(+), 12 deletions(-) diff --git a/site/js/list-filters.js b/site/js/list-filters.js index 3fbdcf3..301bad7 100644 --- a/site/js/list-filters.js +++ b/site/js/list-filters.js @@ -17,7 +17,7 @@ import { showVotersOnMap } from "./map.js"; //import { makeVoterFeatureCollection } from "./map.js"; // Initialize -export let filteredData; +export let filteredData = undefined; /* A function that includes all the filters diff --git a/site/js/list-loader.js b/site/js/list-loader.js index 5cfc8d6..61c27ad 100644 --- a/site/js/list-loader.js +++ b/site/js/list-loader.js @@ -100,15 +100,11 @@ function loadVoterData(text) { // Create new property: combine house number with street name data = makeShortAddress(data); - // Make a FeatureCollection - votersFeature = makeVoterFeatureCollection(data); - - // Show voters on the map + // Show voters on the map and list + showVotersInList(data); showVotersOnMap(data); fitMap(); - showVotersInList(data); - // Store current list number to local storage to be loaded the next time localStorage.setItem("current-list", inputNumber); window.data = data; diff --git a/site/js/map.js b/site/js/map.js index 453c319..e843c83 100644 --- a/site/js/map.js +++ b/site/js/map.js @@ -36,6 +36,7 @@ function makeVoterFeatureCollection(thisData) { }; // Write into geojson + console.log(thisData.length); for(let i = 0; i < thisData.length; i++) { let thisLngLat = thisData[i]["TIGER/Line Lng/Lat"]; if(typeof(thisLngLat) == "string"){ @@ -74,7 +75,7 @@ function voterMarkerOnClick(event) { function showVotersOnMap(thisData) { let voterFeatures = makeVoterFeatureCollection(thisData); - if(baseMap.voterLayers != undefined) { + if(baseMap.voterLayers !== undefined) { baseMap.removeLayer(baseMap.voterLayers); } baseMap.voterLayers = L.geoJSON(voterFeatures, { diff --git a/site/js/selected-voter.js b/site/js/selected-voter.js index f36b106..d8a098d 100644 --- a/site/js/selected-voter.js +++ b/site/js/selected-voter.js @@ -10,6 +10,7 @@ import { voterListItemsEl } from "./voter-list.js"; import { baseMap } from "./map.js"; import { showVotersOnMap } from "./map.js"; +import { data } from "./list-loader.js"; import { filteredData } from "./list-filters.js"; import { voterMarkerOnClick } from "./map.js"; @@ -32,10 +33,17 @@ function unhighlightVoterOnMap() { // First remove the highlight layer // Then re-run showVotersOnMap // because previously when a voter was highlighted, its regular marker was removed + if(baseMap.highlightLayer !== undefined) { baseMap.removeLayer(baseMap.highlightLayer); } - showVotersOnMap(filteredData); + + // When rerun showVotersOnMap, either use data or filteredData (if it's defined) + if(filteredData !== undefined) { + showVotersOnMap(filteredData); + } else { + showVotersOnMap(data); + } } function unhighlightVoter() { diff --git a/site/js/voter-list.js b/site/js/voter-list.js index 90b42aa..656c2ad 100644 --- a/site/js/voter-list.js +++ b/site/js/voter-list.js @@ -23,7 +23,7 @@ function groupByKey(data, key) { } // The output voters are grouped by their addresses -// Show address +// Function to show address function addAddressToList(address) { const addressEl = htmlToElement(`
  • @@ -33,7 +33,6 @@ function addAddressToList(address) { voterList.append(addressEl); } - // Function: prepare the voterlist, i.e., add event listener function listPrepare(voterListItemsEl) { for(const thisListItem of voterListItemsEl) { @@ -143,4 +142,11 @@ Requirement: The list's DOM element should be available on the global */ -window.voterList = voterList; \ No newline at end of file +window.voterList = voterList; + +/* +Requirement: +Wrap each voter's name in an element with the class `voter-name`. +Wrap addresses in an element with the address `voter-address`. +Make sure the class names match. +*/ \ No newline at end of file From 8899d57a6f5b86fcd82262fc1a6eca19af09057e Mon Sep 17 00:00:00 2001 From: Leejere Date: Mon, 7 Nov 2022 09:06:20 -0500 Subject: [PATCH 34/95] Made voter list item scrolled to view when selected --- site/js/selected-voter.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/site/js/selected-voter.js b/site/js/selected-voter.js index d8a098d..5c7821d 100644 --- a/site/js/selected-voter.js +++ b/site/js/selected-voter.js @@ -61,7 +61,14 @@ function highlightVoterInList(thisId) { unhighlightVoterInList(); // Highlight selected voter let thisListItem = Array.from(voterListItemsEl).find(item => item.title == thisId); + + // Make this voter highlighted in color thisListItem.classList.add("list-selected"); + + thisListItem.scrollIntoView({ + behavior: "smooth", + block: "center", + }); } function highlightVoterOnMap(thisId) { From 3c93e839e43b312bc7346cf76f3ff93225d87776 Mon Sep 17 00:00:00 2001 From: Leejere Date: Mon, 7 Nov 2022 09:08:40 -0500 Subject: [PATCH 35/95] Made voter scrolled to view in list & change class name to comply with requirement --- site/css/voter-list.css | 6 +++--- site/js/selected-voter.js | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/site/css/voter-list.css b/site/css/voter-list.css index 80c658b..624c57c 100644 --- a/site/css/voter-list.css +++ b/site/css/voter-list.css @@ -54,11 +54,11 @@ background-color: #eee; } -#voter-list-component .list-selected { +#voter-list-component .selected { background-color: #0d59a9; } -#voter-list-component .list-selected:hover { +#voter-list-component .selected:hover { background-color: #0d59a9; } @@ -71,7 +71,7 @@ vertical-align: center; } -#voter-list-component .list-selected .list-name { +#voter-list-component .selected .list-name { color: #fff; } diff --git a/site/js/selected-voter.js b/site/js/selected-voter.js index 5c7821d..fe690ca 100644 --- a/site/js/selected-voter.js +++ b/site/js/selected-voter.js @@ -63,7 +63,7 @@ function highlightVoterInList(thisId) { let thisListItem = Array.from(voterListItemsEl).find(item => item.title == thisId); // Make this voter highlighted in color - thisListItem.classList.add("list-selected"); + thisListItem.classList.add("selected"); thisListItem.scrollIntoView({ behavior: "smooth", From e0942e062edb27139678e35891e76cbe63472cd0 Mon Sep 17 00:00:00 2001 From: Leejere Date: Mon, 7 Nov 2022 09:48:58 -0500 Subject: [PATCH 36/95] Made every building a map marker, instead of every voter Made other changes as support --- site/js/map.js | 27 ++++++++++++++++++++++----- site/js/selected-voter.js | 5 ++++- site/js/voter-list.js | 1 + 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/site/js/map.js b/site/js/map.js index e843c83..aa2d9fe 100644 --- a/site/js/map.js +++ b/site/js/map.js @@ -55,7 +55,7 @@ function makeVoterFeatureCollection(thisData) { "id": thisData[i]["ID Number"], "last_name": thisData[i]["Last Name"], "first_name": thisData[i]["First Name"], - "address": thisData[i]["TIGER/Line Matched Address"], + "address": thisData[i]["short_address"], }, }); } @@ -73,8 +73,26 @@ function voterMarkerOnClick(event) { onSelectAction(event.layer.feature.properties.id); } +// When showing on the map, we show only one marker per short_address +// This function slices the data to only one voter per short_address +function sliceByKey(data, key) { + let dataUniqueAddress = data.reduce((result, thisItem) => { + let thisCategory = thisItem[key]; + // Add item if its key is not added yet + if(result.find(item => item[key] === thisCategory) == undefined) { + result.push(thisItem); + } else { + // empty + } + return result; + }, []); + + return dataUniqueAddress; +} + function showVotersOnMap(thisData) { - let voterFeatures = makeVoterFeatureCollection(thisData); + let dataUniqueAddress = sliceByKey(thisData, "short_address"); + let voterFeatures = makeVoterFeatureCollection(dataUniqueAddress); if(baseMap.voterLayers !== undefined) { baseMap.removeLayer(baseMap.voterLayers); } @@ -82,14 +100,13 @@ function showVotersOnMap(thisData) { pointToLayer: (point, latLng) => L.circleMarker(latLng), style: { radius: 7, - color: "#aaaaaa", + color: "#999999", stroke: true, opacity: 0.5, - weight: 1, + weight: 2, }, }) .on("click", voterMarkerOnClick) - .bindPopup(point => point.feature.properties.last_name) .addTo(baseMap); } diff --git a/site/js/selected-voter.js b/site/js/selected-voter.js index fe690ca..a56dff8 100644 --- a/site/js/selected-voter.js +++ b/site/js/selected-voter.js @@ -78,9 +78,12 @@ function highlightVoterOnMap(thisId) { let selectedFeature; + // As the map doesn't have every voter's ID, we need to find the same address + let thisAddress = data.find(item => item["ID Number"] === thisId).short_address; + // Then remove the regular marker of the selected voter for(let entry of Object.entries(baseMap.voterLayers._layers)) { - if(entry[1].feature.properties.id == thisId) { + if(entry[1].feature.properties.address == thisAddress) { selectedFeature = entry[1].feature; baseMap.removeLayer(entry[1]); break; diff --git a/site/js/voter-list.js b/site/js/voter-list.js index 656c2ad..d68d956 100644 --- a/site/js/voter-list.js +++ b/site/js/voter-list.js @@ -120,6 +120,7 @@ function showVotersInList(data) { voterList.innerHTML = ''; let dataGroupedByAddress = groupByKey(data, "short_address"); + window.test = data; let addressKeys = Object.keys(dataGroupedByAddress); for(const address of addressKeys) { From 0af7429ab6ac0ac2069301988921243709c940f7 Mon Sep 17 00:00:00 2001 From: Leejere Date: Mon, 7 Nov 2022 10:04:50 -0500 Subject: [PATCH 37/95] Used simpler way to highlight marker --- site/js/list-loader.js | 1 - site/js/map.js | 1 - site/js/selected-voter.js | 45 ++++++++++++--------------------------- 3 files changed, 14 insertions(+), 33 deletions(-) diff --git a/site/js/list-loader.js b/site/js/list-loader.js index 61c27ad..51c84c3 100644 --- a/site/js/list-loader.js +++ b/site/js/list-loader.js @@ -50,7 +50,6 @@ function errorTooltip(inputNumber) { let interruptLoad = false; if(inputNumber.length == 0) { toolTipEl.innerHTML = `
    Empty input
    `; - console.log(toolTipEl); interruptLoad = true; } else if(inputNumber.length != 4) { toolTipEl.innerHTML = `
    Wrong digits
    `; diff --git a/site/js/map.js b/site/js/map.js index aa2d9fe..f4108b5 100644 --- a/site/js/map.js +++ b/site/js/map.js @@ -36,7 +36,6 @@ function makeVoterFeatureCollection(thisData) { }; // Write into geojson - console.log(thisData.length); for(let i = 0; i < thisData.length; i++) { let thisLngLat = thisData[i]["TIGER/Line Lng/Lat"]; if(typeof(thisLngLat) == "string"){ diff --git a/site/js/selected-voter.js b/site/js/selected-voter.js index a56dff8..68723b1 100644 --- a/site/js/selected-voter.js +++ b/site/js/selected-voter.js @@ -30,15 +30,8 @@ function unhighlightVoterInList() { } function unhighlightVoterOnMap() { - // First remove the highlight layer - // Then re-run showVotersOnMap - // because previously when a voter was highlighted, its regular marker was removed - - if(baseMap.highlightLayer !== undefined) { - baseMap.removeLayer(baseMap.highlightLayer); - } - - // When rerun showVotersOnMap, either use data or filteredData (if it's defined) + // Re-run showVotersOnMap + // Either use data or filteredData (if it's defined) if(filteredData !== undefined) { showVotersOnMap(filteredData); } else { @@ -76,36 +69,26 @@ function highlightVoterOnMap(thisId) { // First remove the existing highlight voter, if existing unhighlightVoterOnMap(); - let selectedFeature; - // As the map doesn't have every voter's ID, we need to find the same address let thisAddress = data.find(item => item["ID Number"] === thisId).short_address; - // Then remove the regular marker of the selected voter + // Then find the marker to be highlighted for(let entry of Object.entries(baseMap.voterLayers._layers)) { if(entry[1].feature.properties.address == thisAddress) { - selectedFeature = entry[1].feature; - baseMap.removeLayer(entry[1]); + entry[1].setStyle({ + radius: 10, + color: "#0d59a9", + fillColor: "#0d59a9", + stroke: true, + opacity: 1, + fillOpacity: 0.7, + weight: 2, + }) + .bringToFront(); + //baseMap.removeLayer(entry[1]); break; } } - - // Then show this highlighted voter on the map - baseMap.highlightLayer = L.geoJSON(selectedFeature, { - pointToLayer: (point, latLng) => L.circleMarker(latLng), - style: { - radius: 10, - color: "#0d59a9", - fillColor: "#0d59a9", - stroke: true, - opacity: 1, - fillOpacity: 0.7, - weight: 2, - }, - }) - .on("click", voterMarkerOnClick) - .addTo(baseMap); - } function highlightVoter(thisId) { From 1a13c64497a1c3373ebf827a59008236813ca13c Mon Sep 17 00:00:00 2001 From: Leejere Date: Mon, 7 Nov 2022 11:21:27 -0500 Subject: [PATCH 38/95] make voter list expand longer & make CSS more readable --- site/css/voter-list.css | 72 +++++++++++++++++++++++++++++------- site/js/voter-list-expand.js | 20 ++++++---- 2 files changed, 71 insertions(+), 21 deletions(-) diff --git a/site/css/voter-list.css b/site/css/voter-list.css index 624c57c..33cac66 100644 --- a/site/css/voter-list.css +++ b/site/css/voter-list.css @@ -1,3 +1,7 @@ +/* ------- +Voter list component overall setting +-------- */ + #voter-list-component { position: relative; display: flex; @@ -6,31 +10,51 @@ #voter-list-component .panel { background-color: white; - padding: 0 0.5rem 0.05rem 0.5rem; + padding: 0 0.5rem 0.05rem; } +/* ------- +Default scroll container height +-------- */ + #voter-list-component .scroll-container { max-height: 18vh; overflow: auto; transition: max-height 0.75s; } +/* ---------- +Change scroll container height based when clicked +---------- */ + +/* ---- Normally, expand to 42vh ------ */ + #voter-list-component .scroll-container-expanded { - max-height: 30vh; + max-height: 42vh; transition: max-height 0.5s; } +/* ---- With wide screen, when basic info panel is on the other side, use 75vh ------ */ + #voter-list-component .scroll-container-expanded-long { max-height: 75vh; transition: max-height 1s; } +/* ------- +Voter list items +-------- */ + +/* ---- Overall adjustment; overwrite list defaults ------ */ + #voter-list-component ul { display: block; margin-right: 0.5rem; padding: 0.1rem 0.4rem 0 0.2rem; } +/* ---- Each component: overall setting ------ */ + #voter-list-component li { padding: 0.3rem; border-bottom: 1px solid #bbb; @@ -41,6 +65,8 @@ width: 28rem; } +/* ---- Overwrite some settings for address items ------ */ + #voter-list-component .list-address { margin-right: 1rem; font-size: 0.8rem; @@ -50,10 +76,14 @@ border-bottom: 0 solid #bbb; } +/* ---- Hover ------ */ + #voter-list-component .list-voter:hover { background-color: #eee; } +/* ---- Highlight voter ------ */ + #voter-list-component .selected { background-color: #0d59a9; } @@ -62,6 +92,10 @@ background-color: #0d59a9; } +/* ---------- +Text and icons inside voter list item +---------- */ + #voter-list-component li .list-name { position: relative; font-weight: 600; @@ -106,22 +140,18 @@ margin-right: auto; } -#voter-list-component #list-expand-button { - margin-left: auto; - margin-right: auto; -} +/* ---------- +For each voter, color of displayed icons +---------- */ -#voter-list-component .panel .button { - height: 1.1rem; - width: 1.1rem; - border-radius: 0.1rem; - margin-right: 0.4rem; -} +/* ---- Voter status ------ */ .icon-ok-color { color: #15b88a; } +/* ---- Registered party ------ */ + .icon-democrat-color { color: #0d59a9; } @@ -132,4 +162,20 @@ .icon-oth-party-color { color: #c1c1c1; -} \ No newline at end of file +} + +/* ---------- +Expand-list button +---------- */ + +#voter-list-component #list-expand-button { + margin-left: auto; + margin-right: auto; +} + +#voter-list-component .panel .button { + height: 1.1rem; + width: 1.1rem; + border-radius: 0.1rem; + margin-right: 0.4rem; +} diff --git a/site/js/voter-list-expand.js b/site/js/voter-list-expand.js index 24b4a07..66c26eb 100644 --- a/site/js/voter-list-expand.js +++ b/site/js/voter-list-expand.js @@ -1,28 +1,32 @@ -let expandButton = document.querySelector("#list-expand-button"); -let listContainer = document.querySelector("#voter-list-component").querySelector(".scroll-container"); +let expandButtonEl = document.querySelector("#list-expand-button"); +let listContainerEl = document.querySelector("#voter-list-component").querySelector(".scroll-container"); + +// Store state: whether the list is currently expanded or not export let listExpanded; listExpanded = 0; -expandButton.addEventListener("click", ( ) => { +expandButtonEl.addEventListener("click", ( ) => { // If currently not expanded, expand it if(listExpanded == 0) { const mediaQuery = window.matchMedia("(min-width: 1200px)"); if(mediaQuery.matches) { - listContainer.classList.add("scroll-container-expanded-long"); + listContainerEl.classList.add("scroll-container-expanded-long"); // Expand to 75vh } else { - listContainer.classList.add("scroll-container-expanded"); + listContainerEl.classList.add("scroll-container-expanded"); // Expand to 42vh } - expandButton.innerHTML = `expand_less`; + // Turn expand button upside down + expandButtonEl.innerHTML = `expand_less`; listExpanded = 1; } else { - listContainer.className = "scroll-container"; + listContainerEl.className = "scroll-container"; - expandButton.innerHTML = `expand_more`; + // Turn expand button upside down + expandButtonEl.innerHTML = `expand_more`; listExpanded = 0; } From b1758a51f9045d50790c7db8aeef954970d22c85 Mon Sep 17 00:00:00 2001 From: Leejere Date: Mon, 7 Nov 2022 11:30:15 -0500 Subject: [PATCH 39/95] Only show expand button when necessary --- site/js/voter-list-expand.js | 2 +- site/js/voter-list.js | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/site/js/voter-list-expand.js b/site/js/voter-list-expand.js index 66c26eb..79775d5 100644 --- a/site/js/voter-list-expand.js +++ b/site/js/voter-list-expand.js @@ -1,4 +1,4 @@ -let expandButtonEl = document.querySelector("#list-expand-button"); +export let expandButtonEl = document.querySelector("#list-expand-button"); let listContainerEl = document.querySelector("#voter-list-component").querySelector(".scroll-container"); // Store state: whether the list is currently expanded or not diff --git a/site/js/voter-list.js b/site/js/voter-list.js index d68d956..9e7eb09 100644 --- a/site/js/voter-list.js +++ b/site/js/voter-list.js @@ -1,6 +1,7 @@ import { htmlToElement } from './htmlelement.js'; import { changeRecord } from "./save-edit.js"; import { onSelectAction } from "./selected-voter.js"; +import { expandButtonEl } from "./voter-list-expand.js"; // DOM obj of voter list let voterList = document.querySelector('#voter-list'); @@ -115,6 +116,17 @@ function addVotersByAddress(votersByThisAddress) { } } +// Function to decide whether to show voter list's expand button +function showHideExpandButton() { + let voterListHeight = document.querySelector("#voter-list").offsetHeight; + let voterContainerHeight = document.querySelector("#voter-list-component").querySelector(".scroll-container").offsetHeight; + if(voterListHeight > voterContainerHeight){ + expandButtonEl.style.display = "block"; + } else { + expandButtonEl.style.display = "none"; + } +} + function showVotersInList(data) { // First empty out existing voter list voterList.innerHTML = ''; @@ -131,6 +143,9 @@ function showVotersInList(data) { voterListItemsEl = document.querySelectorAll(".list-voter"); window.voterListItemsEl = voterListItemsEl; listPrepare(voterListItemsEl); + + // Only show expand button when necessary + showHideExpandButton(); } export { From e0267d292bc845702522856fa60a1b493e37ef8b Mon Sep 17 00:00:00 2001 From: Leejere Date: Mon, 7 Nov 2022 11:58:50 -0500 Subject: [PATCH 40/95] Initiated README --- README.md | 52 ++++++++++++++++++++++++++++++--- bin/geocoder.ipynb | 73 ---------------------------------------------- 2 files changed, 48 insertions(+), 77 deletions(-) delete mode 100644 bin/geocoder.ipynb diff --git a/README.md b/README.md index a6eae44..b9b3c9d 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,49 @@ -# Voter Canvassing App +# Canvassers -Team members: -* ... -* ... \ No newline at end of file +**Jie Li ([@Leejere](https://github.com/Leejere)), Myron BaƱez ([@myronbanez](https://github.com/myronbanez))** + +This is a mobile-friendly web-app used for voter canvassing. With this app, the canvasser can select the voters from a list and a map, view their status and other information, and record additional information regarding each canvassed voter. The more specific PRD for this product can be found in the same repository or via [this link](https://github.com/Leejere/js-voter-canvassing/blob/dev/PRD.md). + +## Data source + +## Functionalities + +### 1. Load voter data manually or based on geolocation API + +Overview of the `list-loader` module... + +Load list by manually inputting list number. (**FINISHED**) + +Load list via geolocation API. First identify the geoscope of each list, then get the user's current location and load the list that matches the best. (**TO BE DONE**) + +### 2. Filter based on voter attributes + +Filter by searching for name or address. (**FINISHED**) + +Filter by canvassing status, voter status, party affiliation, etc. (**TO BE DONE**) + +### 3. Display voters in a list and on a map + +Display voters in a list, grouped by address. (**FINISHED**) + +Display voters on the map, each marker representing one address (**FINISHED**) + +### 4. Select voter from the list or map + +Highlight a voter by clicking on the voter list or by clicking on the map markers. When clicking on a map marker, the first voter by this address is selected. (**FINISHED**) + +Update selection by selecting a new voter. Unselect by clicking on the same voter again. (**FINISHED**) + +### 5. Display detailed information of the selected voter + +(**TO BE DONE**) + +### 6. Update or add info of the selected voter + +(**TO BE DONE**) + +### 7. Save updated/added information locally or on the cloud + +(**TO BE DONE**) + +## Overview of collaboration \ No newline at end of file diff --git a/bin/geocoder.ipynb b/bin/geocoder.ipynb deleted file mode 100644 index f31f58b..0000000 --- a/bin/geocoder.ipynb +++ /dev/null @@ -1,73 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "import numpy as np\n", - "import pandas as pd\n", - "df = pd.read_csv(\"../site/data/voters_lists/0101test.csv\")" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0 -75.16145216099994,39.92993551500007\n", - "1 -75.16149719599997,39.93145038500006\n", - "2 -75.16143961899996,39.92998664800007\n", - "3 -75.15865174799995,39.93162562100008\n", - "4 -75.16168658199996,39.93004896100007\n", - " ... \n", - "521 -75.16234616099996,39.92970272300005\n", - "522 -75.15959113499997,39.93104925500006\n", - "523 -75.15932014999999,39.93228303300003\n", - "524 -75.15947777399998,39.93155817300004\n", - "525 -75.15947777399998,39.93155817300004\n", - "Name: TIGER/Line Lng/Lat, Length: 526, dtype: object" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df[\"TIGER/Line Lng/Lat\"]" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3.9.13 ('musa-550-fall-2022')", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.13" - }, - "orig_nbformat": 4, - "vscode": { - "interpreter": { - "hash": "82331f546391311e04de82455d6ddfe42af9f79fe3961e72f749472e4fc4cc58" - } - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} From 760eb205ad8659e569e100f64574868291c19371 Mon Sep 17 00:00:00 2001 From: Leejere Date: Mon, 7 Nov 2022 14:47:48 -0500 Subject: [PATCH 41/95] updated README as of 1107 --- README.md | 61 ++++++++++++++++++++++++++++++++++--------------------- 1 file changed, 38 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index b9b3c9d..c24e171 100644 --- a/README.md +++ b/README.md @@ -1,49 +1,64 @@ -# Canvassers +# **Canvassers** + +by **Jie Li ([@Leejere](https://github.com/Leejere))** and **Myron BaƱez ([@myronbanez](https://github.com/myronbanez))** -**Jie Li ([@Leejere](https://github.com/Leejere)), Myron BaƱez ([@myronbanez](https://github.com/myronbanez))** This is a mobile-friendly web-app used for voter canvassing. With this app, the canvasser can select the voters from a list and a map, view their status and other information, and record additional information regarding each canvassed voter. The more specific PRD for this product can be found in the same repository or via [this link](https://github.com/Leejere/js-voter-canvassing/blob/dev/PRD.md). -## Data source +## **Data source** + +The voter data comes from [Pennsylvania Department of State](https://www.dos.pa.gov/VotingElections/OtherServicesEvents/VotingElectionStatistics/Pages/VotingElectionStatistics.aspx), who provides voter registration data that includes the name, address, and other voting-related information. The data is available for purchase through [this link](https://www.pavoterservices.pa.gov/Pages/PurchasePAFULLVoterExport.aspx). For this application, only data from Philadelphia gets extracted, preprocessed, and geocoded by Mjumbe Poe ([@mjumbewu](https://github.com/mjumbewu)). + +## **App functionalities** + +### **Module 1: `list-loader`** -## Functionalities +Due to its large amount, the data is split into more 1,000 separate lists, which also acts as task lists for the canvassing team. Each list can get loaded into the app asynchronously on demand. `list-loader.js` primarily deals with loading data. The loaded data gets stored in a global object, which is the data source for all other operations. The `list-loader` module is rerequisit for all other functions of the app. -### 1. Load voter data manually or based on geolocation API +There are two ways to load the data. -Overview of the `list-loader` module... +- [X] Load data by manually inputting list number. An input box exists on the top right of the viewport that allows the user to input a number, and then imports the corresponding list. -Load list by manually inputting list number. (**FINISHED**) +- [ ] **To Be Created.** Load data using geolocation API. By calculating the spatial scope of each voter list, the app can identify which scope the user is currently in using a geolocation API, and load the corresponding voter list. -Load list via geolocation API. First identify the geoscope of each list, then get the user's current location and load the list that matches the best. (**TO BE DONE**) +### **Module 2: `list-filters`** -### 2. Filter based on voter attributes +This filter filters voters after a particular voter list is loaded. The kernel script for the function resides in `list-filters.js`. This script workds as follows: -Filter by searching for name or address. (**FINISHED**) +1. **Data import.** +2. **Event listeners.** Event listeners get added to all filter widgets. +3. **Filter application.** Every time a filter event is recorded, whether a new filter is applied, or a filter is modified or canceled, the `allFilters` functions takes the imported data and applies **all the filters** to produce to filtered version of the data. +4. **Display update.** Use the filtered data to updated the voter list and map, which gets implemented in the **Module 3**. -Filter by canvassing status, voter status, party affiliation, etc. (**TO BE DONE**) +Several filters are available: -### 3. Display voters in a list and on a map +- [X] Filter voters by searching for name or address. The related functions are in `search-box.js`. -Display voters in a list, grouped by address. (**FINISHED**) +- [ ] **To Be Created** Filter voters by voter attributes. The related functions are in ... -Display voters on the map, each marker representing one address (**FINISHED**) +### **Module 3: Voters display** -### 4. Select voter from the list or map +This model displayed either comprehensive or filtered voter data in a particular list in the voter list and on the map. -Highlight a voter by clicking on the voter list or by clicking on the map markers. When clicking on a map marker, the first voter by this address is selected. (**FINISHED**) +- [X] `voter-list.js` takes the data, group them by address, and display them in a list. The list includes the voter's address, full name, and some icons that shows the voters canvassing status (pending visit, visited, awaiting followup, etc.), voter status (active or inactive), party registration, etc. -Update selection by selecting a new voter. Unselect by clicking on the same voter again. (**FINISHED**) +- [X] `map.js` takes the data, makes an geometry object (`FeatureCollection`), and display it on the map. -### 5. Display detailed information of the selected voter +### **Module 4: Voter selection** -(**TO BE DONE**) +This module highlights a **maximum of one voter** as the "selected" voter. The module resides in `selected-voter.js` and contains the following components: -### 6. Update or add info of the selected voter +- A global variable to store the ID of the currently selected voter. If no voter is currently under selection, the variable remains `undefined`. +- Event listeners added on each voter list item and map marker. Whenever the list item or marker get clicked, it either + - **highlight a new voter**, + - **updated the highlighted voter**, or + - **unhighlight the currently highlighted voter**. +- The highlighted voter ID is recorded and passed into **Module 5**. -(**TO BE DONE**) +### **Module 5: Voter information display** (To Be Created) -### 7. Save updated/added information locally or on the cloud +### **Module 6: Data edits and records** (To Be Created) -(**TO BE DONE**) +### **Module 7: Data saving** (To Be Created ## Overview of collaboration \ No newline at end of file From e621ee6501851cfe27606759fd63a21a4fd7ae04 Mon Sep 17 00:00:00 2001 From: Leejere Date: Mon, 7 Nov 2022 15:04:18 -0500 Subject: [PATCH 42/95] scroll back to top when updating list --- README.md | 2 +- site/js/voter-list.js | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index c24e171..a00b925 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ This model displayed either comprehensive or filtered voter data in a particular - [X] `voter-list.js` takes the data, group them by address, and display them in a list. The list includes the voter's address, full name, and some icons that shows the voters canvassing status (pending visit, visited, awaiting followup, etc.), voter status (active or inactive), party registration, etc. -- [X] `map.js` takes the data, makes an geometry object (`FeatureCollection`), and display it on the map. +- [X] `map.js` takes the data, makes an geometry object (`FeatureCollection`), and display it on the map. Note that **every marker stands for ### **Module 4: Voter selection** diff --git a/site/js/voter-list.js b/site/js/voter-list.js index 9e7eb09..5c96d48 100644 --- a/site/js/voter-list.js +++ b/site/js/voter-list.js @@ -146,6 +146,10 @@ function showVotersInList(data) { // Only show expand button when necessary showHideExpandButton(); + + // Scroll back to top + let scrollContainer = document.querySelector("#voter-list-component").querySelector(".scroll-container") + scrollContainer.scrollTop = 0; } export { From 76791dead784aa1d788fb266c3da52b01d3a0d60 Mon Sep 17 00:00:00 2001 From: Leejere Date: Mon, 7 Nov 2022 15:07:32 -0500 Subject: [PATCH 43/95] update README --- README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index a00b925..d5dd9f1 100644 --- a/README.md +++ b/README.md @@ -42,17 +42,18 @@ This model displayed either comprehensive or filtered voter data in a particular - [X] `voter-list.js` takes the data, group them by address, and display them in a list. The list includes the voter's address, full name, and some icons that shows the voters canvassing status (pending visit, visited, awaiting followup, etc.), voter status (active or inactive), party registration, etc. -- [X] `map.js` takes the data, makes an geometry object (`FeatureCollection`), and display it on the map. Note that **every marker stands for +- [X] `map.js` takes the data, makes an geometry object (`FeatureCollection`), and display it on the map. Note that **every marker stands for one address** (house number + street name), rather than one voter. ### **Module 4: Voter selection** This module highlights a **maximum of one voter** as the "selected" voter. The module resides in `selected-voter.js` and contains the following components: - A global variable to store the ID of the currently selected voter. If no voter is currently under selection, the variable remains `undefined`. -- Event listeners added on each voter list item and map marker. Whenever the list item or marker get clicked, it either - - **highlight a new voter**, - - **updated the highlighted voter**, or - - **unhighlight the currently highlighted voter**. +- Event listeners added on each voter list item and map marker. Note that as each map marker stands for an address rather than a voter, **the first voter by this address** is selected when the marker is clicked on. +- Whenever the list item or marker get clicked, it either + - **highlights a new voter**, + - **updats the highlighted voter**, or + - **unhighlights the currently highlighted voter**. - The highlighted voter ID is recorded and passed into **Module 5**. ### **Module 5: Voter information display** (To Be Created) From 6a28fed5fcbdb0deaf1056eeedf6d76dc2540a0d Mon Sep 17 00:00:00 2001 From: Leejere Date: Mon, 7 Nov 2022 15:12:36 -0500 Subject: [PATCH 44/95] annotate some CSS --- site/css/banner.css | 2 ++ site/css/edit-button.css | 4 ---- site/css/list-filters.css | 5 +++++ site/css/main.css | 12 ++++++++++++ 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/site/css/banner.css b/site/css/banner.css index e50267d..efb419d 100644 --- a/site/css/banner.css +++ b/site/css/banner.css @@ -1,3 +1,5 @@ +/* ---------- Top banner ------------- */ + #banner-component { position: fixed; background-color: #fff; diff --git a/site/css/edit-button.css b/site/css/edit-button.css index 92cb32a..e69de29 100644 --- a/site/css/edit-button.css +++ b/site/css/edit-button.css @@ -1,4 +0,0 @@ -#edit-button { - - -} \ No newline at end of file diff --git a/site/css/list-filters.css b/site/css/list-filters.css index f36b11e..caa03a7 100644 --- a/site/css/list-filters.css +++ b/site/css/list-filters.css @@ -1,3 +1,7 @@ +/* ---------- +Top right button to initiate filter window +------------ */ + #list-filter-component { position: relative; float: right; @@ -13,3 +17,4 @@ border-bottom-width: 3px; border-radius: 0 0 0.5rem 0.5rem; } + diff --git a/site/css/main.css b/site/css/main.css index b629780..6f9c0a8 100644 --- a/site/css/main.css +++ b/site/css/main.css @@ -1,3 +1,7 @@ +/* -------- +Overall framework setting +-------- */ + html { font-family: Roboto, sans-serif; } @@ -17,6 +21,10 @@ body { margin-right: 1rem; } +/* -------- +Responsive design +-------- */ + @media only screen and (max-width: 400px) { .component-margin-left { margin-left: 0.5rem; @@ -37,6 +45,10 @@ body { } } +/* -------- +Defining some universal classes +-------- */ + .button { background-color: #0d59a9; width: 2rem; From a11eb6b254b6eda507f9fd2d8516b20b5e8c69c9 Mon Sep 17 00:00:00 2001 From: Leejere Date: Mon, 7 Nov 2022 18:42:23 -0500 Subject: [PATCH 45/95] added filter window --- site/css/list-filters.css | 43 ++++++++++++++++++++++++++++++++++++++- site/css/main-box.css | 2 +- site/index.html | 16 +++++++++------ site/js/filter-window.js | 15 ++++++++++++++ 4 files changed, 68 insertions(+), 8 deletions(-) create mode 100644 site/js/filter-window.js diff --git a/site/css/list-filters.css b/site/css/list-filters.css index caa03a7..8afbb7b 100644 --- a/site/css/list-filters.css +++ b/site/css/list-filters.css @@ -7,7 +7,7 @@ Top right button to initiate filter window float: right; right: 0; height: 2.5em; - width: 8.5rem; + width: 2.1rem; z-index: 99999; } @@ -18,3 +18,44 @@ Top right button to initiate filter window border-radius: 0 0 0.5rem 0.5rem; } +/* ------------ +Filter window +-------------- */ + +/* ------- Half-transparent overlay ---------- */ + +.filter-overlay { + align-items: center; + justify-content: center; + position: fixed; + left: 0; + top: 0; + bottom: 0; + right: 0; + background-color: rgb(0 0 0 / 60%); + color: white; + font-weight: bold; + z-index: 99999; + animation: pulse-black 1s infinite; + display: none; + transition: display 1s; +} + +/* ------- Filter window ---------- */ + +.filter-window { + position: fixed; + top: 50%; + left: 50%; + width: 16rem; + height: 20rem; + margin-top: -10rem; + margin-left: -8rem; + background-color: white; + border-radius: 1rem; + z-index: 2000; + z-index: 9999999; + filter: drop-shadow(10px 10px 12px #333333); + display: none; + transition: display 2s; +} \ No newline at end of file diff --git a/site/css/main-box.css b/site/css/main-box.css index a0a9d2a..bade8df 100644 --- a/site/css/main-box.css +++ b/site/css/main-box.css @@ -32,5 +32,5 @@ } #bottom-component { - top: 43vh; + top: 40vh; } \ No newline at end of file diff --git a/site/index.html b/site/index.html index 588bf9a..dd4d003 100644 --- a/site/index.html +++ b/site/index.html @@ -36,9 +36,12 @@
    -
    + +
    +
    +
    @@ -69,10 +72,9 @@
    -
    -
    -
    -
    +
    + filter_alt +
    @@ -85,7 +87,7 @@
    - +
    @@ -126,6 +128,7 @@
    Add To
    +
    @@ -150,6 +153,7 @@ + diff --git a/site/js/filter-window.js b/site/js/filter-window.js new file mode 100644 index 0000000..4607c36 --- /dev/null +++ b/site/js/filter-window.js @@ -0,0 +1,15 @@ +const filterOverlayEl = document.querySelector("#filter-overlay"); +const filterWindowEl = document.querySelector("#filter-window"); +const filterButtonEl = document.querySelector("#filter-popup-button"); + +// Filter window pops up when clicking on the button +filterButtonEl.addEventListener("click", ( ) => { + filterOverlayEl.style.display = "block"; + filterWindowEl.style.display = "flex"; +}); + +// Window disappears when clicking outside of window +filterOverlayEl.addEventListener("click", ( ) => { + filterOverlayEl.style.display = "none"; + filterWindowEl.style.display = "none"; +}); \ No newline at end of file From 97215084c36ee3c388c6908383de7cd2b34211c5 Mon Sep 17 00:00:00 2001 From: Leejere Date: Wed, 9 Nov 2022 17:52:52 -0500 Subject: [PATCH 46/95] hide whole searchbox and list when clicking on button --- site/css/search-box.css | 1 + site/css/voter-list.css | 1 + site/index.html | 2 +- site/js/custom-lists.js | 0 site/js/hide-show.js | 58 ++++++++++++++++++++++++++++++++++++ site/js/list-loader.js | 22 -------------- site/js/main.js | 3 -- site/js/voter-list-expand.js | 51 ++++++++++++++++++++----------- 8 files changed, 94 insertions(+), 44 deletions(-) delete mode 100644 site/js/custom-lists.js create mode 100644 site/js/hide-show.js delete mode 100644 site/js/main.js diff --git a/site/css/search-box.css b/site/css/search-box.css index 7b45ffb..7fcab63 100644 --- a/site/css/search-box.css +++ b/site/css/search-box.css @@ -2,6 +2,7 @@ position: relative; height: 6.5em; z-index: 999; + transition: transform 0.5s; } #search-box-component .input-container { diff --git a/site/css/voter-list.css b/site/css/voter-list.css index 33cac66..63d41cd 100644 --- a/site/css/voter-list.css +++ b/site/css/voter-list.css @@ -6,6 +6,7 @@ Voter list component overall setting position: relative; display: flex; flex-direction: column; + transition: transform 0.5s; } #voter-list-component .panel { diff --git a/site/index.html b/site/index.html index dd4d003..5cc0f12 100644 --- a/site/index.html +++ b/site/index.html @@ -151,9 +151,9 @@ - + diff --git a/site/js/custom-lists.js b/site/js/custom-lists.js deleted file mode 100644 index e69de29..0000000 diff --git a/site/js/hide-show.js b/site/js/hide-show.js new file mode 100644 index 0000000..e26ab2d --- /dev/null +++ b/site/js/hide-show.js @@ -0,0 +1,58 @@ +/* This chunk controls whether the hidable chunk is hidden at the moment +*/ + +import { listExpanded, onExpandButtonClick } from "./voter-list-expand.js"; + +// State variable: whether the chunk is hidden at the moment +export let loaderElIsHidden = 0; + +let hideButtonEl = document.querySelector("#list-loader-hide"); +let listLoaderHidableEl = document.querySelector("#list-loader-hidable-chunk"); +let searchBoxHidableEl = document.querySelector("#search-box-component"); +let voterListHidableEl = document.querySelector("#voter-list-component"); + +function hideChunk() { + // Hide chunk by moving + listLoaderHidableEl.style.transform = "translateX(-16em)"; + searchBoxHidableEl.style.transform = "translateX(-23em)"; + voterListHidableEl.style.transform = "translateX(-23em)"; + + // If the list is currently expanded, unexpand + if(listExpanded == 1) { + onExpandButtonClick(); + } + + // Update button icon + hideButtonEl.innerHTML = ` + chevron_right + `; + + // Update state to hidden + loaderElIsHidden = 1; +} + +function showChunk() { + // Move back + listLoaderHidableEl.style.transform = "translateX(0em)"; + searchBoxHidableEl.style.transform = "translateX(0em)"; + voterListHidableEl.style.transform = "translateX(0em)"; + + // Update button icon + hideButtonEl.innerHTML = ` + chevron_left + `; + + // Update state to not hidden + loaderElIsHidden = 0; +} + +function onHideChunkClick() { + if(loaderElIsHidden == 0) { + hideChunk(); + } else { + showChunk(); + } +} + +// The list loader thing can be hidden (not very important) +hideButtonEl.addEventListener("click", onHideChunkClick); \ No newline at end of file diff --git a/site/js/list-loader.js b/site/js/list-loader.js index 51c84c3..98f846b 100644 --- a/site/js/list-loader.js +++ b/site/js/list-loader.js @@ -8,8 +8,6 @@ Hide and Show List Loader */ // DOM elements -let hideButtonEl = document.querySelector("#list-loader-hide"); -let hidableChunkEl = document.querySelector("#list-loader-hidable-chunk"); let listNumberInputEl = document.querySelector("#list-loader-input"); let loadButtonEl = document.querySelector("#list-loader-load"); let toolTipEl = document.querySelector("#list-loader-load").querySelector(".tooltiptext"); @@ -17,30 +15,10 @@ let toolTipEl = document.querySelector("#list-loader-load").querySelector(".tool // Create a global object to store current input number let inputNumber; -// A variable to store whether the list loader component is currently hidden -let loaderElIsHidden = 0; - // This is a global object to store the current list of voters export let data; export let votersFeature; -// The list loader thing can be hidden (not very important) -hideButtonEl.addEventListener("click", ( ) => { - if(loaderElIsHidden == 0) { - hidableChunkEl.style.transform = "translateX(-16em)"; - hideButtonEl.innerHTML = ` - chevron_right - `; - loaderElIsHidden = 1; - } else { - hidableChunkEl.style.transform = "translateX(0em)"; - hideButtonEl.innerHTML = ` - chevron_left - `; - loaderElIsHidden = 0; - } -}); - /* Load List */ diff --git a/site/js/main.js b/site/js/main.js deleted file mode 100644 index 68affbb..0000000 --- a/site/js/main.js +++ /dev/null @@ -1,3 +0,0 @@ -// Create a local storage that stores which list to load -// Every time the page reopens, should read the stored list - diff --git a/site/js/voter-list-expand.js b/site/js/voter-list-expand.js index 79775d5..6b2c2d1 100644 --- a/site/js/voter-list-expand.js +++ b/site/js/voter-list-expand.js @@ -5,29 +5,44 @@ let listContainerEl = document.querySelector("#voter-list-component").querySelec export let listExpanded; listExpanded = 0; -expandButtonEl.addEventListener("click", ( ) => { +function expandList() { + const mediaQuery = window.matchMedia("(min-width: 1200px)"); + // If a wide screen, expand to longer + if(mediaQuery.matches) { + listContainerEl.classList.add("scroll-container-expanded-long"); // Expand to 75vh + } else { + listContainerEl.classList.add("scroll-container-expanded"); // Expand to 42vh + } - // If currently not expanded, expand it - if(listExpanded == 0) { - const mediaQuery = window.matchMedia("(min-width: 1200px)"); + // Update button icon + expandButtonEl.innerHTML = `expand_less`; + + // Update state + listExpanded = 1; +} - if(mediaQuery.matches) { - listContainerEl.classList.add("scroll-container-expanded-long"); // Expand to 75vh - } else { - listContainerEl.classList.add("scroll-container-expanded"); // Expand to 42vh - } +function unExpandList() { + // Unexpand + listContainerEl.className = "scroll-container"; - // Turn expand button upside down - expandButtonEl.innerHTML = `expand_less`; + // Update button icon + expandButtonEl.innerHTML = `expand_more`; - listExpanded = 1; + // Update state + listExpanded = 0; +} +function onExpandButtonClick() { + // If currently not expanded, expand it + if(listExpanded == 0) { + expandList(); } else { - listContainerEl.className = "scroll-container"; + unExpandList(); + } +} - // Turn expand button upside down - expandButtonEl.innerHTML = `expand_more`; +expandButtonEl.addEventListener("click", onExpandButtonClick); - listExpanded = 0; - } -}); \ No newline at end of file +export { + onExpandButtonClick, +}; \ No newline at end of file From 133c8decede79512a5d8b9d9f89595dfca5331d0 Mon Sep 17 00:00:00 2001 From: Leejere Date: Wed, 9 Nov 2022 18:07:42 -0500 Subject: [PATCH 47/95] pan to voter on map when selected --- site/js/selected-voter.js | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/site/js/selected-voter.js b/site/js/selected-voter.js index 68723b1..daa4ae0 100644 --- a/site/js/selected-voter.js +++ b/site/js/selected-voter.js @@ -13,6 +13,8 @@ import { showVotersOnMap } from "./map.js"; import { data } from "./list-loader.js"; import { filteredData } from "./list-filters.js"; import { voterMarkerOnClick } from "./map.js"; +import { listExpanded, onExpandButtonClick } from "./voter-list-expand.js"; + /* The unhighlight function is made of two parts: @@ -73,6 +75,7 @@ function highlightVoterOnMap(thisId) { let thisAddress = data.find(item => item["ID Number"] === thisId).short_address; // Then find the marker to be highlighted + // And then highlight it for(let entry of Object.entries(baseMap.voterLayers._layers)) { if(entry[1].feature.properties.address == thisAddress) { entry[1].setStyle({ @@ -85,7 +88,9 @@ function highlightVoterOnMap(thisId) { weight: 2, }) .bringToFront(); - //baseMap.removeLayer(entry[1]); + + // Pan to the selected feature marker + baseMap.panTo(entry[1]._latlng); break; } } @@ -102,12 +107,18 @@ function highlightVoter(thisId) { // Either highlight new voter and update selectedVoter, or unhighlight current voter function onSelectAction(thisId) { + // If clicking on the same voter, unhighlight them if(selectedVoter != undefined && thisId == selectedVoter) { unhighlightVoter(); selectedVoter = undefined; } else { highlightVoter(thisId); + // Update stored voter ID selectedVoter = thisId; + // If the list is currently expanded, unexpand it + if(listExpanded == 1) { + onExpandButtonClick(); + } } } From c54c83b2dfd8b856093c7db71b66f51e5ae5a55b Mon Sep 17 00:00:00 2001 From: Leejere Date: Wed, 9 Nov 2022 18:15:37 -0500 Subject: [PATCH 48/95] load list on enter key --- site/js/list-loader.js | 9 ++++++++- site/js/selected-voter.js | 1 - 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/site/js/list-loader.js b/site/js/list-loader.js index 98f846b..a01a763 100644 --- a/site/js/list-loader.js +++ b/site/js/list-loader.js @@ -1,7 +1,6 @@ import { showVotersOnMap } from "./map.js"; import { fitMap } from "./map.js"; import { showVotersInList } from './voter-list.js'; -import { makeVoterFeatureCollection } from "./map.js"; /* Hide and Show List Loader @@ -131,6 +130,14 @@ loadByListNumber(autoList); // Add event listener to the load button loadButtonEl.addEventListener("click", onLoadButtonClick); +// Simulate button click when press enter after input +listNumberInputEl.addEventListener("keypress", (e) => { + if(e.key === "Enter") { + e.preventDefault(); + loadButtonEl.click(); + } +}); + // Refresh tooltip text when mouse moves out loadButtonEl.addEventListener("mouseout", ( ) => { toolTipEl.innerHTML = `
    Load List
    `; diff --git a/site/js/selected-voter.js b/site/js/selected-voter.js index daa4ae0..1b622dc 100644 --- a/site/js/selected-voter.js +++ b/site/js/selected-voter.js @@ -12,7 +12,6 @@ import { baseMap } from "./map.js"; import { showVotersOnMap } from "./map.js"; import { data } from "./list-loader.js"; import { filteredData } from "./list-filters.js"; -import { voterMarkerOnClick } from "./map.js"; import { listExpanded, onExpandButtonClick } from "./voter-list-expand.js"; From a9d5d1ebf6a0c71b27768673cf1019a4dd81c04b Mon Sep 17 00:00:00 2001 From: Leejere Date: Wed, 9 Nov 2022 18:45:07 -0500 Subject: [PATCH 49/95] add comments, overall descriptions of js scripts --- README.md | 2 ++ site/js/edit-button.js | 0 site/js/filter-window.js | 7 +++++++ site/js/hide-show.js | 9 ++++++++- site/js/list-filters.js | 2 ++ site/js/list-loader.js | 9 +++++++++ site/js/map.js | 13 +++++++++++++ site/js/search-box.js | 6 ++++++ site/js/selected-voter.js | 4 ++++ site/js/voter-list.js | 11 +++++++++++ 10 files changed, 62 insertions(+), 1 deletion(-) delete mode 100644 site/js/edit-button.js diff --git a/README.md b/README.md index d5dd9f1..d5ceef6 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,8 @@ There are two ways to load the data. - [ ] **To Be Created.** Load data using geolocation API. By calculating the spatial scope of each voter list, the app can identify which scope the user is currently in using a geolocation API, and load the corresponding voter list. +The list loader is triggered either on **button click** or on **Enter keypress**. + ### **Module 2: `list-filters`** This filter filters voters after a particular voter list is loaded. The kernel script for the function resides in `list-filters.js`. This script workds as follows: diff --git a/site/js/edit-button.js b/site/js/edit-button.js deleted file mode 100644 index e69de29..0000000 diff --git a/site/js/filter-window.js b/site/js/filter-window.js index 4607c36..e447d6b 100644 --- a/site/js/filter-window.js +++ b/site/js/filter-window.js @@ -1,3 +1,10 @@ +/* +MISCELLANEOUS +This script hides or shows the filter window on click +When clicking on filter button, the filter window appears +Then, clicking on the areas outside the filter window, the window closes +*/ + const filterOverlayEl = document.querySelector("#filter-overlay"); const filterWindowEl = document.querySelector("#filter-window"); const filterButtonEl = document.querySelector("#filter-popup-button"); diff --git a/site/js/hide-show.js b/site/js/hide-show.js index e26ab2d..c198719 100644 --- a/site/js/hide-show.js +++ b/site/js/hide-show.js @@ -1,4 +1,11 @@ -/* This chunk controls whether the hidable chunk is hidden at the moment +/* +MISCELLANEOUS +This script hides or shows +1. list loader component +2. search box component +3. voter list component +when clicking on the hide-show button. +It is not essential to the core functionalities of the app */ import { listExpanded, onExpandButtonClick } from "./voter-list-expand.js"; diff --git a/site/js/list-filters.js b/site/js/list-filters.js index 301bad7..e0c0fd8 100644 --- a/site/js/list-filters.js +++ b/site/js/list-filters.js @@ -1,4 +1,6 @@ /* +MODULE 2: LIST FILTERS (MAIN) +=================================================== This script contains the links to all the filters. Every time a filter is applied, changed, or taken off, we should calculate a new filtered data by applying all the filters. diff --git a/site/js/list-loader.js b/site/js/list-loader.js index a01a763..c2715bb 100644 --- a/site/js/list-loader.js +++ b/site/js/list-loader.js @@ -1,3 +1,12 @@ +/* +MODULE 1: LIST LOADER +================================================== +This script has the main functionalities of the list loader module +1. Load list on demand +2. Store loaded data in a global variable +3. Export data to be used in other scripts +*/ + import { showVotersOnMap } from "./map.js"; import { fitMap } from "./map.js"; import { showVotersInList } from './voter-list.js'; diff --git a/site/js/map.js b/site/js/map.js index f4108b5..fb6a043 100644 --- a/site/js/map.js +++ b/site/js/map.js @@ -1,3 +1,16 @@ +/* +MODULE 3: Voters display (on the map) +================================================== +Every time a new list is loaded, or when the filter(s) are changed +voters need to be updated both on the map and in the list +This script deals with the map +1. Create geo features from data coming from MODULE 1: LIST-LOADER + or MODULE 2: LIST FILTERS + The created features are ONE MARKER PER ADDRESS +2. Put the geo features on the map, and prepare them with event listeners + The event listeners are to prepare for MODULE 4: VOTER SELECTION +*/ + import { onSelectAction } from "./selected-voter.js"; /* diff --git a/site/js/search-box.js b/site/js/search-box.js index db89572..338a387 100644 --- a/site/js/search-box.js +++ b/site/js/search-box.js @@ -1,3 +1,9 @@ +/* +MODULE 2: LIST FILTERS (COMPONENT) +================================================== +This script contains the functions to filter voters by search box input +Refer to [list-filters.js] to see how all the filters work together +*/ export let voterInputBoxEl = document.querySelector('#search-box-input'); // Step in filter by search box; match if an individual voter fulfills the filter diff --git a/site/js/selected-voter.js b/site/js/selected-voter.js index 1b622dc..0284c3a 100644 --- a/site/js/selected-voter.js +++ b/site/js/selected-voter.js @@ -1,10 +1,14 @@ /* +MODULE 4: VOTER SELECTION +================================================== 1. Use global variable selectedVoter to store the currently voter selected. If no voter is selected at the moment, variable is undefined 2. Whenever a click on the voter list or on the map happens: 2.1 Check if newly selected is the same as the current. 2.1.1 If same, update selectedVoter to undefined -> use unhighlightVoter function 2.1.2 If same, update selectedVoter. unhighlight current voter, highlight new voter + +Also does miscellaneous work, i.e., pan to voter on selection */ import { voterListItemsEl } from "./voter-list.js"; diff --git a/site/js/voter-list.js b/site/js/voter-list.js index 5c96d48..6796096 100644 --- a/site/js/voter-list.js +++ b/site/js/voter-list.js @@ -1,3 +1,14 @@ +/* +MODULE 4: Voters display (on the map) +================================================== +Every time a new list is loaded, or when the filter(s) are changed +voters need to be updated both on the map and in the list +This script deals with the list +1. Create HTML elements of the voters to be added to the voter list +2. Note that these are group by ADDRESS +3. Add event listener to prepare for MODULE 4: VOTER SELECTION +*/ + import { htmlToElement } from './htmlelement.js'; import { changeRecord } from "./save-edit.js"; import { onSelectAction } from "./selected-voter.js"; From 813b53f75d2c2470a41123e794a43fa0372d7c0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Myron=20Ba=C3=B1ez?= Date: Thu, 10 Nov 2022 21:58:16 -0500 Subject: [PATCH 50/95] filter buttons --- site/index.html | 10 ++++++++- site/js/list-filters.js | 50 ++++++++++++++++++++++++++++++++++++++++- site/js/search-box.js | 6 +++++ site/js/voter-list.js | 10 ++++++++- 4 files changed, 73 insertions(+), 3 deletions(-) diff --git a/site/index.html b/site/index.html index 5cc0f12..b91bef7 100644 --- a/site/index.html +++ b/site/index.html @@ -40,7 +40,15 @@
    -
    +
    +
      +
    • D
    • +
    • R
    • +
    • NOP
    • +
    • check_circle
    • +
    • hourglass_top
    • +
    +
    diff --git a/site/js/list-filters.js b/site/js/list-filters.js index e0c0fd8..e18f9a6 100644 --- a/site/js/list-filters.js +++ b/site/js/list-filters.js @@ -13,6 +13,8 @@ eventlistener -> function: 1. apply all filters on by one, 2. update voter list import { data } from "./list-loader.js"; import { filterByNameAddress } from "./search-box.js"; +// import { filterByDemocrat } from "./search-box.js"; +// import { democratList } from "./voter-list.js"; import { showVotersInList } from "./voter-list.js"; import { showVotersOnMap } from "./map.js"; @@ -42,4 +44,50 @@ voterInputBoxEl.addEventListener("input", ( ) => { filteredData = allFilters(data); showVotersInList(filteredData); showVotersOnMap(filteredData); -}); \ No newline at end of file +}); + + + +const democratFilter = document.querySelector('#democrat'); +democratFilter.addEventListener("click", () => { + // filteredData = filterByDemocrat(); + // showVotersInList(filteredData); + // showVotersOnMap(filteredData); + // const democratic = filterByDemocrat(); + // democratList(democratic); + const child = document.getElementsByClassName("list-icon icon-democrat-color"); + console.log(child); + }); + +const republicanFilter = document.querySelector('#republican'); +republicanFilter.addEventListener("click", () => { + filteredData = allFilters(data); + // showVotersInList(filteredData); + // showVotersOnMap(filteredData); + console.log('hello'); + }); + + const noPartyFilter = document.querySelector('#no-party'); + noPartyFilter.addEventListener("click", () => { + filteredData = allFilters(data); + // showVotersInList(filteredData); + // showVotersOnMap(filteredData); + console.log('hello'); + }); + + const activeFilter = document.querySelector('#active'); + activeFilter.addEventListener("click", () => { + filteredData = allFilters(data); + // showVotersInList(filteredData); + // showVotersOnMap(filteredData); + console.log('hello'); + }); + + const inactiveFilter = document.querySelector('#inactive'); + inactiveFilter.addEventListener("click", () => { + filteredData = allFilters(data); + // showVotersInList(filteredData); + // showVotersOnMap(filteredData); + console.log('hello'); + }); + diff --git a/site/js/search-box.js b/site/js/search-box.js index 338a387..010659f 100644 --- a/site/js/search-box.js +++ b/site/js/search-box.js @@ -39,6 +39,12 @@ function filterByNameAddress(data) { return filtered; } +function filterByDemocrat() { + const demClass = document.getElementsByClassName('list-icon icon-democrat-color'); + return demClass; +} + export { filterByNameAddress, + filterByDemocrat, }; \ No newline at end of file diff --git a/site/js/voter-list.js b/site/js/voter-list.js index 6796096..c2f39fa 100644 --- a/site/js/voter-list.js +++ b/site/js/voter-list.js @@ -34,6 +34,13 @@ function groupByKey(data, key) { return dataGroupedByAddress; } +function democratList(democrat) { + const demList = document.querySelector('#voter-list'); + for( const voter of democrat){ + demList.appendChild(voter); + } +} + // The output voters are grouped by their addresses // Function to show address function addAddressToList(address) { @@ -159,13 +166,14 @@ function showVotersInList(data) { showHideExpandButton(); // Scroll back to top - let scrollContainer = document.querySelector("#voter-list-component").querySelector(".scroll-container") + let scrollContainer = document.querySelector("#voter-list-component").querySelector(".scroll-container"); scrollContainer.scrollTop = 0; } export { showVotersInList, voterList, + democratList, }; /* From 775166e5fec915af4ef149e03cc9f1c3e027a158 Mon Sep 17 00:00:00 2001 From: Leejere Date: Fri, 11 Nov 2022 13:02:35 -0500 Subject: [PATCH 51/95] used firestore to save and load list number --- package-lock.json | 1985 +++++++++++++++++++++++++++++++++++----- package.json | 1 + site/index.html | 5 + site/js/list-loader.js | 32 +- site/js/main.js | 65 ++ 5 files changed, 1867 insertions(+), 221 deletions(-) create mode 100644 site/js/main.js diff --git a/package-lock.json b/package-lock.json index ed7b5dc..51d8419 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "1.0.0", "license": "ISC", "dependencies": { + "firebase": "^9.14.0", "papaparse": "^5.3.2" }, "devDependencies": { @@ -647,6 +648,620 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@firebase/analytics": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.8.4.tgz", + "integrity": "sha512-Bgr2tMexv0YrL6kjrOF1xVRts8PM6WWmROpfRQjh0xFU4QSoofBJhkVn2NXDXkHWrr5slFfqB5yOnmgAIsHiMw==", + "dependencies": { + "@firebase/component": "0.5.21", + "@firebase/installations": "0.5.16", + "@firebase/logger": "0.3.4", + "@firebase/util": "1.7.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/analytics-compat": { + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.1.17.tgz", + "integrity": "sha512-36ByEDsH6/3YNuD6yig30s2A/+E1pt333r8SJirUE8+aHYl/DGX0PXplKvJWDGamYYjMwet3Kt4XRrB1NY8mLg==", + "dependencies": { + "@firebase/analytics": "0.8.4", + "@firebase/analytics-types": "0.7.1", + "@firebase/component": "0.5.21", + "@firebase/util": "1.7.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/analytics-types": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.7.1.tgz", + "integrity": "sha512-a1INLjelc1Mqrt2CbGmGdlNBj0zsvwBv0K5q5C6Fje8GSXBMc3+iQQQjzYe/4KkK6nL54UP7ZMeI/Q3VEW72FA==" + }, + "node_modules/@firebase/app": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.8.4.tgz", + "integrity": "sha512-gQntijd+sLaGWjcBQpk33giCEXNzGLB6489NMpypVgEXJwQXYQPSrtb9vUHXot1w1iy/j6xlNl4K8wwwNdRgDg==", + "dependencies": { + "@firebase/component": "0.5.21", + "@firebase/logger": "0.3.4", + "@firebase/util": "1.7.3", + "idb": "7.0.1", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/app-check": { + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.5.17.tgz", + "integrity": "sha512-P4bm0lbs+VgS7pns322GC0hyKuTDCqYk2X4FGBf133LZaw1NXJpzOteqPdCT0hBCaR0QSHk49gxx+bdnSdd5Fg==", + "dependencies": { + "@firebase/component": "0.5.21", + "@firebase/logger": "0.3.4", + "@firebase/util": "1.7.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/app-check-compat": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.2.17.tgz", + "integrity": "sha512-yhiAy6U4MuhbY+DCgvG5FcrXkAL+7YohRzqywycQKr31k/ftelbR5l9Zmo2WJMxdLxfubnnqeG/BYCRHlSvk7A==", + "dependencies": { + "@firebase/app-check": "0.5.17", + "@firebase/app-check-types": "0.4.1", + "@firebase/component": "0.5.21", + "@firebase/logger": "0.3.4", + "@firebase/util": "1.7.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/app-check-interop-types": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.1.1.tgz", + "integrity": "sha512-QpYh5GmiLA9ob8NWAZpHbNNl9TzxxZI4NLevT6MYPRDXKG9BSmBI7FATRfm5uv2QQUVSQrESKog5CCmU16v+7Q==" + }, + "node_modules/@firebase/app-check-types": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.4.1.tgz", + "integrity": "sha512-4X79w2X0H5i5qvaho3qkjZg5qdERnKR4gCfy/fxDmdMMP4QgNJHJ9IBk1E+c4cm5HlaZVcLq9K6z8xaRqjZhyw==" + }, + "node_modules/@firebase/app-compat": { + "version": "0.1.39", + "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.1.39.tgz", + "integrity": "sha512-F5O/N38dVGFzpe6zM//MslYT80rpX0V+MQNMvONPUlXhvDqS5T+8NMSCWOcZ++Z4Hkj8EvgTJk59AMnD8SdyFw==", + "dependencies": { + "@firebase/app": "0.8.4", + "@firebase/component": "0.5.21", + "@firebase/logger": "0.3.4", + "@firebase/util": "1.7.3", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/app-types": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.8.1.tgz", + "integrity": "sha512-p75Ow3QhB82kpMzmOntv866wH9eZ3b4+QbUY+8/DA5Zzdf1c8Nsk8B7kbFpzJt4wwHMdy5LTF5YUnoTc1JiWkw==" + }, + "node_modules/@firebase/auth": { + "version": "0.20.11", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.20.11.tgz", + "integrity": "sha512-cKy91l4URDG3yWfPK7tjUySh2wCLxtTilsR59jiqQJLReBrQsKP79eFDJ6jqWwbEh3+f1lmoH1nKswwbo9XdmA==", + "dependencies": { + "@firebase/component": "0.5.21", + "@firebase/logger": "0.3.4", + "@firebase/util": "1.7.3", + "node-fetch": "2.6.7", + "selenium-webdriver": "4.5.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/auth-compat": { + "version": "0.2.24", + "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.2.24.tgz", + "integrity": "sha512-IuZQScjtoOLkUHtmIUJ2F3E2OpDOyap6L/9HL/DX3nzEA1LrX7wlpeU6OF2jS9E0KLueWKIrSkIQOOsKoQj/sA==", + "dependencies": { + "@firebase/auth": "0.20.11", + "@firebase/auth-types": "0.11.1", + "@firebase/component": "0.5.21", + "@firebase/util": "1.7.3", + "node-fetch": "2.6.7", + "selenium-webdriver": "4.5.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/auth-interop-types": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.7.tgz", + "integrity": "sha512-yA/dTveGGPcc85JP8ZE/KZqfGQyQTBCV10THdI8HTlP1GDvNrhr//J5jAt58MlsCOaO3XmC4DqScPBbtIsR/EA==", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/auth-types": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.11.1.tgz", + "integrity": "sha512-ud7T39VG9ptTrC2fOy/XlU+ubC+BVuBJPteuzsPZSa9l7gkntvWgVb3Z/3FxqqRPlkVUYiyvmsbRN3DE1He2ow==", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/component": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.5.21.tgz", + "integrity": "sha512-12MMQ/ulfygKpEJpseYMR0HunJdlsLrwx2XcEs40M18jocy2+spyzHHEwegN3x/2/BLFBjR5247Etmz0G97Qpg==", + "dependencies": { + "@firebase/util": "1.7.3", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database": { + "version": "0.13.10", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.13.10.tgz", + "integrity": "sha512-KRucuzZ7ZHQsRdGEmhxId5jyM2yKsjsQWF9yv0dIhlxYg0D8rCVDZc/waoPKA5oV3/SEIoptF8F7R1Vfe7BCQA==", + "dependencies": { + "@firebase/auth-interop-types": "0.1.7", + "@firebase/component": "0.5.21", + "@firebase/logger": "0.3.4", + "@firebase/util": "1.7.3", + "faye-websocket": "0.11.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database-compat": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-0.2.10.tgz", + "integrity": "sha512-fK+IgUUqVKcWK/gltzDU+B1xauCOfY6vulO8lxoNTkcCGlSxuTtwsdqjGkFmgFRMYjXFWWJ6iFcJ/vXahzwCtA==", + "dependencies": { + "@firebase/component": "0.5.21", + "@firebase/database": "0.13.10", + "@firebase/database-types": "0.9.17", + "@firebase/logger": "0.3.4", + "@firebase/util": "1.7.3", + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/database-types": { + "version": "0.9.17", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.9.17.tgz", + "integrity": "sha512-YQm2tCZyxNtEnlS5qo5gd2PAYgKCy69tUKwioGhApCFThW+mIgZs7IeYeJo2M51i4LCixYUl+CvnOyAnb/c3XA==", + "dependencies": { + "@firebase/app-types": "0.8.1", + "@firebase/util": "1.7.3" + } + }, + "node_modules/@firebase/firestore": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-3.7.3.tgz", + "integrity": "sha512-hnA8hljwJBpejv0SPlt0yiej1wz3VRcLzoNAZujTCI1wLoADkRNsqic5uN/Ge0M0vbmHliLXtet/PDqvEbB9Ww==", + "dependencies": { + "@firebase/component": "0.5.21", + "@firebase/logger": "0.3.4", + "@firebase/util": "1.7.3", + "@firebase/webchannel-wrapper": "0.8.1", + "@grpc/grpc-js": "^1.3.2", + "@grpc/proto-loader": "^0.6.13", + "node-fetch": "2.6.7", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=10.10.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/firestore-compat": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.2.3.tgz", + "integrity": "sha512-FgJwGCA2K+lsGk6gbJo57qn4iocQSGfOlNi2s4QsEO/WOVIU00yYGm408fN7iAGpr9d5VKyulO4sYcic7cS51g==", + "dependencies": { + "@firebase/component": "0.5.21", + "@firebase/firestore": "3.7.3", + "@firebase/firestore-types": "2.5.1", + "@firebase/util": "1.7.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/firestore-types": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-2.5.1.tgz", + "integrity": "sha512-xG0CA6EMfYo8YeUxC8FeDzf6W3FX1cLlcAGBYV6Cku12sZRI81oWcu61RSKM66K6kUENP+78Qm8mvroBcm1whw==", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/functions": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.8.8.tgz", + "integrity": "sha512-weNcDQJcH3/2YFaXd5dF5pUk3IQdZY60QNuWpq7yS+uaPlCRHjT0K989Q3ZcmYwXz7mHTfhlQamXdA4Yobgt+Q==", + "dependencies": { + "@firebase/app-check-interop-types": "0.1.1", + "@firebase/auth-interop-types": "0.1.7", + "@firebase/component": "0.5.21", + "@firebase/messaging-interop-types": "0.1.1", + "@firebase/util": "1.7.3", + "node-fetch": "2.6.7", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/functions-compat": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.2.8.tgz", + "integrity": "sha512-5w668whT+bm6oVcFqIxfFbn9N77WycpNCfZNg1l0iC+5RLSt53RTVu43pqi43vh23Vp4ad+SRBgZiQGAMen5wA==", + "dependencies": { + "@firebase/component": "0.5.21", + "@firebase/functions": "0.8.8", + "@firebase/functions-types": "0.5.1", + "@firebase/util": "1.7.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/functions-types": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.5.1.tgz", + "integrity": "sha512-olEJnTuULM/ws0pwhHA0Ze5oIdpFbZsdBGCaBhyL4pm1NUR4Moh0cyAsqr+VtqHCNMGquHU1GJ77qITkoonp0w==" + }, + "node_modules/@firebase/installations": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.5.16.tgz", + "integrity": "sha512-k3iyjr+yZnDOcJbP+CCZW3/zQJf9gYL2CNBJs9QbmFJoLz7cgIcnAT/XNDMudxcggF1goLfq4+MygpzHD0NzLA==", + "dependencies": { + "@firebase/component": "0.5.21", + "@firebase/util": "1.7.3", + "idb": "7.0.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/installations-compat": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.1.16.tgz", + "integrity": "sha512-Xp7s3iUMZ6/TN0a+g1kpHNEn7h59kSxi44/2I7bd3X6xwHnxMu0TqYB7U9WfqEhqiI9iKulL3g06wIZqaklElw==", + "dependencies": { + "@firebase/component": "0.5.21", + "@firebase/installations": "0.5.16", + "@firebase/installations-types": "0.4.1", + "@firebase/util": "1.7.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/installations-types": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.4.1.tgz", + "integrity": "sha512-ac906QcmipomZjSasGDYNS1LDy4JNGzQ4VXHpFtoOrI6U2QGFkRezZpI+5bzfU062JOD+doO6irYC6Uwnv/GnA==", + "peerDependencies": { + "@firebase/app-types": "0.x" + } + }, + "node_modules/@firebase/logger": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.3.4.tgz", + "integrity": "sha512-hlFglGRgZEwoyClZcGLx/Wd+zoLfGmbDkFx56mQt/jJ0XMbfPqwId1kiPl0zgdWZX+D8iH+gT6GuLPFsJWgiGw==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/messaging": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.11.0.tgz", + "integrity": "sha512-V7+Xw4QlB8PgINY7Wml+Uj8A3S2nR0ooVoaqfRJ8ZN3W7A4aO/DCkjPsf6DXehwfqRLA7PGB9Boe8l9Idy7icA==", + "dependencies": { + "@firebase/component": "0.5.21", + "@firebase/installations": "0.5.16", + "@firebase/messaging-interop-types": "0.1.1", + "@firebase/util": "1.7.3", + "idb": "7.0.1", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/messaging-compat": { + "version": "0.1.21", + "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.1.21.tgz", + "integrity": "sha512-oxQCQ8EXqpSaTybryokbEM/LAqkG0L7OJuucllCg5roqRGIHE437Abus0Bn67P8TKJaYjyKxomg8wCvfmInjlg==", + "dependencies": { + "@firebase/component": "0.5.21", + "@firebase/messaging": "0.11.0", + "@firebase/util": "1.7.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/messaging-interop-types": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.1.1.tgz", + "integrity": "sha512-7XuY87zPh01EBaeS3s6co31Il5oGbPl5MxAg6Uj3fPv7PqJQlbwQ+B5k7CKSF/Y26tRxp+u+usxIvIWCSEA8CQ==" + }, + "node_modules/@firebase/performance": { + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.5.17.tgz", + "integrity": "sha512-NDgzI5JYo6Itnj1FWhMkK3LtwKhtOnhC+WBkxezjzFVuCOornQjvu7ucAU1o2dHXh7MFruhHGFPsHyfkkMCljA==", + "dependencies": { + "@firebase/component": "0.5.21", + "@firebase/installations": "0.5.16", + "@firebase/logger": "0.3.4", + "@firebase/util": "1.7.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/performance-compat": { + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.1.17.tgz", + "integrity": "sha512-Hci5MrDlRuqwVozq7LaSAufXXElz+AtmEQArix64kLRJqHhOu5K/8TpuZXM/klR6gnLyIrk+01CrAemH3zHpDw==", + "dependencies": { + "@firebase/component": "0.5.21", + "@firebase/logger": "0.3.4", + "@firebase/performance": "0.5.17", + "@firebase/performance-types": "0.1.1", + "@firebase/util": "1.7.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/performance-types": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.1.1.tgz", + "integrity": "sha512-wiJRLBg8EPaYSGJqx7aqkZ3L5fULfZa9zOTs4C06K020g0zzJh9kUUO/0U3wvHz7zRQjJxTO8Jw4SDjxs3EZrA==" + }, + "node_modules/@firebase/remote-config": { + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.3.15.tgz", + "integrity": "sha512-ZCyqoCaftoNvc2r4zPaqNV4OgC4sRHjcQI+agzXESnhDLnTY8DpCaQ0m9j6deHuxxDOgu8QPDb8psLbjR+9CgQ==", + "dependencies": { + "@firebase/component": "0.5.21", + "@firebase/installations": "0.5.16", + "@firebase/logger": "0.3.4", + "@firebase/util": "1.7.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/remote-config-compat": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.1.16.tgz", + "integrity": "sha512-BWonzeqODnGki/fZ17zOnjJFR5CWbIOU0PmYGjWBnbkWxpFDdE3zNsz8JTVd/Mkt7y2PHFMYpLsyZ473E/62FQ==", + "dependencies": { + "@firebase/component": "0.5.21", + "@firebase/logger": "0.3.4", + "@firebase/remote-config": "0.3.15", + "@firebase/remote-config-types": "0.2.1", + "@firebase/util": "1.7.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/remote-config-types": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.2.1.tgz", + "integrity": "sha512-1PGx4vKtMMd5uB6G1Nj2b8fOnJx7mIJGzkdyfhIM1oQx9k3dJ+pVu4StrNm46vHaD8ZlOQLr91YfUE43xSXwSg==" + }, + "node_modules/@firebase/storage": { + "version": "0.9.14", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.9.14.tgz", + "integrity": "sha512-he8VAJ4BLkQdebnna15TI1/ymkwQTeKnjA/psKMAJ2+/UswD/68bCMKOlTrMvw6Flv3zc5YZk1xdL9DHR0i6wg==", + "dependencies": { + "@firebase/component": "0.5.21", + "@firebase/util": "1.7.3", + "node-fetch": "2.6.7", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app": "0.x" + } + }, + "node_modules/@firebase/storage-compat": { + "version": "0.1.22", + "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.1.22.tgz", + "integrity": "sha512-uv33WnAEcxf2983Z03uhJmKc91LKSsRijFwut8xeoJamJoGAVj1Tc9Mio491aI1KZ+RMkNFghHL2FpxjuvxpPg==", + "dependencies": { + "@firebase/component": "0.5.21", + "@firebase/storage": "0.9.14", + "@firebase/storage-types": "0.6.1", + "@firebase/util": "1.7.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@firebase/app-compat": "0.x" + } + }, + "node_modules/@firebase/storage-types": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.6.1.tgz", + "integrity": "sha512-/pkNzKiGCSjdBBZHPvWL1kkPZfM3pFJ38HPJE1xTHwLBwdrFb4JrmY+5/E4ma5ePsbejecIOD1SZhEKDB/JwUQ==", + "peerDependencies": { + "@firebase/app-types": "0.x", + "@firebase/util": "1.x" + } + }, + "node_modules/@firebase/util": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.7.3.tgz", + "integrity": "sha512-wxNqWbqokF551WrJ9BIFouU/V5SL1oYCGx1oudcirdhadnQRFH5v1sjgGL7cUV/UsekSycygphdrF2lxBxOYKg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@firebase/webchannel-wrapper": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.8.1.tgz", + "integrity": "sha512-CJW8vxt6bJaBeco2VnlJjmCmAkrrtIdf0GGKvpAB4J5gw8Gi0rHb+qsgKp6LsyS5W6ALPLawLs7phZmw02dvLw==" + }, + "node_modules/@grpc/grpc-js": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.7.3.tgz", + "integrity": "sha512-H9l79u4kJ2PVSxUNA08HMYAnUBLj9v6KjYQ7SQ71hOZcEXhShE/y5iQCesP8+6/Ik/7i2O0a10bPquIcYfufog==", + "dependencies": { + "@grpc/proto-loader": "^0.7.0", + "@types/node": ">=12.12.47" + }, + "engines": { + "node": "^8.13.0 || >=10.10.0" + } + }, + "node_modules/@grpc/grpc-js/node_modules/@grpc/proto-loader": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.3.tgz", + "integrity": "sha512-5dAvoZwna2Py3Ef96Ux9jIkp3iZ62TUsV00p3wVBPNX5K178UbNi8Q7gQVqwXT1Yq9RejIGG9G2IPEo93T6RcA==", + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^7.0.0", + "yargs": "^16.2.0" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@grpc/grpc-js/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/@grpc/grpc-js/node_modules/protobufjs": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.1.2.tgz", + "integrity": "sha512-4ZPTPkXCdel3+L81yw3dG6+Kq3umdWKh7Dc7GW/CpNk4SX3hK58iPCWeCyhVTDrbkNeKrYNZ7EojM5WDaEWTLQ==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@grpc/grpc-js/node_modules/protobufjs/node_modules/long": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz", + "integrity": "sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==" + }, + "node_modules/@grpc/grpc-js/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.6.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.13.tgz", + "integrity": "sha512-FjxPYDRTn6Ec3V0arm1FtSpmP6V50wuph2yILpyvTKzjc76oDdoihXqM1DzOW5ubvCC8GivfCnNtfaRE8myJ7g==", + "dependencies": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^6.11.3", + "yargs": "^16.2.0" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@grpc/proto-loader/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/@grpc/proto-loader/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -1163,6 +1778,60 @@ "node": ">= 8" } }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, "node_modules/@sideway/address": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", @@ -1282,6 +1951,11 @@ "@types/istanbul-lib-report": "*" } }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, "node_modules/@types/minimist": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", @@ -1291,8 +1965,7 @@ "node_modules/@types/node": { "version": "18.11.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.2.tgz", - "integrity": "sha512-BWN3M23gLO2jVG8g/XHIRFWiiV4/GckeFIqbU/C4V3xpoBBWSMk4OZomouN0wCkfQFPqgZikyLr7DOYDysIkkw==", - "dev": true + "integrity": "sha512-BWN3M23gLO2jVG8g/XHIRFWiiV4/GckeFIqbU/C4V3xpoBBWSMk4OZomouN0wCkfQFPqgZikyLr7DOYDysIkkw==" }, "node_modules/@types/normalize-package-data": { "version": "2.4.1", @@ -1425,7 +2098,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -1434,7 +2106,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -1612,8 +2283,7 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base64-js": { "version": "1.5.1", @@ -1664,7 +2334,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1918,7 +2587,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -1929,8 +2597,7 @@ "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/colord": { "version": "2.9.3", @@ -1950,8 +2617,7 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/convert-source-map": { "version": "1.9.0", @@ -1959,6 +2625,11 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, "node_modules/corser": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", @@ -2181,8 +2852,7 @@ "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/end-of-stream": { "version": "1.4.4", @@ -2207,7 +2877,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, "engines": { "node": ">=6" } @@ -2573,6 +3242,17 @@ "reusify": "^1.0.4" } }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", @@ -2671,6 +3351,39 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/firebase": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-9.14.0.tgz", + "integrity": "sha512-wePrsf7W33mhT7RVXQavragoAgXb/NDm22vuhwJXkprrQ2Y9alrEKC5LTAtLJL3P2dHdDmeylS6PLZwWPEE79A==", + "dependencies": { + "@firebase/analytics": "0.8.4", + "@firebase/analytics-compat": "0.1.17", + "@firebase/app": "0.8.4", + "@firebase/app-check": "0.5.17", + "@firebase/app-check-compat": "0.2.17", + "@firebase/app-compat": "0.1.39", + "@firebase/app-types": "0.8.1", + "@firebase/auth": "0.20.11", + "@firebase/auth-compat": "0.2.24", + "@firebase/database": "0.13.10", + "@firebase/database-compat": "0.2.10", + "@firebase/firestore": "3.7.3", + "@firebase/firestore-compat": "0.2.3", + "@firebase/functions": "0.8.8", + "@firebase/functions-compat": "0.2.8", + "@firebase/installations": "0.5.16", + "@firebase/installations-compat": "0.1.16", + "@firebase/messaging": "0.11.0", + "@firebase/messaging-compat": "0.1.21", + "@firebase/performance": "0.5.17", + "@firebase/performance-compat": "0.1.17", + "@firebase/remote-config": "0.3.15", + "@firebase/remote-config-compat": "0.1.16", + "@firebase/storage": "0.9.14", + "@firebase/storage-compat": "0.1.22", + "@firebase/util": "1.7.3" + } + }, "node_modules/flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -2750,8 +3463,7 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.2", @@ -2786,7 +3498,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -2830,7 +3541,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -3056,6 +3766,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + }, "node_modules/http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", @@ -3132,6 +3847,11 @@ "node": ">=0.10.0" } }, + "node_modules/idb": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.1.tgz", + "integrity": "sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==" + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -3162,6 +3882,11 @@ "node": ">= 4" } }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -3228,7 +3953,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -3237,8 +3961,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "1.3.8", @@ -3292,7 +4015,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, "engines": { "node": ">=8" } @@ -3369,6 +4091,11 @@ "node": ">=0.10.0" } }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -4308,6 +5035,39 @@ "node": ">=6" } }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/jszip/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/jszip/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -4366,6 +5126,14 @@ "node": ">= 0.8.0" } }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -4393,6 +5161,11 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -4405,6 +5178,11 @@ "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", "dev": true }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -4577,7 +5355,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -4686,8 +5463,6 @@ "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "peer": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -4779,7 +5554,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "dependencies": { "wrappy": "1" } @@ -4873,6 +5647,11 @@ "node": ">=6" } }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, "node_modules/papaparse": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.3.2.tgz", @@ -4930,7 +5709,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -5186,6 +5964,11 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -5209,6 +5992,31 @@ "node": ">= 6" } }, + "node_modules/protobufjs": { + "version": "6.11.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", + "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -5498,7 +6306,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -5601,7 +6408,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -5647,8 +6453,7 @@ "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/safer-buffer": { "version": "2.1.2", @@ -5662,6 +6467,19 @@ "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", "dev": true }, + "node_modules/selenium-webdriver": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.5.0.tgz", + "integrity": "sha512-9mSFii+lRwcnT2KUAB1kqvx6+mMiiQHH60Y0VUtr3kxxi3oZ3CV3B8e2nuJ7T4SPb+Q6VA0swswe7rYpez07Bg==", + "dependencies": { + "jszip": "^3.10.0", + "tmp": "^0.2.1", + "ws": ">=8.7.0" + }, + "engines": { + "node": ">= 14.20.0" + } + }, "node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", @@ -5671,6 +6489,11 @@ "semver": "bin/semver.js" } }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, "node_modules/shallow-clone": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", @@ -5926,7 +6749,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -5940,7 +6762,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -6282,6 +7103,17 @@ "dev": true, "peer": true }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -6312,9 +7144,7 @@ "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true, - "peer": true + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "node_modules/tree-kill": { "version": "1.2.2", @@ -6337,8 +7167,7 @@ "node_modules/tslib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/type-check": { "version": "0.4.0", @@ -6440,8 +7269,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/v8-compile-cache": { "version": "2.3.0", @@ -6504,9 +7332,28 @@ "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true, - "peer": true + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "engines": { + "node": ">=0.8.0" + } }, "node_modules/whatwg-encoding": { "version": "2.0.0", @@ -6524,8 +7371,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "peer": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -6559,7 +7404,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -6575,8 +7419,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/write-file-atomic": { "version": "4.0.2", @@ -6595,8 +7438,6 @@ "version": "8.9.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.9.0.tgz", "integrity": "sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==", - "dev": true, - "peer": true, "engines": { "node": ">=10.0.0" }, @@ -6617,7 +7458,6 @@ "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, "engines": { "node": ">=10" } @@ -6659,7 +7499,6 @@ "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, "engines": { "node": ">=10" } @@ -7041,127 +7880,645 @@ "@babel/helper-plugin-utils": "^7.10.4" } }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", + "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.18.6" + } + }, + "@babel/template": { + "version": "7.18.10", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", + "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.18.10", + "@babel/types": "^7.18.10" + } + }, + "@babel/traverse": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.4.tgz", + "integrity": "sha512-w3K1i+V5u2aJUOXBFFC5pveFLmtq1s3qcdDNC2qRI6WPBQIDaKFqXxDEqDO/h1dQ3HjsZoZMyIy6jGLq0xtw+g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.19.4", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.19.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.19.4", + "@babel/types": "^7.19.4", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.4.tgz", + "integrity": "sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw==", + "dev": true, + "requires": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + } + }, + "@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "@csstools/selector-specificity": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz", + "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==", + "dev": true, + "requires": {} + }, + "@eslint/eslintrc": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", + "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.15.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + } + }, + "@firebase/analytics": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.8.4.tgz", + "integrity": "sha512-Bgr2tMexv0YrL6kjrOF1xVRts8PM6WWmROpfRQjh0xFU4QSoofBJhkVn2NXDXkHWrr5slFfqB5yOnmgAIsHiMw==", + "requires": { + "@firebase/component": "0.5.21", + "@firebase/installations": "0.5.16", + "@firebase/logger": "0.3.4", + "@firebase/util": "1.7.3", + "tslib": "^2.1.0" + } + }, + "@firebase/analytics-compat": { + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.1.17.tgz", + "integrity": "sha512-36ByEDsH6/3YNuD6yig30s2A/+E1pt333r8SJirUE8+aHYl/DGX0PXplKvJWDGamYYjMwet3Kt4XRrB1NY8mLg==", + "requires": { + "@firebase/analytics": "0.8.4", + "@firebase/analytics-types": "0.7.1", + "@firebase/component": "0.5.21", + "@firebase/util": "1.7.3", + "tslib": "^2.1.0" + } + }, + "@firebase/analytics-types": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.7.1.tgz", + "integrity": "sha512-a1INLjelc1Mqrt2CbGmGdlNBj0zsvwBv0K5q5C6Fje8GSXBMc3+iQQQjzYe/4KkK6nL54UP7ZMeI/Q3VEW72FA==" + }, + "@firebase/app": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.8.4.tgz", + "integrity": "sha512-gQntijd+sLaGWjcBQpk33giCEXNzGLB6489NMpypVgEXJwQXYQPSrtb9vUHXot1w1iy/j6xlNl4K8wwwNdRgDg==", + "requires": { + "@firebase/component": "0.5.21", + "@firebase/logger": "0.3.4", + "@firebase/util": "1.7.3", + "idb": "7.0.1", + "tslib": "^2.1.0" + } + }, + "@firebase/app-check": { + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.5.17.tgz", + "integrity": "sha512-P4bm0lbs+VgS7pns322GC0hyKuTDCqYk2X4FGBf133LZaw1NXJpzOteqPdCT0hBCaR0QSHk49gxx+bdnSdd5Fg==", + "requires": { + "@firebase/component": "0.5.21", + "@firebase/logger": "0.3.4", + "@firebase/util": "1.7.3", + "tslib": "^2.1.0" + } + }, + "@firebase/app-check-compat": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.2.17.tgz", + "integrity": "sha512-yhiAy6U4MuhbY+DCgvG5FcrXkAL+7YohRzqywycQKr31k/ftelbR5l9Zmo2WJMxdLxfubnnqeG/BYCRHlSvk7A==", + "requires": { + "@firebase/app-check": "0.5.17", + "@firebase/app-check-types": "0.4.1", + "@firebase/component": "0.5.21", + "@firebase/logger": "0.3.4", + "@firebase/util": "1.7.3", + "tslib": "^2.1.0" + } + }, + "@firebase/app-check-interop-types": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.1.1.tgz", + "integrity": "sha512-QpYh5GmiLA9ob8NWAZpHbNNl9TzxxZI4NLevT6MYPRDXKG9BSmBI7FATRfm5uv2QQUVSQrESKog5CCmU16v+7Q==" + }, + "@firebase/app-check-types": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.4.1.tgz", + "integrity": "sha512-4X79w2X0H5i5qvaho3qkjZg5qdERnKR4gCfy/fxDmdMMP4QgNJHJ9IBk1E+c4cm5HlaZVcLq9K6z8xaRqjZhyw==" + }, + "@firebase/app-compat": { + "version": "0.1.39", + "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.1.39.tgz", + "integrity": "sha512-F5O/N38dVGFzpe6zM//MslYT80rpX0V+MQNMvONPUlXhvDqS5T+8NMSCWOcZ++Z4Hkj8EvgTJk59AMnD8SdyFw==", + "requires": { + "@firebase/app": "0.8.4", + "@firebase/component": "0.5.21", + "@firebase/logger": "0.3.4", + "@firebase/util": "1.7.3", + "tslib": "^2.1.0" + } + }, + "@firebase/app-types": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.8.1.tgz", + "integrity": "sha512-p75Ow3QhB82kpMzmOntv866wH9eZ3b4+QbUY+8/DA5Zzdf1c8Nsk8B7kbFpzJt4wwHMdy5LTF5YUnoTc1JiWkw==" + }, + "@firebase/auth": { + "version": "0.20.11", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-0.20.11.tgz", + "integrity": "sha512-cKy91l4URDG3yWfPK7tjUySh2wCLxtTilsR59jiqQJLReBrQsKP79eFDJ6jqWwbEh3+f1lmoH1nKswwbo9XdmA==", + "requires": { + "@firebase/component": "0.5.21", + "@firebase/logger": "0.3.4", + "@firebase/util": "1.7.3", + "node-fetch": "2.6.7", + "selenium-webdriver": "4.5.0", + "tslib": "^2.1.0" + } + }, + "@firebase/auth-compat": { + "version": "0.2.24", + "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.2.24.tgz", + "integrity": "sha512-IuZQScjtoOLkUHtmIUJ2F3E2OpDOyap6L/9HL/DX3nzEA1LrX7wlpeU6OF2jS9E0KLueWKIrSkIQOOsKoQj/sA==", + "requires": { + "@firebase/auth": "0.20.11", + "@firebase/auth-types": "0.11.1", + "@firebase/component": "0.5.21", + "@firebase/util": "1.7.3", + "node-fetch": "2.6.7", + "selenium-webdriver": "4.5.0", + "tslib": "^2.1.0" + } + }, + "@firebase/auth-interop-types": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.7.tgz", + "integrity": "sha512-yA/dTveGGPcc85JP8ZE/KZqfGQyQTBCV10THdI8HTlP1GDvNrhr//J5jAt58MlsCOaO3XmC4DqScPBbtIsR/EA==", + "requires": {} + }, + "@firebase/auth-types": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.11.1.tgz", + "integrity": "sha512-ud7T39VG9ptTrC2fOy/XlU+ubC+BVuBJPteuzsPZSa9l7gkntvWgVb3Z/3FxqqRPlkVUYiyvmsbRN3DE1He2ow==", + "requires": {} + }, + "@firebase/component": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.5.21.tgz", + "integrity": "sha512-12MMQ/ulfygKpEJpseYMR0HunJdlsLrwx2XcEs40M18jocy2+spyzHHEwegN3x/2/BLFBjR5247Etmz0G97Qpg==", + "requires": { + "@firebase/util": "1.7.3", + "tslib": "^2.1.0" + } + }, + "@firebase/database": { + "version": "0.13.10", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.13.10.tgz", + "integrity": "sha512-KRucuzZ7ZHQsRdGEmhxId5jyM2yKsjsQWF9yv0dIhlxYg0D8rCVDZc/waoPKA5oV3/SEIoptF8F7R1Vfe7BCQA==", + "requires": { + "@firebase/auth-interop-types": "0.1.7", + "@firebase/component": "0.5.21", + "@firebase/logger": "0.3.4", + "@firebase/util": "1.7.3", + "faye-websocket": "0.11.4", + "tslib": "^2.1.0" + } + }, + "@firebase/database-compat": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-0.2.10.tgz", + "integrity": "sha512-fK+IgUUqVKcWK/gltzDU+B1xauCOfY6vulO8lxoNTkcCGlSxuTtwsdqjGkFmgFRMYjXFWWJ6iFcJ/vXahzwCtA==", + "requires": { + "@firebase/component": "0.5.21", + "@firebase/database": "0.13.10", + "@firebase/database-types": "0.9.17", + "@firebase/logger": "0.3.4", + "@firebase/util": "1.7.3", + "tslib": "^2.1.0" + } + }, + "@firebase/database-types": { + "version": "0.9.17", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.9.17.tgz", + "integrity": "sha512-YQm2tCZyxNtEnlS5qo5gd2PAYgKCy69tUKwioGhApCFThW+mIgZs7IeYeJo2M51i4LCixYUl+CvnOyAnb/c3XA==", + "requires": { + "@firebase/app-types": "0.8.1", + "@firebase/util": "1.7.3" + } + }, + "@firebase/firestore": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-3.7.3.tgz", + "integrity": "sha512-hnA8hljwJBpejv0SPlt0yiej1wz3VRcLzoNAZujTCI1wLoADkRNsqic5uN/Ge0M0vbmHliLXtet/PDqvEbB9Ww==", + "requires": { + "@firebase/component": "0.5.21", + "@firebase/logger": "0.3.4", + "@firebase/util": "1.7.3", + "@firebase/webchannel-wrapper": "0.8.1", + "@grpc/grpc-js": "^1.3.2", + "@grpc/proto-loader": "^0.6.13", + "node-fetch": "2.6.7", + "tslib": "^2.1.0" + } + }, + "@firebase/firestore-compat": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.2.3.tgz", + "integrity": "sha512-FgJwGCA2K+lsGk6gbJo57qn4iocQSGfOlNi2s4QsEO/WOVIU00yYGm408fN7iAGpr9d5VKyulO4sYcic7cS51g==", + "requires": { + "@firebase/component": "0.5.21", + "@firebase/firestore": "3.7.3", + "@firebase/firestore-types": "2.5.1", + "@firebase/util": "1.7.3", + "tslib": "^2.1.0" + } + }, + "@firebase/firestore-types": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-2.5.1.tgz", + "integrity": "sha512-xG0CA6EMfYo8YeUxC8FeDzf6W3FX1cLlcAGBYV6Cku12sZRI81oWcu61RSKM66K6kUENP+78Qm8mvroBcm1whw==", + "requires": {} + }, + "@firebase/functions": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.8.8.tgz", + "integrity": "sha512-weNcDQJcH3/2YFaXd5dF5pUk3IQdZY60QNuWpq7yS+uaPlCRHjT0K989Q3ZcmYwXz7mHTfhlQamXdA4Yobgt+Q==", + "requires": { + "@firebase/app-check-interop-types": "0.1.1", + "@firebase/auth-interop-types": "0.1.7", + "@firebase/component": "0.5.21", + "@firebase/messaging-interop-types": "0.1.1", + "@firebase/util": "1.7.3", + "node-fetch": "2.6.7", + "tslib": "^2.1.0" + } + }, + "@firebase/functions-compat": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.2.8.tgz", + "integrity": "sha512-5w668whT+bm6oVcFqIxfFbn9N77WycpNCfZNg1l0iC+5RLSt53RTVu43pqi43vh23Vp4ad+SRBgZiQGAMen5wA==", + "requires": { + "@firebase/component": "0.5.21", + "@firebase/functions": "0.8.8", + "@firebase/functions-types": "0.5.1", + "@firebase/util": "1.7.3", + "tslib": "^2.1.0" + } + }, + "@firebase/functions-types": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.5.1.tgz", + "integrity": "sha512-olEJnTuULM/ws0pwhHA0Ze5oIdpFbZsdBGCaBhyL4pm1NUR4Moh0cyAsqr+VtqHCNMGquHU1GJ77qITkoonp0w==" + }, + "@firebase/installations": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.5.16.tgz", + "integrity": "sha512-k3iyjr+yZnDOcJbP+CCZW3/zQJf9gYL2CNBJs9QbmFJoLz7cgIcnAT/XNDMudxcggF1goLfq4+MygpzHD0NzLA==", + "requires": { + "@firebase/component": "0.5.21", + "@firebase/util": "1.7.3", + "idb": "7.0.1", + "tslib": "^2.1.0" + } + }, + "@firebase/installations-compat": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.1.16.tgz", + "integrity": "sha512-Xp7s3iUMZ6/TN0a+g1kpHNEn7h59kSxi44/2I7bd3X6xwHnxMu0TqYB7U9WfqEhqiI9iKulL3g06wIZqaklElw==", + "requires": { + "@firebase/component": "0.5.21", + "@firebase/installations": "0.5.16", + "@firebase/installations-types": "0.4.1", + "@firebase/util": "1.7.3", + "tslib": "^2.1.0" + } + }, + "@firebase/installations-types": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.4.1.tgz", + "integrity": "sha512-ac906QcmipomZjSasGDYNS1LDy4JNGzQ4VXHpFtoOrI6U2QGFkRezZpI+5bzfU062JOD+doO6irYC6Uwnv/GnA==", + "requires": {} + }, + "@firebase/logger": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.3.4.tgz", + "integrity": "sha512-hlFglGRgZEwoyClZcGLx/Wd+zoLfGmbDkFx56mQt/jJ0XMbfPqwId1kiPl0zgdWZX+D8iH+gT6GuLPFsJWgiGw==", + "requires": { + "tslib": "^2.1.0" + } + }, + "@firebase/messaging": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.11.0.tgz", + "integrity": "sha512-V7+Xw4QlB8PgINY7Wml+Uj8A3S2nR0ooVoaqfRJ8ZN3W7A4aO/DCkjPsf6DXehwfqRLA7PGB9Boe8l9Idy7icA==", + "requires": { + "@firebase/component": "0.5.21", + "@firebase/installations": "0.5.16", + "@firebase/messaging-interop-types": "0.1.1", + "@firebase/util": "1.7.3", + "idb": "7.0.1", + "tslib": "^2.1.0" + } + }, + "@firebase/messaging-compat": { + "version": "0.1.21", + "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.1.21.tgz", + "integrity": "sha512-oxQCQ8EXqpSaTybryokbEM/LAqkG0L7OJuucllCg5roqRGIHE437Abus0Bn67P8TKJaYjyKxomg8wCvfmInjlg==", + "requires": { + "@firebase/component": "0.5.21", + "@firebase/messaging": "0.11.0", + "@firebase/util": "1.7.3", + "tslib": "^2.1.0" + } + }, + "@firebase/messaging-interop-types": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.1.1.tgz", + "integrity": "sha512-7XuY87zPh01EBaeS3s6co31Il5oGbPl5MxAg6Uj3fPv7PqJQlbwQ+B5k7CKSF/Y26tRxp+u+usxIvIWCSEA8CQ==" + }, + "@firebase/performance": { + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.5.17.tgz", + "integrity": "sha512-NDgzI5JYo6Itnj1FWhMkK3LtwKhtOnhC+WBkxezjzFVuCOornQjvu7ucAU1o2dHXh7MFruhHGFPsHyfkkMCljA==", + "requires": { + "@firebase/component": "0.5.21", + "@firebase/installations": "0.5.16", + "@firebase/logger": "0.3.4", + "@firebase/util": "1.7.3", + "tslib": "^2.1.0" + } + }, + "@firebase/performance-compat": { + "version": "0.1.17", + "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.1.17.tgz", + "integrity": "sha512-Hci5MrDlRuqwVozq7LaSAufXXElz+AtmEQArix64kLRJqHhOu5K/8TpuZXM/klR6gnLyIrk+01CrAemH3zHpDw==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@firebase/component": "0.5.21", + "@firebase/logger": "0.3.4", + "@firebase/performance": "0.5.17", + "@firebase/performance-types": "0.1.1", + "@firebase/util": "1.7.3", + "tslib": "^2.1.0" } }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@firebase/performance-types": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.1.1.tgz", + "integrity": "sha512-wiJRLBg8EPaYSGJqx7aqkZ3L5fULfZa9zOTs4C06K020g0zzJh9kUUO/0U3wvHz7zRQjJxTO8Jw4SDjxs3EZrA==" + }, + "@firebase/remote-config": { + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.3.15.tgz", + "integrity": "sha512-ZCyqoCaftoNvc2r4zPaqNV4OgC4sRHjcQI+agzXESnhDLnTY8DpCaQ0m9j6deHuxxDOgu8QPDb8psLbjR+9CgQ==", + "requires": { + "@firebase/component": "0.5.21", + "@firebase/installations": "0.5.16", + "@firebase/logger": "0.3.4", + "@firebase/util": "1.7.3", + "tslib": "^2.1.0" } }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, + "@firebase/remote-config-compat": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.1.16.tgz", + "integrity": "sha512-BWonzeqODnGki/fZ17zOnjJFR5CWbIOU0PmYGjWBnbkWxpFDdE3zNsz8JTVd/Mkt7y2PHFMYpLsyZ473E/62FQ==", "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@firebase/component": "0.5.21", + "@firebase/logger": "0.3.4", + "@firebase/remote-config": "0.3.15", + "@firebase/remote-config-types": "0.2.1", + "@firebase/util": "1.7.3", + "tslib": "^2.1.0" } }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, + "@firebase/remote-config-types": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.2.1.tgz", + "integrity": "sha512-1PGx4vKtMMd5uB6G1Nj2b8fOnJx7mIJGzkdyfhIM1oQx9k3dJ+pVu4StrNm46vHaD8ZlOQLr91YfUE43xSXwSg==" + }, + "@firebase/storage": { + "version": "0.9.14", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.9.14.tgz", + "integrity": "sha512-he8VAJ4BLkQdebnna15TI1/ymkwQTeKnjA/psKMAJ2+/UswD/68bCMKOlTrMvw6Flv3zc5YZk1xdL9DHR0i6wg==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@firebase/component": "0.5.21", + "@firebase/util": "1.7.3", + "node-fetch": "2.6.7", + "tslib": "^2.1.0" } }, - "@babel/plugin-syntax-typescript": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", - "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", - "dev": true, + "@firebase/storage-compat": { + "version": "0.1.22", + "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.1.22.tgz", + "integrity": "sha512-uv33WnAEcxf2983Z03uhJmKc91LKSsRijFwut8xeoJamJoGAVj1Tc9Mio491aI1KZ+RMkNFghHL2FpxjuvxpPg==", "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@firebase/component": "0.5.21", + "@firebase/storage": "0.9.14", + "@firebase/storage-types": "0.6.1", + "@firebase/util": "1.7.3", + "tslib": "^2.1.0" } }, - "@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", - "dev": true, + "@firebase/storage-types": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.6.1.tgz", + "integrity": "sha512-/pkNzKiGCSjdBBZHPvWL1kkPZfM3pFJ38HPJE1xTHwLBwdrFb4JrmY+5/E4ma5ePsbejecIOD1SZhEKDB/JwUQ==", + "requires": {} + }, + "@firebase/util": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.7.3.tgz", + "integrity": "sha512-wxNqWbqokF551WrJ9BIFouU/V5SL1oYCGx1oudcirdhadnQRFH5v1sjgGL7cUV/UsekSycygphdrF2lxBxOYKg==", "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "tslib": "^2.1.0" } }, - "@babel/traverse": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.4.tgz", - "integrity": "sha512-w3K1i+V5u2aJUOXBFFC5pveFLmtq1s3qcdDNC2qRI6WPBQIDaKFqXxDEqDO/h1dQ3HjsZoZMyIy6jGLq0xtw+g==", - "dev": true, + "@firebase/webchannel-wrapper": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-0.8.1.tgz", + "integrity": "sha512-CJW8vxt6bJaBeco2VnlJjmCmAkrrtIdf0GGKvpAB4J5gw8Gi0rHb+qsgKp6LsyS5W6ALPLawLs7phZmw02dvLw==" + }, + "@grpc/grpc-js": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.7.3.tgz", + "integrity": "sha512-H9l79u4kJ2PVSxUNA08HMYAnUBLj9v6KjYQ7SQ71hOZcEXhShE/y5iQCesP8+6/Ik/7i2O0a10bPquIcYfufog==", "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.4", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.4", - "@babel/types": "^7.19.4", - "debug": "^4.1.0", - "globals": "^11.1.0" + "@grpc/proto-loader": "^0.7.0", + "@types/node": ">=12.12.47" }, "dependencies": { - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true + "@grpc/proto-loader": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.3.tgz", + "integrity": "sha512-5dAvoZwna2Py3Ef96Ux9jIkp3iZ62TUsV00p3wVBPNX5K178UbNi8Q7gQVqwXT1Yq9RejIGG9G2IPEo93T6RcA==", + "requires": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^7.0.0", + "yargs": "^16.2.0" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "protobufjs": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.1.2.tgz", + "integrity": "sha512-4ZPTPkXCdel3+L81yw3dG6+Kq3umdWKh7Dc7GW/CpNk4SX3hK58iPCWeCyhVTDrbkNeKrYNZ7EojM5WDaEWTLQ==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/node": ">=13.7.0", + "long": "^5.0.0" + }, + "dependencies": { + "long": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.1.tgz", + "integrity": "sha512-GKSNGeNAtw8IryjjkhZxuKB3JzlcLTwjtiQCHKvqQet81I93kXslhDQruGI/QsddO83mcDToBVy7GqGS/zYf/A==" + } + } + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } } } }, - "@babel/types": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.4.tgz", - "integrity": "sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - } - }, - "@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "@csstools/selector-specificity": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz", - "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==", - "dev": true, - "requires": {} - }, - "@eslint/eslintrc": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", - "integrity": "sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==", - "dev": true, + "@grpc/proto-loader": { + "version": "0.6.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.13.tgz", + "integrity": "sha512-FjxPYDRTn6Ec3V0arm1FtSpmP6V50wuph2yILpyvTKzjc76oDdoihXqM1DzOW5ubvCC8GivfCnNtfaRE8myJ7g==", "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.4.0", - "globals": "^13.15.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^6.11.3", + "yargs": "^16.2.0" + }, + "dependencies": { + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + } } }, "@hapi/hoek": { @@ -7569,6 +8926,60 @@ "fastq": "^1.6.0" } }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, "@sideway/address": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", @@ -7688,6 +9099,11 @@ "@types/istanbul-lib-report": "*" } }, + "@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, "@types/minimist": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", @@ -7697,8 +9113,7 @@ "@types/node": { "version": "18.11.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.2.tgz", - "integrity": "sha512-BWN3M23gLO2jVG8g/XHIRFWiiV4/GckeFIqbU/C4V3xpoBBWSMk4OZomouN0wCkfQFPqgZikyLr7DOYDysIkkw==", - "dev": true + "integrity": "sha512-BWN3M23gLO2jVG8g/XHIRFWiiV4/GckeFIqbU/C4V3xpoBBWSMk4OZomouN0wCkfQFPqgZikyLr7DOYDysIkkw==" }, "@types/normalize-package-data": { "version": "2.4.1", @@ -7805,14 +9220,12 @@ "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "requires": { "color-convert": "^2.0.1" } @@ -7948,8 +9361,7 @@ "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base64-js": { "version": "1.5.1", @@ -7983,7 +9395,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -8157,7 +9568,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "requires": { "color-name": "~1.1.4" } @@ -8165,8 +9575,7 @@ "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "colord": { "version": "2.9.3", @@ -8183,8 +9592,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "convert-source-map": { "version": "1.9.0", @@ -8192,6 +9600,11 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "dev": true }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, "corser": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", @@ -8357,8 +9770,7 @@ "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "end-of-stream": { "version": "1.4.4", @@ -8382,8 +9794,7 @@ "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "escape-string-regexp": { "version": "4.0.0", @@ -8656,6 +10067,14 @@ "reusify": "^1.0.4" } }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "requires": { + "websocket-driver": ">=0.5.1" + } + }, "fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", @@ -8733,6 +10152,39 @@ "path-exists": "^4.0.0" } }, + "firebase": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-9.14.0.tgz", + "integrity": "sha512-wePrsf7W33mhT7RVXQavragoAgXb/NDm22vuhwJXkprrQ2Y9alrEKC5LTAtLJL3P2dHdDmeylS6PLZwWPEE79A==", + "requires": { + "@firebase/analytics": "0.8.4", + "@firebase/analytics-compat": "0.1.17", + "@firebase/app": "0.8.4", + "@firebase/app-check": "0.5.17", + "@firebase/app-check-compat": "0.2.17", + "@firebase/app-compat": "0.1.39", + "@firebase/app-types": "0.8.1", + "@firebase/auth": "0.20.11", + "@firebase/auth-compat": "0.2.24", + "@firebase/database": "0.13.10", + "@firebase/database-compat": "0.2.10", + "@firebase/firestore": "3.7.3", + "@firebase/firestore-compat": "0.2.3", + "@firebase/functions": "0.8.8", + "@firebase/functions-compat": "0.2.8", + "@firebase/installations": "0.5.16", + "@firebase/installations-compat": "0.1.16", + "@firebase/messaging": "0.11.0", + "@firebase/messaging-compat": "0.1.21", + "@firebase/performance": "0.5.17", + "@firebase/performance-compat": "0.1.17", + "@firebase/remote-config": "0.3.15", + "@firebase/remote-config-compat": "0.1.16", + "@firebase/storage": "0.9.14", + "@firebase/storage-compat": "0.1.22", + "@firebase/util": "1.7.3" + } + }, "flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -8786,8 +10238,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "fsevents": { "version": "2.3.2", @@ -8811,8 +10262,7 @@ "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-intrinsic": { "version": "1.1.3", @@ -8841,7 +10291,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -9006,6 +10455,11 @@ "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", "dev": true }, + "http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + }, "http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", @@ -9064,6 +10518,11 @@ "safer-buffer": ">= 2.1.2 < 3.0.0" } }, + "idb": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.0.1.tgz", + "integrity": "sha512-UUxlE7vGWK5RfB/fDwEGgRf84DY/ieqNha6msMV99UsEMQhJ1RwbCd8AYBj3QMgnE3VZnfQvm4oKVCJTYlqIgg==" + }, "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -9077,6 +10536,11 @@ "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, "import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -9119,7 +10583,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -9128,8 +10591,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "1.3.8", @@ -9173,8 +10635,7 @@ "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "is-generator-fn": { "version": "2.1.0", @@ -9224,6 +10685,11 @@ "integrity": "sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q==", "dev": true }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -9966,6 +11432,41 @@ "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", "dev": true }, + "jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -10009,6 +11510,14 @@ "type-check": "~0.4.0" } }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "requires": { + "immediate": "~3.0.5" + } + }, "lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -10030,6 +11539,11 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -10042,6 +11556,11 @@ "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", "dev": true }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -10164,7 +11683,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -10250,8 +11768,6 @@ "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "peer": true, "requires": { "whatwg-url": "^5.0.0" } @@ -10316,7 +11832,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "requires": { "wrappy": "1" } @@ -10380,6 +11895,11 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, "papaparse": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/papaparse/-/papaparse-5.3.2.tgz", @@ -10421,8 +11941,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" }, "path-key": { "version": "3.1.1", @@ -10608,6 +12127,11 @@ } } }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -10625,6 +12149,26 @@ "sisteransi": "^1.0.5" } }, + "protobufjs": { + "version": "6.11.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", + "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + } + }, "proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -10839,8 +12383,7 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" }, "require-from-string": { "version": "2.0.2", @@ -10914,7 +12457,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, "requires": { "glob": "^7.1.3" } @@ -10940,8 +12482,7 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safer-buffer": { "version": "2.1.2", @@ -10955,12 +12496,27 @@ "integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw==", "dev": true }, + "selenium-webdriver": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.5.0.tgz", + "integrity": "sha512-9mSFii+lRwcnT2KUAB1kqvx6+mMiiQHH60Y0VUtr3kxxi3oZ3CV3B8e2nuJ7T4SPb+Q6VA0swswe7rYpez07Bg==", + "requires": { + "jszip": "^3.10.0", + "tmp": "^0.2.1", + "ws": ">=8.7.0" + } + }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + }, "shallow-clone": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", @@ -11166,7 +12722,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -11177,7 +12732,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "requires": { "ansi-regex": "^5.0.1" } @@ -11447,6 +13001,14 @@ "dev": true, "peer": true }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "requires": { + "rimraf": "^3.0.0" + } + }, "tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -11471,9 +13033,7 @@ "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true, - "peer": true + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "tree-kill": { "version": "1.2.2", @@ -11490,8 +13050,7 @@ "tslib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "type-check": { "version": "0.4.0", @@ -11562,8 +13121,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "v8-compile-cache": { "version": "2.3.0", @@ -11617,9 +13175,22 @@ "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true, - "peer": true + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" }, "whatwg-encoding": { "version": "2.0.0", @@ -11634,8 +13205,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "peer": true, "requires": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -11660,7 +13229,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -11670,8 +13238,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "write-file-atomic": { "version": "4.0.2", @@ -11687,15 +13254,12 @@ "version": "8.9.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.9.0.tgz", "integrity": "sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==", - "dev": true, - "peer": true, "requires": {} }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, "yallist": { "version": "4.0.0", @@ -11735,8 +13299,7 @@ "yargs-parser": { "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" }, "yauzl": { "version": "2.10.0", diff --git a/package.json b/package.json index b70795f..f584bdd 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "stylelint-config-standard": "^28.0.0" }, "dependencies": { + "firebase": "^9.14.0", "papaparse": "^5.3.2" } } diff --git a/site/index.html b/site/index.html index 5cc0f12..b6ce2ce 100644 --- a/site/index.html +++ b/site/index.html @@ -145,6 +145,7 @@ + @@ -154,6 +155,10 @@ + + + + diff --git a/site/js/list-loader.js b/site/js/list-loader.js index c2715bb..9540f50 100644 --- a/site/js/list-loader.js +++ b/site/js/list-loader.js @@ -10,6 +10,7 @@ This script has the main functionalities of the list loader module import { showVotersOnMap } from "./map.js"; import { fitMap } from "./map.js"; import { showVotersInList } from './voter-list.js'; +import { loadListNum, saveListNum } from "./main.js"; /* Hide and Show List Loader @@ -90,8 +91,8 @@ function loadVoterData(text) { showVotersOnMap(data); fitMap(); - // Store current list number to local storage to be loaded the next time - localStorage.setItem("current-list", inputNumber); + // Save current list number to be loaded the next time + saveListNum(inputNumber); window.data = data; } @@ -100,11 +101,13 @@ function loadVoterData(text) { 2. Check fetch status using checkFetchStatus 3. If check success, load data using loadVoterData; otherwise, show error tooltip */ -function loadByListNumber(inputNumber) { - let path = './data/voters_lists/' + inputNumber + '.csv'; +function loadByListNumber(number) { + // Update input number, if loading from cloud and it is undefined + inputNumber = number; + let path = './data/voters_lists/' + number + '.csv'; // Set the input box placeholder - listNumberInputEl.placeholder = `${inputNumber}`; + listNumberInputEl.placeholder = `${number}`; // Fetch the particular CSV file fetch(path) @@ -128,13 +131,22 @@ function onLoadButtonClick() { Automatically load list from local storage */ -let autoList = localStorage.getItem("current-list") || "{}"; -if(autoList == "{}" || autoList == undefined || autoList.length != 4) { - autoList = "0101"; -} +// First try to load data from local storage +// inputNumber = localStorage.getItem("current-list") || "{}"; +// loadListNum(); -loadByListNumber(autoList); +// } +// First try to load list number from local storage +inputNumber = localStorage.getItem("current-list") || "{}"; +// When local storage has a valid number, use that +if(inputNumber != undefined & inputNumber.length != 4) { + loadByListNumber(inputNumber); +} else { + // If success, load that list from fire store + // If not success, load list 0101 + loadListNum(loadByListNumber, loadByListNumber); +} // Add event listener to the load button loadButtonEl.addEventListener("click", onLoadButtonClick); diff --git a/site/js/main.js b/site/js/main.js new file mode 100644 index 0000000..155638e --- /dev/null +++ b/site/js/main.js @@ -0,0 +1,65 @@ +/* +MAIN COORDINATION +This script is used for setting up cloud storage + +This part is inspired by Mjumbe Poe +*/ + +// Import functions used to use Firestore cloud storage +// https://firebase.google.com/docs/web/setup#available-libraries for libraries to use +import { initializeApp } from 'https://www.gstatic.com/firebasejs/9.13.0/firebase-app.js'; +import { getFirestore, doc, setDoc, getDoc } from 'https://www.gstatic.com/firebasejs/9.13.0/firebase-firestore.js'; + +// My web app's Firebase config +const firebaseConfig = { + apiKey: "AIzaSyDL11M21sMZ6wJ1SxFvEqEvQkipD7DFKjk", + authDomain: "voter-canvassing.firebaseapp.com", + projectId: "voter-canvassing", + storageBucket: "voter-canvassing.appspot.com", + messagingSenderId: "20100623977", + appId: "1:20100623977:web:2d20af24c659bdda17bcf8", + measurementId: "G-BXCLNBWQH6", +}; + +// Initialize firebase +const firebaseApp = initializeApp(firebaseConfig); +const firestoreDb = getFirestore(firebaseApp); + +// LOAD LIST NUMBER FROM LAST TIME FROM CLOUD +// This function is called when starting the page and the local storage has no list number stored +// If success, load that list +// If not success, load list 0101 +async function loadListNum(onSuccess, onFailure) { + try { + const notesDoc = doc(firestoreDb, "voter-canvassing", "current-list"); + const result = await getDoc(notesDoc); + console.log("Loaded list number from Firestore!"); + onSuccess(result.data().inputNumber); + } catch { + if(onFailure) { + onFailure("0101"); + } + } +} + +// SAVE CURRENT LIST NUMBER LOCALLY AND TO CLOUD +// This function is called whenever a voter list gets loaded [list-loader.js] +// Current list number automatically saved +async function saveListNum(inputNumber) { + // Save locally + localStorage.setItem("current-list", inputNumber); + + // Save to the cloud + try { + const notesDoc = doc(firestoreDb, "voter-canvassing", "current-list"); + await setDoc(notesDoc, { inputNumber }); + console.log("Saved number to cloud"); + } catch(error) { + console.log(error); + } +} + +export { + loadListNum, + saveListNum, +}; \ No newline at end of file From 5cc0898530df296907976e3f212b616cf5df9ddf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Myron=20Ba=C3=B1ez?= Date: Fri, 11 Nov 2022 13:51:18 -0500 Subject: [PATCH 52/95] filter --- site/js/list-filters.js | 14 ++++++-------- site/js/search-box.js | 9 ++++----- site/js/voter-list.js | 13 ++++++------- 3 files changed, 16 insertions(+), 20 deletions(-) diff --git a/site/js/list-filters.js b/site/js/list-filters.js index e18f9a6..6292a20 100644 --- a/site/js/list-filters.js +++ b/site/js/list-filters.js @@ -46,17 +46,15 @@ voterInputBoxEl.addEventListener("input", ( ) => { showVotersOnMap(filteredData); }); - - const democratFilter = document.querySelector('#democrat'); democratFilter.addEventListener("click", () => { - // filteredData = filterByDemocrat(); - // showVotersInList(filteredData); - // showVotersOnMap(filteredData); + filteredData = allFilters(data); + showVotersInList(filteredData); + showVotersOnMap(filteredData); // const democratic = filterByDemocrat(); - // democratList(democratic); - const child = document.getElementsByClassName("list-icon icon-democrat-color"); - console.log(child); + // // democratList(democratic); + // // const child = document.getElementsByClassName("list-voter"); + console.log(filteredData); }); const republicanFilter = document.querySelector('#republican'); diff --git a/site/js/search-box.js b/site/js/search-box.js index 010659f..8ef8daa 100644 --- a/site/js/search-box.js +++ b/site/js/search-box.js @@ -39,12 +39,11 @@ function filterByNameAddress(data) { return filtered; } -function filterByDemocrat() { - const demClass = document.getElementsByClassName('list-icon icon-democrat-color'); - return demClass; -} +// function filterByDemocrat() { +// const demClass = document.getElementsByClassName('list-icon icon-democrat-color'); +// return demClass; +// } export { filterByNameAddress, - filterByDemocrat, }; \ No newline at end of file diff --git a/site/js/voter-list.js b/site/js/voter-list.js index c2f39fa..a844c5d 100644 --- a/site/js/voter-list.js +++ b/site/js/voter-list.js @@ -34,12 +34,12 @@ function groupByKey(data, key) { return dataGroupedByAddress; } -function democratList(democrat) { - const demList = document.querySelector('#voter-list'); - for( const voter of democrat){ - demList.appendChild(voter); - } -} +// function democratList(democrat) { +// const demList = document.querySelector('#voter-list'); +// for(const voter of democrat){ +// demList.appendChild(voter); +// } +// } // The output voters are grouped by their addresses // Function to show address @@ -173,7 +173,6 @@ function showVotersInList(data) { export { showVotersInList, voterList, - democratList, }; /* From 68007a7ed668b5f03cdac09301139d8494ca5520 Mon Sep 17 00:00:00 2001 From: Leejere Date: Sat, 12 Nov 2022 12:11:11 -0500 Subject: [PATCH 53/95] modified pointer event so map can be clicked when search box is hidden --- site/css/main-box.css | 14 ++++++++------ site/css/main.css | 1 + site/css/search-box.css | 2 +- site/index.html | 5 ++++- site/js/hide-show.js | 8 ++++++-- site/js/list-loader.js | 26 +++++++++++++++----------- 6 files changed, 35 insertions(+), 21 deletions(-) diff --git a/site/css/main-box.css b/site/css/main-box.css index bade8df..00a8526 100644 --- a/site/css/main-box.css +++ b/site/css/main-box.css @@ -1,15 +1,17 @@ .main-box { position: relative; top: 8vh; - height: 30vh; z-index: 9999; - margin: 0 1rem; + padding: 0 1rem; + margin-right: 0.5rem; } -@media only screen and (max-width: 400px) { - .main-box { - margin: 0 0.5rem; - } +#nav-component { + height: 5vh; +} + +#top-component { + height: 25vh; } @media only screen and (min-width: 600px) { diff --git a/site/css/main.css b/site/css/main.css index 6f9c0a8..6d64891 100644 --- a/site/css/main.css +++ b/site/css/main.css @@ -11,6 +11,7 @@ body { width: 100vw; padding: 0; margin: 0; + position: relative; } .component-margin-left { diff --git a/site/css/search-box.css b/site/css/search-box.css index 7fcab63..7dc71bd 100644 --- a/site/css/search-box.css +++ b/site/css/search-box.css @@ -1,6 +1,6 @@ #search-box-component { position: relative; - height: 6.5em; + height: 3.5em; z-index: 999; transition: transform 0.5s; } diff --git a/site/index.html b/site/index.html index 01b1947..45a89e3 100644 --- a/site/index.html +++ b/site/index.html @@ -50,7 +50,7 @@
    -
    +
  • D
  • -
  • R
  • -
  • NOP
  • -
  • check_circle
  • -
  • hourglass_top
  • diff --git a/site/js/list-filters.js b/site/js/list-filters.js index 7fa4a6f..3ddb188 100644 --- a/site/js/list-filters.js +++ b/site/js/list-filters.js @@ -106,22 +106,4 @@ for (const cb of statusFilter) { showVotersOnMap(filteredStatus); showVotersInList(filteredStatus); }); -} - - - const activeFilter = document.querySelector('#active'); - activeFilter.addEventListener("click", () => { - filteredData = allFilters(data); - // showVotersInList(filteredData); - // showVotersOnMap(filteredData); - console.log('hello'); - }); - - const inactiveFilter = document.querySelector('#inactive'); - inactiveFilter.addEventListener("click", () => { - filteredData = allFilters(data); - // showVotersInList(filteredData); - // showVotersOnMap(filteredData); - console.log('hello'); - }); - +} \ No newline at end of file From 97429af50ff56dd91ff1eece17719ee6cdcc4bf0 Mon Sep 17 00:00:00 2001 From: Leejere Date: Sat, 12 Nov 2022 16:59:35 -0500 Subject: [PATCH 59/95] transition between normal and edit mode --- site/css/edit.css | 30 ++++++++++++++++++++++++++++++ site/index.html | 4 ++++ site/js/hide-show.js | 12 +++++++++--- site/js/selected-voter.js | 7 +++++++ site/js/show-info.js | 0 5 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 site/js/show-info.js diff --git a/site/css/edit.css b/site/css/edit.css index 877b1dc..c8d1586 100644 --- a/site/css/edit.css +++ b/site/css/edit.css @@ -3,6 +3,15 @@ height: 10em; } +/* +The bottom component is originally not showing until you select a voter +*/ + +#bottom-component { + transform: translateX(-30em); + transition: all 0.5s ease-in-out; +} + #bottom-component .edit-button { background-color: var(--main-color); float: left; @@ -24,3 +33,24 @@ grid-template: repeat(6, 1fr) / repeat(5, 1fr); margin-bottom: 1rem; } + +.basic-info-panel { + height: 16vh; +} + +#edit-component { + transform: translateX(-30em); + transition: transform 0.5s ease-in-out; +} + +.voter-history-panel { + min-height: 15vh; +} + +.this-visit-panel { + min-height: 25vh; +} + +.last-visit-panel { + min-height: 15vh; +} \ No newline at end of file diff --git a/site/index.html b/site/index.html index 964d55c..2752d88 100644 --- a/site/index.html +++ b/site/index.html @@ -133,6 +133,9 @@
    +
    A name
    +
    some address
    +
    Republican
    @@ -168,6 +171,7 @@ + diff --git a/site/js/hide-show.js b/site/js/hide-show.js index 75c1f57..5635ac5 100644 --- a/site/js/hide-show.js +++ b/site/js/hide-show.js @@ -21,10 +21,10 @@ let hideButtonEl = document.querySelector("#list-loader-hide"); let listLoaderHidableEl = document.querySelector("#list-loader-hidable-chunk"); let searchBoxHidableEl = document.querySelector("#search-box-component"); let voterListHidableEl = document.querySelector("#voter-list-component"); -let bottomComponentEl = document.querySelector("#bottom-component"); +export let bottomComponentEl = document.querySelector("#bottom-component"); let navComponentEl = document.querySelector("#nav-component"); - let topComponentEl = document.querySelector("#top-component"); +let editComponentEl = document.querySelector("#edit-component"); function hideChunk() { // Hide chunk by moving @@ -92,6 +92,9 @@ function switchToEdit() { // Move the whole thing up bottomComponentEl.style.top = "7vh"; + // Make the other panels show + editComponentEl.style.transform = "translateX(0em)"; + // Change the icon setTimeout(() => { editButtonEl.querySelector("span").innerHTML = "chevron_left"; @@ -105,7 +108,10 @@ function switchToNormal() { topComponentEl.style.transform = "translateX(0em)"; navComponentEl.style.transform = "translateX(0em)"; - // Move the whole thing up + // Hide the other panels + editComponentEl.style.transform = "translateX(-30em)"; + + // Move the whole thing down bottomComponentEl.style.top = "72vh"; // Change the icon diff --git a/site/js/selected-voter.js b/site/js/selected-voter.js index 9e0e31e..9f26654 100644 --- a/site/js/selected-voter.js +++ b/site/js/selected-voter.js @@ -17,6 +17,7 @@ import { showVotersOnMap } from "./map.js"; import { data } from "./list-loader.js"; import { filteredData } from "./list-filters.js"; import { voterListExpandButtonEl, voterListContainerEl, onExpandButtonClick } from "./list-expand.js"; +import { bottomComponentEl } from "./hide-show.js"; /* @@ -114,6 +115,9 @@ function onSelectAction(thisId) { if(selectedVoter != undefined && thisId == selectedVoter) { unhighlightVoter(); selectedVoter = undefined; + // Show info edit panel + bottomComponentEl.style.transform = "translateX(-30em)"; + } else { // If the list is currently expanded, unexpand it if(voterListExpandButtonEl.expandStatus == 1) { @@ -122,6 +126,9 @@ function onSelectAction(thisId) { highlightVoter(thisId); // Update stored voter ID selectedVoter = thisId; + + // Show info edit panel + bottomComponentEl.style.transform = "translateX(0em)"; } } diff --git a/site/js/show-info.js b/site/js/show-info.js new file mode 100644 index 0000000..e69de29 From 86615d80f6e1fe22192341e593b107a48e86221f Mon Sep 17 00:00:00 2001 From: Leejere Date: Sat, 12 Nov 2022 21:41:43 -0500 Subject: [PATCH 60/95] update data based on cloud storage right after loading --- site/css/edit.css | 3 +-- site/css/list-loader.css | 2 +- site/index.html | 2 +- site/js/hide-show.js | 3 +-- site/js/list-filters.js | 1 + site/js/list-loader.js | 20 +++++++++++----- site/js/main.js | 49 +++++++++++++++++++++++++++++++++++++-- site/js/selected-voter.js | 7 +++++- site/js/show-info.js | 43 ++++++++++++++++++++++++++++++++++ 9 files changed, 115 insertions(+), 15 deletions(-) diff --git a/site/css/edit.css b/site/css/edit.css index c8d1586..d07fb53 100644 --- a/site/css/edit.css +++ b/site/css/edit.css @@ -29,8 +29,7 @@ The bottom component is originally not showing until you select a voter clear: left; background-color: white; padding: 0.5rem 0.5rem 0; - display: grid; - grid-template: repeat(6, 1fr) / repeat(5, 1fr); + display: block; margin-bottom: 1rem; } diff --git a/site/css/list-loader.css b/site/css/list-loader.css index d2ea383..f5922ef 100644 --- a/site/css/list-loader.css +++ b/site/css/list-loader.css @@ -1,7 +1,7 @@ #list-loader-component { position: relative; height: 3.2em; - width: 10rem; + width: 11rem; float: left; z-index: 99999; margin: 0; diff --git a/site/index.html b/site/index.html index dfdb047..0e27c89 100644 --- a/site/index.html +++ b/site/index.html @@ -16,9 +16,9 @@ - + diff --git a/site/js/hide-show.js b/site/js/hide-show.js index 5635ac5..791e235 100644 --- a/site/js/hide-show.js +++ b/site/js/hide-show.js @@ -6,7 +6,6 @@ MISCELLANEOUS 3. voter list component when clicking on the hide-show button aside the list loader 2. Shows or hides components when clicking on the edit or go-back button - */ // FIRST @@ -24,7 +23,7 @@ let voterListHidableEl = document.querySelector("#voter-list-component"); export let bottomComponentEl = document.querySelector("#bottom-component"); let navComponentEl = document.querySelector("#nav-component"); let topComponentEl = document.querySelector("#top-component"); -let editComponentEl = document.querySelector("#edit-component"); +export let editComponentEl = document.querySelector("#edit-component"); function hideChunk() { // Hide chunk by moving diff --git a/site/js/list-filters.js b/site/js/list-filters.js index 3ddb188..aa759cb 100644 --- a/site/js/list-filters.js +++ b/site/js/list-filters.js @@ -40,6 +40,7 @@ Search box filter import { voterInputBoxEl } from "./search-box.js"; voterInputBoxEl.addEventListener("input", ( ) => { filteredData = allFilters(data); + window.filteredData = filteredData; showVotersInList(filteredData); showVotersOnMap(filteredData); }); diff --git a/site/js/list-loader.js b/site/js/list-loader.js index 5bcc35a..8366282 100644 --- a/site/js/list-loader.js +++ b/site/js/list-loader.js @@ -8,9 +8,8 @@ This script has the main functionalities of the list loader module */ import { showVotersOnMap } from "./map.js"; -import { fitMap } from "./map.js"; import { showVotersInList } from './voter-list.js'; -import { loadListNum, saveListNum } from "./main.js"; +import { loadListNum, saveListNum, updateAdditionalInfo } from "./main.js"; /* Hide and Show List Loader @@ -28,6 +27,11 @@ let inputNumber; export let data; export let votersFeature; +// A global object to store additional voter data from firebase +export let additionalData = { + info: null, +}; + /* FUNCTIONS */ @@ -87,10 +91,14 @@ function loadVoterData(text) { // Create new property: combine house number with street name data = makeShortAddress(data); - // Show voters on the map and list - showVotersInList(data); - showVotersOnMap(data); - fitMap(); + // Load additional voter data from firebase, and update data + // And then display the data on the map and in the list + updateAdditionalInfo(inputNumber, data, showVotersInList, showVotersOnMap); + + // // Show voters on the map and list + // showVotersInList(data); + // showVotersOnMap(data); + // Save current list number to be loaded the next time saveListNum(inputNumber); diff --git a/site/js/main.js b/site/js/main.js index 155638e..555f6da 100644 --- a/site/js/main.js +++ b/site/js/main.js @@ -9,7 +9,6 @@ This part is inspired by Mjumbe Poe // https://firebase.google.com/docs/web/setup#available-libraries for libraries to use import { initializeApp } from 'https://www.gstatic.com/firebasejs/9.13.0/firebase-app.js'; import { getFirestore, doc, setDoc, getDoc } from 'https://www.gstatic.com/firebasejs/9.13.0/firebase-firestore.js'; - // My web app's Firebase config const firebaseConfig = { apiKey: "AIzaSyDL11M21sMZ6wJ1SxFvEqEvQkipD7DFKjk", @@ -25,6 +24,10 @@ const firebaseConfig = { const firebaseApp = initializeApp(firebaseConfig); const firestoreDb = getFirestore(firebaseApp); +/* +Save or Load List Number +*/ + // LOAD LIST NUMBER FROM LAST TIME FROM CLOUD // This function is called when starting the page and the local storage has no list number stored // If success, load that list @@ -45,6 +48,9 @@ async function loadListNum(onSuccess, onFailure) { // SAVE CURRENT LIST NUMBER LOCALLY AND TO CLOUD // This function is called whenever a voter list gets loaded [list-loader.js] // Current list number automatically saved + +import { additionalData } from "./list-loader.js"; + async function saveListNum(inputNumber) { // Save locally localStorage.setItem("current-list", inputNumber); @@ -53,13 +59,52 @@ async function saveListNum(inputNumber) { try { const notesDoc = doc(firestoreDb, "voter-canvassing", "current-list"); await setDoc(notesDoc, { inputNumber }); - console.log("Saved number to cloud"); + console.log("Saved current list number to cloud!"); } catch(error) { console.log(error); } } +/* +Save or Load Edited Voter Info +*/ + +import { fitMap } from "./map.js"; + +// Update the data loaded from the csv +function updateVoters(additionalInfo, data) { + for(let voter of data) { + let thisId = voter["ID Number"]; + if(additionalInfo[thisId]) { + let thisAdditionalInfo = additionalInfo[thisId]; + let keys = Object.keys(thisAdditionalInfo); + for(let key of keys){ + voter[key] = thisAdditionalInfo[key]; + } + } + } +} + +// Function called to get additional voter data from the cloud +// And then use the updated data to update the map and list +async function updateAdditionalInfo(listNumber, data, showOnMap, showInList) { + try { + const voterNotesDoc = doc(firestoreDb, "voter-info", listNumber); + const result = await getDoc(voterNotesDoc); + additionalData.info = result.data(); + console.log("Got additional data from cloud!", additionalData.info); + updateVoters(result.data(), data); + console.log("Updated data!", data); + showOnMap(data); + showInList(data); + fitMap(); + } catch { + additionalData.info = {}; + } +} + export { loadListNum, saveListNum, + updateAdditionalInfo, }; \ No newline at end of file diff --git a/site/js/selected-voter.js b/site/js/selected-voter.js index 9f26654..4d9ef66 100644 --- a/site/js/selected-voter.js +++ b/site/js/selected-voter.js @@ -7,6 +7,7 @@ MODULE 4: VOTER SELECTION 2.1 Check if newly selected is the same as the current. 2.1.1 If same, update selectedVoter to undefined -> use unhighlightVoter function 2.1.2 If same, update selectedVoter. unhighlight current voter, highlight new voter + 2.2 Show this voter's information on the edit panels Also does miscellaneous work, i.e., pan to voter on selection */ @@ -18,6 +19,7 @@ import { data } from "./list-loader.js"; import { filteredData } from "./list-filters.js"; import { voterListExpandButtonEl, voterListContainerEl, onExpandButtonClick } from "./list-expand.js"; import { bottomComponentEl } from "./hide-show.js"; +import { displayInfo } from "./show-info.js"; /* @@ -127,8 +129,11 @@ function onSelectAction(thisId) { // Update stored voter ID selectedVoter = thisId; - // Show info edit panel + // Show info edit panel (if not already) bottomComponentEl.style.transform = "translateX(0em)"; + + // Display voter info + displayInfo(thisId); } } diff --git a/site/js/show-info.js b/site/js/show-info.js index e69de29..9e26cc5 100644 --- a/site/js/show-info.js +++ b/site/js/show-info.js @@ -0,0 +1,43 @@ +/* +SHOW INFO WHEN A VOTER IS SELECTED +*/ + +import { data } from "./list-loader.js"; + +let basicInfoNameEl = document.querySelector(".info-panel-name"); +let basicInfoAddressEl = document.querySelector(".info-panel-address"); +let basicInfoPartyEl = document.querySelector(".info-panel-party"); + +function displayName(thisVoter) { + const name = `${thisVoter["First Name"]} ${thisVoter["Last Name"]}`; + basicInfoNameEl.innerHTML = name; +} + +function displayAddress(thisVoter) { + const address = thisVoter.short_address; + basicInfoAddressEl.innerHTML = address; +} + +function displayParty(thisVoter) { + const party = thisVoter["Party Code"]; + basicInfoPartyEl.innerHTML = party; +} + +function findThisVoter(thisId) { + for(let voter of data) { + if(voter["ID Number"] === thisId) { + return(voter); + } + } +} + +function displayInfo(thisId) { + let thisVoter = findThisVoter(thisId); + displayName(thisVoter); + displayAddress(thisVoter); + displayParty(thisVoter); +} + +export { + displayInfo, +}; \ No newline at end of file From 5ec3088bc5176687eff947f522d4f1b081e24351 Mon Sep 17 00:00:00 2001 From: Leejere Date: Sun, 13 Nov 2022 03:53:22 -0500 Subject: [PATCH 61/95] finished voter history --- site/css/edit.css | 81 ++++++++++++++++- site/css/scroll-list.css | 12 +++ site/css/voter-list.css | 14 +-- site/data/election_lookup.js | 162 +++++++++++++++++++++++++++++++++ site/data/election_lookup.json | 4 +- site/index.html | 36 ++++++-- site/js/list-expand.js | 8 ++ site/js/list-loader.js | 3 +- site/js/save-edit.js | 3 - site/js/show-info.js | 98 ++++++++++++++++++++ site/js/voter-list.js | 26 +++--- 11 files changed, 407 insertions(+), 40 deletions(-) create mode 100644 site/data/election_lookup.js delete mode 100644 site/js/save-edit.js diff --git a/site/css/edit.css b/site/css/edit.css index d07fb53..4d3725d 100644 --- a/site/css/edit.css +++ b/site/css/edit.css @@ -7,6 +7,11 @@ The bottom component is originally not showing until you select a voter */ +.panel-title { + padding: 0.3rem 0.5rem 0; + font-weight: 800; +} + #bottom-component { transform: translateX(-30em); transition: all 0.5s ease-in-out; @@ -20,6 +25,11 @@ The bottom component is originally not showing until you select a voter border-radius: 0.5rem 0.5rem 0 0; } +.edit-container { + max-height: 65vh; + overflow-y: auto; +} + .edit-button .material-symbols-outlined { font-size: 1.2rem; line-height: 1.2; @@ -42,8 +52,77 @@ The bottom component is originally not showing until you select a voter transition: transform 0.5s ease-in-out; } +#edit-component .scroll-container li { + width: 100%; +} + +/* Voting History */ + .voter-history-panel { - min-height: 15vh; + min-height: 12.5vh; +} + +.voting-history-title { + width: 100%; + padding: 1rem 0.5rem 0; + margin-bottom: -0.3rem; +} + +#edit-component .list-expand-button { + margin-top: -1rem; + margin-bottom: 1rem; + height: 1.4rem; + width: 2rem; + line-height: 0.8; + margin-left: calc(50% - 1rem); +} + +.voting-history-title > div { + font-size: 0.7rem; + float: left; +} + +.voting-history-title-date { + width: 20%; +} + +.voting-history-title-name { + width: 48%; +} + +.voting-history-title-party { + width: 15%; +} + +.voting-history-title-method { + width: 12%; +} + +#edit-component .scroll-container { + clear: left; +} + +.voting-history-item { + float: left; + font-size: 0.8rem; +} + +.voting-history-date { + width: 22%; + font-size: 0.7rem; +} + +.voting-history-name { + width: 53%; + font-weight: 800; +} + +.voting-history-party { + width: 18%; +} + +.voting-history-method { + width: 12%; } .this-visit-panel { diff --git a/site/css/scroll-list.css b/site/css/scroll-list.css index da875e7..02a5e06 100644 --- a/site/css/scroll-list.css +++ b/site/css/scroll-list.css @@ -16,3 +16,15 @@ Expand-list button margin-left: auto; margin-right: auto; } + +/* ---- Each component: overall setting ------ */ + +.scroll-container li { + padding: 0.3rem; + border-bottom: 1px solid #bbb; + height: 1.5rem; + display: flex; + justify-content: flex-start; + align-items: center; + width: 28rem; +} \ No newline at end of file diff --git a/site/css/voter-list.css b/site/css/voter-list.css index 4abd462..1bfa96f 100644 --- a/site/css/voter-list.css +++ b/site/css/voter-list.css @@ -44,18 +44,6 @@ Voter list items padding: 0.1rem 0.4rem 0 0.2rem; } -/* ---- Each component: overall setting ------ */ - -.scroll-container li { - padding: 0.3rem; - border-bottom: 1px solid #bbb; - height: 1.5rem; - display: flex; - justify-content: flex-start; - align-items: center; - width: 28rem; -} - /* ---- Overwrite some settings for address items ------ */ #voter-list-component .scroll-container .list-address { @@ -105,7 +93,7 @@ Text and icons inside voter list item height: 1.3rem; } -#voter-list-component .list-icon { +.list-icon { background-color: #fff; float: left; height: 1.1rem; diff --git a/site/data/election_lookup.js b/site/data/election_lookup.js new file mode 100644 index 0000000..f2d1fb0 --- /dev/null +++ b/site/data/election_lookup.js @@ -0,0 +1,162 @@ +export default[{ + "Election 1": { + "description": "2020 GENERAL PRIMARY", + "date": "06/02/2020" + }, + "Election 2": { + "description": "2021 MUNICIPAL ELECTION", + "date": "11/02/2021" + }, + "Election 3": { + "description": "2020 GENERAL ELECTION", + "date": "11/03/2020" + }, + "Election 4": { + "description": "2017 MUNICIPAL PRIMARY", + "date": "05/16/2017" + }, + "Election 5": { + "description": "2017 MUNICIPAL ELECTION", + "date": "11/07/2017" + }, + "Election 6": { + "description": "2018 GENERAL ELECTION", + "date": "11/06/2018" + }, + "Election 7": { + "description": "2018 GENERAL PRIMARY", + "date": "05/15/2018" + }, + "Election 8": { + "description": "2019 MUNICIPAL PRIMARY", + "date": "05/21/2019" + }, + "Election 9": { + "description": "2019 Special Election 190TH Leg", + "date": "03/12/2019" + }, + "Election 10": { + "description": "2020 SPECIAL ELECTION 190TH DIST", + "date": "02/25/2020" + }, + "Election 11": { + "description": "2021 MUNICIPAL PRIMARY", + "date": "05/18/2021" + }, + "Election 12": { + "description": "2019 MUNICIPAL ELECTION", + "date": "11/05/2019" + }, + "Election 13": { + "description": "2022 GENERAL PRIMARY", + "date": "05/17/2022" + }, + "Election 14": { + "description": "2006 GENERAL PRIMARY", + "date": "05/16/2006" + }, + "Election 15": { + "description": "2006 GENERAL ELECTION", + "date": "11/07/2006" + }, + "Election 16": { + "description": "2007 GENERAL PRIMARY", + "date": "05/15/2007" + }, + "Election 17": { + "description": "2007 GENERAL ELECTION", + "date": "11/06/2007" + }, + "Election 18": { + "description": "2008 GENERAL PRIMARY", + "date": "04/22/2008" + }, + "Election 19": { + "description": "2008 GENERAL ELECTION", + "date": "11/04/2008" + }, + "Election 20": { + "description": "2009 MUNICIPAL PRIMARY ELECTION", + "date": "05/19/2009" + }, + "Election 21": { + "description": "2009 MUNICIPAL GENERAL ELECTION", + "date": "11/03/2009" + }, + "Election 22": { + "description": "2010 GENERAL PRIMARY", + "date": "05/18/2010" + }, + "Election 23": { + "description": "2010 GENERAL ELECTION", + "date": "11/02/2010" + }, + "Election 24": { + "description": "2011 SPECIAL ELECTION", + "date": "02/01/2011" + }, + "Election 25": { + "description": "2011 MUNICIPAL PRIMARY", + "date": "05/17/2011" + }, + "Election 26": { + "description": "2011 MUNICIPAL ELECTION", + "date": "11/08/2011" + }, + "Election 27": { + "description": "2012 GENERAL PRIMARY", + "date": "04/24/2012" + }, + "Election 28": { + "description": "2012 GENERAL ELECTION", + "date": "11/06/2012" + }, + "Election 29": { + "description": "2013 MUNICIPAL PRIMARY", + "date": "05/21/2013" + }, + "Election 30": { + "description": "2013 MUNICIPAL ELECTION", + "date": "11/05/2013" + }, + "Election 31": { + "description": "2014 GENERAL PRIMARY", + "date": "05/20/2014" + }, + "Election 32": { + "description": "2014 GENERAL ELECTION", + "date": "11/04/2014" + }, + "Election 33": { + "description": "Special Election for the170thLegislative District", + "date": "03/24/2015" + }, + "Election 34": { + "description": "2015 MUNICIPAL PRIMARY", + "date": "05/19/2015" + }, + "Election 35": { + "description": "2015 SPECIAL ELECTION FOR THE 174TH,191ST,195TH, L", + "date": "08/11/2015" + }, + "Election 36": { + "description": "2015 MUNICIPAL ELECTION", + "date": "11/03/2015" + }, + "Election 37": { + "description": "2016 SPECIAL ELECTION (03/15/2016)", + "date": "03/15/2016" + }, + "Election 38": { + "description": "2016 GENERAL PRIMARY", + "date": "04/26/2016" + }, + "Election 39": { + "description": "2016 GENERAL ELECTION", + "date": "11/08/2016" + }, + "Election 40": { + "description": "2017 SPECIAL ELECTION LEGISLATIVE DISTRICT 197", + "date": "03/21/2017" + } +}]; \ No newline at end of file diff --git a/site/data/election_lookup.json b/site/data/election_lookup.json index 6185502..f2d1fb0 100644 --- a/site/data/election_lookup.json +++ b/site/data/election_lookup.json @@ -1,4 +1,4 @@ -{ +export default[{ "Election 1": { "description": "2020 GENERAL PRIMARY", "date": "06/02/2020" @@ -159,4 +159,4 @@ "description": "2017 SPECIAL ELECTION LEGISLATIVE DISTRICT 197", "date": "03/21/2017" } -} \ No newline at end of file +}]; \ No newline at end of file diff --git a/site/index.html b/site/index.html index 0e27c89..5499757 100644 --- a/site/index.html +++ b/site/index.html @@ -128,14 +128,35 @@
    -
    A name
    -
    some address
    -
    Republican
    +
    +
    +
    +
    +
    -
    -
    -
    -
    +
    +
    +
    +
    VOTING HISTORY
    +
    +
    Date
    +
    Election
    +
    Party
    +
    Method
    +
    +
    +
      +
    +
    +
    + +
    + expand_more +
    + +
    +
    +
    @@ -161,7 +182,6 @@ - diff --git a/site/js/list-expand.js b/site/js/list-expand.js index 7a61b85..abfe45c 100644 --- a/site/js/list-expand.js +++ b/site/js/list-expand.js @@ -4,8 +4,12 @@ LIST EXPAND AND UNEXPAND FUNCTION export let voterListExpandButtonEl = document.querySelector("#voter-list-expand-button"); export let voterListContainerEl = document.querySelector("#voter-list-component").querySelector(".scroll-container"); +export let electionListExpandButtonEl = document.querySelector("#election-list-expand-button"); +export let electionListContainerEl = document.querySelector(".voter-history-panel").querySelector(".scroll-container"); + // Store state: whether the list is currently expanded or not voterListExpandButtonEl.expandStatus = 0; +electionListExpandButtonEl.expandStatus = 0; function expandList(thisButtonEl, thisContainerEl) { const mediaQuery = window.matchMedia("(min-width: 1200px)"); @@ -50,8 +54,12 @@ function addExpandListFunction(thisButtonEl, thisContainerEl) { }); } +// Voter list addExpandListFunction(voterListExpandButtonEl, voterListContainerEl); +// Voting history list +addExpandListFunction(electionListExpandButtonEl, electionListContainerEl); + export { onExpandButtonClick, }; \ No newline at end of file diff --git a/site/js/list-loader.js b/site/js/list-loader.js index 8366282..ccdbee9 100644 --- a/site/js/list-loader.js +++ b/site/js/list-loader.js @@ -4,7 +4,8 @@ MODULE 1: LIST LOADER This script has the main functionalities of the list loader module 1. Load list on demand 2. Store loaded data in a global variable -3. Export data to be used in other scripts +3. Update data by getting additional info from the cloud +4. Export data to be used in other scripts */ import { showVotersOnMap } from "./map.js"; diff --git a/site/js/save-edit.js b/site/js/save-edit.js deleted file mode 100644 index a22f7ee..0000000 --- a/site/js/save-edit.js +++ /dev/null @@ -1,3 +0,0 @@ -// An object to store all the edits made to specific voters - -export let changeRecord = JSON.parse(localStorage.getItem("change-racord") || "{}"); diff --git a/site/js/show-info.js b/site/js/show-info.js index 9e26cc5..70e5677 100644 --- a/site/js/show-info.js +++ b/site/js/show-info.js @@ -3,10 +3,21 @@ SHOW INFO WHEN A VOTER IS SELECTED */ import { data } from "./list-loader.js"; +import electionLookup from "../data/election_lookup.js"; +import { getPartyColor } from "./voter-list.js"; +import { htmlToElement } from './htmlelement.js'; +import { showHideExpandButton } from "./voter-list.js"; +import { electionListExpandButtonEl } from "./list-expand.js"; + +const electionDict = electionLookup[0]; let basicInfoNameEl = document.querySelector(".info-panel-name"); let basicInfoAddressEl = document.querySelector(".info-panel-address"); let basicInfoPartyEl = document.querySelector(".info-panel-party"); +let basicInfoCanvassStatusEl = document.querySelector(".info-panel-canvass-status"); +let basicInfoVoterStatusEl = document.querySelector(".info-panel-voter-status"); + +let electionListEl = document.querySelector("#voting-history"); function displayName(thisVoter) { const name = `${thisVoter["First Name"]} ${thisVoter["Last Name"]}`; @@ -23,6 +34,85 @@ function displayParty(thisVoter) { basicInfoPartyEl.innerHTML = party; } +function displayCanvassStatus(thisVoter) { + if(thisVoter["canvass-status"]) { + basicInfoCanvassStatusEl.innerHTML = thisVoter["canvass-status"]; + } else { + basicInfoCanvassStatusEl.innerHTML = "Pending"; + } +} + +function displayActiveness(thisVoter) { + const active = thisVoter["Voter Status"]; + basicInfoVoterStatusEl.innerHTML = active; +} + +// Function to construct an array sorted by date, with all the election info regarding this voter +function getVotingHistory(thisVoter) { + // Initiate an array to store election info regarding a particular voter + let thisVotingHistory = []; + for(let i=1; i<=40; i++){ + // Get election info from dictionary + let thisElection = electionDict[`Election ${i}`]; + + if(thisElection) { + let thisElectionName = thisElection.description.substring(5); // Name without year + + // Dates + let thisElectionDate = thisElection.date; + let thisElectionYear = thisElectionDate.substring(6); + let thisElectionMonth = thisElectionDate.substring(0, 2); + let thisElectionDay = thisElectionDate.substring(3, 5); + // Concat dates for sorting + let thisElectionDateCompare = thisElectionYear.concat(thisElectionMonth).concat(thisElectionDay); + + let thisElectionParty = thisVoter[`Election ${i} Party`]; + let thisElectionMethod = thisVoter[`Election ${i} Vote Method`]; + + if(thisElectionParty) { + thisVotingHistory.push({ + "name": thisElectionName, + "date": thisElectionDate, + "date-compare": thisElectionDateCompare, + "party": thisElectionParty, + "method": thisElectionMethod, + }); + } + } + } + return thisVotingHistory.sort((a, b) => (a["date-compare"] > b["date-compare"]) ? -1 : 1); +} + +function displayVotingHistory(thisVoter) { + let thisVotingHistory = getVotingHistory(thisVoter); + + // Initialize + electionListEl.innerHTML = ""; + + // Display preparation: all the HTML components + for(let election of thisVotingHistory) { + let thisYearMonth = `${election["date"].substring(0, 2)}/${election["date"].substring(6)}`; + + let thisNameHTML = `
    ${election["name"]}
    `; + let thisDateHTML = `
    ${thisYearMonth}
    `; + + let partyColor = getPartyColor(election["party"]); + let thisPartyHTML = `
    +
    ${election["party"]}
    +
    `; + let thisMethodHTML = `
    ${election["method"]}
    `; + const electionItemEl = htmlToElement(` +
  • + ${thisDateHTML} ${thisNameHTML} ${thisPartyHTML} ${thisMethodHTML} +
  • + `); + electionListEl.append(electionItemEl); + } + + // Only show button when necessary + showHideExpandButton("#voting-history", "#edit-component", electionListExpandButtonEl); +} + function findThisVoter(thisId) { for(let voter of data) { if(voter["ID Number"] === thisId) { @@ -32,10 +122,18 @@ function findThisVoter(thisId) { } function displayInfo(thisId) { + // Find this voter's data let thisVoter = findThisVoter(thisId); + + // Display in the basic info panel displayName(thisVoter); displayAddress(thisVoter); + displayActiveness(thisVoter); displayParty(thisVoter); + displayCanvassStatus(thisVoter); + + // Voting history part + displayVotingHistory(thisVoter); } export { diff --git a/site/js/voter-list.js b/site/js/voter-list.js index 18b7f75..dab824f 100644 --- a/site/js/voter-list.js +++ b/site/js/voter-list.js @@ -10,7 +10,6 @@ This script deals with the list */ import { htmlToElement } from './htmlelement.js'; -import { changeRecord } from "./save-edit.js"; import { onSelectAction } from "./selected-voter.js"; import { voterListExpandButtonEl } from "./list-expand.js"; @@ -57,7 +56,7 @@ function listPrepare(voterListItemsEl) { // Function to get the canvassing status (visited, pendign, etc.) for each voter function getCanvassStatusIcon(voterId) { - const canvassStatus = changeRecord[voterId] || "pending"; + const canvassStatus = "pending"; // Default icon: pending hourglass let canvassStatusIcon = `hourglass_top`; @@ -78,13 +77,13 @@ function getVoterStatusIcon(voter) { } // Function to get the party for each voter -function getPartyColor(voter) { +function getPartyColor(party) { const democratColor = "icon-democrat-color"; const republicanColor = "icon-republican-color"; const otherPartyColor = "icon-oth-party-color"; let partyColor; - switch(voter["Party Code"]) { + switch(party) { case "D": partyColor = democratColor; break; @@ -113,7 +112,7 @@ function addVotersByAddress(votersByThisAddress) { // Check party affiliation const party = voter["Party Code"]; - const partyColor = getPartyColor(voter); + const partyColor = getPartyColor(voter["Party Code"]); const voterEl = htmlToElement(`
  • @@ -128,13 +127,15 @@ function addVotersByAddress(votersByThisAddress) { } // Function to decide whether to show voter list's expand button -function showHideExpandButton() { - let voterListHeight = document.querySelector("#voter-list").offsetHeight; - let voterContainerHeight = document.querySelector("#voter-list-component").querySelector(".scroll-container").offsetHeight; +function showHideExpandButton(innerSelector, outerSelector, buttonEl) { + let voterListHeight = document.querySelector(innerSelector).offsetHeight; + console.log("inner height is ", voterListHeight); + let voterContainerHeight = document.querySelector(outerSelector).querySelector(".scroll-container").offsetHeight; + console.log("outer height is ", voterContainerHeight); if(voterListHeight > voterContainerHeight){ - voterListExpandButtonEl.style.display = "block"; + buttonEl.style.display = "block"; } else { - voterListExpandButtonEl.style.display = "none"; + buttonEl.style.display = "none"; } } @@ -152,11 +153,10 @@ function showVotersInList(data) { addVotersByAddress(votersByThisAddress); } voterListItemsEl = document.querySelectorAll(".list-voter"); - window.voterListItemsEl = voterListItemsEl; listPrepare(voterListItemsEl); // Only show expand button when necessary - showHideExpandButton(); + showHideExpandButton("#voter-list", "#voter-list-component", voterListExpandButtonEl); // Scroll back to top let scrollContainer = document.querySelector("#voter-list-component").querySelector(".scroll-container"); @@ -166,6 +166,8 @@ function showVotersInList(data) { export { showVotersInList, voterList, + getPartyColor, + showHideExpandButton, }; /* From 536f673a5ab79eec5bb6e4efb2f06ffd49288194 Mon Sep 17 00:00:00 2001 From: Leejere Date: Sun, 13 Nov 2022 08:38:23 -0500 Subject: [PATCH 62/95] started basic info panel --- site/css/edit.css | 17 +++++++++++++++++ site/css/voter-list.css | 12 ++++++++++-- site/index.html | 14 +++++++++++--- site/js/main.js | 2 -- site/js/show-info.js | 6 +++--- site/js/voter-list.js | 28 +++++++++++++++------------- 6 files changed, 56 insertions(+), 23 deletions(-) diff --git a/site/css/edit.css b/site/css/edit.css index 4d3725d..227fd25 100644 --- a/site/css/edit.css +++ b/site/css/edit.css @@ -7,6 +7,23 @@ The bottom component is originally not showing until you select a voter */ +/* Basic info panel */ + +.info-panel-name-address { + float: left; + width: 65%; +} + +.info-panel-name { + padding: 0.5rem; + font-weight: 800; +} + +.info-panel-address { + font-size: 0.85rem; + padding: 0 0.5rem; +} + .panel-title { padding: 0.3rem 0.5rem 0; font-weight: 800; diff --git a/site/css/voter-list.css b/site/css/voter-list.css index 1bfa96f..9bd2c76 100644 --- a/site/css/voter-list.css +++ b/site/css/voter-list.css @@ -120,15 +120,23 @@ Text and icons inside voter list item } /* ---------- -For each voter, color of displayed icons +COLOR ---------- */ -/* ---- Voter status ------ */ +/* ---- Some colors ------ */ .icon-ok-color { color: #15b88a; } +.icon-notify-color { + color: #e96a46; +} + +.icon-gray-color { + color: #bbb; +} + /* ---- Registered party ------ */ .icon-democrat-color { diff --git a/site/index.html b/site/index.html index 5499757..e1c9b7b 100644 --- a/site/index.html +++ b/site/index.html @@ -127,15 +127,23 @@ edit
  • +
    -
    -
    -
    +
    +
    +
    +
    +
    +
    + +
    + +
    VOTING HISTORY
    diff --git a/site/js/main.js b/site/js/main.js index 555f6da..3b4e10a 100644 --- a/site/js/main.js +++ b/site/js/main.js @@ -92,9 +92,7 @@ async function updateAdditionalInfo(listNumber, data, showOnMap, showInList) { const voterNotesDoc = doc(firestoreDb, "voter-info", listNumber); const result = await getDoc(voterNotesDoc); additionalData.info = result.data(); - console.log("Got additional data from cloud!", additionalData.info); updateVoters(result.data(), data); - console.log("Updated data!", data); showOnMap(data); showInList(data); fitMap(); diff --git a/site/js/show-info.js b/site/js/show-info.js index 70e5677..ec1452d 100644 --- a/site/js/show-info.js +++ b/site/js/show-info.js @@ -128,9 +128,9 @@ function displayInfo(thisId) { // Display in the basic info panel displayName(thisVoter); displayAddress(thisVoter); - displayActiveness(thisVoter); - displayParty(thisVoter); - displayCanvassStatus(thisVoter); + // displayActiveness(thisVoter); + // displayParty(thisVoter); + // displayCanvassStatus(thisVoter); // Voting history part displayVotingHistory(thisVoter); diff --git a/site/js/voter-list.js b/site/js/voter-list.js index dab824f..b5a1b04 100644 --- a/site/js/voter-list.js +++ b/site/js/voter-list.js @@ -44,7 +44,7 @@ function addAddressToList(address) { voterList.append(addressEl); } -// Function: prepare the voterlist, i.e., add event listener +// Function: prepare the voterlist for the next module (voter selection) function listPrepare(voterListItemsEl) { for(const thisListItem of voterListItemsEl) { thisListItem.addEventListener("click", () => { @@ -55,20 +55,22 @@ function listPrepare(voterListItemsEl) { } // Function to get the canvassing status (visited, pendign, etc.) for each voter -function getCanvassStatusIcon(voterId) { - const canvassStatus = "pending"; - - // Default icon: pending hourglass - let canvassStatusIcon = `hourglass_top`; - if(canvassStatus == "pending") { - canvassStatusIcon = `hourglass_top`; - } // Other icons to be added - return(canvassStatusIcon); +function getCanvassStatusIcon(voter) { + // Default to hourglass (pending) + let canvassStatusIcon = `hourglass_top`; + if(voter["canvass-status"]) { + if(voter["canvass-status"] === "completed") { + canvassStatusIcon = `task_alt`; + } else if(voter["canvass-status"] === "awaits-followup") { + canvassStatusIcon = `timeline`; + } + } + return canvassStatusIcon; } // Function to get the voter status (active or inactive) for each voter function getVoterStatusIcon(voter) { - const activeVoterIcon = `check_circle`; + const activeVoterIcon = `ballot`; const inactiveVoterIcon = `close`; const voterStatusIcon = voter["Voter Status"] == "A" ? activeVoterIcon : inactiveVoterIcon; @@ -102,13 +104,13 @@ function addVotersByAddress(votersByThisAddress) { for(const voter of votersByThisAddress) { // Get current voter ID - const voterId = voter["ID Number"]; + // const voterId = voter["ID Number"]; // Get voter status icon const voterStatusIcon = getVoterStatusIcon(voter); // Check canvassing status of this voter and get the icon - const canvassStatusIcon = getCanvassStatusIcon(voterId); + const canvassStatusIcon = getCanvassStatusIcon(voter); // Check party affiliation const party = voter["Party Code"]; From 21e4b5ef308981f7d93ce18f8fd79a6e22e4e12c Mon Sep 17 00:00:00 2001 From: Leejere Date: Sun, 13 Nov 2022 13:16:16 -0500 Subject: [PATCH 63/95] finished canvas status part --- site/css/edit.css | 157 +++++++++++++++++++++++++++++++++----- site/css/main.css | 2 + site/index.html | 32 +++++++- site/js/list-filters.js | 6 +- site/js/list-loader.js | 2 +- site/js/main.js | 18 ++++- site/js/selected-voter.js | 1 + site/js/show-info.js | 20 ++++- site/js/update-info.js | 88 +++++++++++++++++++++ site/js/voter-list.js | 5 +- 10 files changed, 298 insertions(+), 33 deletions(-) create mode 100644 site/js/update-info.js diff --git a/site/css/edit.css b/site/css/edit.css index 227fd25..2e7439e 100644 --- a/site/css/edit.css +++ b/site/css/edit.css @@ -7,21 +7,11 @@ The bottom component is originally not showing until you select a voter */ -/* Basic info panel */ +/* Some overall setting */ -.info-panel-name-address { - float: left; - width: 65%; -} - -.info-panel-name { - padding: 0.5rem; - font-weight: 800; -} - -.info-panel-address { - font-size: 0.85rem; - padding: 0 0.5rem; +.edit-button .material-symbols-outlined { + font-size: 1.2rem; + line-height: 1.2; } .panel-title { @@ -47,11 +37,6 @@ The bottom component is originally not showing until you select a voter overflow-y: auto; } -.edit-button .material-symbols-outlined { - font-size: 1.2rem; - line-height: 1.2; -} - .info-panel { clear: left; background-color: white; @@ -61,7 +46,139 @@ The bottom component is originally not showing until you select a voter } .basic-info-panel { - height: 16vh; + min-height: 16vh; +} + +/* Icon set */ + +.info-panel-canvass-status { + width: 50%; + float: left; + display: flex; + flex-direction: column; + align-items: center; +} + +.icon-group { + display: flex; + justify-content: center; +} + +.icon-set { + width: 3rem; + float: left; + display: flex; + flex-direction: column; + align-items: center; +} + +.icon-set .list-icon { + border-color: #bbb; +} + +.icon-set .material-symbols-outlined { + font-size: 1.2rem; + color: #bbb; +} + +.icon-subtitle { + font-size: 0.65rem; + text-align: center; + color: #bbb; +} + +.canvass-status-save { + clear: left; + width: 8rem; + border: 1px solid var(--main-color); + margin-top: 0.25rem; + padding: 0.1rem; + text-align: center; + font-size: 0.9rem; + border-radius: 0 0 0.4rem 0.4rem; + border-bottom-width: 2.5px; +} + +.canvass-status-save-toast { + background-color: var(--main-color); + color: #fff; +} + +/* Dealing with highlighted items */ + +.highlighted .material-symbols-outlined { + font-size: 1.2rem; + color: #fff; +} + +#icon-canvass-pending.highlighted .list-icon { + background-color: #999; + border-color: #999; +} + +#icon-canvass-pending.highlighted .icon-subtitle { + color: #999; + font-weight: 800; +} + +#icon-canvass-awaits.highlighted .list-icon { + background-color: var(--red-color); + border-color: var(--red-color); +} + +#icon-canvass-awaits.highlighted .icon-subtitle { + color: var(--red-color); + font-weight: 800; +} + +#icon-canvass-completed.highlighted .list-icon { + background-color: var(--ok-color); + border-color: var(--ok-color); +} + +#icon-canvass-completed.highlighted .icon-subtitle { + color: var(--ok-color); + font-weight: 800; +} + +/* When screen too small, don't display subtitles */ + +@media only screen and (max-width: 340px) { + .icon-set { + width: 2rem; + } + + .icon-subtitle { + display: none; + } +} + +/* Basic info panel name and address */ + +.info-panel-name-address { + float: left; + width: 50%; +} + +.info-panel-name { + padding: 0.5rem; + font-size: 1.4rem; + font-weight: 800; +} + +.info-panel-address { + font-size: 0.85rem; + padding: 0 0.5rem; +} + +@media only screen and (max-width: 340px) { + .info-panel-name { + font-size: 1rem; + } + + .info-panel-address { + font-size: 0.75rem; + } } #edit-component { diff --git a/site/css/main.css b/site/css/main.css index 8753e61..9d13c4d 100644 --- a/site/css/main.css +++ b/site/css/main.css @@ -5,6 +5,8 @@ Overall colors :root { --main-color: #0d59a9; --aux-color: #fad03c; + --ok-color: #15b88a; + --red-color: #e96a46; } /* -------- diff --git a/site/index.html b/site/index.html index e1c9b7b..428e5fd 100644 --- a/site/index.html +++ b/site/index.html @@ -129,11 +129,40 @@
    +
    -
    + + +
    +
    +
    +
    + hourglass_top +
    +
    Pending
    +
    +
    +
    + timeline +
    +
    Awaits followup
    +
    +
    +
    + task_alt +
    +
    Completed
    +
    +
    + +
    + Update status +
    + +
    @@ -195,6 +224,7 @@ + diff --git a/site/js/list-filters.js b/site/js/list-filters.js index aa759cb..ae675a0 100644 --- a/site/js/list-filters.js +++ b/site/js/list-filters.js @@ -107,4 +107,8 @@ for (const cb of statusFilter) { showVotersOnMap(filteredStatus); showVotersInList(filteredStatus); }); -} \ No newline at end of file +} + +export { + allFilters, +}; \ No newline at end of file diff --git a/site/js/list-loader.js b/site/js/list-loader.js index ccdbee9..4394948 100644 --- a/site/js/list-loader.js +++ b/site/js/list-loader.js @@ -22,7 +22,7 @@ let loadButtonEl = document.querySelector("#list-loader-load"); let toolTipEl = document.querySelector("#list-loader-load").querySelector(".tooltiptext"); // Create a global object to store current input number -let inputNumber; +export let inputNumber; // This is a global object to store the current list of voters export let data; diff --git a/site/js/main.js b/site/js/main.js index 3b4e10a..648cdd3 100644 --- a/site/js/main.js +++ b/site/js/main.js @@ -70,9 +70,10 @@ Save or Load Edited Voter Info */ import { fitMap } from "./map.js"; +import { data } from "./list-loader.js"; -// Update the data loaded from the csv -function updateVoters(additionalInfo, data) { +// Update the data loaded from the csv with additional info +function updateVoters(additionalInfo) { for(let voter of data) { let thisId = voter["ID Number"]; if(additionalInfo[thisId]) { @@ -101,8 +102,21 @@ async function updateAdditionalInfo(listNumber, data, showOnMap, showInList) { } } +// Function to save the updated additional info to Firebase +async function saveAdditionalInfo(listNumber, additionalInfo) { + try { + const voterNotesDoc = doc(firestoreDb, "voter-info", listNumber); + await setDoc(voterNotesDoc, additionalInfo); + console.log("Saved edited info to the cloud!"); + } catch(error) { + console.log(error); + } +} + export { loadListNum, saveListNum, updateAdditionalInfo, + updateVoters, + saveAdditionalInfo, }; \ No newline at end of file diff --git a/site/js/selected-voter.js b/site/js/selected-voter.js index 4d9ef66..d383614 100644 --- a/site/js/selected-voter.js +++ b/site/js/selected-voter.js @@ -139,4 +139,5 @@ function onSelectAction(thisId) { export { onSelectAction, + highlightVoter, }; \ No newline at end of file diff --git a/site/js/show-info.js b/site/js/show-info.js index ec1452d..c065d0c 100644 --- a/site/js/show-info.js +++ b/site/js/show-info.js @@ -8,6 +8,7 @@ import { getPartyColor } from "./voter-list.js"; import { htmlToElement } from './htmlelement.js'; import { showHideExpandButton } from "./voter-list.js"; import { electionListExpandButtonEl } from "./list-expand.js"; +import { highlightOption, prepareOption } from "./update-info.js"; const electionDict = electionLookup[0]; @@ -35,11 +36,21 @@ function displayParty(thisVoter) { } function displayCanvassStatus(thisVoter) { + // Get the canvass state + let thisStatus = "pending"; if(thisVoter["canvass-status"]) { - basicInfoCanvassStatusEl.innerHTML = thisVoter["canvass-status"]; - } else { - basicInfoCanvassStatusEl.innerHTML = "Pending"; + thisStatus = thisVoter["canvass-status"]; } + let optionIdSelector = `#icon-canvass-${thisStatus}`; + + // Store current voter id in the container DOM object + document.querySelector("#icon-canvass").currentVoterId = thisVoter["ID Number"]; + + // Highlight option + highlightOption("#icon-canvass", optionIdSelector); + + // Prepare: add event listeners for them to be clicked on + prepareOption("#icon-canvass"); } function displayActiveness(thisVoter) { @@ -130,7 +141,7 @@ function displayInfo(thisId) { displayAddress(thisVoter); // displayActiveness(thisVoter); // displayParty(thisVoter); - // displayCanvassStatus(thisVoter); + displayCanvassStatus(thisVoter); // Voting history part displayVotingHistory(thisVoter); @@ -138,4 +149,5 @@ function displayInfo(thisId) { export { displayInfo, + highlightOption, }; \ No newline at end of file diff --git a/site/js/update-info.js b/site/js/update-info.js new file mode 100644 index 0000000..d89bd85 --- /dev/null +++ b/site/js/update-info.js @@ -0,0 +1,88 @@ +import { additionalData } from "./list-loader.js"; +import { updateVoters, saveAdditionalInfo } from "./main.js"; +import { data } from "./list-loader.js"; +import { showVotersInList } from "./voter-list.js"; +import { showVotersOnMap } from "./map.js"; +import { fitMap } from "./map.js"; +import { highlightVoter } from "./selected-voter.js"; +import { allFilters } from "./list-filters.js"; +import { inputNumber } from "./list-loader.js"; + +// Function to highlight an option given selectors +function highlightOption(groupIdSelector, optionIdSelector) { + // First remove all highlighted classes + let iconGroupEl = document.querySelector(groupIdSelector).querySelectorAll(".icon-set"); + for(let item of iconGroupEl) { + item.classList.remove("highlighted"); + } + + // DOM object of the icon to be highlighted + let highlightIconSet = document.querySelector(groupIdSelector).querySelector(optionIdSelector); + highlightIconSet.classList.add("highlighted"); +} + +// Function to add event listeners to option +// Everytime a click happens, store the clicked item in the container DOM +// .. until pushing the save button +function prepareOption(groupIdSelector) { + let iconGroupEl = document.querySelector(groupIdSelector).querySelectorAll(".icon-set"); + // Add event listener + for(let item of iconGroupEl) { + item.addEventListener("click", ( ) => { + + // First, highlight that option + highlightOption(groupIdSelector, `#${item.id}`); + + // Find substring item.id to get the real term + let lastDashLocation = item.id.lastIndexOf("-"); + + // Then, record the click + document.querySelector(groupIdSelector).unsavedSelection = item.id.substring(lastDashLocation + 1); + }); + } +} + +// Save current canvass status on click +const canvassStatusSaveButtonEl = document.querySelector("#canvass-status-save"); +canvassStatusSaveButtonEl.addEventListener("click", ( ) => { + let unsavedSelection = document.querySelector("#icon-canvass").unsavedSelection; + let currentVoterId = document.querySelector("#icon-canvass").currentVoterId; + if(unsavedSelection) { + // Initiate, if no additional info has been recorded for this voter + if(!additionalData.info[currentVoterId]) { + additionalData.info[currentVoterId] = {}; + } + additionalData.info[currentVoterId]["canvass-status"] = unsavedSelection; + + // Then, update Data + updateVoters(additionalData.info); + + // Then, update map and list + // Remember to reapply the filters + let filteredData = allFilters(data); + showVotersInList(filteredData); + showVotersOnMap(filteredData); + fitMap(); + + // After updating map, select this particular voter again + console.log(currentVoterId); + highlightVoter(currentVoterId); + + // Then, send the updated info to the cloud + // and do a toast on success + saveAdditionalInfo(inputNumber, additionalData.info); + + // Then, show a toast on the button + canvassStatusSaveButtonEl.classList.add("canvass-status-save-toast"); + canvassStatusSaveButtonEl.innerHTML = "Updated status!"; + setTimeout(( ) => { + canvassStatusSaveButtonEl.classList.remove("canvass-status-save-toast"); + canvassStatusSaveButtonEl.innerHTML = "Update status"; + }, 2000); + } +}); + +export { + highlightOption, + prepareOption, +}; \ No newline at end of file diff --git a/site/js/voter-list.js b/site/js/voter-list.js index b5a1b04..eafad5d 100644 --- a/site/js/voter-list.js +++ b/site/js/voter-list.js @@ -61,7 +61,7 @@ function getCanvassStatusIcon(voter) { if(voter["canvass-status"]) { if(voter["canvass-status"] === "completed") { canvassStatusIcon = `task_alt`; - } else if(voter["canvass-status"] === "awaits-followup") { + } else if(voter["canvass-status"] === "awaits") { canvassStatusIcon = `timeline`; } } @@ -131,9 +131,7 @@ function addVotersByAddress(votersByThisAddress) { // Function to decide whether to show voter list's expand button function showHideExpandButton(innerSelector, outerSelector, buttonEl) { let voterListHeight = document.querySelector(innerSelector).offsetHeight; - console.log("inner height is ", voterListHeight); let voterContainerHeight = document.querySelector(outerSelector).querySelector(".scroll-container").offsetHeight; - console.log("outer height is ", voterContainerHeight); if(voterListHeight > voterContainerHeight){ buttonEl.style.display = "block"; } else { @@ -146,7 +144,6 @@ function showVotersInList(data) { voterList.innerHTML = ''; let dataGroupedByAddress = groupByKey(data, "short_address"); - window.test = data; let addressKeys = Object.keys(dataGroupedByAddress); for(const address of addressKeys) { From 92d1f0377c70138c7821f705b95742bc1ad9d5f2 Mon Sep 17 00:00:00 2001 From: Leejere Date: Mon, 14 Nov 2022 09:37:21 -0500 Subject: [PATCH 64/95] optimized update-status --- site/js/update-info.js | 57 +++++++++++++++++++++++++++++------------- 1 file changed, 40 insertions(+), 17 deletions(-) diff --git a/site/js/update-info.js b/site/js/update-info.js index d89bd85..aa31103 100644 --- a/site/js/update-info.js +++ b/site/js/update-info.js @@ -1,9 +1,7 @@ import { additionalData } from "./list-loader.js"; import { updateVoters, saveAdditionalInfo } from "./main.js"; import { data } from "./list-loader.js"; -import { showVotersInList } from "./voter-list.js"; import { showVotersOnMap } from "./map.js"; -import { fitMap } from "./map.js"; import { highlightVoter } from "./selected-voter.js"; import { allFilters } from "./list-filters.js"; import { inputNumber } from "./list-loader.js"; @@ -42,8 +40,46 @@ function prepareOption(groupIdSelector) { } } +function updateDisplay(data, currentVoterId, status) { + let filteredData = allFilters(data); + // showVotersInList(filteredData); + showVotersOnMap(filteredData); + + // Update the display of this particular voter + let voterListItemsEl = document.querySelectorAll(".list-voter"); + // First find out which icon it should be + let canvassStatusIcon = `hourglass_top`; + if(status) { + if(status === "completed") { + canvassStatusIcon = `task_alt`; + } else if(status === "awaits") { + canvassStatusIcon = `timeline`; + } + } + // Then find the corresponding DOM and update it + for(let thisListItem of voterListItemsEl) { + if(thisListItem.title == currentVoterId) { + thisListItem.getElementsByTagName("div")[1].innerHTML = canvassStatusIcon; + } + } + + // Then rehighlight this voter + highlightVoter(currentVoterId); +} + +// Called on success of updating voter canvass status +function onUpdateStatusSuccess(canvassStatusSaveButtonEl) { + canvassStatusSaveButtonEl.classList.add("canvass-status-save-toast"); + canvassStatusSaveButtonEl.innerHTML = "Updated status!"; + setTimeout(( ) => { + canvassStatusSaveButtonEl.classList.remove("canvass-status-save-toast"); + canvassStatusSaveButtonEl.innerHTML = "Update status"; + }, 1500); +} + // Save current canvass status on click const canvassStatusSaveButtonEl = document.querySelector("#canvass-status-save"); + canvassStatusSaveButtonEl.addEventListener("click", ( ) => { let unsavedSelection = document.querySelector("#icon-canvass").unsavedSelection; let currentVoterId = document.querySelector("#icon-canvass").currentVoterId; @@ -58,27 +94,14 @@ canvassStatusSaveButtonEl.addEventListener("click", ( ) => { updateVoters(additionalData.info); // Then, update map and list - // Remember to reapply the filters - let filteredData = allFilters(data); - showVotersInList(filteredData); - showVotersOnMap(filteredData); - fitMap(); - - // After updating map, select this particular voter again - console.log(currentVoterId); - highlightVoter(currentVoterId); + updateDisplay(data, currentVoterId, unsavedSelection); // Then, send the updated info to the cloud // and do a toast on success saveAdditionalInfo(inputNumber, additionalData.info); // Then, show a toast on the button - canvassStatusSaveButtonEl.classList.add("canvass-status-save-toast"); - canvassStatusSaveButtonEl.innerHTML = "Updated status!"; - setTimeout(( ) => { - canvassStatusSaveButtonEl.classList.remove("canvass-status-save-toast"); - canvassStatusSaveButtonEl.innerHTML = "Update status"; - }, 2000); + onUpdateStatusSuccess(canvassStatusSaveButtonEl); } }); From 6898509c0db75ee4c0d0890072d1215ef59cdab0 Mon Sep 17 00:00:00 2001 From: Leejere Date: Mon, 14 Nov 2022 12:56:31 -0500 Subject: [PATCH 65/95] finished edit page wireframe --- site/css/edit.css | 76 +++++++++++++++++++++++-- site/css/voter-list.css | 16 ++++++ site/index.html | 123 ++++++++++++++++++++++++++++++++++++++-- site/js/show-info.js | 42 +++++++++++--- site/js/update-info.js | 1 + site/js/voter-list.js | 1 + 6 files changed, 241 insertions(+), 18 deletions(-) diff --git a/site/css/edit.css b/site/css/edit.css index 2e7439e..d3e5ad4 100644 --- a/site/css/edit.css +++ b/site/css/edit.css @@ -1,6 +1,5 @@ #basic-panel-component { position: relative; - height: 10em; } /* @@ -17,6 +16,7 @@ The bottom component is originally not showing until you select a voter .panel-title { padding: 0.3rem 0.5rem 0; font-weight: 800; + margin-bottom: 1.5rem; } #bottom-component { @@ -46,7 +46,7 @@ The bottom component is originally not showing until you select a voter } .basic-info-panel { - min-height: 16vh; + height: auto; } /* Icon set */ @@ -74,11 +74,11 @@ The bottom component is originally not showing until you select a voter .icon-set .list-icon { border-color: #bbb; + color: #bbb; } .icon-set .material-symbols-outlined { font-size: 1.2rem; - color: #bbb; } .icon-subtitle { @@ -104,6 +104,35 @@ The bottom component is originally not showing until you select a voter color: #fff; } +/* Other overview icons */ + +.overview-display { + padding: 0.4rem; + clear: left; + margin-top: 0.5rem; + display: flex; +} + +#overview-display .icon-set { + margin-right: 0.8rem; +} + +#overview-display .icon-set .icon-subtitle { + color: var(--main-color); +} + +#overview-display .icon-set .list-icon { + border-color: var(--main-color); +} + +#overview-display .icon-set .material-symbols-outlined { + font-size: 1.2rem; +} + +#overview-display .icon-set { + max-width: 5rem; +} + /* Dealing with highlighted items */ .highlighted .material-symbols-outlined { @@ -198,7 +227,7 @@ The bottom component is originally not showing until you select a voter .voting-history-title { width: 100%; - padding: 1rem 0.5rem 0; + padding: 0rem 0.5rem 0; margin-bottom: -0.3rem; } @@ -260,9 +289,46 @@ The bottom component is originally not showing until you select a voter } .this-visit-panel { - min-height: 25vh; + height: auto; + padding-bottom: 1rem; } .last-visit-panel { min-height: 15vh; +} + +.record-item { + padding-left: 0.5rem; + margin-top: 0.5rem; +} + +.record-item-name { + float: left; + font-size: 0.85rem; + width: 30%; + position: relative; + top: 0.75rem; +} + +.record-item .icon-group { + justify-content: flex-start; + width: 70%; +} + +.record-item .input-container { + margin-top: 0.3rem; + margin-left: 0.5rem; + width: 3rem; +} + +.record-item input { + border-color: #bbb; + border-width: 1px 1px 2.5px; + font-size: 0.8rem; + height: 1.2rem; + color: #bbb; +} + +.record-item input::placeholder { + color: #bbb; } \ No newline at end of file diff --git a/site/css/voter-list.css b/site/css/voter-list.css index 9bd2c76..27508f0 100644 --- a/site/css/voter-list.css +++ b/site/css/voter-list.css @@ -137,16 +137,32 @@ COLOR color: #bbb; } +.icon-main-color { + color: #0d59a9; +} + /* ---- Registered party ------ */ .icon-democrat-color { color: #0d59a9; } +#overview-display .icon-set .icon-democrat-color { + color: #0d59a9; +} + .icon-republican-color { color: #e96a46; } +.icon-set .icon-republican-color { + color: #e96a46; +} + +#overview-display .icon-republican-color { + color: #e96a46; +} + .icon-oth-party-color { color: #c1c1c1; } diff --git a/site/index.html b/site/index.html index 428e5fd..688a132 100644 --- a/site/index.html +++ b/site/index.html @@ -134,7 +134,6 @@
    -
    @@ -163,8 +162,24 @@
    -
    - + + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    +
    @@ -191,8 +206,106 @@ expand_more
    -
    -
    +
    +
    PER CANVASSING RECORDING
    + +
    +
    Language
    +
    +
    +
    + EN +
    +
    English
    +
    +
    +
    + ES +
    +
    Needs Spanish help
    +
    +
    +
    + CN +
    +
    Needs Chinise help
    +
    +
    +
    + +
    +
    +
    +
    + +
    +
    Planned to vote
    +
    +
    +
    + task_alt +
    +
    Yes
    +
    +
    +
    + unpublished +
    +
    No
    +
    +
    +
    + +
    +
    Mail ballot
    +
    +
    +
    + mark_email_read +
    +
    Received
    +
    +
    +
    + unsubscribe +
    +
    Not received
    +
    +
    +
    + footprint +
    +
    Vote in person
    +
    +
    +
    + +
    +
    Who for
    +
    +
    +
    + D +
    +
    Dem.
    +
    +
    +
    + R +
    +
    Rep.
    +
    +
    +
    + +
    +
    +
    +
    + +
    + +
    diff --git a/site/js/show-info.js b/site/js/show-info.js index c065d0c..a417290 100644 --- a/site/js/show-info.js +++ b/site/js/show-info.js @@ -4,13 +4,15 @@ SHOW INFO WHEN A VOTER IS SELECTED import { data } from "./list-loader.js"; import electionLookup from "../data/election_lookup.js"; -import { getPartyColor } from "./voter-list.js"; import { htmlToElement } from './htmlelement.js'; -import { showHideExpandButton } from "./voter-list.js"; +import { showHideExpandButton, getVoterStatusIcon } from "./voter-list.js"; import { electionListExpandButtonEl } from "./list-expand.js"; import { highlightOption, prepareOption } from "./update-info.js"; +import partyDict from '../data/political_party_lookup.json' assert {type: "json"}; +import { getPartyColor } from "./voter-list.js"; const electionDict = electionLookup[0]; +console.log(partyDict); let basicInfoNameEl = document.querySelector(".info-panel-name"); let basicInfoAddressEl = document.querySelector(".info-panel-address"); @@ -28,11 +30,22 @@ function displayName(thisVoter) { function displayAddress(thisVoter) { const address = thisVoter.short_address; basicInfoAddressEl.innerHTML = address; + } function displayParty(thisVoter) { - const party = thisVoter["Party Code"]; - basicInfoPartyEl.innerHTML = party; + const partyCode = thisVoter["Party Code"]; + const party = partyDict[partyCode]; + const partyCodeEl = document.querySelector("#info-panel-party-set").getElementsByClassName("list-icon")[0]; + partyCodeEl.innerHTML = partyCode; + + const partyColor = getPartyColor(partyCode); + + partyCodeEl.classList.remove(partyCodeEl.classList.item(1)); + partyCodeEl.classList.add(partyColor); + + const partyNameEl = document.querySelector("#info-panel-party-set").getElementsByClassName("icon-subtitle")[0]; + partyNameEl.innerHTML = party; } function displayCanvassStatus(thisVoter) { @@ -54,8 +67,19 @@ function displayCanvassStatus(thisVoter) { } function displayActiveness(thisVoter) { - const active = thisVoter["Voter Status"]; - basicInfoVoterStatusEl.innerHTML = active; + const activeCode = thisVoter["Voter Status"]; + const activeName = activeCode == "A" ? "ACTIVE" : "INACTIVE"; + const activeCodeEl = document.querySelector("#info-panel-active-set").getElementsByClassName("list-icon")[0]; + const activeNameEl = document.querySelector("#info-panel-active-set").getElementsByClassName("icon-subtitle")[0]; + + const activeVoterIcon = `ballot`; + const inactiveVoterIcon = `close`; + const voterStatusIcon = activeCode == "A" ? activeVoterIcon : inactiveVoterIcon; + + + activeCodeEl.innerHTML = voterStatusIcon; + + activeNameEl.innerHTML = activeName; } // Function to construct an array sorted by date, with all the election info regarding this voter @@ -94,6 +118,7 @@ function getVotingHistory(thisVoter) { return thisVotingHistory.sort((a, b) => (a["date-compare"] > b["date-compare"]) ? -1 : 1); } +// Voting history on the second panel function displayVotingHistory(thisVoter) { let thisVotingHistory = getVotingHistory(thisVoter); @@ -124,6 +149,7 @@ function displayVotingHistory(thisVoter) { showHideExpandButton("#voting-history", "#edit-component", electionListExpandButtonEl); } +// Find voter: takes voter ID and outputs comprehensive voter data function findThisVoter(thisId) { for(let voter of data) { if(voter["ID Number"] === thisId) { @@ -139,8 +165,8 @@ function displayInfo(thisId) { // Display in the basic info panel displayName(thisVoter); displayAddress(thisVoter); - // displayActiveness(thisVoter); - // displayParty(thisVoter); + displayActiveness(thisVoter); + displayParty(thisVoter); displayCanvassStatus(thisVoter); // Voting history part diff --git a/site/js/update-info.js b/site/js/update-info.js index aa31103..5a8612b 100644 --- a/site/js/update-info.js +++ b/site/js/update-info.js @@ -12,6 +12,7 @@ function highlightOption(groupIdSelector, optionIdSelector) { let iconGroupEl = document.querySelector(groupIdSelector).querySelectorAll(".icon-set"); for(let item of iconGroupEl) { item.classList.remove("highlighted"); + item.classList.add("icon-no-color"); } // DOM object of the icon to be highlighted diff --git a/site/js/voter-list.js b/site/js/voter-list.js index eafad5d..4b17046 100644 --- a/site/js/voter-list.js +++ b/site/js/voter-list.js @@ -167,6 +167,7 @@ export { voterList, getPartyColor, showHideExpandButton, + getVoterStatusIcon, }; /* From c50b62eba4fafb2ad3e40497d64f3c8e9d0c700b Mon Sep 17 00:00:00 2001 From: Leejere Date: Mon, 14 Nov 2022 17:22:55 -0500 Subject: [PATCH 66/95] display language finished --- site/css/edit.css | 15 +++++++++++++++ site/index.html | 6 +++--- site/js/show-info.js | 33 +++++++++++++++++++++++++++++++++ site/js/update-info.js | 27 +++++++++++++++++++-------- 4 files changed, 70 insertions(+), 11 deletions(-) diff --git a/site/css/edit.css b/site/css/edit.css index d3e5ad4..7fdbe1d 100644 --- a/site/css/edit.css +++ b/site/css/edit.css @@ -140,6 +140,16 @@ The bottom component is originally not showing until you select a voter color: #fff; } +.highlighted p { + font-size: 1.2rem; + color: #fff; +} + +.highlighted .list-icon { + background-color: var(--main-color); + border-color: var(--main-color); +} + #icon-canvass-pending.highlighted .list-icon { background-color: #999; border-color: #999; @@ -329,6 +339,11 @@ The bottom component is originally not showing until you select a voter color: #bbb; } +.record-item input:focus { + border-width: 2.5px; + border-radius: 0 0 0.5em 0.5em; +} + .record-item input::placeholder { color: #bbb; } \ No newline at end of file diff --git a/site/index.html b/site/index.html index 688a132..47b718c 100644 --- a/site/index.html +++ b/site/index.html @@ -214,19 +214,19 @@
    - EN +

    EN

    English
    - ES +

    ES

    Needs Spanish help
    - CN +

    ZH

    Needs Chinise help
    diff --git a/site/js/show-info.js b/site/js/show-info.js index a417290..6c7616b 100644 --- a/site/js/show-info.js +++ b/site/js/show-info.js @@ -22,6 +22,8 @@ let basicInfoVoterStatusEl = document.querySelector(".info-panel-voter-status"); let electionListEl = document.querySelector("#voting-history"); +/* BASIC INFO PANEL */ + function displayName(thisVoter) { const name = `${thisVoter["First Name"]} ${thisVoter["Last Name"]}`; basicInfoNameEl.innerHTML = name; @@ -82,6 +84,8 @@ function displayActiveness(thisVoter) { activeNameEl.innerHTML = activeName; } +/* VOTING HISTORY */ + // Function to construct an array sorted by date, with all the election info regarding this voter function getVotingHistory(thisVoter) { // Initiate an array to store election info regarding a particular voter @@ -149,6 +153,32 @@ function displayVotingHistory(thisVoter) { showHideExpandButton("#voting-history", "#edit-component", electionListExpandButtonEl); } +/* PER CANVASSING RECORD */ + +function displayLanguage(thisVoter) { + // Get the canvass state + let thisStatus = undefined; + // Store current voter id in the container DOM object + // Do this because we have to store the info associated with the voter + document.querySelector("#icon-lang").currentVoterId = thisVoter["ID Number"]; + + thisStatus = thisVoter["language"]; + let optionIdSelector = `#icon-lang-${thisStatus}`; + // Highlight option (thisStatus undefined situation dealt with there) + highlightOption("#icon-lang", optionIdSelector); + + // If not the three languages, show in the input box + if(thisStatus != undefined && ["english", "spanish", "chinese"].includes(thisStatus)) { + let langInput = document.querySelector("#icon-lang-input").getElementsByTagName("input")[0]; + langInput.placeholder = thisStatus; + } + + // Prepare: add event listeners for them to be clicked on + prepareOption("#icon-lang"); +} + +/* UTIL: FIND THE VOTER DATA ENTRY USING VOTER ID */ + // Find voter: takes voter ID and outputs comprehensive voter data function findThisVoter(thisId) { for(let voter of data) { @@ -171,6 +201,9 @@ function displayInfo(thisId) { // Voting history part displayVotingHistory(thisVoter); + + // Canvass recording part + displayLanguage(thisVoter); } export { diff --git a/site/js/update-info.js b/site/js/update-info.js index 5a8612b..492913c 100644 --- a/site/js/update-info.js +++ b/site/js/update-info.js @@ -6,9 +6,9 @@ import { highlightVoter } from "./selected-voter.js"; import { allFilters } from "./list-filters.js"; import { inputNumber } from "./list-loader.js"; -// Function to highlight an option given selectors +// Function to highlight an option given selectors on click function highlightOption(groupIdSelector, optionIdSelector) { - // First remove all highlighted classes + // First remove all highlighted classes and reset everything to default gray color let iconGroupEl = document.querySelector(groupIdSelector).querySelectorAll(".icon-set"); for(let item of iconGroupEl) { item.classList.remove("highlighted"); @@ -16,14 +16,19 @@ function highlightOption(groupIdSelector, optionIdSelector) { } // DOM object of the icon to be highlighted - let highlightIconSet = document.querySelector(groupIdSelector).querySelector(optionIdSelector); - highlightIconSet.classList.add("highlighted"); + if(document.querySelector(groupIdSelector).querySelector(optionIdSelector)) { + let highlightIconSet = document.querySelector(groupIdSelector).querySelector(optionIdSelector); + highlightIconSet.classList.add("highlighted"); + } } -// Function to add event listeners to option +// Prepare the detailed info display for the selected voter +// 1. highlight options, 2. add event listeners // Everytime a click happens, store the clicked item in the container DOM // .. until pushing the save button function prepareOption(groupIdSelector) { + + // DOM: all the icon sets in a particular group let iconGroupEl = document.querySelector(groupIdSelector).querySelectorAll(".icon-set"); // Add event listener for(let item of iconGroupEl) { @@ -36,12 +41,18 @@ function prepareOption(groupIdSelector) { let lastDashLocation = item.id.lastIndexOf("-"); // Then, record the click - document.querySelector(groupIdSelector).unsavedSelection = item.id.substring(lastDashLocation + 1); + let storageEl = document.querySelector(groupIdSelector); + storageEl.unsavedSelection = item.id.substring(lastDashLocation + 1); + + console.log("The voter is ", storageEl.currentVoterId); + console.log("The language is", storageEl.unsavedSelection); }); } } -function updateDisplay(data, currentVoterId, status) { +// After saving data, update Filtered data +// At the same time, update display on the map and in the list +function updateData(data, currentVoterId, status) { let filteredData = allFilters(data); // showVotersInList(filteredData); showVotersOnMap(filteredData); @@ -95,7 +106,7 @@ canvassStatusSaveButtonEl.addEventListener("click", ( ) => { updateVoters(additionalData.info); // Then, update map and list - updateDisplay(data, currentVoterId, unsavedSelection); + updateData(data, currentVoterId, unsavedSelection); // Then, send the updated info to the cloud // and do a toast on success From ad98ad24fac04b371bad038f3983af8469fea483 Mon Sep 17 00:00:00 2001 From: Leejere Date: Mon, 14 Nov 2022 18:23:28 -0500 Subject: [PATCH 67/95] finished final save button --- site/css/edit.css | 18 +++++++++++- site/index.html | 6 ++-- site/js/show-info.js | 7 +++-- site/js/update-info.js | 65 +++++++++++++++++++++++++++++++++++++----- 4 files changed, 83 insertions(+), 13 deletions(-) diff --git a/site/css/edit.css b/site/css/edit.css index 7fdbe1d..152a427 100644 --- a/site/css/edit.css +++ b/site/css/edit.css @@ -33,7 +33,7 @@ The bottom component is originally not showing until you select a voter } .edit-container { - max-height: 65vh; + max-height: 59vh; overflow-y: auto; } @@ -346,4 +346,20 @@ The bottom component is originally not showing until you select a voter .record-item input::placeholder { color: #bbb; +} + +.final-save { + height: 2rem; + background-color: var(--main-color); + color: #fff; + width: 100%; + border: 1.5px solid var(--main-color); + border-bottom-width: 3px; + border-radius: 0 0 0.6rem 0.6rem; + display: flex; + align-items: center; + justify-content: center; + margin-top: 1.2rem; + font-size: 1.2rem; + font-weight: 800; } \ No newline at end of file diff --git a/site/index.html b/site/index.html index 47b718c..b8a8131 100644 --- a/site/index.html +++ b/site/index.html @@ -304,10 +304,12 @@
    - - + + + +
    Save
    diff --git a/site/js/show-info.js b/site/js/show-info.js index 6c7616b..28f5220 100644 --- a/site/js/show-info.js +++ b/site/js/show-info.js @@ -156,6 +156,8 @@ function displayVotingHistory(thisVoter) { /* PER CANVASSING RECORD */ function displayLanguage(thisVoter) { + let langInput = document.querySelector("#icon-lang-input").getElementsByTagName("input")[0]; + langInput.placeholder = "Other..."; // Get the canvass state let thisStatus = undefined; // Store current voter id in the container DOM object @@ -168,11 +170,10 @@ function displayLanguage(thisVoter) { highlightOption("#icon-lang", optionIdSelector); // If not the three languages, show in the input box - if(thisStatus != undefined && ["english", "spanish", "chinese"].includes(thisStatus)) { - let langInput = document.querySelector("#icon-lang-input").getElementsByTagName("input")[0]; + if(thisStatus != undefined && !["english", "spanish", "chinese"].includes(thisStatus)) { langInput.placeholder = thisStatus; } - + // Prepare: add event listeners for them to be clicked on prepareOption("#icon-lang"); } diff --git a/site/js/update-info.js b/site/js/update-info.js index 492913c..a5f0a3e 100644 --- a/site/js/update-info.js +++ b/site/js/update-info.js @@ -5,6 +5,7 @@ import { showVotersOnMap } from "./map.js"; import { highlightVoter } from "./selected-voter.js"; import { allFilters } from "./list-filters.js"; import { inputNumber } from "./list-loader.js"; +import { showVotersInList } from "./voter-list.js"; // Function to highlight an option given selectors on click function highlightOption(groupIdSelector, optionIdSelector) { @@ -43,16 +44,13 @@ function prepareOption(groupIdSelector) { // Then, record the click let storageEl = document.querySelector(groupIdSelector); storageEl.unsavedSelection = item.id.substring(lastDashLocation + 1); - - console.log("The voter is ", storageEl.currentVoterId); - console.log("The language is", storageEl.unsavedSelection); }); } } // After saving data, update Filtered data // At the same time, update display on the map and in the list -function updateData(data, currentVoterId, status) { +function updateDataOnStatusSave(data, currentVoterId, status) { let filteredData = allFilters(data); // showVotersInList(filteredData); showVotersOnMap(filteredData); @@ -79,6 +77,16 @@ function updateData(data, currentVoterId, status) { highlightVoter(currentVoterId); } +function updateDataOnFinalSave(data, currentVoterId) { + let filteredData = allFilters(data); + // showVotersInList(filteredData); + showVotersOnMap(filteredData); + + showVotersInList(filteredData); + // Then rehighlight this voter + highlightVoter(currentVoterId); +} + // Called on success of updating voter canvass status function onUpdateStatusSuccess(canvassStatusSaveButtonEl) { canvassStatusSaveButtonEl.classList.add("canvass-status-save-toast"); @@ -91,7 +99,6 @@ function onUpdateStatusSuccess(canvassStatusSaveButtonEl) { // Save current canvass status on click const canvassStatusSaveButtonEl = document.querySelector("#canvass-status-save"); - canvassStatusSaveButtonEl.addEventListener("click", ( ) => { let unsavedSelection = document.querySelector("#icon-canvass").unsavedSelection; let currentVoterId = document.querySelector("#icon-canvass").currentVoterId; @@ -106,10 +113,9 @@ canvassStatusSaveButtonEl.addEventListener("click", ( ) => { updateVoters(additionalData.info); // Then, update map and list - updateData(data, currentVoterId, unsavedSelection); + updateDataOnStatusSave(data, currentVoterId, unsavedSelection); // Then, send the updated info to the cloud - // and do a toast on success saveAdditionalInfo(inputNumber, additionalData.info); // Then, show a toast on the button @@ -117,6 +123,51 @@ canvassStatusSaveButtonEl.addEventListener("click", ( ) => { } }); +// Initiate properties on DOM elements to store unsaved information +let saveItemsSelectorsList = ["#icon-canvass", "#icon-lang", "#icon-plan", "#icon-mail", "#icon-who"]; +let recordItemsList = ["canvass-status", "language", "plan", "mail"]; + +for(let i = 0; i < saveItemsSelectorsList.length; i++) { + let selector = saveItemsSelectorsList[i]; + let name = recordItemsList[i]; + let itemEl = document.querySelector(selector); + itemEl.recordItemName = name; + itemEl.currentVoterId = undefined; + itemEl.unsavedSelection = undefined; +} + +// Save all on click +const finalSaveButtonEl = document.querySelector("#final-save"); +finalSaveButtonEl.addEventListener("click", ( ) => { + let currentVoterId; + + for(let selector of saveItemsSelectorsList) { + let itemEl = document.querySelector(selector); + let recordItemName = itemEl.recordItemName; + currentVoterId = itemEl.currentVoterId; + let unsavedSelection = itemEl.unsavedSelection; + + if(currentVoterId && unsavedSelection) { + // Initiate, if no additional info has been recorded for this voter + if(!additionalData.info[currentVoterId]) { + additionalData.info[currentVoterId] = {}; + } + // Add to temp save data + additionalData.info[currentVoterId][recordItemName] = unsavedSelection; + } + } + + // Update data + updateVoters(additionalData.info); + + // Update display + // updateDataOnFinalSave(data, currentVoterId); + + // Then, send the updated info to the cloud + saveAdditionalInfo(inputNumber, additionalData.info); + +}); + export { highlightOption, prepareOption, From a1e2a5690ba422fded6dea319ba8fdb16340bf2d Mon Sep 17 00:00:00 2001 From: Leejere Date: Mon, 14 Nov 2022 21:39:34 -0500 Subject: [PATCH 68/95] fixed a bug --- site/js/list-loader.js | 2 +- site/js/main.js | 7 ++++--- site/js/show-info.js | 4 +++- site/js/update-info.js | 38 +++++++++++++++++++++++--------------- 4 files changed, 31 insertions(+), 20 deletions(-) diff --git a/site/js/list-loader.js b/site/js/list-loader.js index 4394948..bba8b4a 100644 --- a/site/js/list-loader.js +++ b/site/js/list-loader.js @@ -78,7 +78,6 @@ function makeShortAddress(data) { 4. Show voters in the list */ function loadVoterData(text) { - if(text == false) { return; } @@ -133,6 +132,7 @@ function loadByListNumber(number) { function onLoadButtonClick() { // Get input list number inputNumber = listNumberInputEl.value.replace(/\s/g, ''); + if(errorTooltip(inputNumber)) { return } loadByListNumber(inputNumber); } diff --git a/site/js/main.js b/site/js/main.js index 648cdd3..9b6edf5 100644 --- a/site/js/main.js +++ b/site/js/main.js @@ -94,12 +94,13 @@ async function updateAdditionalInfo(listNumber, data, showOnMap, showInList) { const result = await getDoc(voterNotesDoc); additionalData.info = result.data(); updateVoters(result.data(), data); - showOnMap(data); - showInList(data); - fitMap(); + } catch { additionalData.info = {}; } + showOnMap(data); + showInList(data); + fitMap(); } // Function to save the updated additional info to Firebase diff --git a/site/js/show-info.js b/site/js/show-info.js index 28f5220..8b0f09d 100644 --- a/site/js/show-info.js +++ b/site/js/show-info.js @@ -7,7 +7,7 @@ import electionLookup from "../data/election_lookup.js"; import { htmlToElement } from './htmlelement.js'; import { showHideExpandButton, getVoterStatusIcon } from "./voter-list.js"; import { electionListExpandButtonEl } from "./list-expand.js"; -import { highlightOption, prepareOption } from "./update-info.js"; +import { highlightOption, prepareOption, prepareInput } from "./update-info.js"; import partyDict from '../data/political_party_lookup.json' assert {type: "json"}; import { getPartyColor } from "./voter-list.js"; @@ -155,6 +155,7 @@ function displayVotingHistory(thisVoter) { /* PER CANVASSING RECORD */ +// Display options for Voter Language function displayLanguage(thisVoter) { let langInput = document.querySelector("#icon-lang-input").getElementsByTagName("input")[0]; langInput.placeholder = "Other..."; @@ -176,6 +177,7 @@ function displayLanguage(thisVoter) { // Prepare: add event listeners for them to be clicked on prepareOption("#icon-lang"); + prepareInput("#icon-lang"); } /* UTIL: FIND THE VOTER DATA ENTRY USING VOTER ID */ diff --git a/site/js/update-info.js b/site/js/update-info.js index a5f0a3e..a8767f7 100644 --- a/site/js/update-info.js +++ b/site/js/update-info.js @@ -13,7 +13,7 @@ function highlightOption(groupIdSelector, optionIdSelector) { let iconGroupEl = document.querySelector(groupIdSelector).querySelectorAll(".icon-set"); for(let item of iconGroupEl) { item.classList.remove("highlighted"); - item.classList.add("icon-no-color"); + //item.classList.add("icon-no-color"); } // DOM object of the icon to be highlighted @@ -48,6 +48,26 @@ function prepareOption(groupIdSelector) { } } +// Likewise, also prepare the input box to be listened +function prepareInput(groupIdSelector) { + let inputEl = document.querySelector(groupIdSelector).querySelector("input"); + inputEl.addEventListener("input", ( ) => { + + // When input, unhighlight all other options + let iconGroupEl = document.querySelector(groupIdSelector).querySelectorAll(".icon-set"); + for(let item of iconGroupEl) { + item.classList.remove("highlighted"); + item.classList.add("icon-no-color"); + } + + // Record the input + let customInput = inputEl.value; + let storageEl = document.querySelector(groupIdSelector); + storageEl.unsavedSelection = customInput; + + }); +} + // After saving data, update Filtered data // At the same time, update display on the map and in the list function updateDataOnStatusSave(data, currentVoterId, status) { @@ -77,16 +97,6 @@ function updateDataOnStatusSave(data, currentVoterId, status) { highlightVoter(currentVoterId); } -function updateDataOnFinalSave(data, currentVoterId) { - let filteredData = allFilters(data); - // showVotersInList(filteredData); - showVotersOnMap(filteredData); - - showVotersInList(filteredData); - // Then rehighlight this voter - highlightVoter(currentVoterId); -} - // Called on success of updating voter canvass status function onUpdateStatusSuccess(canvassStatusSaveButtonEl) { canvassStatusSaveButtonEl.classList.add("canvass-status-save-toast"); @@ -124,6 +134,7 @@ canvassStatusSaveButtonEl.addEventListener("click", ( ) => { }); // Initiate properties on DOM elements to store unsaved information +// Add names and such let saveItemsSelectorsList = ["#icon-canvass", "#icon-lang", "#icon-plan", "#icon-mail", "#icon-who"]; let recordItemsList = ["canvass-status", "language", "plan", "mail"]; @@ -159,10 +170,6 @@ finalSaveButtonEl.addEventListener("click", ( ) => { // Update data updateVoters(additionalData.info); - - // Update display - // updateDataOnFinalSave(data, currentVoterId); - // Then, send the updated info to the cloud saveAdditionalInfo(inputNumber, additionalData.info); @@ -171,4 +178,5 @@ finalSaveButtonEl.addEventListener("click", ( ) => { export { highlightOption, prepareOption, + prepareInput, }; \ No newline at end of file From b4afd4f2e9afee62f48da5a37dcf0cc656f76f86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Myron=20Ba=C3=B1ez?= Date: Mon, 14 Nov 2022 22:21:08 -0500 Subject: [PATCH 69/95] fixed filters and css --- site/css/list-filters.css | 37 ++++++++++++++++++++++++++++++++++++- site/index.html | 22 ++++++++++++++-------- 2 files changed, 50 insertions(+), 9 deletions(-) diff --git a/site/css/list-filters.css b/site/css/list-filters.css index 74baa4a..c45fa4b 100644 --- a/site/css/list-filters.css +++ b/site/css/list-filters.css @@ -50,7 +50,7 @@ Filter window top: 50%; left: 50%; width: 16rem; - height: 20rem; + height: 28rem; margin-top: -10rem; margin-left: -8rem; background-color: white; @@ -60,4 +60,39 @@ Filter window filter: drop-shadow(10px 10px 12px #333333); display: none; transition: display 2s; + overflow-y: scroll; +} + +/* --------- Filters --------- */ + +.party-checkbox { + opacity: 0; + position: absolute; + pointer-events: none; +} + +.party-label { + color: #0d59a9; +} + +.party-checkbox:checked + .party-label { + text-decoration: solid; + color: white; + background-color: #0d59a9; +} + +.status-checkbox { + opacity: 0; + position: absolute; + pointer-events: none; +} + +.status-label { + color: #0d59a9; +} + +.status-checkbox:checked + .status-label { + text-decoration: solid; + color: white; + background-color: #0d59a9; } \ No newline at end of file diff --git a/site/index.html b/site/index.html index 688a132..cdb39b9 100644 --- a/site/index.html +++ b/site/index.html @@ -44,14 +44,20 @@
      -
      -
      -
      -
      -
      -
      -
      -
      +

      Filter by Party

      +
      +
      +
      +
      +
      +
      +

      Filter by Voting Status

      +
      +
      +

      Filter by Visit Status

      +
      +
      +
    From dba35b3314b4ed3f1b812833ec61697982e0d46e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Myron=20Ba=C3=B1ez?= Date: Mon, 14 Nov 2022 22:36:52 -0500 Subject: [PATCH 70/95] created a new function for visit status --- site/css/list-filters.css | 16 ++++++++++++++++ site/index.html | 6 +++--- site/js/list-filters.js | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+), 3 deletions(-) diff --git a/site/css/list-filters.css b/site/css/list-filters.css index c45fa4b..df7cd39 100644 --- a/site/css/list-filters.css +++ b/site/css/list-filters.css @@ -95,4 +95,20 @@ Filter window text-decoration: solid; color: white; background-color: #0d59a9; +} + +.visit-checkbox { + opacity: 0; + position: absolute; + pointer-events: none; +} + +.visit-label { + color: #0d59a9; +} + +.visit-checkbox:checked + .visit-label { + text-decoration: solid; + color: white; + background-color: #0d59a9; } \ No newline at end of file diff --git a/site/index.html b/site/index.html index 9e6df6a..aab8f6a 100644 --- a/site/index.html +++ b/site/index.html @@ -55,9 +55,9 @@

    Filter by Voting Status



    Filter by Visit Status

    -
    -
    -
    +
    +
    +
    diff --git a/site/js/list-filters.js b/site/js/list-filters.js index ae675a0..43931d4 100644 --- a/site/js/list-filters.js +++ b/site/js/list-filters.js @@ -109,6 +109,38 @@ for (const cb of statusFilter) { }); } +/* +Function for visit status +*/ +let visitFilter = document.querySelectorAll('.visit-checkbox'); + +function shouldShowVisit () { + let filteredVisit = data; + for (const checkbox of visitFilter) { + if (checkbox.checked) { + filteredVisit = filteredVisit.filter(function (voter) { + const visitType = checkbox.value; + if (voter['canvass-status'] === visitType) { + return true; + } else { + return false; + } + + }); + } + } + + return filteredVisit; +} + +for (const cb of visitFilter) { + cb.addEventListener('change', () => { + const filteredVisit = shouldShowVisit(); + showVotersOnMap(filteredVisit); + showVotersInList(filteredVisit); + }); +} + export { allFilters, }; \ No newline at end of file From 1804589af94f4fb5ba824f09107c48e1f786e5c1 Mon Sep 17 00:00:00 2001 From: Leejere Date: Mon, 14 Nov 2022 23:04:49 -0500 Subject: [PATCH 71/95] finished recorder --- site/css/edit.css | 16 +++++++++ site/index.html | 6 ++-- site/js/show-info.js | 75 ++++++++++++++++++++++++++++++++++++++++-- site/js/update-info.js | 41 ++++++++++++++--------- 4 files changed, 118 insertions(+), 20 deletions(-) diff --git a/site/css/edit.css b/site/css/edit.css index 152a427..f64cd98 100644 --- a/site/css/edit.css +++ b/site/css/edit.css @@ -150,6 +150,16 @@ The bottom component is originally not showing until you select a voter border-color: var(--main-color); } +#icon-who-r.highlighted .list-icon { + background-color: var(--red-color); + border-color: var(--red-color); +} + +#icon-plan-yes.highlighted .list-icon { + background-color: var(--ok-color); + border-color: var(--ok-color); +} + #icon-canvass-pending.highlighted .list-icon { background-color: #999; border-color: #999; @@ -341,6 +351,7 @@ The bottom component is originally not showing until you select a voter .record-item input:focus { border-width: 2.5px; + border-color: var(--aux-color); border-radius: 0 0 0.5em 0.5em; } @@ -362,4 +373,9 @@ The bottom component is originally not showing until you select a voter margin-top: 1.2rem; font-size: 1.2rem; font-weight: 800; +} + +.final-save-toast { + background-color: var(--aux-color); + border-color: var(--aux-color); } \ No newline at end of file diff --git a/site/index.html b/site/index.html index b8a8131..4d14d1d 100644 --- a/site/index.html +++ b/site/index.html @@ -207,7 +207,7 @@
    -
    PER CANVASSING RECORDING
    +
    RECORDER
    Language
    @@ -285,13 +285,13 @@
    - D +

    D

    Dem.
    - R +

    R

    Rep.
    diff --git a/site/js/show-info.js b/site/js/show-info.js index 8b0f09d..1406b77 100644 --- a/site/js/show-info.js +++ b/site/js/show-info.js @@ -84,6 +84,10 @@ function displayActiveness(thisVoter) { activeNameEl.innerHTML = activeName; } +function displayPlanGeneral(thisVoter) { + +} + /* VOTING HISTORY */ // Function to construct an array sorted by date, with all the election info regarding this voter @@ -156,7 +160,7 @@ function displayVotingHistory(thisVoter) { /* PER CANVASSING RECORD */ // Display options for Voter Language -function displayLanguage(thisVoter) { +function displayLanguageOptions(thisVoter) { let langInput = document.querySelector("#icon-lang-input").getElementsByTagName("input")[0]; langInput.placeholder = "Other..."; // Get the canvass state @@ -180,6 +184,70 @@ function displayLanguage(thisVoter) { prepareInput("#icon-lang"); } +// Display options for Voter Plan +function displayPlanOptions(thisVoter) { + + // Get the canvass state + let thisStatus = undefined; + // Store current voter id in the container DOM object + // Do this because we have to store the info associated with the voter + document.querySelector("#icon-plan").currentVoterId = thisVoter["ID Number"]; + + thisStatus = thisVoter["plan"]; + let optionIdSelector = `#icon-plan-${thisStatus}`; + + // Highlight option (thisStatus undefined situation dealt with there) + highlightOption("#icon-plan", optionIdSelector); + + // Prepare: add event listeners for them to be clicked on + prepareOption("#icon-plan"); +} + +// Display options for Voter mailing option +function displayMailOptions(thisVoter) { + + // Get the canvass state + let thisStatus = undefined; + // Store current voter id in the container DOM object + // Do this because we have to store the info associated with the voter + document.querySelector("#icon-mail").currentVoterId = thisVoter["ID Number"]; + + thisStatus = thisVoter["mail"]; + let optionIdSelector = `#icon-mail-${thisStatus}`; + + // Highlight option (thisStatus undefined situation dealt with there) + highlightOption("#icon-mail", optionIdSelector); + + // Prepare: add event listeners for them to be clicked on + prepareOption("#icon-mail"); +} + +// Display options for Voter Language +function displayWhoOptions(thisVoter) { + let whoInput = document.querySelector("#icon-who-input").getElementsByTagName("input")[0]; + whoInput.placeholder = "Other..."; + + // Get the canvass state + let thisStatus = undefined; + // Store current voter id in the container DOM object + // Do this because we have to store the info associated with the voter + document.querySelector("#icon-who").currentVoterId = thisVoter["ID Number"]; + + thisStatus = thisVoter["who"]; + let optionIdSelector = `#icon-who-${thisStatus}`; + // Highlight option (thisStatus undefined situation dealt with there) + highlightOption("#icon-who", optionIdSelector); + + // If not the two parties, show in the input box + if(thisStatus != undefined && !["d", "r"].includes(thisStatus)) { + whoInput.placeholder = thisStatus; + } + + // Prepare: add event listeners for them to be clicked on + prepareOption("#icon-who"); + prepareInput("#icon-who"); +} + /* UTIL: FIND THE VOTER DATA ENTRY USING VOTER ID */ // Find voter: takes voter ID and outputs comprehensive voter data @@ -206,7 +274,10 @@ function displayInfo(thisId) { displayVotingHistory(thisVoter); // Canvass recording part - displayLanguage(thisVoter); + displayLanguageOptions(thisVoter); + displayPlanOptions(thisVoter); + displayMailOptions(thisVoter); + displayWhoOptions(thisVoter); } export { diff --git a/site/js/update-info.js b/site/js/update-info.js index a8767f7..694c612 100644 --- a/site/js/update-info.js +++ b/site/js/update-info.js @@ -7,6 +7,22 @@ import { allFilters } from "./list-filters.js"; import { inputNumber } from "./list-loader.js"; import { showVotersInList } from "./voter-list.js"; +// Initiate properties on DOM elements to store unsaved information +// Add names and such +let saveItemsSelectorsList = ["#icon-canvass", "#icon-lang", "#icon-plan", "#icon-mail", "#icon-who"]; +let recordItemsList = ["canvass-status", "language", "plan", "mail", "who"]; + +for(let i = 0; i < saveItemsSelectorsList.length; i++) { + let selector = saveItemsSelectorsList[i]; + let name = recordItemsList[i]; + let itemEl = document.querySelector(selector); + itemEl.recordItemName = name; + itemEl.currentVoterId = undefined; + itemEl.unsavedSelection = undefined; + console.log(name); +} + + // Function to highlight an option given selectors on click function highlightOption(groupIdSelector, optionIdSelector) { // First remove all highlighted classes and reset everything to default gray color @@ -107,6 +123,15 @@ function onUpdateStatusSuccess(canvassStatusSaveButtonEl) { }, 1500); } +function onFinalSaveSuccess(finalSaveButtonEl) { + finalSaveButtonEl.classList.add("final-save-toast"); + finalSaveButtonEl.innerHTML = "Saved!"; + setTimeout(( ) => { + finalSaveButtonEl.classList.remove("final-save-toast"); + finalSaveButtonEl.innerHTML = "Save"; + }, 1500); +} + // Save current canvass status on click const canvassStatusSaveButtonEl = document.querySelector("#canvass-status-save"); canvassStatusSaveButtonEl.addEventListener("click", ( ) => { @@ -133,20 +158,6 @@ canvassStatusSaveButtonEl.addEventListener("click", ( ) => { } }); -// Initiate properties on DOM elements to store unsaved information -// Add names and such -let saveItemsSelectorsList = ["#icon-canvass", "#icon-lang", "#icon-plan", "#icon-mail", "#icon-who"]; -let recordItemsList = ["canvass-status", "language", "plan", "mail"]; - -for(let i = 0; i < saveItemsSelectorsList.length; i++) { - let selector = saveItemsSelectorsList[i]; - let name = recordItemsList[i]; - let itemEl = document.querySelector(selector); - itemEl.recordItemName = name; - itemEl.currentVoterId = undefined; - itemEl.unsavedSelection = undefined; -} - // Save all on click const finalSaveButtonEl = document.querySelector("#final-save"); finalSaveButtonEl.addEventListener("click", ( ) => { @@ -167,12 +178,12 @@ finalSaveButtonEl.addEventListener("click", ( ) => { additionalData.info[currentVoterId][recordItemName] = unsavedSelection; } } - // Update data updateVoters(additionalData.info); // Then, send the updated info to the cloud saveAdditionalInfo(inputNumber, additionalData.info); + onFinalSaveSuccess(finalSaveButtonEl); }); export { From c9beab31bd7e5345ef4c91b67c716f18977ff503 Mon Sep 17 00:00:00 2001 From: Leejere Date: Tue, 15 Nov 2022 00:11:06 -0500 Subject: [PATCH 72/95] finished basically --- site/css/edit.css | 11 +++++++ site/index.html | 27 ++++++++++++++- site/js/show-info.js | 75 +++++++++++++++++++++++++++++++++++++++++- site/js/update-info.js | 18 ++++++++++ 4 files changed, 129 insertions(+), 2 deletions(-) diff --git a/site/css/edit.css b/site/css/edit.css index f64cd98..d638653 100644 --- a/site/css/edit.css +++ b/site/css/edit.css @@ -311,6 +311,7 @@ The bottom component is originally not showing until you select a voter .this-visit-panel { height: auto; padding-bottom: 1rem; + transition: height 1s ease-in-out; } .last-visit-panel { @@ -359,6 +360,16 @@ The bottom component is originally not showing until you select a voter color: #bbb; } +#other-notes-input { + margin: 1rem 0.5rem 0.5rem; + width: calc(100% - 2rem); + height: 3rem; +} + +#other-notes-input input { + height: 100%; +} + .final-save { height: 2rem; background-color: var(--main-color); diff --git a/site/index.html b/site/index.html index 1d6b036..f560e69 100644 --- a/site/index.html +++ b/site/index.html @@ -171,12 +171,16 @@

    Filter by Visit Status

    + +
    + +
    @@ -184,8 +188,23 @@

    Filter by Visit Status

    -
    + +
    +
    +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + +
    @@ -308,6 +327,12 @@

    Filter by Visit Status

    + + +
    + +
    + diff --git a/site/js/show-info.js b/site/js/show-info.js index 1406b77..ba4cd92 100644 --- a/site/js/show-info.js +++ b/site/js/show-info.js @@ -84,8 +84,65 @@ function displayActiveness(thisVoter) { activeNameEl.innerHTML = activeName; } +function displayMailGeneral(thisVoter) { + // Get DOM objects + const mailSet = document.querySelector("#info-panel-mail-set"); + mailSet.style.display = "none"; + + const mailCodeEl = document.querySelector("#info-panel-mail-set").getElementsByClassName("list-icon")[0]; + const mailNameEl = document.querySelector("#info-panel-mail-set").getElementsByClassName("icon-subtitle")[0]; + console.log(mailNameEl); + + // Construct some HTML elements + const mailReceivedHTML = `mark_email_read`; + const mailNotReceivedHTML = `unsubscribe`; + const voteInPersonHTML = `footprint`; + + // Only display if such info exists + if(thisVoter["mail"]) { + // Only show if there's this thing + mailSet.style.display = "flex"; + + let mailBallotInfo = thisVoter["mail"]; + if(mailBallotInfo === "received") { + mailCodeEl.innerHTML = mailReceivedHTML; + mailNameEl.innerHTML = "Received mail ballot"; + } else if(mailBallotInfo === "awaits") { + mailCodeEl.innerHTML = mailNotReceivedHTML; + mailNameEl.innerHTML = "Awaits mail ballot"; + } else { + mailCodeEl.innerHTML = voteInPersonHTML; + mailNameEl.innerHTML = "Will vote in person"; + } + } +} + function displayPlanGeneral(thisVoter) { - + // Get DOM objects + const planSet = document.querySelector("#info-panel-plan-set"); + planSet.style.display = "none"; + + const planCodeEl = document.querySelector("#info-panel-plan-set").getElementsByClassName("list-icon")[0]; + const planNameEl = document.querySelector("#info-panel-plan-set").getElementsByClassName("icon-subtitle")[0]; + + // Construct some HTML elements + const planYes = `task_alt`; + const planNo = `unpublished`; + + // Only display if such info exists + if(thisVoter["plan"]) { + // Only show if there's this thing + planSet.style.display = "flex"; + + let planInfo = thisVoter["plan"]; + if(planInfo === "yes") { + planCodeEl.innerHTML = planYes; + planNameEl.innerHTML = "Planned"; + } else { + planCodeEl.innerHTML = planNo; + planNameEl.innerHTML = "Not planned"; + } + } } /* VOTING HISTORY */ @@ -248,6 +305,14 @@ function displayWhoOptions(thisVoter) { prepareInput("#icon-who"); } +// Display extra notes +function displayExtraNotes(thisVoter) { + let extraNotesEl = document.querySelector("#other-notes-input").getElementsByTagName("input")[0]; + if(thisVoter["notes"]) { + extraNotesEl.placeholder = thisVoter["notes"]; + } +} + /* UTIL: FIND THE VOTER DATA ENTRY USING VOTER ID */ // Find voter: takes voter ID and outputs comprehensive voter data @@ -269,6 +334,8 @@ function displayInfo(thisId) { displayActiveness(thisVoter); displayParty(thisVoter); displayCanvassStatus(thisVoter); + displayMailGeneral(thisVoter); + displayPlanGeneral(thisVoter); // Voting history part displayVotingHistory(thisVoter); @@ -278,9 +345,15 @@ function displayInfo(thisId) { displayPlanOptions(thisVoter); displayMailOptions(thisVoter); displayWhoOptions(thisVoter); + + // Show notes if any + displayExtraNotes(thisVoter); } export { displayInfo, highlightOption, + displayPlanGeneral, + displayMailGeneral, + findThisVoter, }; \ No newline at end of file diff --git a/site/js/update-info.js b/site/js/update-info.js index 694c612..8f45230 100644 --- a/site/js/update-info.js +++ b/site/js/update-info.js @@ -6,6 +6,8 @@ import { highlightVoter } from "./selected-voter.js"; import { allFilters } from "./list-filters.js"; import { inputNumber } from "./list-loader.js"; import { showVotersInList } from "./voter-list.js"; +import { displayPlanGeneral, displayMailGeneral, findThisVoter } from "./show-info.js"; +import { selectedVoter } from "./selected-voter.js"; // Initiate properties on DOM elements to store unsaved information // Add names and such @@ -163,6 +165,16 @@ const finalSaveButtonEl = document.querySelector("#final-save"); finalSaveButtonEl.addEventListener("click", ( ) => { let currentVoterId; + // First update the extra notes, if any + let extraNotesEl = document.querySelector("#other-notes-input").getElementsByTagName("input")[0]; + if(extraNotesEl.value) { + // Initiate, if no additional info has been recorded for this voter + if(!additionalData.info[selectedVoter]) { + additionalData.info[selectedVoter] = {}; + } + additionalData.info[selectedVoter]["notes"] = extraNotesEl.value; + } + for(let selector of saveItemsSelectorsList) { let itemEl = document.querySelector(selector); let recordItemName = itemEl.recordItemName; @@ -180,6 +192,12 @@ finalSaveButtonEl.addEventListener("click", ( ) => { } // Update data updateVoters(additionalData.info); + + // Update some general display + let thisVoter = findThisVoter(currentVoterId); + displayPlanGeneral(thisVoter); + displayMailGeneral(thisVoter); + // Then, send the updated info to the cloud saveAdditionalInfo(inputNumber, additionalData.info); From 4ffc8c43aca8bd8dce117e01ca5b98b8fd5e11da Mon Sep 17 00:00:00 2001 From: Leejere Date: Tue, 15 Nov 2022 00:14:59 -0500 Subject: [PATCH 73/95] small change --- site/js/hide-show.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/site/js/hide-show.js b/site/js/hide-show.js index 791e235..86718f2 100644 --- a/site/js/hide-show.js +++ b/site/js/hide-show.js @@ -85,8 +85,8 @@ function switchToEdit() { // Move the top thing away topComponentEl.style.transition = 'transform 0.3s ease-in-out'; navComponentEl.style.transition = 'transform 0.3s ease-in-out'; - topComponentEl.style.transform = "translateX(-28em)"; - navComponentEl.style.transform = "translateX(-28em)"; + topComponentEl.style.transform = "translateX(-35em)"; + navComponentEl.style.transform = "translateX(-35em)"; // Move the whole thing up bottomComponentEl.style.top = "7vh"; From 93549ac11c966ae6b1e082430a72f95d969c5274 Mon Sep 17 00:00:00 2001 From: Leejere Date: Tue, 15 Nov 2022 00:16:20 -0500 Subject: [PATCH 74/95] small change --- site/js/hide-show.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/js/hide-show.js b/site/js/hide-show.js index 86718f2..15d1bb5 100644 --- a/site/js/hide-show.js +++ b/site/js/hide-show.js @@ -108,7 +108,7 @@ function switchToNormal() { navComponentEl.style.transform = "translateX(0em)"; // Hide the other panels - editComponentEl.style.transform = "translateX(-30em)"; + editComponentEl.style.transform = "translateX(-38em)"; // Move the whole thing down bottomComponentEl.style.top = "72vh"; From 2e56476acab0dee21c88929cb0b41ab8c96b015b Mon Sep 17 00:00:00 2001 From: Leejere Date: Tue, 15 Nov 2022 00:34:42 -0500 Subject: [PATCH 75/95] small changes --- site/js/hide-show.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/site/js/hide-show.js b/site/js/hide-show.js index 15d1bb5..e6628ab 100644 --- a/site/js/hide-show.js +++ b/site/js/hide-show.js @@ -28,8 +28,8 @@ export let editComponentEl = document.querySelector("#edit-component"); function hideChunk() { // Hide chunk by moving listLoaderHidableEl.style.transform = "translateX(-16em)"; - searchBoxHidableEl.style.transform = "translateX(-28em)"; - voterListHidableEl.style.transform = "translateX(-28em)"; + searchBoxHidableEl.style.transform = "translateX(-42em)"; + voterListHidableEl.style.transform = "translateX(-42em)"; topComponentEl.style.pointerEvents = "none"; // If the list is currently expanded, unexpand @@ -85,8 +85,8 @@ function switchToEdit() { // Move the top thing away topComponentEl.style.transition = 'transform 0.3s ease-in-out'; navComponentEl.style.transition = 'transform 0.3s ease-in-out'; - topComponentEl.style.transform = "translateX(-35em)"; - navComponentEl.style.transform = "translateX(-35em)"; + topComponentEl.style.transform = "translateX(-42em)"; + navComponentEl.style.transform = "translateX(-42em)"; // Move the whole thing up bottomComponentEl.style.top = "7vh"; @@ -108,7 +108,7 @@ function switchToNormal() { navComponentEl.style.transform = "translateX(0em)"; // Hide the other panels - editComponentEl.style.transform = "translateX(-38em)"; + editComponentEl.style.transform = "translateX(-42em)"; // Move the whole thing down bottomComponentEl.style.top = "72vh"; From 3989e6868f0bc8c6b6bb987ee96735d2b6964071 Mon Sep 17 00:00:00 2001 From: Leejere Date: Tue, 15 Nov 2022 00:55:55 -0500 Subject: [PATCH 76/95] trying a fix --- site/js/list-loader.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/site/js/list-loader.js b/site/js/list-loader.js index bba8b4a..4a9aeb7 100644 --- a/site/js/list-loader.js +++ b/site/js/list-loader.js @@ -90,7 +90,7 @@ function loadVoterData(text) { // Create new property: combine house number with street name data = makeShortAddress(data); - + console.log(data); // Load additional voter data from firebase, and update data // And then display the data on the map and in the list updateAdditionalInfo(inputNumber, data, showVotersInList, showVotersOnMap); @@ -113,7 +113,7 @@ function loadVoterData(text) { function loadByListNumber(number) { // Update input number, if loading from cloud and it is undefined inputNumber = number; - let path = './data/voters_lists/' + number + '.csv'; + let path = '../data/voters_lists/' + number + '.csv'; // Set the input box placeholder listNumberInputEl.placeholder = `${number}`; From 466d38b08c4f80c90ecbb27966373e5a82557f37 Mon Sep 17 00:00:00 2001 From: Leejere Date: Tue, 15 Nov 2022 01:05:41 -0500 Subject: [PATCH 77/95] fix --- site/js/list-loader.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/js/list-loader.js b/site/js/list-loader.js index 4a9aeb7..8fb4583 100644 --- a/site/js/list-loader.js +++ b/site/js/list-loader.js @@ -113,7 +113,7 @@ function loadVoterData(text) { function loadByListNumber(number) { // Update input number, if loading from cloud and it is undefined inputNumber = number; - let path = '../data/voters_lists/' + number + '.csv'; + let path = './data/voters_lists/' + number + '.csv'; // Set the input box placeholder listNumberInputEl.placeholder = `${number}`; From 2d4f895e92136dc81dc9f03ebfe5fc6dad38475d Mon Sep 17 00:00:00 2001 From: Leejere Date: Tue, 15 Nov 2022 08:22:36 -0500 Subject: [PATCH 78/95] trial fix --- site/data/political_party_lookup.js | 535 ++++++++++++++++++++++++++ site/data/political_party_lookup.json | 4 +- site/js/list-loader.js | 3 +- site/js/map.js | 10 +- site/js/show-info.js | 7 +- 5 files changed, 547 insertions(+), 12 deletions(-) create mode 100644 site/data/political_party_lookup.js diff --git a/site/data/political_party_lookup.js b/site/data/political_party_lookup.js new file mode 100644 index 0000000..9c245f0 --- /dev/null +++ b/site/data/political_party_lookup.js @@ -0,0 +1,535 @@ +export default[{ + "3RD": "3rd", + "A": "ALL", + "ABO": "ABOLITIONIST", + "AC": "ANARCHIST", + "ACO": "ANARCHO-COMMUNIST", + "ACP": "ANARCHO CAPITALIST", + "ACR": "ALL CROOKS", + "AD": "ADARIAN", + "AE": "AMERICAN EAGLE", + "AF": "AMERICAN FIRST PARTY", + "AFP": "AMERICAN FREEDOM PARTY", + "AG": "ALMIGHTY GOD'S", + "AH": "AMERICAN HERITAGE", + "AI": "AMERICAN INDEPENDENT", + "AIP": "AIP", + "AL": "AMERICAN LABOR", + "AMA": "AMERICA", + "ALL": "ALLAH", + "AM": "AMERICAN", + "AMD": "AMERICAN DELTA", + "AME": "AMERICA'S", + "AMF": "AMERICA FIRST", + "AMI": "AMERICAN INDIAN", + "AMRE": "American Reform", + "AMRL": "AMERICAL LIBERTY", + "AN": "AMERICAN NAZI", + "ANA": "ANARCHY", + "ANL": "ANIMAL LIFE", + "ANO": "ANONYMOUS", + "ANP": "AIN'T NO PARTY LIKE A POLITICAL PARTY", + "ANY": "ANY", + "AO": "ANTI OBAMA", + "AP": "AMERICAN PATRIOT", + "APJ": "APPLE JUICE", + "APP": "AMERICA'S PARTY PENNSYLVANIA", + "APR": "AMERICAN FIRST PROGRESSIVE", + "APTY": "AMERICA's PARTY ", + "ARI": "ARISTOCRAT", + "ARP": "AMERICAN REVOLUTIONARY PARTY", + "ASF": "AMERICA - SEMPER FI", + "ASI": "ASIAN", + "ASM": "ASSEMBLY", + "ASP": "American Solidarity Party", + "AT": "ATHEIST", + "ATP": "AMERICAN TEA PARTY", + "AU": "AMERICAN UNITY", + "AW": "AWAKE", + "AZ": "AQUAZIAN ZIONIST", + "AZPA": "AQUARIAN ZIONIST PARTY OF AMERICA", + "AYE": "Aseyev", + "B": "BIRTHDAY", + "BA": "BLUE ARMY", + "BH": "BOTH", + "BL": "BLISS", + "BLP": "BLACK PANTHER", + "BM": "BULL MOOSE", + "BMP": "BOTH MAJOR PARTIES", + "BO": "BARACK OBAMA", + "BP": "BI-PARTISAN", + "BPAT": "BEST PERSON AT THE TIME", + "BPFJ": "BEST PERSON FOR THE JOB", + "BS": "BERNIE SANDERS", + "BSRR": "BEER/SEX/ROCK ROLL", + "BSTP": "BEST PERSON", + "BTH": "BOTH 1/2", + "BTM": "BETWEEN MIDDLE", + "C": "CONSERVATIVE", + "CA": "CAPITALIST", + "CB": "CAMPBELL PARTY", + "CC": "CHRISTIAN CONSERVATIVE", + "CCO": "CHRISTIAN COALITION", + "CCUS": "CATHOLIC CENTER PARTY USA", + "CD": "CHRISTIAN DEMOCRAT", + "CDU": "CHRISTIAN DEMOCRATIC PARTY U.S.A.", + "CDUN": "CHRISTIAN DEMOCRAT UNION", + "CE": "CENTRALIST", + "CF": "CONFEDERATE", + "CFED": "Constitutional Federalist", + "CH": "CHRISTIAN", + "CHA": "Chablais", + "CHG": "CHANGE", + "CHY": "Christianity", + "CL": "CONSTITUTIONAL", + "CLI": "CHARLIE", + "CLL": "CHRISTIANS FOR LIFE AND LIBERTY", + "CM": "COMMUNIST", + "CMR": "COMMERCIAL", + "CN": "CONFIDENSIAL", + "CNC": "CONSTITUTIONAL CONSERVATIVE", + "CNT": "CENTRIST", + "CNLB": "CENTRIST LIBERTARIAN", + "CO": "CONSUMER'S", + "COD": "CONSERVATIVE DEMOCRAT", + "COI": "CONSERVATIVE INDEPENDENT", + "COL": "COLL", + "COM": "COMMUNIST PARTY USA", + "CON": "CONSUMER", + "CP": "CITIZEN'S", + "CPU": "CPUSA", + "CR": "Conservative Republican", + "CRE": "CARE", + "CRT": "CIVIL RIGHTS", + "CS": "Common Sense", + "CSI": "COMMON SENSE INDEPENDENT", + "CSIP": "CSI PARTY", + "CT": "CONSTITUTION", + "CTL": "Cocktail Party", + "CTT": "CONSTITUTIONALIST", + "D": "DEMOCRATIC", + "DEAB": "Democrats Abroad", + "DEC": "DECEPTICON", + "DEM": "_DEMOCRACY", + "DEP": "DEPPERT", + "DIE": "DIETZIST", + "DIS": "DISABILITY", + "DKY": "DONT KNOW YET", + "DL": "DEMOCRATIC LIBERAL", + "DNA": "Democratic-Non Affiliation", + "DNV": "DO NOT VOTE", + "DPD": "DEPENDED", + "DPN": "DEPENDS", + "DPP": "DEMOCRATIC PROGRESSIVE PARTY", + "DR": "Democratic Republican", + "DS": "DEMOCRATIC SOCIALIST", + "DSN": "DEAD SOON", + "DSNY": "Disney Party", + "DST": "DMCRT SOCIALIST", + "DT": "DON\u2019T KNOW", + "DTP": "DIESEL TRUCK PARTY", + "DTS": "DECLINE TO STATE", + "E": "EVERYDAY", + "ECO": "Ecomagen", + "ECS": "Economic Statism", + "EGA": "Egalitare", + "EMET": "EMET", + "ENP": "EGYPTIAN", + "EPTY": "Ethan's Party", + "EQU": "EQuAliST", + "EX": "EXPERT", + "FA": "FASCIST", + "FAC": "FACIST", + "FAS": "FASCIM", + "FD": "FREEDOM", + "FE": "FEDERALIST", + "FLT": "Free\\Libert\u00e8", + "FM": "FEMINIST MAJORITY", + "FO": "FUGIFINO", + "FP": "FREAK POWER", + "FR": "FREE", + "FRA": "FREE AGENT", + "FRUSA": "FREEDOM USA", + "FS": "FREEDOM SELF", + "FT": "FREETHINKER", + "FTP": "FOR THE PEOPLE", + "FUT": "FUCK TRUP", + "G": "GOD", + "GAD": "GUNS AND DOPE", + "GD": "GREEN DEMOCRAT", + "GDI": "GDI", + "GE": "GALACTIC EMPIRE", + "GG": "GOLD GOOSE", + "GIM": "GIANT METEOR", + "GJ": "GARY JOHNSON", + "GM": "GRAND METACOSMOS", + "GN": "GOOD NEIGHBOR", + "GO": "GOOD ONE", + "GOP": "GOP", + "GP": "GREEN PARTY", + "GPUS": "GREEN PARTY OF THE US", + "GR": "GREEN", + "GRD": "GREEN DEMOCRATIC", + "GRNI": "GREEN INDEPENDENT", + "GRR": "GRASS ROOT", + "GS": "GO STEELERS", + "GT": "Go Trump", + "GTP": "GREEN TEA PARTY", + "GW": "George Washington", + "H": "HALLOWEEN", + "HAB": "HABIBI", + "HAP": "HAPPY", + "HC": "HILLERY CLINTON", + "HE": "HELLO", + "HI": "HUMAN INTEREST", + "HIL": "HILLARY", + "HILA": "HILARY", + "HO": "HORDE", + "HOG": "HOG4BOSS", + "HP": "Hoffman Party", + "HR": "HUMAN RACE", + "HSP": "HOLY SPIRIT", + "HTL": "HITLER", + "HUM": "HUMANITARIAN", + "HUP": "HUMANE", + "I": "INDEPENDENT", + "IA": "INDEPENDENCE PARTY OF AMERICA", + "IAPP": "INDEPENDENT AMERICAN PARTY OF PA", + "IC": "INDEPENDENT-COMPLETION", + "ICC": "Independent Constitutional Conservative", + "ICL": "INDEPENDENT CONSERVATIVE LIBERTARIAN", + "ICO": "INDEPENDENT CONSERVATIVE", + "ICON": "INDEPENDENT CONSTITUTIONALIST", + "ID": "INDEPENDENT DEMOCRAT", + "INDd": "IND.", + "INT": "INTRA", + "INTE": "INTELLIGENT", + "IDK": "I DON'T KNOW", + "IDL": "IDOL", + "IDR": "I DONT REGISTER ", + "IG": "INDEPENDENT GREEN", + "IITM": "I'M IN THE MIDDLE", + "IK": "IDK", + "IL": "INDEPENDENT/LIBERTARIAN", + "ILM": "ILLUMINATI", + "IM": "INDEPENDENT MODERATE", + "IN": "INTERESTING", + "IND": "INDEPENDENCE", + "INDE": "INDEPENDANT", + "INDY": "INDY", + "INRE": "INDEPENDANT/REPUBLIC", + "INNA": "Independent No Affiliation ", + "INNP": "INDEPENDENT/NO PARTY", + "IP": "INDEPENDENT POPULIST", + "IPPA": "IPPA", + "IR": "INDEPENDENT REPUBLICAN", + "IS": "INTERNATIONAL SOCIALIST", + "IT": "INDEPENT", + "ITENT": "INDEPENTENT", + "ITM": "Intermediated", + "IV": "INDIVIDUAL", + "IVFABP": "I VOTE FOR A BETTER PERSON NOT", + "JBN": "JACOBIN", + "J": "JUBILEEIAN", + "JD": "JEDI", + "JO": "JACKASS-ONE", + "JON": "JOHNSON'S", + "JP": "JUSTICE PARTY", + "JS": "JESUS", + "KEG": "KEG", + "KN": "KNOW NOTHING", + "KNP": "KUNNERMAN", + "KOG": "KINGDOM OF GOD", + "KQ": "KINGS & QUEENS", + "KWAD": "KWAD", + "L": "LABOR", + "LA": "LABORER", + "LAN": "LANNISTER", + "LAT": "LATINA", + "LD": "Liberal Democrat", + "LEG": "LEGALIST", + "LF": "LAISSE-FAIRE CAPITALIST", + "LG": "LIBERAL GREENE", + "LI": "LIBERAL", + "LIB": "Liberalist", + "LIBIN": "LIBERAL/INDEPENDENT", + "LIUP": "Liberty Union Party", + "LN": "LIBERTARIAN", + "LNS": "LIBERTARIAN SOCIALIST", + "LNSG": "LIBERTARIAN NATIONAL SOCIALIST GREEN", + "LR": "LIBERTARIAN REPUBLICAN", + "LREP": "LIBERAL REPUBLICAN", + "LT": "LIBERTARIAN TRANSHUMANIST", + "LUK": "LUKAWANDA", + "M": "MODERATE", + "MA": "MAITER", + "MAJA": "MARIJUANA", + "MAN": "MAN", + "MARR": "Marriage", + "MAY": "MAYBE", + "MAS": "MIGHT AS WELL", + "MC": "McCain", + "MCHAR": "MORAL CHARACTER", + "MDWP": "MODERATE WARD PARTY", + "MG": "MIDDLE GROUND", + "MI": "MANAYUNK INDEPENDENT", + "MID": "MIDDLE", + "MIG": "MARK IS GOD", + "MIN": "MODERATE \\ INDEPENDENT", + "ML": "MODERATE-LIBERAL", + "MM": "MICKEY MOUSE", + "MMI": "ME MYSELF AND I", + "MNT": "MONARCHIST", + "MODR": "MODERN REPUBLICAN", + "MP": "Moderate Republican", + "MOP": "Movement for a People's Party Or None", + "MRP": "Marijuana Reform Party", + "MRT": "MR TRUMP", + "MSE": "MEASE", + "MU": "MUTUAL", + "MUS": "MUSLIM", + "MW": "MODERN WHIG", + "MWP": "MODERN WHIG PARTY", + "MX": "MARXIST PARTY", + "MYMED": "MEN YOGA MEDITATION", + "MYP": "My Party", + "MZ": "MADI Z", + "N": "N/A", + "NA": "NEW ALLIANCE", + "NAI": "NEW AFRIKAN INDEPENDENCE", + "NAT": "NAT'L TAXPAYER", + "NC": "NON-COMMITTAL", + "NCP": "NON-CONFORMIST PARTY", + "ND": "NOT DEMO-REPO", + "NE": "NEUTRAL", + "NEI": "Not Either", + "NEO": "NEO-AGRARIAN", + "NF": "NO AFFILIATION", + "NI": "NOT INTERESTED", + "NINC": "NON-INCRIMINATING", + "NL": "NATURAL LAW", + "NO": "NO PARTY", + "NODE": "NON DENOMINATIONAL", + "NON": "NONE", + "NOYO": "None-Your", + "NOO": "NO", + "NOP": "NON-PARTISAN", + "NOPA": "NO PARTY AFFILIATION", + "NOS": "Non Specific", + "NOT": "NOTALITARIAN", + "NOV": "NOVELIST", + "NOW": "NO WAY", + "NP": "NEW PATRIOT", + "NPA": "Non Party", + "NPF": "No Preference", + "NPP": "NEW PATRIOT PARTY", + "NPRO": "NEW PROGRESSIVE", + "NPS": "NPS", + "NRA": "NRA", + "NS": "NATIONAL SOCIALIST", + "NSAL": "NSALP", + "NSSLP": "THE NATIONAL SOCIALIST SONS OF LIBERTY PARTY", + "NST": "NATIONALIST", + "NT": "NATIONAL TAXPAYERS", + "NTRP": "NOT TRUMP", + "NTS": "NOT SURE", + "NU": "NO LONGER IN USE", + "NVTR": "#NeverTrump", + "NW": "NEOWHIG", + "NZ": "NAZI", + "NYP": "NOT YOU PROBLEM", + "O": "OPRAH", + "OBA": "OBAMA", + "OLAP": "Ol' American Party", + "OP": "OPEN", + "OPV": "OTHER POLITICAL VIEWS", + "OR": "ORANGE", + "OTH": "OTHER", + "OW": "OLD WHIG", + "OWN": "OWN", + "OWW": "Old wagon Wheel", + "P": "PUMPKIN", + "P2": "PP", + "PA": "PA FOR PEROT", + "PA2": "PA", + "PAL": "Pacifist/Libertarian", + "PAP": "PEACE & PROSPERITY", + "PAR": "PARTY FOR SOCIALISM AND LIBERIA", + "PART": "PARTY", + "PAS": "PENNSYLVANIA SOVEREIGNS", + "PAST": "PASTAFARIEN", + "PE": "PEDESTRIAN", + "PENN": "PENNSYLVANIA", + "PEPA": "PEACE PARTY", + "PER": "PERSONAL", + "PF": "PEACE AND FREEDOM", + "PFP": "#66 PA FOR PEROT", + "PG": "PACIFIC GREEN", + "PH": "PROHIBITION", + "PHA": "PHILOSOPHICAL ANARCHIST", + "PI": "PENNSYLVANIA INDEPENDENT PARTY", + "PIR": "PIRATE", + "PIZ": "PIZZA PARTY", + "PJ": "THE PARTY OF JAY", + "PL": "PRO-LIFE", + "PLL": "Pleasant Living", + "PNP": "Pennsylvania Nationalist Party ", + "PNT": "PANTS PARTY", + "PNTS": "PREFER NOT TO SAY", + "PO": "POPULIST", + "POL": "POLITICAL", + "POLA": "POLITICAL ATHEIST", + "POO": "PARTY OF ONE", + "PP": "PATRIOT", + "PPD": "PPD", + "PPOA": "Progressive Party of America", + "PPP": "PANSEXUAL PEACE PARTY", + "PPUS": "PIRATE PARTY OF THE UNITED STATES", + "PR": "PROGRESSIVE", + "PRE": "PRESIDENT", + "PRI": "PRIVIT", + "PRK": "PHREAK THE 4TH", + "PRM": "PRAGMATIST", + "PRO": "PRO-FOR THE CULTURE", + "PRT": "PEROT", + "PS": "PACIFIST SOCIALIST", + "PSL": "PSL", + "PSS": "PIRATE STARSHIP", + "PUPA": "PURGE PARTY", + "PT": "PROUT", + "PU": "PURITAN", + "PUE": "Puerto Rico", + "PUR": "PURPLE PARTY", + "PVT": "Private", + "PZ": "PRINCIPALITY OF ZION", + "R": "REPUBLICAN", + "RA": "RAINBOW", + "RAM": "Rambler", + "RC": "RATIONAL CITIZEN", + "RD": "REFORMED", + "RDNA": "REPUBLICAN DEMOCRATIC NO AFFILIATION", + "RE": "REAL", + "REP": "REPRESENTATIVE", + "RES": "RESTRICTED", + "RF": "REFORM", + "RGN": "REAGANITE", + "RL": "RIGHT TO LIFE", + "RO": "ROYALIST", + "RON": "RON PAUL", + "ROY": "ROYAL", + "RP": "REPRESENTITIVENESS", + "RPDM": "REPUBLICAN DEMOCRATIC", + "RTV": "RIGHT TO VOTE", + "RVA": "REVOLUTIONARY ANARCHIST", + "RW": "RIGHT WING", + "S": "SOCIALIST", + "SA": "SOCIAL ANARCHIST", + "SAME": "SAME", + "SCIW": "SHARE COMMON INTERESTS WITHIN", + "SD": "SOCIALIST DEMOCRAT", + "SE": "Self", + "SST": "SECESSIONIST", + "SEC": "SECREST PARTY", + "SECR": "SECRETO", + "SEQ": "Socialist Equality", + "SFC": "SIR FRED THE CAT", + "SH": "SKYHOOK", + "SI": "SLOTH AND INDOLENCE", + "SIN": "SINGLE", + "SIS": "SISTER PARTY", + "SL": "SOCIALIST LABOR", + "SM": "SMUCK", + "SOA": "SOCIALIST ALTERNATIVE", + "SOD": "SOCIAL DEMOCRAT", + "SP": "SOCIALIST PROGRESSIVE", + "SPA": "spaghetti", + "SPI": "SPIRITUALISM", + "SPL": "SPLIT PARTY", + "SPP": "SILLY PARTY", + "SPS": "SPUSA", + "SPU": "SOCIALIST PARTY USA", + "SQ": "S.Q.U.I.D.", + "SR": "SQUIRREL REFORM", + "SSU": "SOVIET SOCIALIST UNION", + "SUP": "THE SURPRISE PARTY", + "SV": "SPLIT VOTE", + "SW": "SOCIALIST WORKERS", + "SWP": "SWP", + "T": "TAXPAYERS", + "TB": "TRUTH BASED", + "TFP": "THE FUN PARTY", + "TH ": "THE HUMANITY PARTY", + "TGPU": "THE GREEN PARTY OF THE UNITED", + "THP": "TRANSHUMANIST PARTY", + "THPY": "Third Party", + "THR": "THREE PERCENTER PARTY", + "TNP": "The New President", + "TO": "TOGA", + "TP": "Tea Party", + "TPC": "Tea Party Conservative", + "TPP": "Tea Party Patriot", + "TRP": "TRUMP", + "TVP": "TVP", + "TWSP": "TAX WALL STREET PARTY", + "TWVP": "TWELVE VISIONS PARTY", + "U": "UNITARIAN", + "UAT": "UNITED AMERICAN TAXPAYERS", + "UC": "UNITED CONSTITUTION", + "UDC": "UNDECLARED", + "UDCL": "UNDISCLOSED", + "UK": "UNITED KNOWLEDGE", + "UL": "US LABOR", + "UA": "UNITED AMERICA", + "UNA": "UNAFFILIATED", + "UNC": "UNCERTAIN", + "UND": "UNDECIDED", + "UNDT": "UNDETERMINED", + "UNER": "UNENROLLED", + "UNK": "UNKNOWN", + "UNPP": "United Progressive Party", + "UNS": "UNSURE", + "UP": "UNITED PEOPLE'S", + "UPA": "United Party of America", + "UPP": "U.S. Pirate Party", + "US": "U.S. SOCIALIST", + "USA": "USA", + "USC": "US CONSTITUTION", + "USM": "USA MINUTEMEN", + "USMJ": "USMJ PARTY", + "USP": "UNITED STATES PIRATE", + "UT": "US TAXPAYERS", + "UTP": "Utopian", + "UU": "U", + "UW": "UWSA", + "UWS": "UNITED WE STAND", + "V": "VOTE", + "VFI": "VOTE FOR WHO I LIKE @ THE TIME", + "VIG": "VIGILANTE", + "VP": "VETERAN'S PARTY OF AMERICA", + "WFP": "WORKING FAMILIES PARTY", + "WH": "WHIG", + "WHO": "whoever", + "WR": "WIG-REPUBLICAN", + "WI": "WILD", + "WIC": "WHOMEVER I CHOOSE", + "WIG": "WIG", + "WIL": "WHATEVER I LIKE", + "WIO": "WHEN ITS OBAMA", + "WIS": "WILL SEE", + "WITB": "WHO I THINK IS BEST", + "WIW": "WHOEVER I WANT", + "WJW": "WHAT JESUS WANTS", + "WL": "WHITE LOTUS", + "WN": "White Nationalist", + "WOR": "WORKERS WORLD", + "WP": "WORKERS PARTY", + "WPP": "WORKING PEOPLE'S", + "WWP": "WORLD WORKERS PARTY", + "WS": "Wynd Sok", + "WTBC": "WHOEVER WILL BE THE BEST CANID", + "WTH": "WILLING TO HELP", + "X": "X", + "YI": "YOUTH INTERNATIONAL", + "YO": "YOUNG OUTSIDER", + "YVIS": "YOUR VOTE IS SECRET" +}] \ No newline at end of file diff --git a/site/data/political_party_lookup.json b/site/data/political_party_lookup.json index bf65a0b..9c245f0 100644 --- a/site/data/political_party_lookup.json +++ b/site/data/political_party_lookup.json @@ -1,4 +1,4 @@ -{ +export default[{ "3RD": "3rd", "A": "ALL", "ABO": "ABOLITIONIST", @@ -532,4 +532,4 @@ "YI": "YOUTH INTERNATIONAL", "YO": "YOUNG OUTSIDER", "YVIS": "YOUR VOTE IS SECRET" -} \ No newline at end of file +}] \ No newline at end of file diff --git a/site/js/list-loader.js b/site/js/list-loader.js index 8fb4583..5be9c45 100644 --- a/site/js/list-loader.js +++ b/site/js/list-loader.js @@ -90,7 +90,6 @@ function loadVoterData(text) { // Create new property: combine house number with street name data = makeShortAddress(data); - console.log(data); // Load additional voter data from firebase, and update data // And then display the data on the map and in the list updateAdditionalInfo(inputNumber, data, showVotersInList, showVotersOnMap); @@ -113,7 +112,7 @@ function loadVoterData(text) { function loadByListNumber(number) { // Update input number, if loading from cloud and it is undefined inputNumber = number; - let path = './data/voters_lists/' + number + '.csv'; + let path = 'https://leejere.github.io/js-voter-canvassing/site/data/voters_lists/' + number + '.csv'; // Set the input box placeholder listNumberInputEl.placeholder = `${number}`; diff --git a/site/js/map.js b/site/js/map.js index 7823943..c47a13e 100644 --- a/site/js/map.js +++ b/site/js/map.js @@ -17,15 +17,15 @@ import { onSelectAction } from "./selected-voter.js"; INITIALIZE BASE MAP TO SHOW */ -const mapboxAccount = 'mapbox'; -const mapboxStyle = 'light-v10'; -const mapboxToken = `pk.eyJ1IjoibGktamllLWZqIiwiYSI6ImNsYWU2dWtqbzByZHYzb3F5dndrZm9vbXoifQ.RhKDjT-7I5oWlzeDbfrI9g`; +// const mapboxAccount = 'mapbox'; +// const mapboxStyle = 'light-v10'; +// const mapboxToken = `pk.eyJ1IjoibGktamllLWZqIiwiYSI6ImNsYWU2dWtqbzByZHYzb3F5dndrZm9vbXoifQ.RhKDjT-7I5oWlzeDbfrI9g`; let baseMapEl = document.querySelector("#map-component"); export let baseMap = L.map(baseMapEl, { zoomControl: false }).setView([40, -75.15], 11); -L.tileLayer(`https://api.mapbox.com/styles/v1/${mapboxAccount}/${mapboxStyle}/tiles/256/{z}/{x}/{y}@2x?access_token=${mapboxToken}`, { +L.tileLayer(`https://tiles.stadiamaps.com/tiles/alidade_smooth/{z}/{x}/{y}{r}.png?api_key=b59111c3-b70c-4361-b0be-47c9cd323fea`, { maxZoom: 20, - attribution: 'Ā© Mapbox Ā© OpenStreetMap Improve this map', + attribution: 'Ā© Stadia Maps Ā© OpenStreetMap Improve this map', }).addTo(baseMap); /* diff --git a/site/js/show-info.js b/site/js/show-info.js index ba4cd92..2c40f8a 100644 --- a/site/js/show-info.js +++ b/site/js/show-info.js @@ -8,11 +8,12 @@ import { htmlToElement } from './htmlelement.js'; import { showHideExpandButton, getVoterStatusIcon } from "./voter-list.js"; import { electionListExpandButtonEl } from "./list-expand.js"; import { highlightOption, prepareOption, prepareInput } from "./update-info.js"; -import partyDict from '../data/political_party_lookup.json' assert {type: "json"}; +import partyLookup from '../data/political_party_lookup.js'; import { getPartyColor } from "./voter-list.js"; const electionDict = electionLookup[0]; -console.log(partyDict); +const partyDict = partyLookup[0]; +window.partyDict = partyDict; let basicInfoNameEl = document.querySelector(".info-panel-name"); let basicInfoAddressEl = document.querySelector(".info-panel-address"); @@ -91,7 +92,7 @@ function displayMailGeneral(thisVoter) { const mailCodeEl = document.querySelector("#info-panel-mail-set").getElementsByClassName("list-icon")[0]; const mailNameEl = document.querySelector("#info-panel-mail-set").getElementsByClassName("icon-subtitle")[0]; - console.log(mailNameEl); + // Construct some HTML elements const mailReceivedHTML = `mark_email_read`; From 50220606574b30bfa48c6f20e8111253222761ce Mon Sep 17 00:00:00 2001 From: Leejere Date: Tue, 15 Nov 2022 19:28:06 -0500 Subject: [PATCH 79/95] test map --- site/js/map.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/site/js/map.js b/site/js/map.js index c47a13e..13858f9 100644 --- a/site/js/map.js +++ b/site/js/map.js @@ -22,10 +22,13 @@ INITIALIZE BASE MAP TO SHOW // const mapboxToken = `pk.eyJ1IjoibGktamllLWZqIiwiYSI6ImNsYWU2dWtqbzByZHYzb3F5dndrZm9vbXoifQ.RhKDjT-7I5oWlzeDbfrI9g`; let baseMapEl = document.querySelector("#map-component"); +const mapboxAccount = 'mapbox'; +const mapboxStyle = 'light-v10'; +const mapboxToken = 'pk.eyJ1IjoibGktamllLWZqIiwiYSI6ImNsYWU2dWtqbzByZHYzb3F5dndrZm9vbXoifQ.RhKDjT-7I5oWlzeDbfrI9g'; export let baseMap = L.map(baseMapEl, { zoomControl: false }).setView([40, -75.15], 11); -L.tileLayer(`https://tiles.stadiamaps.com/tiles/alidade_smooth/{z}/{x}/{y}{r}.png?api_key=b59111c3-b70c-4361-b0be-47c9cd323fea`, { +L.tileLayer(`https://api.mapbox.com/styles/v1/${mapboxAccount}/${mapboxStyle}/tiles/256/{z}/{x}/{y}@2x?access_token=${mapboxToken}`, { maxZoom: 20, - attribution: 'Ā© Stadia Maps Ā© OpenStreetMap Improve this map', + attribution: 'Ā© Mapbox Ā© OpenStreetMap Improve this map', }).addTo(baseMap); /* From 6538197aa8a2ecc8916cf9c267f1e0bf5f82f052 Mon Sep 17 00:00:00 2001 From: Leejere Date: Tue, 15 Nov 2022 21:19:54 -0500 Subject: [PATCH 80/95] Fixed bottom viewport block problem; clear input box when clicking on option --- site/css/edit.css | 17 +++++++++++++---- site/css/main-box.css | 2 +- site/css/main.css | 2 +- site/index.html | 2 +- site/js/basic-info-panel.js | 0 site/js/hide-show.js | 18 +++++++++++++++--- site/js/show-info.js | 7 +------ site/js/update-info.js | 8 ++++++-- 8 files changed, 38 insertions(+), 18 deletions(-) delete mode 100644 site/js/basic-info-panel.js diff --git a/site/css/edit.css b/site/css/edit.css index d638653..9703299 100644 --- a/site/css/edit.css +++ b/site/css/edit.css @@ -33,7 +33,7 @@ The bottom component is originally not showing until you select a voter } .edit-container { - max-height: 59vh; + max-height: 50vh; overflow-y: auto; } @@ -231,7 +231,8 @@ The bottom component is originally not showing until you select a voter } #edit-component { - transform: translateX(-30em); + display: none; + transform: translateX(-40em); transition: transform 0.5s ease-in-out; } @@ -242,12 +243,12 @@ The bottom component is originally not showing until you select a voter /* Voting History */ .voter-history-panel { - min-height: 12.5vh; + min-height: 10vh; } .voting-history-title { width: 100%; - padding: 0rem 0.5rem 0; + padding: 0 0.5rem; margin-bottom: -0.3rem; } @@ -282,9 +283,15 @@ The bottom component is originally not showing until you select a voter } #edit-component .scroll-container { + max-height: 12vh; clear: left; } +#edit-component .scroll-container-expanded { + max-height: 25vh; + transition: max-height 0.5s; +} + .voting-history-item { float: left; font-size: 0.8rem; @@ -384,6 +391,8 @@ The bottom component is originally not showing until you select a voter margin-top: 1.2rem; font-size: 1.2rem; font-weight: 800; + transform: translateX(-40em); + transition: transform 0.5s ease-in-out; } .final-save-toast { diff --git a/site/css/main-box.css b/site/css/main-box.css index 59dd846..336c027 100644 --- a/site/css/main-box.css +++ b/site/css/main-box.css @@ -15,7 +15,7 @@ } .bottom-component { - top: 72vh; + top: 65vh; width: calc(100vw - 2.5rem); position: fixed; transition: top 0.5s ease-in-out; diff --git a/site/css/main.css b/site/css/main.css index 9d13c4d..ad95225 100644 --- a/site/css/main.css +++ b/site/css/main.css @@ -18,7 +18,7 @@ html { } body { - height: 100vh; + min-height: 100vh; width: 100vw; padding: 0; margin: 0; diff --git a/site/index.html b/site/index.html index f560e69..3592970 100644 --- a/site/index.html +++ b/site/index.html @@ -221,7 +221,7 @@

    Filter by Visit Status

    Party
    Method
    -
    +
    diff --git a/site/js/basic-info-panel.js b/site/js/basic-info-panel.js deleted file mode 100644 index e69de29..0000000 diff --git a/site/js/hide-show.js b/site/js/hide-show.js index e6628ab..80a56c4 100644 --- a/site/js/hide-show.js +++ b/site/js/hide-show.js @@ -12,6 +12,7 @@ MISCELLANEOUS // Top component show-hide import { voterListExpandButtonEl, voterListContainerEl, onExpandButtonClick } from "./list-expand.js"; +import { finalSaveButtonEl } from "./update-info.js"; // State variable: whether the chunk is hidden at the moment export let loaderElIsHidden = 0; @@ -91,8 +92,13 @@ function switchToEdit() { // Move the whole thing up bottomComponentEl.style.top = "7vh"; - // Make the other panels show - editComponentEl.style.transform = "translateX(0em)"; + // Make the other panels show: first show then slide to center + editComponentEl.style.display = "block"; + finalSaveButtonEl.style.display = "flex"; + setTimeout(( ) => { + editComponentEl.style.transform = "translateX(0em)"; + finalSaveButtonEl.style.transform = "translateX(0em)"; + }, 200); // Change the icon setTimeout(() => { @@ -109,9 +115,15 @@ function switchToNormal() { // Hide the other panels editComponentEl.style.transform = "translateX(-42em)"; + finalSaveButtonEl.style.transform = "translateX(-42em)"; + setTimeout(( ) => { + editComponentEl.style.display = "none"; + finalSaveButtonEl.style.display = "none"; + }, 200); + // Move the whole thing down - bottomComponentEl.style.top = "72vh"; + bottomComponentEl.style.top = "65vh"; // Change the icon setTimeout(() => { diff --git a/site/js/show-info.js b/site/js/show-info.js index 2c40f8a..151301a 100644 --- a/site/js/show-info.js +++ b/site/js/show-info.js @@ -5,8 +5,6 @@ SHOW INFO WHEN A VOTER IS SELECTED import { data } from "./list-loader.js"; import electionLookup from "../data/election_lookup.js"; import { htmlToElement } from './htmlelement.js'; -import { showHideExpandButton, getVoterStatusIcon } from "./voter-list.js"; -import { electionListExpandButtonEl } from "./list-expand.js"; import { highlightOption, prepareOption, prepareInput } from "./update-info.js"; import partyLookup from '../data/political_party_lookup.js'; import { getPartyColor } from "./voter-list.js"; @@ -17,9 +15,6 @@ window.partyDict = partyDict; let basicInfoNameEl = document.querySelector(".info-panel-name"); let basicInfoAddressEl = document.querySelector(".info-panel-address"); -let basicInfoPartyEl = document.querySelector(".info-panel-party"); -let basicInfoCanvassStatusEl = document.querySelector(".info-panel-canvass-status"); -let basicInfoVoterStatusEl = document.querySelector(".info-panel-voter-status"); let electionListEl = document.querySelector("#voting-history"); @@ -212,7 +207,7 @@ function displayVotingHistory(thisVoter) { } // Only show button when necessary - showHideExpandButton("#voting-history", "#edit-component", electionListExpandButtonEl); + // showHideExpandButton("#voting-history", "#voting-history-container", electionListExpandButtonEl); } /* PER CANVASSING RECORD */ diff --git a/site/js/update-info.js b/site/js/update-info.js index 8f45230..b428a2c 100644 --- a/site/js/update-info.js +++ b/site/js/update-info.js @@ -5,7 +5,6 @@ import { showVotersOnMap } from "./map.js"; import { highlightVoter } from "./selected-voter.js"; import { allFilters } from "./list-filters.js"; import { inputNumber } from "./list-loader.js"; -import { showVotersInList } from "./voter-list.js"; import { displayPlanGeneral, displayMailGeneral, findThisVoter } from "./show-info.js"; import { selectedVoter } from "./selected-voter.js"; @@ -56,6 +55,11 @@ function prepareOption(groupIdSelector) { // First, highlight that option highlightOption(groupIdSelector, `#${item.id}`); + // If this parent has an input, clear that input box + if(document.querySelector(groupIdSelector).querySelector("input")) { + document.querySelector(groupIdSelector).querySelector("input").value = ""; + } + // Find substring item.id to get the real term let lastDashLocation = item.id.lastIndexOf("-"); @@ -161,7 +165,7 @@ canvassStatusSaveButtonEl.addEventListener("click", ( ) => { }); // Save all on click -const finalSaveButtonEl = document.querySelector("#final-save"); +export const finalSaveButtonEl = document.querySelector("#final-save"); finalSaveButtonEl.addEventListener("click", ( ) => { let currentVoterId; From e753b55a53a9caa223a7199560457f9aea192463 Mon Sep 17 00:00:00 2001 From: Leejere Date: Tue, 15 Nov 2022 23:07:31 -0500 Subject: [PATCH 81/95] finished filters --- site/js/hide-show.js | 8 +++ site/js/list-filters.js | 143 +++++++++++---------------------------- site/js/other-filters.js | 49 ++++++++++++++ site/js/search-box.js | 1 + site/js/update-info.js | 3 +- 5 files changed, 100 insertions(+), 104 deletions(-) create mode 100644 site/js/other-filters.js diff --git a/site/js/hide-show.js b/site/js/hide-show.js index 80a56c4..0a63fca 100644 --- a/site/js/hide-show.js +++ b/site/js/hide-show.js @@ -13,6 +13,9 @@ MISCELLANEOUS import { voterListExpandButtonEl, voterListContainerEl, onExpandButtonClick } from "./list-expand.js"; import { finalSaveButtonEl } from "./update-info.js"; +import { filterAllAndUpdate } from "./list-filters.js"; +import { selectedVoter } from "./selected-voter.js"; +import { highlightVoter } from "./selected-voter.js"; // State variable: whether the chunk is hidden at the moment export let loaderElIsHidden = 0; @@ -125,6 +128,11 @@ function switchToNormal() { // Move the whole thing down bottomComponentEl.style.top = "65vh"; + // Update list display + filterAllAndUpdate(); + highlightVoter(selectedVoter); + + // Change the icon setTimeout(() => { editButtonEl.querySelector("span").innerHTML = "edit"; diff --git a/site/js/list-filters.js b/site/js/list-filters.js index 43931d4..8fa1f8a 100644 --- a/site/js/list-filters.js +++ b/site/js/list-filters.js @@ -15,132 +15,69 @@ import { data } from "./list-loader.js"; import { filterByNameAddress } from "./search-box.js"; import { showVotersInList } from "./voter-list.js"; import { showVotersOnMap } from "./map.js"; +import { filterByOption, uncheckAllOptions, filterByVisitStatus } from "./other-filters.js"; //import { makeVoterFeatureCollection } from "./map.js"; // Initialize export let filteredData = undefined; +// All the filter elements +import { voterInputBoxEl } from "./search-box.js"; +let partyFiltersEl = document.querySelectorAll('.party-checkbox'); +let statusFiltersEl = document.querySelectorAll('.status-checkbox'); +let visitFiltersEl = document.querySelectorAll('.visit-checkbox'); + /* A function that includes all the filters */ -function allFilters(data) { - let filtered = data; - filtered = filterByNameAddress(data); - // More filters to come... +function allFilters() { + filteredData = data; + filteredData = filterByNameAddress(filteredData); + filteredData = filterByOption(filteredData, partyFiltersEl, "Party Code"); + filteredData = filterByOption(filteredData, statusFiltersEl, "Voter Status"); + filteredData = filterByVisitStatus(filteredData, visitFiltersEl); - return filtered; + return(filteredData); } -/* -Search box filter -*/ - -import { voterInputBoxEl } from "./search-box.js"; -voterInputBoxEl.addEventListener("input", ( ) => { - filteredData = allFilters(data); - window.filteredData = filteredData; +function filterAllAndUpdate() { + filteredData = allFilters(); + // Update display showVotersInList(filteredData); showVotersOnMap(filteredData); -}); - -/* -Function for voter party -*/ - let partyFilter = document.querySelectorAll('.party-checkbox'); - - function shouldShowParty () { - let filteredParty = data; - for (const checkbox of partyFilter) { - if (checkbox.checked) { - filteredParty = filteredParty.filter(function (voter) { - const partyType = checkbox.value; - if (voter['Party Code'] === partyType) { - return true; - } else { - return false; - } - - }); - } - } - - return filteredParty; } -for (const cb of partyFilter) { - cb.addEventListener('change', () => { - const filteredParty = shouldShowParty(); - showVotersOnMap(filteredParty); - showVotersInList(filteredParty); - }); -} +// Search box filter +voterInputBoxEl.addEventListener("input", filterAllAndUpdate); -/* -Function for voter status -*/ -let statusFilter = document.querySelectorAll('.status-checkbox'); - -function shouldShowStatus () { - let filteredStatus = data; - for (const checkbox of statusFilter) { - if (checkbox.checked) { - filteredStatus = filteredStatus.filter(function (voter) { - const statusType = checkbox.value; - if (voter['Voter Status'] === statusType) { - return true; - } else { - return false; - } - - }); - } - } - - return filteredStatus; -} +// The other filters -for (const cb of statusFilter) { - cb.addEventListener('change', () => { - const filteredStatus = shouldShowStatus(); - showVotersOnMap(filteredStatus); - showVotersInList(filteredStatus); - }); -} +function prepareFilterSet(filtersEl) { + for (const cb of filtersEl) { + cb.addEventListener('change', ( ) => { + if(cb.checked) { // Meaning user intends to check this one -/* -Function for visit status -*/ -let visitFilter = document.querySelectorAll('.visit-checkbox'); - -function shouldShowVisit () { - let filteredVisit = data; - for (const checkbox of visitFilter) { - if (checkbox.checked) { - filteredVisit = filteredVisit.filter(function (voter) { - const visitType = checkbox.value; - if (voter['canvass-status'] === visitType) { - return true; - } else { - return false; - } - - }); - } - } - - return filteredVisit; -} + // First uncheck everything in the party group + uncheckAllOptions(filtersEl); + // Recheck self if it should be that way + cb.checked = true; -for (const cb of visitFilter) { - cb.addEventListener('change', () => { - const filteredVisit = shouldShowVisit(); - showVotersOnMap(filteredVisit); - showVotersInList(filteredVisit); - }); + } else { // Meaning user intends to uncheck this one + cb.checked = false; + } + // Go through all filters + filterAllAndUpdate(); + }); + } } +prepareFilterSet(partyFiltersEl); +prepareFilterSet(statusFiltersEl); +prepareFilterSet(visitFiltersEl); + export { + filterAllAndUpdate, allFilters, }; \ No newline at end of file diff --git a/site/js/other-filters.js b/site/js/other-filters.js new file mode 100644 index 0000000..e0d1ba9 --- /dev/null +++ b/site/js/other-filters.js @@ -0,0 +1,49 @@ +/* +MODULE 2: LIST FILTERS (COMPONENT) +================================================== +This script contains the functions to filter voters by the other filters +Refer to [list-filters.js] to see how all the filters work together +*/ + +// Function to filter data by party +function filterByOption(data, filtersEl, voterProperty) { + let filtered = data; + for (const checkbox of filtersEl) { + if (checkbox.checked) { + filtered = filtered.filter((voter) => + voter[voterProperty] === checkbox.value); + } + } + return filtered; +} + +function filterByVisitStatus(data, filtersEl) { + let filtered = data; + for (const checkbox of filtersEl) { + if (checkbox.checked) { + filtered = filtered.filter((voter) => { + let thisStatus; + if(voter["canvass-status"]) { + thisStatus = voter["canvass-status"]; + } else { + thisStatus = "pending"; + } + return thisStatus === checkbox.value; + }); + } + } + return filtered; +} + +// Function to uncheck all checkboxes in a group +function uncheckAllOptions(optionsEl) { + for(const cb of optionsEl) { + cb.checked = false; + } +} + +export { + filterByOption, + uncheckAllOptions, + filterByVisitStatus, +}; \ No newline at end of file diff --git a/site/js/search-box.js b/site/js/search-box.js index 338a387..bfd5f0f 100644 --- a/site/js/search-box.js +++ b/site/js/search-box.js @@ -4,6 +4,7 @@ MODULE 2: LIST FILTERS (COMPONENT) This script contains the functions to filter voters by search box input Refer to [list-filters.js] to see how all the filters work together */ + export let voterInputBoxEl = document.querySelector('#search-box-input'); // Step in filter by search box; match if an individual voter fulfills the filter diff --git a/site/js/update-info.js b/site/js/update-info.js index b428a2c..d4fd0bd 100644 --- a/site/js/update-info.js +++ b/site/js/update-info.js @@ -93,7 +93,7 @@ function prepareInput(groupIdSelector) { // After saving data, update Filtered data // At the same time, update display on the map and in the list function updateDataOnStatusSave(data, currentVoterId, status) { - let filteredData = allFilters(data); + let filteredData = allFilters(); // showVotersInList(filteredData); showVotersOnMap(filteredData); @@ -199,6 +199,7 @@ finalSaveButtonEl.addEventListener("click", ( ) => { // Update some general display let thisVoter = findThisVoter(currentVoterId); + // Update display on the top displayPlanGeneral(thisVoter); displayMailGeneral(thisVoter); From bc5b9556ded9eb4b2ec7b95721688543a3f1016b Mon Sep 17 00:00:00 2001 From: Leejere Date: Tue, 15 Nov 2022 23:32:20 -0500 Subject: [PATCH 82/95] filter transition --- site/css/list-filters.css | 8 +++++--- site/js/filter-window.js | 14 ++++++++++++-- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/site/css/list-filters.css b/site/css/list-filters.css index df7cd39..32f56a2 100644 --- a/site/css/list-filters.css +++ b/site/css/list-filters.css @@ -40,7 +40,8 @@ Filter window z-index: 99999; animation: pulse-black 1s infinite; display: none; - transition: display 1s; + opacity: 0; + transition: opacity 0.5s ease-in-out; } /* ------- Filter window ---------- */ @@ -57,9 +58,10 @@ Filter window border-radius: 1rem; z-index: 2000; z-index: 9999999; - filter: drop-shadow(10px 10px 12px #333333); + filter: drop-shadow(10px 10px 12px #333); display: none; - transition: display 2s; + opacity: 0; + transition: opacity 0.5s ease-in-out; overflow-y: scroll; } diff --git a/site/js/filter-window.js b/site/js/filter-window.js index e447d6b..15300e0 100644 --- a/site/js/filter-window.js +++ b/site/js/filter-window.js @@ -13,10 +13,20 @@ const filterButtonEl = document.querySelector("#filter-popup-button"); filterButtonEl.addEventListener("click", ( ) => { filterOverlayEl.style.display = "block"; filterWindowEl.style.display = "flex"; + setTimeout( ( ) => { + filterOverlayEl.style.opacity = 0.8; + filterWindowEl.style.opacity = 1; + }, 50); + }); // Window disappears when clicking outside of window filterOverlayEl.addEventListener("click", ( ) => { - filterOverlayEl.style.display = "none"; - filterWindowEl.style.display = "none"; + filterOverlayEl.style.opacity = 0; + filterWindowEl.style.opacity = 0; + setTimeout( () => { + filterOverlayEl.style.display = "none"; + filterWindowEl.style.display = "none"; + }, 500); + }); \ No newline at end of file From 76c8f8cef664648f29024520d6f81182e3ffcaef Mon Sep 17 00:00:00 2001 From: Leejere Date: Tue, 15 Nov 2022 23:53:13 -0500 Subject: [PATCH 83/95] change filter button color when filter applied --- site/js/filter-window.js | 17 ++++++++++++++++- site/js/list-filters.js | 8 ++++++++ site/js/other-filters.js | 8 ++++++-- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/site/js/filter-window.js b/site/js/filter-window.js index 15300e0..119892b 100644 --- a/site/js/filter-window.js +++ b/site/js/filter-window.js @@ -29,4 +29,19 @@ filterOverlayEl.addEventListener("click", ( ) => { filterWindowEl.style.display = "none"; }, 500); -}); \ No newline at end of file +}); + +// Function to change filter button color when any filter is applied +function changeFilterButtonColor(status) { + if(status === 1) { + filterButtonEl.style.backgroundColor = "#fad03c"; + filterButtonEl.style.borderColor = "#fad03c"; + } else { + filterButtonEl.style.backgroundColor = "#0d59a9"; + filterButtonEl.style.borderColor = "#0d59a9"; + } +} + +export { + changeFilterButtonColor, +}; \ No newline at end of file diff --git a/site/js/list-filters.js b/site/js/list-filters.js index 8fa1f8a..3cf1a06 100644 --- a/site/js/list-filters.js +++ b/site/js/list-filters.js @@ -16,12 +16,18 @@ import { filterByNameAddress } from "./search-box.js"; import { showVotersInList } from "./voter-list.js"; import { showVotersOnMap } from "./map.js"; import { filterByOption, uncheckAllOptions, filterByVisitStatus } from "./other-filters.js"; +import { changeFilterButtonColor } from "./filter-window.js"; //import { makeVoterFeatureCollection } from "./map.js"; // Initialize export let filteredData = undefined; +// Store a global status: whether any filter is applied +export let filterApplied = { + status: 0, +}; + // All the filter elements import { voterInputBoxEl } from "./search-box.js"; let partyFiltersEl = document.querySelectorAll('.party-checkbox'); @@ -33,12 +39,14 @@ A function that includes all the filters */ function allFilters() { + filterApplied.status = 0; filteredData = data; filteredData = filterByNameAddress(filteredData); filteredData = filterByOption(filteredData, partyFiltersEl, "Party Code"); filteredData = filterByOption(filteredData, statusFiltersEl, "Voter Status"); filteredData = filterByVisitStatus(filteredData, visitFiltersEl); + changeFilterButtonColor(filterApplied.status); return(filteredData); } diff --git a/site/js/other-filters.js b/site/js/other-filters.js index e0d1ba9..37bc729 100644 --- a/site/js/other-filters.js +++ b/site/js/other-filters.js @@ -5,13 +5,17 @@ This script contains the functions to filter voters by the other filters Refer to [list-filters.js] to see how all the filters work together */ +import { filterApplied } from "./list-filters.js"; + // Function to filter data by party function filterByOption(data, filtersEl, voterProperty) { let filtered = data; for (const checkbox of filtersEl) { if (checkbox.checked) { - filtered = filtered.filter((voter) => - voter[voterProperty] === checkbox.value); + filtered = filtered.filter((voter) => voter[voterProperty] === checkbox.value); + + // If anything is checked... + filterApplied.status = 1; } } return filtered; From c3e1ba2a9803c123e7779c2a4a0ca8fa4942a3dc Mon Sep 17 00:00:00 2001 From: Leejere Date: Wed, 16 Nov 2022 00:07:02 -0500 Subject: [PATCH 84/95] minor changes --- site/css/edit.css | 57 +++++++++++++++++++-------------------- site/css/search-box.css | 1 + site/css/voter-list.css | 4 +-- site/js/list-expand.js | 9 ++----- site/js/selected-voter.js | 2 +- 5 files changed, 33 insertions(+), 40 deletions(-) diff --git a/site/css/edit.css b/site/css/edit.css index 9703299..560ad76 100644 --- a/site/css/edit.css +++ b/site/css/edit.css @@ -20,7 +20,7 @@ The bottom component is originally not showing until you select a voter } #bottom-component { - transform: translateX(-30em); + transform: translateX(-40em); transition: all 0.5s ease-in-out; } @@ -104,35 +104,6 @@ The bottom component is originally not showing until you select a voter color: #fff; } -/* Other overview icons */ - -.overview-display { - padding: 0.4rem; - clear: left; - margin-top: 0.5rem; - display: flex; -} - -#overview-display .icon-set { - margin-right: 0.8rem; -} - -#overview-display .icon-set .icon-subtitle { - color: var(--main-color); -} - -#overview-display .icon-set .list-icon { - border-color: var(--main-color); -} - -#overview-display .icon-set .material-symbols-outlined { - font-size: 1.2rem; -} - -#overview-display .icon-set { - max-width: 5rem; -} - /* Dealing with highlighted items */ .highlighted .material-symbols-outlined { @@ -190,6 +161,32 @@ The bottom component is originally not showing until you select a voter font-weight: 800; } +/* Other overview icons */ + +.overview-display { + padding: 0.4rem; + clear: left; + margin-top: 0.5rem; + display: flex; +} + +#overview-display .icon-set { + margin-right: 0.8rem; + max-width: 5rem; +} + +#overview-display .icon-set .icon-subtitle { + color: var(--main-color); +} + +#overview-display .icon-set .list-icon { + border-color: var(--main-color); +} + +#overview-display .icon-set .material-symbols-outlined { + font-size: 1.2rem; +} + /* When screen too small, don't display subtitles */ @media only screen and (max-width: 340px) { diff --git a/site/css/search-box.css b/site/css/search-box.css index 7dc71bd..323e589 100644 --- a/site/css/search-box.css +++ b/site/css/search-box.css @@ -3,6 +3,7 @@ height: 3.5em; z-index: 999; transition: transform 0.5s; + margin-bottom: 0.6rem; } #search-box-component .input-container { diff --git a/site/css/voter-list.css b/site/css/voter-list.css index 27508f0..6abd41a 100644 --- a/site/css/voter-list.css +++ b/site/css/voter-list.css @@ -21,14 +21,14 @@ Change scroll container height based when clicked /* ---- Normally, expand to 42vh ------ */ .scroll-container-expanded { - max-height: 42vh; + max-height: 39vh; transition: max-height 0.5s; } /* ---- With wide screen, when basic info panel is on the other side, use 75vh ------ */ .scroll-container-expanded-long { - max-height: 75vh; + max-height: 39vh; transition: max-height 1s; } diff --git a/site/js/list-expand.js b/site/js/list-expand.js index abfe45c..d0940fb 100644 --- a/site/js/list-expand.js +++ b/site/js/list-expand.js @@ -12,13 +12,8 @@ voterListExpandButtonEl.expandStatus = 0; electionListExpandButtonEl.expandStatus = 0; function expandList(thisButtonEl, thisContainerEl) { - const mediaQuery = window.matchMedia("(min-width: 1200px)"); - // If a wide screen, expand to longer - if(mediaQuery.matches) { - thisContainerEl.classList.add("scroll-container-expanded-long"); // Expand to 75vh max - } else { - thisContainerEl.classList.add("scroll-container-expanded"); // Expand to 42vh max - } + + thisContainerEl.classList.add("scroll-container-expanded"); // Expand to 42vh max // Update button icon thisButtonEl.innerHTML = `expand_less`; diff --git a/site/js/selected-voter.js b/site/js/selected-voter.js index d383614..facf448 100644 --- a/site/js/selected-voter.js +++ b/site/js/selected-voter.js @@ -118,7 +118,7 @@ function onSelectAction(thisId) { unhighlightVoter(); selectedVoter = undefined; // Show info edit panel - bottomComponentEl.style.transform = "translateX(-30em)"; + bottomComponentEl.style.transform = "translateX(-40em)"; } else { // If the list is currently expanded, unexpand it From 5a5c59696792678375f06e1fa4618b4ca7adf18e Mon Sep 17 00:00:00 2001 From: Leejere Date: Wed, 16 Nov 2022 20:17:55 -0500 Subject: [PATCH 85/95] tested layout --- site/css/edit.css | 15 ++++-------- site/css/framework.css | 53 ++++++++++++++++++++++++++++++++++++++++ site/css/main-box.css | 19 +------------- site/css/main.css | 12 --------- site/css/scroll-list.css | 2 +- site/css/search-box.css | 2 +- site/css/voter-list.css | 4 +-- site/index.html | 44 +++++++++++++++------------------ 8 files changed, 83 insertions(+), 68 deletions(-) create mode 100644 site/css/framework.css diff --git a/site/css/edit.css b/site/css/edit.css index 560ad76..a93c75e 100644 --- a/site/css/edit.css +++ b/site/css/edit.css @@ -19,11 +19,6 @@ The bottom component is originally not showing until you select a voter margin-bottom: 1.5rem; } -#bottom-component { - transform: translateX(-40em); - transition: all 0.5s ease-in-out; -} - #bottom-component .edit-button { background-color: var(--main-color); float: left; @@ -33,7 +28,7 @@ The bottom component is originally not showing until you select a voter } .edit-container { - max-height: 50vh; + max-height: 55vh; overflow-y: auto; } @@ -42,7 +37,7 @@ The bottom component is originally not showing until you select a voter background-color: white; padding: 0.5rem 0.5rem 0; display: block; - margin-bottom: 1rem; + margin-bottom: 0.5rem; } .basic-info-panel { @@ -250,7 +245,7 @@ The bottom component is originally not showing until you select a voter } #edit-component .list-expand-button { - margin-top: -1rem; + margin-top: -0.5rem; margin-bottom: 1rem; height: 1.4rem; width: 2rem; @@ -378,14 +373,14 @@ The bottom component is originally not showing until you select a voter height: 2rem; background-color: var(--main-color); color: #fff; - width: 100%; border: 1.5px solid var(--main-color); border-bottom-width: 3px; border-radius: 0 0 0.6rem 0.6rem; display: flex; align-items: center; justify-content: center; - margin-top: 1.2rem; + margin-top: -1rem; + margin-bottom: 0.5rem; font-size: 1.2rem; font-weight: 800; transform: translateX(-40em); diff --git a/site/css/framework.css b/site/css/framework.css new file mode 100644 index 0000000..30b36ae --- /dev/null +++ b/site/css/framework.css @@ -0,0 +1,53 @@ +html { + font-family: Roboto, sans-serif; +} + +body { + min-height: 100vh; + width: 100vw; + padding: 0; + margin: 0; + position: relative; +} + +#banner-component { + position: fixed; + background-color: #fff; + height: 5vh; + width: 100vw; + border-bottom: 3px solid #0d59a9; + z-index: 99; +} + +#banner-component p { + color: #0d59a9; + font-size: 1.3em; + margin: 0; + line-height: 5vh; + font-weight: 800; + text-align: center; + vertical-align: middle; +} + +/* ---------- List loader and filter button ------------- */ + +#nav-component { + height: 5vh; + position: fixed; + top: 7vh; +} + +#top-component { + position: fixed; + top: 13vh; + height: 25vh; + z-index: 99999; +} + +#bottom-component { + top: 60vh; + position: fixed; + transform: translateX(-40em); + transition: all 0.5s ease-in-out; + max-height: 70vh; +} \ No newline at end of file diff --git a/site/css/main-box.css b/site/css/main-box.css index 336c027..04ac9ff 100644 --- a/site/css/main-box.css +++ b/site/css/main-box.css @@ -1,24 +1,8 @@ .main-box { - position: relative; - top: 8vh; z-index: 9999; padding: 0 1rem; margin-right: 0.5rem; -} - -#nav-component { - height: 5vh; -} - -#top-component { - height: 25vh; -} - -.bottom-component { - top: 65vh; - width: calc(100vw - 2.5rem); - position: fixed; - transition: top 0.5s ease-in-out; + width: calc(100vw - 2rem); } @media only screen and (min-width: 600px) { @@ -36,6 +20,5 @@ @media only screen and (min-width: 1200px) { .main-box { width: 25vw; - margin: 0 3rem; } } diff --git a/site/css/main.css b/site/css/main.css index ad95225..26e0eb3 100644 --- a/site/css/main.css +++ b/site/css/main.css @@ -13,18 +13,6 @@ Overall colors Overall framework setting -------- */ -html { - font-family: Roboto, sans-serif; -} - -body { - min-height: 100vh; - width: 100vw; - padding: 0; - margin: 0; - position: relative; -} - .component-margin-left { margin-left: 1rem; } diff --git a/site/css/scroll-list.css b/site/css/scroll-list.css index 02a5e06..b507656 100644 --- a/site/css/scroll-list.css +++ b/site/css/scroll-list.css @@ -3,7 +3,7 @@ Default scroll container height -------- */ .scroll-container { - max-height: 18vh; + max-height: 16vh; overflow: auto; transition: max-height 0.75s; } diff --git a/site/css/search-box.css b/site/css/search-box.css index 323e589..30b0744 100644 --- a/site/css/search-box.css +++ b/site/css/search-box.css @@ -1,6 +1,6 @@ #search-box-component { position: relative; - height: 3.5em; + height: 2.5rem; z-index: 999; transition: transform 0.5s; margin-bottom: 0.6rem; diff --git a/site/css/voter-list.css b/site/css/voter-list.css index 6abd41a..956ba99 100644 --- a/site/css/voter-list.css +++ b/site/css/voter-list.css @@ -21,14 +21,14 @@ Change scroll container height based when clicked /* ---- Normally, expand to 42vh ------ */ .scroll-container-expanded { - max-height: 39vh; + max-height: 35vh; transition: max-height 0.5s; } /* ---- With wide screen, when basic info panel is on the other side, use 75vh ------ */ .scroll-container-expanded-long { - max-height: 39vh; + max-height: 35vh; transition: max-height 1s; } diff --git a/site/index.html b/site/index.html index 3592970..2f108a9 100644 --- a/site/index.html +++ b/site/index.html @@ -16,7 +16,7 @@ - + @@ -212,28 +212,8 @@

    Filter by Visit Status

    - -
    -
    VOTING HISTORY
    -
    -
    Date
    -
    Election
    -
    Party
    -
    Method
    -
    -
    -
      -
    -
    -
    - -
    - expand_more -
    -
    RECORDER
    -
    Language
    @@ -335,12 +315,28 @@

    Filter by Visit Status

    +
    Save
    + +
    +
    VOTING HISTORY
    +
    +
    Date
    +
    Election
    +
    Party
    +
    Method
    +
    +
    +
      +
    +
    +
    + +
    + expand_more +
    - -
    -
    Save
    From 0590e1d6d76fbd5aeb02014d354dee7877ceb8c6 Mon Sep 17 00:00:00 2001 From: Leejere Date: Wed, 16 Nov 2022 20:21:13 -0500 Subject: [PATCH 86/95] tested layout --- site/css/edit.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/site/css/edit.css b/site/css/edit.css index a93c75e..77d58b1 100644 --- a/site/css/edit.css +++ b/site/css/edit.css @@ -167,7 +167,7 @@ The bottom component is originally not showing until you select a voter #overview-display .icon-set { margin-right: 0.8rem; - max-width: 5rem; + width: 4.3rem; } #overview-display .icon-set .icon-subtitle { From 09fcf68272725f8e04f1fac294661bc76f29f5ad Mon Sep 17 00:00:00 2001 From: Leejere Date: Wed, 16 Nov 2022 20:40:55 -0500 Subject: [PATCH 87/95] fixed problem --- site/css/framework.css | 1 + site/css/list-loader.css | 2 +- site/index.html | 8 +------- site/js/hide-show.js | 6 +++++- site/js/show-info.js | 2 -- site/js/voter-list.js | 4 ++-- 6 files changed, 10 insertions(+), 13 deletions(-) diff --git a/site/css/framework.css b/site/css/framework.css index 30b36ae..e41e4d9 100644 --- a/site/css/framework.css +++ b/site/css/framework.css @@ -35,6 +35,7 @@ body { height: 5vh; position: fixed; top: 7vh; + margin-bottom: 0.5rem; } #top-component { diff --git a/site/css/list-loader.css b/site/css/list-loader.css index f5922ef..5cd82df 100644 --- a/site/css/list-loader.css +++ b/site/css/list-loader.css @@ -1,6 +1,6 @@ #list-loader-component { position: relative; - height: 3.2em; + height: 2.5rem; width: 11rem; float: left; z-index: 99999; diff --git a/site/index.html b/site/index.html index 2f108a9..9932f1b 100644 --- a/site/index.html +++ b/site/index.html @@ -112,7 +112,7 @@

    Filter by Visit Status

    -
    +
    @@ -260,7 +260,6 @@

    Filter by Visit Status

    -
    Mail ballot
    @@ -284,7 +283,6 @@

    Filter by Visit Status

    -
    Who for
    @@ -307,13 +305,9 @@

    Filter by Visit Status

    - -
    - -
    Save
    diff --git a/site/js/hide-show.js b/site/js/hide-show.js index 0a63fca..0b40413 100644 --- a/site/js/hide-show.js +++ b/site/js/hide-show.js @@ -16,6 +16,7 @@ import { finalSaveButtonEl } from "./update-info.js"; import { filterAllAndUpdate } from "./list-filters.js"; import { selectedVoter } from "./selected-voter.js"; import { highlightVoter } from "./selected-voter.js"; +import { showHideExpandButton } from "./voter-list.js"; // State variable: whether the chunk is hidden at the moment export let loaderElIsHidden = 0; @@ -98,11 +99,14 @@ function switchToEdit() { // Make the other panels show: first show then slide to center editComponentEl.style.display = "block"; finalSaveButtonEl.style.display = "flex"; + // Only show button when necessary on the voting history panel + const electionListExpandButtonEl = document.querySelector("#election-list-expand-button"); + showHideExpandButton("#voting-history", "#voting-history-container", electionListExpandButtonEl); + setTimeout(( ) => { editComponentEl.style.transform = "translateX(0em)"; finalSaveButtonEl.style.transform = "translateX(0em)"; }, 200); - // Change the icon setTimeout(() => { editButtonEl.querySelector("span").innerHTML = "chevron_left"; diff --git a/site/js/show-info.js b/site/js/show-info.js index 151301a..5a17287 100644 --- a/site/js/show-info.js +++ b/site/js/show-info.js @@ -206,8 +206,6 @@ function displayVotingHistory(thisVoter) { electionListEl.append(electionItemEl); } - // Only show button when necessary - // showHideExpandButton("#voting-history", "#voting-history-container", electionListExpandButtonEl); } /* PER CANVASSING RECORD */ diff --git a/site/js/voter-list.js b/site/js/voter-list.js index 4b17046..db5a23b 100644 --- a/site/js/voter-list.js +++ b/site/js/voter-list.js @@ -131,7 +131,7 @@ function addVotersByAddress(votersByThisAddress) { // Function to decide whether to show voter list's expand button function showHideExpandButton(innerSelector, outerSelector, buttonEl) { let voterListHeight = document.querySelector(innerSelector).offsetHeight; - let voterContainerHeight = document.querySelector(outerSelector).querySelector(".scroll-container").offsetHeight; + let voterContainerHeight = document.querySelector(outerSelector).offsetHeight; if(voterListHeight > voterContainerHeight){ buttonEl.style.display = "block"; } else { @@ -155,7 +155,7 @@ function showVotersInList(data) { listPrepare(voterListItemsEl); // Only show expand button when necessary - showHideExpandButton("#voter-list", "#voter-list-component", voterListExpandButtonEl); + showHideExpandButton("#voter-list", "#voter-list-container", voterListExpandButtonEl); // Scroll back to top let scrollContainer = document.querySelector("#voter-list-component").querySelector(".scroll-container"); From 41b50e952c89f6ad07208667e10cd43fdf8eae3e Mon Sep 17 00:00:00 2001 From: Leejere Date: Wed, 16 Nov 2022 20:48:28 -0500 Subject: [PATCH 88/95] slight changes on list loader height --- site/css/framework.css | 2 +- site/css/list-loader.css | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/site/css/framework.css b/site/css/framework.css index e41e4d9..046aad7 100644 --- a/site/css/framework.css +++ b/site/css/framework.css @@ -32,7 +32,7 @@ body { /* ---------- List loader and filter button ------------- */ #nav-component { - height: 5vh; + height: 5.1vh; position: fixed; top: 7vh; margin-bottom: 0.5rem; diff --git a/site/css/list-loader.css b/site/css/list-loader.css index 5cd82df..cd5a0ec 100644 --- a/site/css/list-loader.css +++ b/site/css/list-loader.css @@ -1,6 +1,6 @@ #list-loader-component { position: relative; - height: 2.5rem; + height: 2.7rem; width: 11rem; float: left; z-index: 99999; From bec211ab56008c88fb79d52503c2e30d69b2510c Mon Sep 17 00:00:00 2001 From: Leejere Date: Wed, 16 Nov 2022 23:39:12 -0500 Subject: [PATCH 89/95] finished filter CSS --- site/css/list-filters.css | 146 ++++++++++++++++++++++++++++++-------- site/css/list-loader.css | 4 +- site/index.html | 124 +++++++++++++++++++++++++++----- 3 files changed, 226 insertions(+), 48 deletions(-) diff --git a/site/css/list-filters.css b/site/css/list-filters.css index 32f56a2..2fbe2ba 100644 --- a/site/css/list-filters.css +++ b/site/css/list-filters.css @@ -48,7 +48,7 @@ Filter window .filter-window { position: fixed; - top: 50%; + top: 30%; left: 50%; width: 16rem; height: 28rem; @@ -59,7 +59,8 @@ Filter window z-index: 2000; z-index: 9999999; filter: drop-shadow(10px 10px 12px #333); - display: none; + display: none; /* But will turn into flex with js */ + flex-direction: column; opacity: 0; transition: opacity 0.5s ease-in-out; overflow-y: scroll; @@ -67,50 +68,135 @@ Filter window /* --------- Filters --------- */ -.party-checkbox { - opacity: 0; - position: absolute; - pointer-events: none; +.filter-group-title { + margin: 2rem 1.5rem 0; + color: var(--main-color); + font-weight: 500; + font-size: 0.95rem; + padding: 0; + text-align: center; } -.party-label { - color: #0d59a9; +.filter-group { + margin: 1rem 1.5rem 0; + display: flex; + justify-content: center; } -.party-checkbox:checked + .party-label { - text-decoration: solid; - color: white; - background-color: #0d59a9; +.filter-group .icon-set { + width: 4rem; } -.status-checkbox { - opacity: 0; - position: absolute; - pointer-events: none; +.filter-checkbox:checked + .icon-set .list-icon { + background-color: var(--main-color); + border-color: var(--main-color); } -.status-label { - color: #0d59a9; +.filter-checkbox:checked + .icon-set .list-icon .material-symbols-outlined { + color: #fff; } -.status-checkbox:checked + .status-label { - text-decoration: solid; - color: white; - background-color: #0d59a9; +.filter-checkbox:checked + .icon-set .list-icon p { + color: #fff; +} + +.filter-checkbox:checked + .icon-set .icon-subtitle { + color: var(--main-color); + font-weight: 800; } -.visit-checkbox { +.filter-checkbox { opacity: 0; position: absolute; pointer-events: none; } -.visit-label { - color: #0d59a9; +.filter-checkbox:checked + #filter-pending .list-icon { + background-color: #bbb; + border-color: #bbb; } -.visit-checkbox:checked + .visit-label { - text-decoration: solid; - color: white; - background-color: #0d59a9; -} \ No newline at end of file +.filter-checkbox:checked + #filter-pending .icon-subtitle { + color: #bbb; +} + +.filter-checkbox:checked + #filter-noparty .list-icon { + background-color: #bbb; + border-color: #bbb; +} + +.filter-checkbox:checked + #filter-noparty .icon-subtitle { + color: #bbb; +} + +.filter-checkbox:checked + #filter-rep .list-icon { + background-color: var(--red-color); + border-color: var(--red-color); +} + +.filter-checkbox:checked + #filter-rep .icon-subtitle { + color: var(--red-color); +} + +.filter-checkbox:checked + #filter-ind .list-icon { + background-color: var(--aux-color); + border-color: var(--aux-color); +} + +.filter-checkbox:checked + #filter-ind .icon-subtitle { + color: var(--aux-color); +} + +.filter-checkbox:checked + #filter-lib .list-icon { + background-color: var(--ok-color); + border-color: var(--ok-color); +} + +.filter-checkbox:checked + #filter-lib .icon-subtitle { + color: var(--ok-color); +} + +.filter-checkbox:checked + #filter-oth .list-icon { + background-color: #bbb; + border-color: #bbb; +} + +.filter-checkbox:checked + #filter-oth .icon-subtitle { + color: #bbb; +} + +.filter-checkbox:checked + #filter-active .list-icon { + background-color: var(--ok-color); + border-color: var(--ok-color); +} + +.filter-checkbox:checked + #filter-active .icon-subtitle { + color: var(--ok-color); +} + +.filter-checkbox:checked + #filter-inactive .list-icon { + background-color: #bbb; + border-color: #bbb; +} + +.filter-checkbox:checked + #filter-inactive .icon-subtitle { + color: #bbb; +} + +.filter-checkbox:checked + #filter-completed .list-icon { + background-color: var(--ok-color); + border-color: var(--ok-color); +} + +.filter-checkbox:checked + #filter-completed .icon-subtitle { + color: var(--ok-color); +} + +.filter-checkbox:checked + #filter-awaits .list-icon { + background-color: var(--red-color); + border-color: var(--red-color); +} + +.filter-checkbox:checked + #filter-awaits .icon-subtitle { + color: var(--red-color); +} diff --git a/site/css/list-loader.css b/site/css/list-loader.css index cd5a0ec..298b438 100644 --- a/site/css/list-loader.css +++ b/site/css/list-loader.css @@ -1,6 +1,6 @@ #list-loader-component { position: relative; - height: 2.7rem; + height: 4.6vh; width: 11rem; float: left; z-index: 99999; @@ -22,7 +22,7 @@ } #list-loader-component .input-container { - height: 2em; + height: 82%; float: left; margin-left: 0.3rem; } diff --git a/site/index.html b/site/index.html index 9932f1b..8e7ff67 100644 --- a/site/index.html +++ b/site/index.html @@ -43,22 +43,114 @@
    -
      -

      Filter by Party

      -
      -
      -
      -
      -
      -
      -

      Filter by Voting Status

      -
      -
      -

      Filter by Visit Status

      -
      -
      -
      -
    + + +
    + Filter by registered party +
    +
    +
    + +
    + Filter by voter status +
    + +
    + + +
    + +
    + Filter by visit status +
    + +
    + + + +
    -
    +
    From 5010d689139c5d255f40f858bbe0df74a8a93771 Mon Sep 17 00:00:00 2001 From: Leejere Date: Mon, 21 Nov 2022 12:33:27 -0500 Subject: [PATCH 94/95] Finished Readme --- README.md | 94 ++++++++++++++---- mockups/display-1_iphone13blue_portrait.png | Bin 0 -> 1375178 bytes mockups/display-2_iphone13blue_portrait.png | Bin 0 -> 1011545 bytes mockups/display-3_iphone13blue_portrait.png | Bin 0 -> 1127264 bytes mockups/filter-1_iphone13blue_portrait.png | Bin 0 -> 1088324 bytes mockups/filter-2_iphone13blue_portrait.png | Bin 0 -> 1377015 bytes ...ist-loader-after_iphone13blue_portrait.png | Bin 0 -> 1423661 bytes ...st-loader-before_iphone13blue_portrait.png | Bin 0 -> 926151 bytes mockups/raw/display-1.png | Bin 0 -> 1134505 bytes mockups/raw/display-2.png | Bin 0 -> 989436 bytes mockups/raw/display-3.png | Bin 0 -> 1007258 bytes mockups/raw/filter-1.png | Bin 0 -> 1278412 bytes mockups/raw/filter-2.png | Bin 0 -> 1135778 bytes mockups/raw/list-loader-after.png | Bin 0 -> 1269346 bytes mockups/raw/list-loader-before.png | Bin 0 -> 811832 bytes mockups/raw/saved.png | Bin 0 -> 1022663 bytes mockups/raw/status-saved.png | Bin 0 -> 1157493 bytes mockups/saved_iphone13blue_landscape.png | Bin 0 -> 1060513 bytes mockups/saved_iphone13blue_portrait.png | Bin 0 -> 1057895 bytes .../status-saved_iphone13blue_portrait.png | Bin 0 -> 1381726 bytes site/css/edit.css | 5 + site/index.html | 4 +- site/js/main.js | 7 +- 23 files changed, 89 insertions(+), 21 deletions(-) create mode 100644 mockups/display-1_iphone13blue_portrait.png create mode 100644 mockups/display-2_iphone13blue_portrait.png create mode 100644 mockups/display-3_iphone13blue_portrait.png create mode 100644 mockups/filter-1_iphone13blue_portrait.png create mode 100644 mockups/filter-2_iphone13blue_portrait.png create mode 100644 mockups/list-loader-after_iphone13blue_portrait.png create mode 100644 mockups/list-loader-before_iphone13blue_portrait.png create mode 100644 mockups/raw/display-1.png create mode 100644 mockups/raw/display-2.png create mode 100644 mockups/raw/display-3.png create mode 100644 mockups/raw/filter-1.png create mode 100644 mockups/raw/filter-2.png create mode 100644 mockups/raw/list-loader-after.png create mode 100644 mockups/raw/list-loader-before.png create mode 100644 mockups/raw/saved.png create mode 100644 mockups/raw/status-saved.png create mode 100644 mockups/saved_iphone13blue_landscape.png create mode 100644 mockups/saved_iphone13blue_portrait.png create mode 100644 mockups/status-saved_iphone13blue_portrait.png diff --git a/README.md b/README.md index d5ceef6..acba11c 100644 --- a/README.md +++ b/README.md @@ -1,50 +1,68 @@ # **Canvassers** +## Visit the app [here](https://leejere.github.io/js-voter-canvassing/site/) +[![face](mockups/saved_iphone13blue_landscape.png)](https://leejere.github.io/js-voter-canvassing/site/) + by **Jie Li ([@Leejere](https://github.com/Leejere))** and **Myron BaƱez ([@myronbanez](https://github.com/myronbanez))** -This is a mobile-friendly web-app used for voter canvassing. With this app, the canvasser can select the voters from a list and a map, view their status and other information, and record additional information regarding each canvassed voter. The more specific PRD for this product can be found in the same repository or via [this link](https://github.com/Leejere/js-voter-canvassing/blob/dev/PRD.md). +This is a mobile-friendly web-app used for voter canvassing. With this app, the canvasser can select the voters from a list and a map, view their status and other information, and record additional information regarding each canvassed voter. The more specific [**PRD for this product**](https://github.com/Leejere/js-voter-canvassing/blob/dev/PRD.md) can be found in the same repository or via [**this link**](https://github.com/Leejere/js-voter-canvassing/blob/dev/PRD.md). The PRD was produced by Mjumbe Poe ([@mjumbewu](https://github.com/mjumbewu)) ## **Data source** The voter data comes from [Pennsylvania Department of State](https://www.dos.pa.gov/VotingElections/OtherServicesEvents/VotingElectionStatistics/Pages/VotingElectionStatistics.aspx), who provides voter registration data that includes the name, address, and other voting-related information. The data is available for purchase through [this link](https://www.pavoterservices.pa.gov/Pages/PurchasePAFULLVoterExport.aspx). For this application, only data from Philadelphia gets extracted, preprocessed, and geocoded by Mjumbe Poe ([@mjumbewu](https://github.com/mjumbewu)). -## **App functionalities** +## **App Modules** + +### **Module 0: Database APIs** + +Data from the [Pennsylvania Department of State](https://www.dos.pa.gov/VotingElections/OtherServicesEvents/VotingElectionStatistics/Pages/VotingElectionStatistics.aspx) is stored in the same repo under the directory of `\data\voter-lists\`. Due to its large amount, the data is split into more 1,000 separate lists by neighborhood, which also acts as task lists for the canvassing team. One single list will be loaded at a time on demand in the next module. + +At the same, the requirement document asks for the function of recording and saving additional information. This app uses [**Firebase**](https://firebase.google.com/docs/firestore) to store additional information recorded on canvassing visits. The saving and loading API calls are in the script of `main.js`. ### **Module 1: `list-loader`** -Due to its large amount, the data is split into more 1,000 separate lists, which also acts as task lists for the canvassing team. Each list can get loaded into the app asynchronously on demand. `list-loader.js` primarily deals with loading data. The loaded data gets stored in a global object, which is the data source for all other operations. The `list-loader` module is rerequisit for all other functions of the app. +Each voter list can get loaded into the app asynchronously on demand via the `list-loader` widget. `list-loader.js` primarily deals with loading data. The loaded data gets stored in a global object, which is the data source for all other operations. The `list-loader` module is rerequisit for all other functions of the app. + +- **Default list on page load.** By default, the same list that the user last used on their device is loaded. When the user last loaded the list, the list number was stored in `localStorage` and also on Firebase. On page load, the app first seeks `localStorage` for the previous list number. If such `localStorage` does not exist, the app makes an API call to Firebase and pulls the list number there. If both do not exist, **the first list (0101)** is loaded by default. -There are two ways to load the data. +- **Custom list input widget** An input box exists on the top right of the viewport that allows the user to input a number, and then imports the corresponding list. The list loader is triggered either on **button click** or on **Enter keypress**. -- [X] Load data by manually inputting list number. An input box exists on the top right of the viewport that allows the user to input a number, and then imports the corresponding list. +- **Two API calls to the repo and Firebase.** When the loader is triggered, an API call is made to fetch voter data. On success, another API call is made to Firebase to pull down additional information recorded on previous canvassing visits. The Firebase database is organized by list number, so only data regarding this list is loaded. -- [ ] **To Be Created.** Load data using geolocation API. By calculating the spatial scope of each voter list, the app can identify which scope the user is currently in using a geolocation API, and load the corresponding voter list. +- **Data update and display.** The data pulled from Firebase is used to update the data pulled from the repo. Then, the updated data is passed to **Module 2**. + +Showcase: + +| Number input | Data loaded | +|--|--| +| ![loader-1](mockups/list-loader-before_iphone13blue_portrait.png)| ![loader-2](mockups/list-loader-after_iphone13blue_portrait.png)| -The list loader is triggered either on **button click** or on **Enter keypress**. ### **Module 2: `list-filters`** -This filter filters voters after a particular voter list is loaded. The kernel script for the function resides in `list-filters.js`. This script workds as follows: +This filter filters voters after a particular voter list is loaded by name/address, registered party, voter status, and visit status. The kernel script for the function resides in `list-filters.js`. The filters work together in the following way: 1. **Data import.** 2. **Event listeners.** Event listeners get added to all filter widgets. 3. **Filter application.** Every time a filter event is recorded, whether a new filter is applied, or a filter is modified or canceled, the `allFilters` functions takes the imported data and applies **all the filters** to produce to filtered version of the data. 4. **Display update.** Use the filtered data to updated the voter list and map, which gets implemented in the **Module 3**. -Several filters are available: - -- [X] Filter voters by searching for name or address. The related functions are in `search-box.js`. +Showcase: +| Filter window | Data filtered | +|--|--| +|![filter-1](mockups/filter-1_iphone13blue_portrait.png)|![filter-2](mockups/filter-2_iphone13blue_portrait.png)| -- [ ] **To Be Created** Filter voters by voter attributes. The related functions are in ... ### **Module 3: Voters display** This model displayed either comprehensive or filtered voter data in a particular list in the voter list and on the map. -- [X] `voter-list.js` takes the data, group them by address, and display them in a list. The list includes the voter's address, full name, and some icons that shows the voters canvassing status (pending visit, visited, awaiting followup, etc.), voter status (active or inactive), party registration, etc. +- `voter-list.js` takes the data, group them by address, and display them in a list. The list includes the voter's address, full name, and some icons that shows the voters canvassing status (pending visit, visited, awaiting followup, etc.), voter status (active or inactive), party registration, etc. -- [X] `map.js` takes the data, makes an geometry object (`FeatureCollection`), and display it on the map. Note that **every marker stands for one address** (house number + street name), rather than one voter. +- `map.js` takes the data, makes an geometry object (`FeatureCollection`), and display it on the map. Note that **every marker stands for one address** (house number + street name), rather than one voter. + +Each displayed voter either on the map and on the list is attached with an event listener, ready to be selected in **Module 4**. ### **Module 4: Voter selection** @@ -58,10 +76,50 @@ This module highlights a **maximum of one voter** as the "selected" voter. The m - **unhighlights the currently highlighted voter**. - The highlighted voter ID is recorded and passed into **Module 5**. -### **Module 5: Voter information display** (To Be Created) +### **Module 5: Voter information display** + +When a voter is currently highlighted, the most basic basic information regarding this voter is displayed on the bottom panel: name, address, visit status, and other information that was recorded on the previous visit (if any). + +- **Basic information**: name and address. +- **Visit status**: either `pending`, `awaits followup`, or `completed`. This information is pulled from Firebase, and every voter is `pending` by default. +- **Other overview information**, e.g., registered party, whether received mail ballot, etc. Some of this information was recorded on the last visit and pulled from Firebase. + +An Edit button exist on top of the basic-information panel. On click, the filters and voter list is hidden, and more information panels emerge. + +- **Record panel**: displays voter information recorded on the last visit, if any. The user may record, edit, and save information on this panel via **Module 6**. +- **Voting history panel**: displays the past voting records of the selected voter. The list may expand on demand. + +Showcase: + +|Basic panel|Record panel|Voting history| +|-|-|-| +|![display-1](mockups/display-1_iphone13blue_portrait.png)|![display-2](mockups/display-2_iphone13blue_portrait.png)|![display-3](mockups/display-3_iphone13blue_portrait.png)| + +### **Module 6: Data editing and saving** + +The user may edit information via the "Update Status" button on the basic-information panel and the "Save" button on the record panel. + +- The "Update Status" button only saves visit statuses, whereas the "Save" button saves all information. +- Whenever the user clicks a button or inputs some text, the unsaved edits will be temporarily recorded in the corresponding DOM object. When the save buttons are clicked, the unsaved chagnes get consolidated and uploaded to Firebase. +- A "toast" appears on the button to give feedback to the user that the information has been saved. + +Showcase: -### **Module 6: Data edits and records** (To Be Created) +| Update Status | Final Save | +|-|-| +|![save-1](mockups/status-saved_iphone13blue_portrait.png)|![save-2](mockups/saved_iphone13blue_portrait.png)| -### **Module 7: Data saving** (To Be Created +## Collaboration -## Overview of collaboration \ No newline at end of file +|Item|Contributor| +|--|--| +|Wireframing| Myron & Jie| +|Module 0: Firebase| Jie | +|Module 1: List loader| Jie| +|Module 1: Parsing CSVs| Myron| +|Module 2: List filters | Jie & Myron| +|Module 3: Voters display | Jie & Myron| +|Module 4: Voter selection| Jie| +|Module 5: Voter information display| Jie| +|Module 6: Data editing and saving| Jie| +|CSS|Jie & Myron| diff --git a/mockups/display-1_iphone13blue_portrait.png b/mockups/display-1_iphone13blue_portrait.png new file mode 100644 index 0000000000000000000000000000000000000000..f0e8962492b8c6325ed63df7b2c89837ff8c3ef2 GIT binary patch literal 1375178 zcmeEt=T{T|6K+BaAP|~TrAv`2BE1(;G!zw(jv@lmdk?*+2r5;OE=7>gLnjmk0V#qI zNazRwLkK-U2;6+{oBJQ!SHI0U$?hk+=WHf3&ph+Y>}ykFLq>XTdH?{xc>kXMBLIL# z2mrVeKubejp%;RFAb(J~=s z0Kh*-06;Yd0O0WX+-{~${(|QD14Dhl<$tfDu8MT>3Mk+{!~nEGLC45M;s4}=2>D{b zeSMuLA*gLqXzPt3JN}R;VL!Ezt`;v(J9FvgC-)Xu6$LUq)>s~0F@m%79bbv-m-9z(WM~o>0p&^r?raJMsJt^*BdCJ(?M2*N_9cA;6RrYblDxuOjNRB^_mtYR#vc z=hvm$489W$^sw}f;-1d%q+h#OLq{NvpL-&PFCGK}KJHjk1T>-D(a>y>?A_as>3e?BPDWfy| zY>e6%0oLx9i?;xS3nh?s1oLyA9(dGJ7Y%^Zsc$^_zirc5^u8E?Vfn(Lhg9g6eXG~T z(6h}ta|F}juBMxu|B^qYjTgE>$)lTW*91(lvBuf~-aoRZv7q3~*3s9O756Q`1c&n{ zC)@koE&Ux-fI(}%XQpBqE9FsFP7`olw!sbhb~YGGtS`gkIidP;1CIH(UB+RZ!N=Qk zyIfQ}JUp|rvzuCZ%fH(E7jPZpN{ULi7G|TF`#7ESqqt_Be+8&sU6I$NT{~_G^-N)L z8PC66qQL~5U!*i^?F9Ik)GZCH;91UIwe>NEaS8A1| z>5G)lU>FVeYO$cg+&b^(Qr5iWqw$-V*pEw`Y1?^9M5`{J&l_Kp8{qVv4b@zJ+J`yV zh`1hL3o4rvMAN6C4=wJrcKTo$ugPzWea;I!J?J?k@Mygt;_A7C1>&`sT(ygW&vk^7 z1tOUsgBJr{!cj*Errk4#Ii}hu`^#$L7*^|?@4sF58UN*@DBN)7M*B70S?r5ZsBq^6 zXs5%ak?UpS+`r%iIVG>rTu)A?c!1B^oXc+y<8iWpkZK9pKORW5l!~j?W}ukj=yj71pyI`9x2WEO**!cw9NX)GJv8*u@V=$X zuKG5&lv{lurgMU#q7vhFT+SyikK~~MdO@mPrhb{?DrkOm-xmdJ~zQdgv|`D@?n zX$4&othe1DAFutRbxcu|W7aiNCvG#gUNKRXcq?pKy?Ici*sMdr zzJ;H(wpZKluM{AYmr%*D-^cqzAvgH#fbucy+$aW+aME$$X6HBF zq>(G6^M6`w6sAT;sY*HszL(ysfYng{ zieKb7f;TxXFmLQ=X&jkVIM$VOmBfXhYh4TbiP?rj>Y)a4d{*5{yS-)t^U z7r>mH=KOwIyQktH+eP;sQ0gNl28XwxvMql}5LFRYco8fz5r`X(c_CN(O%`Nva4@l_ zQRt^FK`q$t|8&kVH>DWMDj$UY`XE_3;p>BW{|&xie)O>+v#*DP1T~8Rvz%i7%m%<+ zp3mtsOwnW5onzV$d)r!vHl}8j5m3J1;Zp zXtDc?dF9V*CqR58voF3-)wh#PI`82?PKqHQdhSAVqtWVdgKbw>GhJPLOy;RaB6%&I z`6V17`;tfmL`z!2nhHCdYugD0V8QR}j+NEd0fp3crOn;EG%`Jl9Qyi(LW}1cN=yHN zWqWl5K0)NZ%n2aw*2Xj}yDwDm`!SA&qg+OOnUYR3*=J*3#ly?<(@?-o!18>X|4aG& zHxM3eIhV0~wu4jF5p^XwW~4U?(CcTFbNXCHKm_K1m{UmWfchgX9NpewmAvkt5%nEQ zUpu3YQFj2(%j8Ws8HGK{5^I?6I~D>Z?^*tKvYgb+;cA&*ri6ZmsoS0s@~+M`2WUEw zpotqgZ7s%})HNC5(nZ*k15)u(A{IW#*9MAMnaNie^mx+N08_qiYB{~^n-F!Sv?zAj zh*xZ4RMCQft2@$hceSgPTEZZ;ns!RR7(V{MQ!yb^{iv6W^qB#pEX~MIX)65>A#knO=h3=k+=c0R=jVDU+3S4<8OVJycSB7C$Ev*^ifjjS zzihkwsL5I5=#z_TZ)&wAjNxcj`OWp&=y+#3tKs%nFm= zukEXA6^aZ|JN>E#M#Nx$_yFN({IS`L@5Z(j8GM^A3)EbaxKXprE@Pj2H)gUv8CR@s zxA||(VO!#(dyi~7Ue^Dr&l&$NFMF#{w(e=xQzCBxmw6C9Ti8K;h4bCE-RN>-lxG3T3XH=%35UcLGVO9gEV1& zIA+?vsU7EK9{h&c zY$~VEyJ7)DWu2LmG6*Nf-XAI@<3i1MLm~0M#eWP0#O{gz_?j*ToGsv4+oPS@nzao* zsqPHUJDVJGMi&qPQyL3vmKgvpB@yVM%j5^n) zz1z@4ZT$d4*BZ568bIweU0daEN^$ruA96%|)(F4mGPdA8_E|%iOh88G8ZmYCw|;EY zuRWEz_PqYr-dsfiuxa33o?0uEBq~4!TWVbo6a3TKrsi&QPD`gBoqAm#@&~YZ2@oj^vU9GIVidN@0oYh|F z9~4wqzFB3sJ3Vo?+08tAboaI%@wb)(D>n*YWDb(idLp3_&<(D7Vcn9t(YP4+M}52F zUH&r(s&eo%6Mw^8aqLU}pY?$=vUQJ7aW^6Bmzwy$>?e68@ z1ldy&D0}f|?O4Hwmm5%kp*X0j#2+E`CH_6#ll&;Jk(itK2;_Cq0K4Tmo7=QpV6Td$ zwchR^J^eQ1g@amQ(xs5k#^K&ZL3tPdy}Tw$57j(q3mql#m$0yF>9dT)6gFgIX(Wxj zYoX0qm(hz18p3`MNyr*UhVJmdaIX_b>J*#-(}`oEovV}66|q!LM|rMi@_cK5hS+kv zT6=!HUgIx)sGR{{`tsYm8b14X=(WO;C-Yor(N5C`>9Z2va&rOI}UV=n~6 zvFjhQe%GdA>Dr73f}DOOlpcC0`yWf$`(Kh~=VyD|`9c8XY9<6nA~-oYQRWS%<~bLv z?THnzzI9H;Dh2zlZ7^LM;Z4&zV#s>S+c?J;Aqxb^T@19omYTg)-rp003!RveF|sUP zs#%tGwAm@8<2;#x=q4BG&W}CbL<*+w=-Jp!OJ|O1Innj5MwIl?V6$sqM7tL1cMFUfj;(3vGNz#YjCDYQjw| zU6OgkxZ&IK&WE((f@8{i*>-_gICwE-+}3n3V$fG~^KB++3s#Yx6qoeR=QK0^u%GJN zLhX(w+-+gWo-kYVO6gDB*5`E5WaNXXOne8SB!J54Z0q${Skl;o5Y0XX*KCQft-pkt zJU%nk*qa?!*`dT|xlL$XZ7HWXXn3sq=)h1(gWl52l<702B~!+;+AmP3oFx9JHVwMC zi642jsN+4ibL-6W#{J2m5fZ+M=tWa2T)2pZA>>GXM@;Km&~DmGvhy9=Hmz&hJYy{% zZ13dRi3+}Ck_5FQ?3z&QNjt-12QM3mSl&-fUFDKd@EWKb}VE42d8zzRr z(v>EL+G+~3+%_^yr{JLAOiJ7-!&E)uA>y2Sc*!jHXgDT_Zz&L=1hVrslm($kjqBPP zt%&}0?bgC12mXc5XI`ben;Xs0GeXo<`_>}?Nczhqa*R!5Ume-jUR>0wrFvPnLQ21T9KsLIL{;bW-AoOb19Fj^Mb08luY8F zf0^#jNu(a1w&^bZr}j>%c*XN=ZB41UuEd{P?hcBTn7STj>QOv#R z8V~;V%WI~U{da*n%-ZJEu=zUwo3krf&wGyiOs((K3OaEjC5H(m`!1~V6ixreRAq!e zYqb65v++oC_5`y8r;>cRIP=P7CU`EQI7J9};$hmFa)^vi=)eh|xIx8WZOUVgpFSGj z`wuuPaHbY=xWbiPs{tyF+Yi}VX_E@L%UF!_l~cC{M2-2DzJE<0^xgkM_gS<4-Cjui zV=?2NP3|)PDh}S-LoHG3)5d25=TOE0{x+#e8dX8dk}B zWzHSx>mQsr=Yg;?ynX(m!`CZJ@nl9HYER{0hO-W*6SPRwfAi67D$|DeCUV8QdjV2| zr)Qi^$~2~a$V_WWjk@vss}BL)p!6ryW@ynS4YnWSIh&+bdXuxpLXsv-LlFhK{#*TI z^Ja@3A{^|v688b-_x(P_JKCz@Ji~7rz?*?1ZAtLsj_1yi&~OT@r21K5Fnk@c#?Lf$ z3{*E7$oKqu(~xx#UU65xp-b_cnX~uoNoL3EMx+*J;^1!%YH%e957TT-wV;#=B<^0j zA&jQDwP~!?bkU66AAHh2?04Cg0w5GQ|D#7$W-8DkL2(|_-QwzLCbn{q^BxjNuDe4xt@t# z+e@v-fi9`ECi=JHvGr1Mg0_}f{v&53<#4}7|8w~vRWuG1z3m?pFVo)>F$2NN^V3?- zULrI3g%rFO-D9u$%Ju+fwPV4@IRZI6#N{VE>K}I6inc!3Uw!XOZ+jXiiY{8naj z_v+KBk!S7oF-rEW(f_&k9m3KQ6@QjN!eC*0EEZY2cJ}W2JZkQTizZRT3pa)niGpxE z*ZTIM_U|<~wvHKRdiVZIF~{l-VEnNLA=(rT(E0q`v{{!OeSa;YPSEIf@KkP3a_jX5 zaXM>*j+x8$n*w>DOT~~0<`NFtr>IC1!($y&Nknyi;A|E$^q`5g%!$ao@aB0BfqgfV z9`H0L3oR>v2=arn>z>I84Yj zPz&Y!(SxeSQz=NzZ0jH4ydCYY@^70s0k=$*6tO_uK4gZPQk#lJPJYOLu~78&m)ri+ z9L<$*=mJG@!d6R@A$@8?}t}kzCP^S5c%IkE_ zyWhL;GHRjY2qvB^@cM`H7SlS|&R$?`Qjivom}H)th?$R?i5OfzRe%&V(dbXM9nu_F z%1W!9Hf1aI;RlCk1My+BX8MO}TqKR%KjH2{ zY5y2j*|8fWt=(&2Y3em9*r{;9t9F9yu25t!sarB?7ewk8><%&d1_UD+*1LVDFT#7c5-xZLL<2`Oc=zHRT7RMZilVgSo-i@Y3&$^c2VYx|U#TQe zURd8zRtEE0FnyD#=ql%Znx2~P*K@S1GD*_DRB~VLhJ{Pvni+U~wBEO3)gg||wQV4K z*t}#oiHO=g@Ug2LF|MtjxQ!$@+M4$EjFB9lESxj;bSdsMyJBE*F=lW~{LIx{KJ&1dUtgnDRMeV(qN~O+s4%dk_)#-bB&(8Agqc@+z4_F8>+woF@#2 z`=0&voey4;l;e8$YiP~pKbp9^DV&zu3|b9eoQVX4_H-T zVpDD_wSVxrx<%1PEf`=o2Z&=1`ek!Zq4|_7QI_9s`hZ(E)lI&T;}>#eloBY;9r_Xp zP6*<)v~*i)Vqnd06MoVbpHlMD<1x|kj=kHnsw!Sxqo3lQu{XOD5I)$~u^@JH={O@f z;)}VcpK!2wpLrz}MsmdT8je}hOf?An!qfR;0x=2)QBWMm;C9!MHA?4du`%>%R_3Nv zcQaBK`paLvKetlbB`vOco)?j3~easD|e@)0Z8 z?w-#5#oMdhmWx+P*)>VCr5p8z{6EB?2TDJtB`s$d_nIhqQclF9lh%~G|1Js(oprKu z$l7=QS6$13HFtMqW(BikjyYUonFw0ZLEGKY+iNDPLoP5U zMYMOKX+!22ETJS%dt$8Av@P$!WxI#9%v>n9hmSV75OA{bb>M&q^b!JSF)o`7k45w+ z&R)%@NbXVdTS{wkD1oaIU-{Z_M=njf(Y1|3KoK=Qm;AF`4Z-?!dA-v(dw23xqy4GNv6S*|7 zoWGuthQvvZkR476^pvTN*HLBnR1(CF!cY`R%}~ER(=Z@+BygF{Fw0~_A#`<5OknN% zF-7nTk0jUq^rt*_9c|ZQi}M(A@k7dPiM2;dD#8C|4{m~9R1oI0&(1J;B2pmvrmiru zf|aRllBXztz0IDtQH&C|WKwf`KB>}!c1kDkq*ib7*!=!DK9o(aSzYr6bv?@opf_W!uRcz5~$ zYuhfNoqG^(dGA&q9jOEQ!mw@mf{=asf{=e)5yyLC?=6q-E>yNN(zn_(KI_rpWGuTA z&wOu^-P~L-sEgwZk1%pTYC9O{@X4E!Vv?F|JKXbzYIHe4pOZYHq=k&R{IxVsFYzoz zC)e5Z?y*;j<>2TMnx2wP5BxYN?^#jb(jOBV#MJ3x?h(+{di*|DU}80A*zCKhTmSU< z4gv5gEdI959Di3J4j0i9)g2GZ%c`=2y^d&^e%8#;PowLUEK~oy&z3mCE4UE zfYRr5{uw&JSiVY|BCfz+WjXvl86(1kO=@I8*WgNVQMCtMin9|YBQJl}h$h!F+zq3r zghQX>%v?%5sd}lFMkoff=^1MbZhuLa1?38U9-fE5a2pTyG(@UOxW?|^eXU_~x7Z>x zUtR4DkTYeHvlcoX*@|Cm3?WfEL=)|OY1(D%YG0?l9psCoD(nn!6CdJFyz;OW@j7`& zd2cxm{9oI+Bs*C-wFTP_RYLXj2c4Yq$lCVsEFOwR4DrY=$AI|cOw|1$>KET1pX3kn z4OZ}VrObKoQ}n^F#Zbj}&1K3nZ3Mr6|N45^5QsCL85hB*t58dgD$YrPc}VK7R1@Qh zbd|lS9K+SV;CLyZnu&GJtjm;K3q=WDd=#Qs@5Jg|($JM}>z_Izg9xM02x~POZ}k4R z+hc84N;m@sD~^<=OIm^iw|$X6C^XlF2|k;b$86p_PRs;8)szQ%myXLF=}G-Yr?*1# z?4*So8@u)%ZNPdT^U#A<@NWZxLLq%zuZ(aLZHflGIHPyZuIvM&#q$FA zX-RrjYURdP{){yV^)4@thAatjj)cx%f6(!irvJ-ngzKdjEUw)0Nr;yygj;gy%&gT( z0)?9m814YK?#wH4e7FVa-u0h4Nm}jo(>@I6Z;s0_wAyuCfg3B0R$$rW`Gy9gO*Lh5oebuI6|8F%X41!=yETr_vynN;UYWvX-1 zA!0`g#|7T0opwB(4ZMSSsF0qZC@qoz7Lv8F_EcO?8DaBOF`ZMFZbusD;MJTT&yC)O zE|E^Le;-7p#;WJ04lES7{b+#H-o)Epj)soLc5Y2cGmXSJo}WH%Zt$w(-92?^I@P96 zs1ipz?G5f6h|Y)7+LT-gNZj2VJNPZl*6;Lc|F0lYD|V^1F1y&oACU%8O~5>8!t^^V zLHHPMj-T6_;EpC1gB7-r=LO9eMRm*32s8Nx0_F2&DW)j*bG+Vx9)E_j9x}>C^fYS| z&SCiUSP^NUd}uVs7o{xnC>Sjy{uq6@hx9~j|N9(g|D)q(c63Jc%z}IeSK(s77{@Xc zxoYMTmDfZ&gBy2AACK)UuI^NGF*k)C;>9AuP=4CI$>Od2n-@EQ`}gpCWo?@2zW&Dj zh`bf0Dfs+8A`Si_#TEJ>cd@M3+bG1?a=)C8%+TlWKJB`+l>p^-y4G&(T4(hg-P>Bw zyA!%tEBU4<0=iF-?A3VczmVu0j)%68JXKH5ypPA1*p4REe<{gx1w${@)pj9nhH6IHtGH=-vd znj6y1J5F!xbYb*emh_)8iL6m#FjgE?SX%;REr?Q8r`zsSO8if5!9KaWJPVpaxY%1| z%Yw2-RhMZp8V)v2i9gM3>^lm;@?1Kbs4U7VkDayLXP+YqJYW#wr&|MzKE20(44UOKyM<-k>C`=ct$)guCezP1~GHRQ)!_%Cv0E2OzcP9o{qGK|!sK>&5B zvh&vsQd;!O^2y0NfV~YR#HkmalBFy8hi?Rndzi*&mGEocp}RVr>z>}XYr8Ii{}JWA z?~hH^CcQOc#R{M_jU*C0DHbg7{S%H`imF5zo?bvV$58PFJ9%thd4p)EnbpkJ zBfMCmm!!DIdX~a)^T!6I5;EG~{nJ&<7$)_7>w8cXj#23^KWDrJq+0Uw^nE`C!$qXi z!^gk*;mRqtR}8}YZL~$WaxK)mA5qZq4Q~@Zem`b*;~RLFA2Al(oYl?RLy}e{epXtW zJLCDc`;>tpU?tJl_2%ka|9IX3DnJk%h6)fxvdi!%gjTCn@AxPk!~2xJeQ`gCA^?rsic)DMx2kzRgmbc0 z;zZuT5^|UZsJ!@w|M{%;*c-4jtco;)-Dsx*iyrkydf7b5N)EF-@23~}l)_Sc*Zj06 zQ77x2DNoFWNWrlLtb?&=bP4Lki9VYQtOa=hq<^|!uzJE?JBkB7rQ{V@b_;c<^XX{o z4bNs#%ACC7H;P1|{BNAA_=QpcRz(aJGAMU!m12JR@aXW-4#(_%CWvW(Y#+RGQblk7 zZS)~gvOOV){W#i!%d;D}kh%?Xw(R|39<-9yYHX=s^H!!z%6#qX06}I$mZp2TogO1G z4WE8Js-}=1&Rw&~*KStAN=}Sa_lC^%n({)d@M6c?=88c#wd`&b(?Z!)V~|BsyKdM6 z$DFa1BiZ?|v#wK%;hVvvq^pE(=LUwvDcUsO_1Od;1Q^H64J{$a$-Nw@_3~yi?Og5#=I3VADfdQM5 zqJ|tZYJ0bcFRYV(P0akK>Df2)bLA|zlQly^l5OnmE@v1*2b5e?EP%$hdGi6PsHPWEItYyy;+-@hC00xt=0zS+yUmJhg=$1_P#TPiud8l<> z^lOLa4fYXVD;E8x0?p&eS@4Nn&F5e>TL?jw5l`3Ga66TalZz=&VQZc7w*=^;f`R!p z&(adPdn^xirHf6c%^Me_Mog77a>eok2&dp3)txMJMd`AyabzS?uIjqzKi`~Mgv?B2 zs0p1fuwL;0ZcBV|U@I33GfEa|9@i&Dv$kI)B7-p#MoKzVwA%D@zp{m5?U{t=#R{)M z0R6I4#~&+w@seW{%wF~h$6V!YVne9TZ+T0NUc#9>&GYW@=2Ed3o|xI|=~{nU-R?Q! zA$c^;CE+#Ko5k3eH92xJ@7npY_y7FzxO@(CTkZTKSq8`X{>dVF(WHoOI^&B|wlg3?w)^w<-4Dh6K=1kCM)mWPgAY zC7A*Py(6abeyJ^s8s40D_e&0gG zQA%78DY$7SAz{cJ1SF5W>L$w#x4b)jPP)5t9?{~SQ-l0Vs%GyshfTT{-E`++-j(m> zjm~JWM?{Zw+t$F7^ACz{iie~N#q;<*h;zP;qA@F{!!!1XrEze&DBW-a1KcgGRKwDs zvD4>j?dU0CT|25va49Rz`aQ8J&Ww#M|L1+`bk~~E{pd&>MS!a?Ge0k?Liuz z`u-mIofB#KcB(7hWCsQ83PFAaoT@#UZyXnK+w(&%b@CH>ut| z<2TBNS}P#@^BZ_1ksb)%y7VH{%%0w91A>F(E^cHfcemr*=J{r>2SJ)~-x|TI-IywV zKhCem(!vE2hCY<6dxWM7fU|5AUK}k+q)#$bN%%j+be^g+$JPf9usUx)TomLu(3wcwL=4EwQK_~S6wC^ZxjxV8Vfi{CYh z(6O#fcp8tF;F$N0548sW9bIvkayPaKL9lOpzwmavB;uOqHVg}0&hau~g-Po$aAj>4 z<%Mlvlz+eb)DoEUM4rX9_LSm&Zqd!^v9R-F1AKwUCe&q<;Iw%m&}rXJ;KPv$WHEXE zUhDxCyv)guq8wJEQqMK+bInWU?fBT5hiEMm>bp3W?6}oHRPooXhp2_hQgX`~tR-o= zbm-T@isx`|#OsNrxCqvZ4(6UA2#*w-u7ciT`>!n-ci<<~a^PpAvYS*)g{zc#$A zHbCd?%M%-bP^x1SV}QPHu@q_d1shMae^*p|21I2wP8on&?DmqZvQ=>7En7RbrVlef z+fUn7*|rbZ!yZBgJxvBh$7_$Tee5cFMV{198g`9c=Mu>vb@>2O`&hK<=Z~5e3+X`0l!o68K|L(oUb~%n; z9;mV7G#4~}REe?>(7A`s9RPcpSwfHzbnmRcipqU>$;B=bV5d;i=?S24jRoljgx{pn z;E#9z@TciJT^wVt4+H4<32h?H9$2`X3qC+Y-FI!c>K8go&P)A~md+<%ur6FF+H=b; zI{^#N>*r+T`e7RAoc#{>!exLnS=oJniX8PR*Qc7j1}GKftd-W1j0npsgFMsbbKMT@ zZ+L?bzS{Z-yjh6*=x#1dZJI^>;v2`!LORG3Gb|A96S{w~iB|3ZVEjIr%7GJo zDD!}y%5IIYrD;cg)O~ci{SPN+F`fWSKTJ<=IVuSM=kHq({T7de#C=YZ+M@&uUj1Kd+p$=C`>by7K+FwoT zBHk%%b=_xv{x1(|=~>bRa63N3WltF0$*We)DBpZFE2SoZp!;hONxm_7$Aq`jk< zy&vmvqRwaQ-yXEC?MyJBEeg{4D{h?YF7<}3XY*waJ*^GXX3@ua3=rY|0WUZ^vZM*V zvNjw8wRdmGb?x>RbMic}pIHTa>xKUW8U`>0na3csd^nI(l&JjKJGF z7Q9X+Z8g2p5N$NJC?%_#;k-rHYQ|n4l})&MyomsRK}01LFQHz}gZfbTuEV zW%SYb0-TiE&|grbR^Bbie|~2s<85y% zcJSiHg1JOswFD?a(~zK9GqlvTq*Yj(ON?2bPeexf%gn31s7~bUC%}DNVvWc7~qQsUhDm%UwVx*Ly`$fgH&SFiiZ{k#b~<*$w^Acizpe z{u$%q>?pV~dN-m}ne+P`yPlryS)w;w?5$g@EVe+>a-)kbiuilX`FB=S`BZuz`06^3 z@(D(qKYCY(aV;@mKhz*|1m2?mDL9sOz*QT04DC58Fb#}(EC$~@1KG!cmiEgwjtEh} z|0>?Mg`};*J~3Ile-9&YajXM52+HFOff8ZIG+H5RNyrqg9fp9=?m-4}4lW{jB2Hc% zWVL7{BfEF5?A1G*2JYn*o_MP7{ki>9(o;<7aVDcUEl}_U`hX0xVFR<*V35oLY}s;> z)&7FbT0lzsaNc;JoUO@;w+KU3$@MpMv;+1`hu&1!=fBkt0+T9l?TC8MQvsf|MJF3V zMn2pV|AT_sSW*kH{aL4whu5%~x5fWPnIF3ow|_sRaVdJki*lVUm_Rk#?t!zpGkN^( zW8uwjZqd*L3EelJ8@6X@c8Yt|YNyn`^$|@aXN#wHkdS`CP+DJV(T-uF~wpSdeG*;71>W&{z0hCGdzEk$)IY#GN@P*6))1 z06=_5fyI%L+8r)~9q6LD=#Y3wB~v0XxpYJ4kJgvDzz&e$`pqd1&v#fipz>o=?0WVU^e&weNjy3gx{K6ctR)`j=&n6H-%efeq}KK{)QE;>)? zz@$C2`y#yki1<87aB9@-Y>hzNwpqBN_xdzz@56Ot{o(IBdh9y%3evyNeJDg}U-guI zOMXt2vqO%mxQ?fd##w)TnXFKlI!ZJn*2z#irc{5Q;O?VlIj_$xl5ci9of{hI+WTmC zb~?-wHJ?u()*^cxaZ=1)vdkMaUhjKa^ZF50Xzh?z0|dm?ame(l9rcVe_K<$8*~Fb| z5N=B!WZ7}ew*C1E5sL?aOW@#)=hpSMAnOTSWWg{d1m!qpC zijS4Hs?FEo&ko`y;+8yVmq0 zB2zZOY-;|PauUSP8BQd5!^+0yC1o@sdy0a!{tR7qr({yxC6Cq}pM8yM3fK~s3n8JA zx8kGKT5xz>fBe;q^=Dix8}8vI+;hjE9loCql#G`=6B&}_`FXQsIUxiS)qfUo(SX#y zn$cCl7~d9Y-{wHOpC}Cquz}tgM9X0CEo(K6I-1vDz#OkwCL!MPp-bs`dwQOLx)^#o z&IQG>%Hsw3V--2SUgkoCr*Ij!8GAD$*(jvVaMxLZc*c9L@1YzsO>D{p9wQsgkjbkI zy7aX7custro3zT6M{|i1HQN&zy0bJ!4WW0h-fLh8G^ch0elMkqe-C>o${)fpaanDI`qInj?So^livifA~{8J`HMAWc3lGC83`MQMe9clUmF=mUSSk^xFM zW;AFl+L~NJhwBE%viOXDy$Cys;wiPO6-P&JLmc)ycEe>NZrNYNn9~k_Adqf4er>WvzF7$-pP#sDT2sn(8M4_QW&fTZfD32OCP7 z7dEROMobjJRl4`W4|s0KRR!tYG>6Dh=xX0v2~%oPimtjTP*!WriW`-oDiNW1!TpP) zPMdzL45ir6L~ zqo<8+$2F}gnY=}6-FvRc^u94h0Xs=+j&JW-ht0QnkTyM9%y+JS+7axvydXEfq87_p>?R%{Q|zGXe9zRc&4`{up<+i#{PbN}{retgLYLNwP_ z-e&en1v;@)32~O9EaLmR6uXSf*&cqQyOb->T@QbU%Eh>=eSXqmOa)e4X-`PDJ^Qy2 zi6~^I=(F@v3>WlNGi9myHmE6=yTR#kRuX!Ty|2Rj#K#SR)bu$EV3jN9Q{UOOoqcfU z-vqv!D`(sFo1){*zC8RQzBP;Ip~2`s)@>l&aH$K_E~dK!7nDaL z5eiR_LLc4B^R|RfGd%{dJXt-4Uxjs?{%QgrA3vS%@3iRkEtPoO9|#Xr_AHRU+bo@6 zkb|EXBCOmRUPig?4=?X+jwMDq-ld(R;iQ2fjn4wc!U^ZZNUNc7=+eZ4kGm+k3wtY* zrxu6f2;U{1pFGbJ9JL(IR4jAV(`ad`F``l&x$gd+1rE}n+@4A|C`+*#a>i6;8RoQL zVMISS(%9R)b`Y3181Nq1*EzjFfT~O&MElNN-fG5pwS5go60~z&uTtUKL+`Z`<1Rvx zqu%KOgB*8sh?!V$KQcjfis+n3vTeWC^Lsg1A3x9clqnuVK9w(+^cHHhC2w)r&NNjP zC6#pD+drjiX<}FD#loFs@C+y|K~ge6)*)c37=1-V{gM>9<$xez!*)@=r>4Wx=PFN` zs1OGvb!?iNx&x_m(LU+;3}2Wx7OAsK)C$nFNd2*}Mwflrziu%CL~3~~heYyWm)^!B z^2v=O;}aWU{rU5YB*d*z?|M#Uhc5R%hdd~PM2c$pyv1#lUcAKYu)>r)b|f38zTLuq zx_s|4IAjzrtWWjrbW{-_G`9#=K)$^+_Rh~gI)-IUE8x}?_&r}8*#F4$ zJuR+FEfz;r8yWX{)SrMpcpl*IFuTb1ru^0iPq&p8r(A-59Y^2N2v6MUJF$6^HF?Hz z-k*jV!N_+K{*cGxmNm5wM>vAx4!&aaAPLMgTa@Y7%Vc>xC{g4AeteJI7_pvvCRfJ5 zt#SXmj5yFvuUwetC+j3ME7dW8TH;H7a9_=XYWhdRFZowJCaENvZssj#E?F+Q>(jmt zQK;|QSa2~@beqyo7CjMY%6~wu^SS8s zkzn8nAUT<0bp&xff1u3h?tuWs&^7B`YHwhg*DX4RTDyI7| z1%w`H@U-L6dCxzkm~veC`Th7&<;abapEMjzSI7?(G>?3jXo72SHCc=jttEM$kkJ6d zRV))xBp7RfqTxxQ(WfePSBr>y5BpKWsQbqmcuz^DNl~sZNLI;6r^6y`p!wQ)X}eLNVYA|6G1c8#6XEMy0aDw$SQQ{)8ceHsf_*I9oV|# zHPuoV1Xh490CJ5+5}9#pj~ffiBWL|;LeFQvJv&MV!@ns!fb)1{AE6nni_i-Jz_jI+ z8agJb!AXmNE#uuDP4;2<^XhB|l00e6E9*9Gx8%a@X1Y}FYT~rZ`K?X3Q0u4JPIPR| zoZ^J7wB@ zSOda`g@L_7!=c-nZ({rxc)k5Kld|Z>JI2*EagF?(Um7bQ-St-)VHAT$?_I~1dfNW| zm0aP+vwY@fY*nAKGeL73|2z&~n5levpfRNqrTDYd?v|8VW+JW`*~Qe?gx^q%>z&EC zNJ&7xyEW=nl5H3(SyID*cPPAgN}h))tWZ52$iEU5aiM+(dw4ogGwvv$)#^U$-NNV> zH13`LQpY~Y+l+7H!2Sj#WFgUQ5phApOo7rmknoYE0h6bQi!*RqJ;bty5P|*s!zT&^ zyWHhfx@tX&kJ-+roN9xkmab0?JV*Qo0*L(o8yS z$|KZ$R8n>OO&oQF-C(l~-f7?d92G@MLPV~FMdVUw`|l*yUW)FnAV8O=x!3{Au(JSn zSm?rN#f7R@tVM&0X1IdqDOdRe%+oN86YdDHamFwbzk`PmiD?_?E}a z!R4^B|HIT*Kt-WN?GD|-&`9?nNQr=ebR#LFC?KsMB~sGeDIrS3P~s&;x;v!3bO;DY z4BZ1W?{NS3zx8IhbS;;t>~qeJZ-4vSGl2@I`Hd+~?ogp(srAZ^z3;j|Y@&CUv}*RZ zikgp8&t!4j2mk(Vq;|T{5<}VgL|!!9vF6Iyq%d<4G!Y&qcodo;q1yOfQC&j!GvjMb zb-T^IM9PWN4=EhMu^iI4NmG#%r25nkyWa53_CKtzT8^5mGJgKYJ8ovPe&)P7Nt}({ z#<~Jeq5_^7howH>v|##eI5WyN1e%2^4!lR_B&!%#4NHFn%jf#Q<1zjHiJHd<3Ee-o zI8>}$1ytb^=e2z}8vS4SI*LBg zC0I{kZq(pA^)nYD;=l&;jDOb!F*kjflv(|XA*D3+)6Covy1-a{8WQ>LG54Ux zdyf2q7EK1vTX{n&?<03OA`-FT`ttU8>n}0HTaYsiFcr@K1H9M^nUX7cWB zZ#*b`>+_((bPPM+uk!s+#9|dPB*ZR+%Ah8d81nnx1y=o(d8@&_5B-V<*OsKKlEKbC z@vk4DC@2OhS1A-8z%cLFpwIN(O8@O5hMuc2^>thY6BwM&)!~!2EtI!?^Mg3?TST03 z#;+Dx4wGY1%Anj5oNe2h$i^D?Pd||*tgBz`+?ks8>nEq(&5B5km_WB$42vqwZy~je zqJ-=Bl~5u7o}RR|83c*cwB6XC=9#6+^KN!>at@593;%6ImZNm)M^_W4aqQ@(=xTBz z;LZ`5lkRrHDQL^#_d7?ra_G%tE4c)6=FP?vqcl11vZCo{A6VC$$qfguh_C)dvbUiJYA{-&mBuE|=#P!N&>D|R?K#J&F^S0;w(k=%- z0&!}`&1%mpDyU^9eu&r0wd}0++q`>sBeCN-jnR+y>kpcK;cQ0EH}t#$gHzj9&O|>~ z+*SKHk>{^joBf2F4Fjpk)15OLTjrgU0Ii@Ex5s~(%207KeA zTUlwmq3vj?6e%B8XYB9z?VMrMP&cAVmBR)x_X#HA{Q zQFA%`9fl*_^sD{iZmGO<4!-Zcg&e6Nh2F)F%O*Vk}W?bV;oYc$?GC`O%^VTSiRGL|lS zJ}lbrJzz!km^pZB;?8IVNB;Ln)ioPTr%&s!E<7%l$S28~*S;-B3Hj`VNV;5s>}>f; zX!T9N9-W@y93HF54vhqlLrVPb&0yP*JGIjxex|uwMEdKI-$k~o33)!hn#;a}4j))F z^wLfxS9e&uAT^ zKXH_M>@(KNnumQ^d)%&oTEHyn2eYbaB;=iUIWiZ5ahts^FmmoBecxtfQX-8*lTUdf;D!ol*7om{N@^?PsTwX3f8c9P6%43ndq?U!rspBtksQ-Q`+u97Hl1 zsIFa1;kNCZlK-|}y7YMZ{E`1jUPO1F{|cQ*&Zx;V(KH0i+xf*ORy-dKik962!f5r+sM684GDIJANxVr5xsZ5y>TpCpA7Sy~(HFY!(?iitE zQ2QJ^G_;i8@Ddvz8(vj8^a*c!4xiM}bj~Jv!LLr$6fTTkvQzz~U55|#B`ZK-mgtkI z5Xth7m-aq5Gq|)h9;mlIwDeXXgn((Edn6Z+yg+^QSp@^!k8iEoA`q4-Y@rc7PfTl{JQ*(>lYiBL8ERr z>|)+(chX$(Wu4`WwUga-htynB(zB#ZwM1*;<`>%#|D0dSAmyf!XNyja%%Ar76FNr6 z^^gOuFV2yF;=0~??)?#Ac{b#w=Pk4B=GQtssDE~<^KS`@q0hNVo9nN+y7{l%%~?B# zms7&5++=r9I&Ddgi><7M;;4p9#Qf~$SmVnf#IJg}G)LASuTMRutDH>Lz7F@M+hmW5 zFt7XEILfB&99-^p9WU;=nr>!AN|N~j{{Lojj#FK&|6&!>3HWyggEpI-mF%XLr_pBw zQ&v|wClS)yOVelg3MMad+F18a6d`PDC6kN|t~pHj>_4|Z#;d;A{On7?zK|oJwHQQt zl8eN>7fk-d=cl%LC+^T?TijL)9lpXYsyB4r?eU+u8>frMIJxE98!tu(g50|I{$N=4Xd^jtyMKv?*PfPTPX=%Ne8O&Arc%Ypz&{lXHh}1x`>Vw zYIuhgu$|F5uz+b?4kO203$4ldpQQEpiid!gP2$U0km2UNP!k+EK@?k_A@UXB;J{mO zCeh;bmm9v0ESTsVIsUCudEaciF&Jy%K-0CKODT0U!;7)h_fDC8Nh7{BDLhrrJx(-d zo`pEjbcxW=J?fsBy!~41n_R=NQUM^lab`Z&NF-)k=HQGk5mgh!JT)+~W$wd2bLh@p zKoQBY)r&_HiKso*qUd)|| zHk&*|ysR#^Jr=I6a z?vYIrcMBS=t`X@|&$9e>3W7yLd-N-ppbldl_ZjECNK_H}5)kP1BIz0DRK^e<;A`!yPpF4B=#sVm0C=a597=IXNa%V8NH76OVcKfyJMVD8gWB z;PwXCa1#r@`1Qt9aUn!jC4Y=&B8YGU-DJWjJv!q0&nhFiRvn0+ zrbVhz&8v^$ap8{rY$2R!SC*^`&BC1*Q(_0yWg@)7@e%fwyH~SqB&eTz8{1>>aZ+hg zgv<6XzUIRimiFhZHwwomRB4BtGXy?d3lMMacSnw9kKHOXKZ6aRlMOvahDfG=)Y8iE% zgjnr+lQgel6+h`$>xAwrFHH>bVq@os@=duLOYIFWf1awBSg`3&a}TbQzT~4;xdZ=H z@(ugPRLL=S%@i!A@Fv~>3_OoQEB-Tou{i8KQK35nu z_Lgn1^(jtpg(D)E>ncKpLmnjc^5MwYWg z>Ajx`t(cpmHvvTt8Xn%Bq08+Vin)8s0}+}7_vHh!4RXJKrF-^dB;+oivO@hYxL2^r zkzA$|9uP2OsGZC-d~E!bP%lmo5hQ&?AZ-kCK9Q(z}%F z@A0hwJgxs6WMC<(rZh0x2ZlC8@U+?<4R}5Kr`=6JD`GOqRp4KDqJ7B0p8ia{%3dV- zH6I5%l(#B_>!-)}AFl6)#Q#z-eW$>-c_Ggimk)C|Q0Axh8b49(KVG;QX2brU(}~gF z-LOAs5vm?9p=$51{+M;Hpjq%@>ZDs(YF9gN@j$2O%hR#?z;JMx;9$ICuv&TXq_R>; zVAdjMu06;t*{VazJ-Zg~R|wL2dCd0?XWZ$0XgLF^t&R?T^$>Z2Y~_ZPY44ut`50mp0IJ7iACy@1w^p^{ySA%i`TRUn$yH8;*V)*W5UP;sksO9-*w=j zgd+Gk{`=(1&d=OeV(RIyCVlaV-5oO*7@ozMPo_H4eml$Shj=V;>9KORJ=G?x`d(g* zf+>8A!b!cje^`Q^Q|E!QODwDwD?(BO`A*j^+(AYqDL%14{9V#(zEv)z%%c9@42sT~ zS9As(49@K(rC*kX2aB|IF&<7)E)NdfO$8~qIU#}fXr1!y7oWJ1A=nYr?hTbeM3~)j z{*qFMa7XX;mN$p-atGqa>Cdxz5=4Q$llpG$-9EIV87~yV}8;e^Xm};B(HJLNDK7 zk1Pdut!J0-@|lUSJX}EU6HRmvOSFs{{7=c?!thO{Jknbk2A}t0OON_$FYyK^u`r5E zl1rqTOC^1->VXY_Q+PEbYEn|p+~FxeNCx(eQbj*kfcTGB(1fI=|2l1qAMBma3aPyzep`9y{n?1Uvf`6Sl(0tkaSGwLB>F>sL8ce zLZo>?RQY{?+D=^YlTGBLNWP?EQoL}w1Bb=~$X#%+$B4IVyU1v`^L8fixC1>dY#0+E zfsH0?T9dW@?evg29Vb%(wl&;RBSkPM*l1Gk#cm~^Dy(YmV;@^_(-qL)eD?2oIW8BZ zxvqSNJP?a0pYAa}N93zNtCDDO$bJ}!eDh_Q^TU9%Q4HSh&-d4VbOV%Sj%L=fAffws zP@7tUP%_0>tQBYB-9)X@LC1HUKLR7GH6|&sg%hJ%E)x&?$?9sHc|&QThVXooU4#IM zp;vtMPyK1)OJ8z$l`{Nar~bl6_ogTF1YPNTVR@;+Q-dDv+E!c|!2;U5WKWqmlRhF> z*qSh@Hh|w>Wg?)TB0eLWGdi0Q6!}+0hcHNBXxG`0`r+|)=rwK%+K)XnL)gHLr&uP^ z3=PX+uwpB8;AuO_AuH?J55YJr%7O}v!0}sKmOF}Bkg;gC(a-4o)x}~SlBsqnWNLDG z)P31BZAwjhI?r!wUsoKNxe!Dmt5KO2jE*~a?N9|Br$t$y$gskQ=hsT zXKYcQ!)TOIV|zDYpel8rdS8ZcsiNpyB`3_#OE?D?LN76XiY>~3BdphhjgPONIqN4# zD+tJVDyl?a3|E9$u~+z|!gD+wrsdAM>#uT7@s6=lSVUGo*J061B)@SyQ6|uFSKiiZ zfd1bOLOdpTxf4UklaEd!p*!GRzR~8%a9UZu{;4L7MJR{CSqL>$g;OYU=scA#DyIu& zcGCDaj5&HhTWXQC!%z@V?xJNPo*38`>fe8(=Z?q8krMMb#RjX4taP0;=8_ct5z$Yl z2al35%QqR(pQb6Tt_+GO4K|>uF`y8REa--5iQJu~<#3_qjCSOYRo9#zK@gwuK4UswUr0^ zELM9qzQ3$=FaNf%U%Y9tW9q3BK5^_3?`r!v0@>B*NLF}*+?`aI->I-)^tdC%t2SJ$ zqHkVhH1q7+%L=j$pspH|u&*JKrSs8-6G*qk@=`tDKzUIjO=1UcjNvp#)ymm)uxQF3 z6M>0|`oBomQn>h5#Z*MoIpV1pW9fB2>WC-C^+qCa5ySVD6*)4T6cjn5ktS67OiI(- z)#LOw`eLq{7g6OmW7@*f#3`yW^X`$9G`@G0OA*%WkmvkF zxuzd3pe4eR09C8~H+=t)LSug0{fkhQiC`5tx4OC^mODVam9tnkM>UB{xOaw#dB?l( zU%9boNfkSOxj({Fj@s9QLX10E-LnWE`q!L27q!9EFHFd7LIDTxWolH<^@Sg@WFr?>FYzF?s&HNjS0 zD>FMQ+(__WfBt)|4V`mhch2OfD;1}Z6_Z$Pg zK61W(bGQ-_fThBnzC^CiWv-0fPuK~Iw8k|}tNjsdyBQQnp$+Lg_lKC+<6D_X=;6Vq zg%eALux-9@<{mNtFIEiNH>>Zv5;Yz z*QoJ5=(x!ca{YOBE@CE7IhuVkpErrayqEw9B_)!sCwsZHT zz4D%CPunL0j`%h3TivHh^MvdmNX3d|O+(ThxiqlZyFb?68p#ES?#8{#a$%C#5$k2T zl=M~k9^e?O0Ees1?Z0DO@jsisY*5dT{y|ol!d!az$YHI-j*2D1fY{xXJbTh#c6(F1 zEv~fGJl1Q(%hj~?qrvLM;aZ}>>f8_e&!d~_Nd+&^m9J=&l}{!_vYgn4L>-vtJ9{^1 zdDg1@Se_5!@lwA%m$p-*hb@H8JhY~+YvG?B zQk-x$i&Dz#$Ykm<_yeYtGBewdO&4lJIlr{wQ_;6Ll$EX)Gf`!Lo7Smq>&ROxt~%dv ze~8KKSgm#9dc5L_`1(7!FGTJtC_>VNYCOg;vuJB^iGV{&`NgNrHA#QDYvCu(&4K$D z<@=(eGEJQ5vt=Jbz+0YsMXm<~Ra}S*-x7X>_Hh24gOrA+R5_aJtw*XpmBuLjs8Is_ z2nkh0mfK4>4Mk6hecXEyr56HuKYA?#2reyy7EaxacK7oIN&b*bA9v`Ao6-osv=Y-4 z$%+@wdg3tD0;^88Z6G)V8oldi(mJQbZp*6Q2b#*tzknVL*MwLP8tp&XDea)K#9BVE zLmoxdN~=hE=lIX59LZ+TU&guc6iUsnIGaHSJEU#jemKd>IWXQ#9VxXCb*|B0)wPWX zJEH6!op=Vs$07;>Fvn;YmWMYt-dzof;o*iaB{sYC=12=Y1KOsT1M1QKOQgqH%gcG} zUDxN+>%;Ds?esW>)I7;V@vL(3J(lAGo3du0*wR||mF)sQhBG7}HC<9!k}i~M1N0e; z8QSgsGIt*;M3w%t0K>(*O|)!q8T!D9xg@bO>n3vXsZQRH<#}50BHTf&J!lFEs;nmPgl*9z{JS!QAmosw}cQyb$SbjwSjJ(2{NnA*2H^3Pk23yc<)08=u1uH zl|}rIie&|4&%UJ{V7xa~j>qIMZNmw&C;o>kIhS9KU+zT2itNKRTbOs56;6WtSO6gM z&V?yJ$U%rO^N}llz=koV+5fj^K-C4W+*L(4XM*1p*$--kddxKwg}zkKv%;GN_hc}g zjQi_f$}INJ`SkEFO3GiERlnZTr+M`0JG0@BPRo6sqjhYXj|iim`ajPXcDT1i>pCJD z@nbu!#X7A;d#y#CaL8RkC8IymJ$g+l1Huxtd4zgHW{=swW-O+r7^LkpU5?!`Rx)Got{^4XD)nsH1E@; zK6PGc>4-Sc#B?Vu`z|n41ix|B&giNg*JWIu!{jj7tP3I9DhfB1Dw+YNbl zb&2Dc0>APWuIe;}0rpD;Wf7nS&BGT;q31+jB$*`-Z!m6gRG};6{B_9$e*sak_0H!W$Irv)rcz4*1eCo}PEOmyUq^RW)>Dg>1T7VZN)mLHhA8`IY&u$k^2af-Mr8H z>^f>jKhF}27?K=fXGh3l#pBr-b%pQh3eQRfiD?L@>xfL@D?$LA`HSW)Tme$+QeeB^ zWi6!&7ho?4eMXb}aCKbu!JE+7rzMs_uq069+>WcQO$4A*E)e?{#Mi8HC$h&@tRDzj z(O+_)kR|)rOP;fMHt!Y71j2l}TrLg&e)?l18 znkCfSD&oa0P|noO7yvV=zo_I1|BCKwD>|~RK}&t{*^x%ELp=+3+6)0zrX{SpUu3x{ zEWf{MVOimeklu#JQbePGd2H{86bmV!==f#klkZ2z;phB5A+9@9_ji%VMdTkYj(obW z65v@z<`d@J?7oqvIw;>^$V++qvL46wWpYGn=ZZZ6w(Z}gq0KH2(k6151l966fjB?_y0RB{ZSl*+i4exiPzu&nV>n}PR!E8*AD5= z7d=^13@%17mvR!zhb{L5SAH`Dt2CPUi1-aaCstlgp^oljvt{V;#InU6MGWt)wdo2_t00v_}c0 z4U-uK8;u~4n$iUsJr6~DcFuYGe3R8*U!Pu#$elYK{{mQH2&Qk@d>@>IB+z>I#u|TV zmT1trOz(6@uP$xE3 zh>e`n7m=2){ zwaU|3{z4F~heLmAB;}Tt7OndxaSc~KdTAfqx0b3AiRJc+ggtT7>pQDHb=hLL0kK`W zcmQg}>stH@g)|=5;>%b&Ks~A4Hw8if?Vs`;eX6FE; zH)`3N+TOh&F&goo3sn*?(_#!@YJI<0JluG4zA2XZk2mb5%T+1`tu`QGF-MBW(h2_J z20`aDGnAiruiMe<&*&A|KVI>(4pTLPr%FBm17n8I7+Xp$wr~0DbsVnseT-ABEmlsq zuy>_`n_2_}gkQdoQu)aF66ENcAX;9!k$|deZHtFC=27pYcEOA2L(6zKG1c@q3T~o_ zL!MlIFoi(KQx`u;MCu?6{4BCrYei4n1sg#F)L|SNe@J(kUG8AgKA?>Kh5RpA<*a2d zgfMviKXqOYFM&uXzYA43!G`u7)?s~Mg#bZz($+Q1@gmQ>kMmz>PApYJtDy!>T6B)^VOkzcP zc6OFd{O8>V4#;q5OY7>a&>Fwn&A~%i;otmrHzwHr^=!*W&1P78|GKw$FoL)Tiyjf* zZgdLoJG}oZ;!HX^f26z1Kg(YS%PeS*zw%}iB(w8`=RT%$7o*qW*Pc6#PG|GZT?9Uz zH?3JUhdU?Br!DkXc57x4^9Lwo2pQTvVD=p&I`hhpux=$xiG^&PG2kDImtmJ1C3b5O zPl!kD>d69h$cHkN?AGeAa<>LtcV|S@`CM+U+y&BxMnutO7}J0S5I5BxW;y-dZ8^7e zwdz8*KBFmZR5XS6$6z=4pkRZPs>0Nro-ms!zCP+V$IX~*%!c?1z6u_;Qws42F~|4S45Ow!AjWcfO7*&KiZ zKRsJE=ed2VMy}4yqff#J_JyxLGtd8ac0;S?;o| zwciZOI!)ot-oIf}&1Zh)H#0rpoH` z6CTLe6Be1AQTD>_4>I@=V6md-At}{fkMG8Tg5*fX`Ci$in2PCi|1pz3H7IvHUnQs_ zMx=O?HHv>=Y{e9*RkEgmzMjC)YtcXNvi#+KOc@ELW!=0Ipw(_y(QK$DTNahmo-DHQ z*Qd^Mq*lS=vzZiKey)rX+i_mIEQ%AskLk((PPVMYHB{YEbBM~~BB~ZJeo?%|m^%)6r1`e~Id4o*ua5gQ=+XWz2 zQVN+|>dCkuKWu99srOow;?3j%>qEW)I~ksYQ{hBlu#LWcINe9FkRy${yE^xocrx7{ zEuhD6d({5L?2T2OrIAd_rSK^2pHHsA?6&J@TIIx`#|oPTZLN80uRI-g&KlZ$CBGi) zy`t9~%JYTfZdHl6#Ye>30ByLVr7?i`8Jy&;>1$e48Hu$xL*5zjaBy5@4ytkjplOAs zqM7_-tlo3(d(%%XtBlM8TII9TJXoT{ltk0n7@aL;7TZ5qkt7dW&B*u<;&a#Pn5S@q zhhWXrWr!C_T^_WK?UEutL@12^@vA=L_(|kJ3+HtJc3`Pirc7(t{>5>?oXpjHTU@|F zSHSaIz@Yc@kUn(_T|2>^#}%~2BuWT#B-92})lRB83m2Yg`c>p4UJW~Y#axc;qqR0R z{ST*m0K`Kc17lE97UAH_t#Jt=BVB1z44|2Bgw4{U6|(NmOC>hO;2F-nHI+vvHMY>k=PS6jK=raGUWE46#S z4&(?N0~X&zFhBh)7;zuvdp5dL+|zhmx3}EoEqdX_b?v_5Qxu9t%>mB)N14^Ur2Dp* zPPSA~={u~b(r(ews;0Vx<`Rk?qE)w0fZ2%Gws7_)^NGjj^nQ@(bwg1nN%mSF({so% z<)uVEnD5d{C25BM)!}T)9wv>X{C>Lfv`|HAjgpt1-fGw5p1xt16B5lVa%Vvi2P>F^ z2iOoWtPzv{7X{f}K-O@2H$eZdg561V(&ptQmxiom>?64>ox`|&G|%zxc?{caY@=&C zo>@aOQT$geh$?1kvs>fB=?;`0hPAK>;4r*_r9JrN9wsWJ_s3OW^TD4X?lb3C!1Kj` zm`OyR2+?^=~|2^Y>P&a24SYpSlCka-zj07z# zbE@?t(mz02ayHpJYX2_fBtWEa*kW_0xMxf}TX$|jXX%70jFr1m1=J$NHVEiQmJeQS zyd!%OrHy_KR@9=OKn%8iCdY^>y|%c>oMiaGhB&Z$Z$_VRmXk$uRnUL6H=|3Eys8Ko zvq4)e;BxIce+iF$ppGziixV|dR3)k@pC2ew38k86yokR|7h}jVYS&$D=jR|mSP8mv z*yoSR-5FLs@%qD4;4ieG_atDAAfR97?1JV{NbX`E2vsV7VUFh0EEaB5mAZ>4wP%cc zm#nWgi;In2`jSJ_aR*{WT2q?0J$R?%kN0DNvvc9)`HuG@UAKsdFL{q;c&U;6^uwZL zQe#F&r`QW}@W8(2}r#o;h})Uo_b|B4Oy8P@oiu75&yyMaGaqh- z&UI(uPCW2klGgP8$CzgU)AS?DJ*NzHo%?$kHG>CpBZ^`PV&!H(=kjw|@F1;D^^tuwli&F7rROjZ64Pj#1BC`wOfePZY zp{4I>KI>sHBSE`UHdCMH18|0o30 z$WThu?z89d657HPS=WMeyoJtRO_Y{OvGyGjV3~Z@DZZe(eeY8-0T8(pPfS#O!*>GE zltU0I_EP9CJb7{-kTqKALIqvr+s}f9@!cB&pWStb=TFJEW?EIXMYLo*zpWxK_wN4z zro3bUj0X4@&M3~znWf$jVv6ZSW035N-8Ui`$YrE8XtBO@(F;3PDEry6`O?Bi?{{a# zdF3Tb_K?S&bm`x)o%$^E0sV=q$~NcX=e-s=tYRw{StTDZCU>;lnp*B;>*~hkSxE{A zpEt<*11H*b5g3|y3n;l^MYXi}QN!b4Iv?YC`iqP|vq(q9A(K7sL=8JSWJ|`4TNCpE ziWtQ}{|Ga?@|!(ExB$e8Lamlgl?$Ly5s4z(@3Gi9O5R6J^41+@%b~P4=vdGR8##Wz zao)@3xRmhZk5b(}-$&Gahbj=(P{!yjpVocUaB3C<`riouX9BdYgbbX6Jj2SGikgH_ z_Pg47{1T+eiF)gl6xjNril&0>Yt*1Z&D_twZH30SWK36PjtbAWM9r4%+=i%i50*%E zh;hbKup6hqj#&Qp+`r%IT|yqSfydjkR`QrR{w1HU9y#%T$$eCgRy&(XA0R_UAm@*f z?C(;tnRX`rc+|Q|4>8-wIn@<+=y|jJYFdE}v95pLJVqlo9^DxL4^~LIc)x*QbI*?( zmvpdN{sr~tQM&pcO$3}=Np7JIjZx!njB9b)OwulQ5nDV(#`7S=6C=iPL8Yui`L|J- ziC0)v$vzCmfDojOOd@p`iHLnrV(GMFoKLTM$wEnq5bI#Q9IQ(h@?W$+SX{P?cq`g# zLaXTeATVOzLkikr81=vDw${IO9dQpYdYpYZ(RFQSH&@Fy5jk|Mmov`9h#y&rQW@u}_3zNq##dW-d4t@sQ+h8u+I6mLGDj;tkMC~y)ZN;y$ASEKkr76VDv4%lyjR&E z(sNdIzrYTkL8adPm?zt7W2-4k9DL&uQvayozVo5^?teMIHGE*=ZNpTP5aH)xRJrbP zzE)DUo--tsGbBpjh|xK(l+=`Bnfkr~!-}5IB3bh|`l-Ls|3P*$2^@rzq~GXcNzc7k z5MVsmAhwSW>hmxig?=#CcMz!=Gr+A2iYr?KzrJqjQOvF>Tdj-Z|=A0VnW)^J$ovAchj!PR(-I1mlt(7^V2v$-+8Z6 zGG6*v;W`R)xVXU_@W=iDbHj^yBIAnWp(q55BZNIjOjZA_B~Uh1B%D19F8Kt^Hkcpy zL{<3ZJVfb5ZYj-~vuU4i00F3wzZ*{jy9N2yM!bI%QA!+JO+9a%K_90IzNB0ZC6MiR z_5#+UQ3ATTJ;;V<2NkH1F)63I!b_xKvs})a>~^B`Xt7#Xqt)ZLjV$i{p$dmrR#sBIr$vMoEssi+uMB`K3?T)WZS@*jt9}%$kpfd$3*Gd7+?pgY+ z4>*XZEIG@y86pRVtoGh2M+YXkIIegAuJtC1Y`npQxGT{uNxBbaIdE z&#@`>F+-^(79VN6qm!kTRkXmcUJ73JhijJ<8?UoY~92ak9(^*L+@VHH7$nJy6btfid|1O-$bkDDc|D6L$GTPTpEucTG-o=$bRaspPaN&q}jORhA+rBaI9k}Wl887_gI5KO5 zNWplb!JN5rDyL>&xoi&vXqXbIM@i)qDR;HP`sw(R z6e9Sq`;GhWW~j0!>8+_;M|d@kpjJOGeZW2}47x5r9V3@>RdewibG8{uCVSDqX4#Ff zqY91W)_Vp&2-(WN=#^*0iKHL86a+v%{L9+Z_vy;dNUQw~xPXTxNT#i9vhXUZq#oE)_a>+>A*scRZRJe!lt zLH?t)?2dZ>i#_FzbojfR9Idf6kBAVdw=6P)1gx702%Dzru%5Os zzNn5xO|`3fKmFWk^nt4@y2`U<(sy9T%&HY7z07&j49)CL|2qPtcmLiYtgI2F(-mfYr*Cq?47Qzk$^IjL0W;;T zO7?#FzIluBQeRT4yfAMtS=}gOhH+99TLHk?qS>8^ah|uT!H+njPuD``u7%93ywqI) ziU29{+VNnLpNv)z1oX?@RG`(`JoQ$EBR0auo zDx~T}rW=vfL>zhg8;@#4#$GBh1aW}3v++=XmSk5JCH7icqH?Aw%(pg1)J%RFPn^e! zNxC)+yr5^?*$>J=mar!v_f;3fbQw?TkGD;<3; zuHYEt2^^19dkO(NXs~+a0c)(mn%dgB32zV+t_@^Z6c!0J^$z(~hO#H&p>U zFMfKKb1t`qSw2$YBGt*B=>@HW39+tIMu~%8$-4RFj~E{Q-}7yeeIHAa5$wb70{!*O-8~2#ZXxv7sq197;KQc2PzE7Pr$;eM9P`+&mXNikRskf z00*_55QuU5tq;Pl=bU{Fe1~$-tixdWg|pug6?VHyoeyiv{Fc&*B{vJ`g*Ua3D+_7% zem*B*ZzY1DH|0>9Klg8(mn_j}6vnyX0l#@oZ3`0zk@8nE*^*L*XpQG#H+jiK5F87! zw}txuKHTt;sLC7`o}cePkC5FuO5c6jPpCRQ!Pk25ptvo1sp<{kpt>icNRcH2KgHqxHm6C=zYwG%9=-I*qllOVmg3!E9)0BLpHZP#sJE;bve zPqXT_yRpusK%+&E0Gq;|nC63xOfUu0pNs0W(AZL!>lyskn}AEzV=Xz1>jvx10l5~0 zLa~|rHpgwGXrXtp<;kC?RvGs&o!%!n07QxCw(F&~B5fH;xg#N2t|MX!5He}N!+k22 zt~kvdni!ZuK@nLkV)%tqQ?(?TJEb&_{i6`wOp_Pc_ZH@#XC9U3yOTyEXNjYp`T}R{ zHJwq&`%j9VcDn>KO6;0Y{O=VOf>+eX9f77_Yxnzx?l|M7z*uNPFTHLZXb(k| zO@iGdR#e9Gyp>+7ViW2d8c(}Fn(CxJg5c20^Kh2Dzr)8(T96@OiC+enuBpXcx{+(v z67nby+|;#$Kms8e$_j>S``2Y{e4ED%kZZu1S|&B$1fF#~CaV6!;VNj&=hGzvwHrC? z-<^-&jQp->Jx86s$!-<&zg|YGS;SU%iP*)#GUft9-{Mf{i--Lp=Fx<}^UG;s$Avk7 zx-nRG_!+rp9|SRW7m0{C(_a6yM-QZh^tOoeRj&}1dK^b(Zy~+U+A4A1IR6Vyd@zYduX6O zo?Dr@ImF657Qg2Gu_}zdFxQ<7vCBjmuxlDHlPTxfdEM@Vk?=xp!y)yC)2Gu|^}cnJ zVSjrRn=gl*TW^a$OBY#I#{Z`zo}9oX?BH&aU=dz{HF zYJ@}R;-aa{&B;?w>HGh4mm?!(_xJqPzr7oMe9mSjs7L+CT+cx6yal56?r!q|9a_(|Xx%R_?zLNZcJE=9^mMv=u{{POO zrnRn|UT9%pBuZM zPOt2ODJFhNHnhaW#gQrN$MWWQQ%X25)X&?2ebfJa+@A05BQ2{wuXPVRja;MG0CP(m zz@-}&X4QQc)Ut&m%E9?6}ra zLF0ER0%JM)xkAddfBF>@so#3dR^0tOWclg=srH> z^6>Q7^N{-AvuR;Ng1hJJOvkIc7{aANp#n|f>V03OY)U)k9@bbLrKFyYfvydvX*%74>kbl-rvh&t z7~;W&mf9?#ZyPR>jw~^jjG|1qtuI!=Y(fW~7F@TQ$`;3#k zgu`bRXFI0O#Ct)yo~WKo2#4njX#Q;sE!DIwG!G37s^m1GCu2wIX?s}5;Fb*rT zMNo8(oPV(%g9pKw8}1VW7De~I%#odMpAQ=Q_L8-OOIDi7)-88cm6NFZ*p)0WFcKu` zWb|-O7HvQlPMknXs_?Pl#v0UmhQ?NAA`!pvzXLV~a-n- z040;0Kk3>b?)MvpY~NKESmFPF8ZdCRdQaa#dHHJV5|oI8xT5m5iM?7wp8-K*gdhn$ z`=Z`F_JA!hJ=s?HZ2b4CZ}VTVupqr74D6h2(djIdje?bRa#T63*VL_9k2xdnfXM*; z=Wis7+OBTo0s}5|F@+ztzu0?}aI+`I77G%N-|3-#Lp4vrp#!=lq62#Nan=6_FE4j3 z4e!*S?moB;$W6~#`z$d$(X)a8>)LRO1?XI&4JTNC{=FW(`=cof|Nli}O_YyMqJjDG zj5r4$=uP30f^wy_+*~ZThD;NL?#6QVPzS~@#4}ecrb-YH{jF0VqVKUHnR#)_K$u(7Qj z$rUnw_s}+4GD%p}k*AQhbCiG`VwD@GP-T)Upp~L&72pgqMwy@+<55e@)dQowWo41& z5Ph0>XGcrXEKup*K8XlRZ|Ka@k`r1w04-BnSBC|u@IU>A1=$?UasEVxVeww{oY@3O zPMV-;rxN+&P;$S&O7*^%M~h3$ASgF>fiF39Tt0IIDFKJztL6`No)Ld*ncWf^zkd(O zT5676IYRGeWijvW?TJ?inYI4(S*8Pw@q>0cwA0_l+qC6X# z;rcZB4#cKuP8^&;u&i9cG~v1SZa!L+56nKycsd*CIY(siCs?)mPz|;0z+N{|s9KWrC^&_C4+IjNZi0ievjpa<9S2(G{WmY-z;F57&lkoC zDsQ6tcPrTbe~y$33k_Tj9@@~ZtseIkppLE}>z4p}lGWuQ>;yJD*5>I7{vgXdtf+pPiD zoGn?ODi#7^=ic_c!wzUwq^kVQS4-b7CYLYVuTX89LL~T{k&X0`Y}>;`hd2Sp&O2?# zx#u`fCewI@3V|L z$Ubl0blS%UuIn+u{QUgI(*DgWUsPQHYH^7spRPqKO>hO+=EKEG#9@@KFE+5p%dH@V z93OqAwIv_3AS4p(41Num)C+TqYL2AU<2=Q}j_9 z5KDWxH$X_)l1V|&qL*mf*D2y1C3L$JpYxU1e#?fC?+~j*z`BtC8>(3Kq(9ofg|$ya zd1o4fUTxIwG@=OuNzOALg|J>^1Q=r?axm`KgB5-zS8Sn?mg)@bERJGbB0XQoZ51Nz8UQT%EdmL*&eRnt&?jN@8 z*vAP8*~!cdk#($NbL^AI-ilD!t3On@ z&a*zB`@TQ-=Xq{F^p4q=^O1i1>17R(gvqCu3GytIzT}U=(m(Y-pPrHo0&0)qZ(#g8 z`Km14er{DTl<)U!aUqQ9^Yq7qT5zBGPDhz;NsY<3YG4EZ_%Wr0n; zcWAM*$T+jzCIZXp5Jxm=gCh? z&aFciDXk~jdq3+du%2eevi_=Ayl7$yG={=u_>{;L6 z)*)7(0()0nqvNtWkDB(yJr{W!VsqQvpOYA;vPQ5WAQ0>}T7c9o>#}9w6*hwq8TBM6 z%$zlaxHnbrbt%x;KD zpGxkP$n5pE9|a+>Dz|2!LJdhsda_P?VfGtXKvxOZ{pR^XTaQ?*N;=|nj@kA);2=4O6X@KNh}^a?=>wKIWq)!fCYcDs&l}RouRz(kbMOyi>Z?Gj+Q9Dz zv>ZJoHZ*8i)Ye1*b)!%P@A1ml5h`nA(5WsM@I4;h2FV*-9l#q`(to)+ zJzwBIpZ1B||CHaa#OLUzK7?hCFkoqNq(AZH^z@u3W*YVfY4=;O<|NZKcX6**=aJWk z!b9Qy*Y7F%IWybsX1@`A#{(5ya2IIdr8HijPaw)3bY@NYF!gugh~=J9FfWx7|g>Pn(Z-+9&+BC-%MoujvLRGK^-O831u%{-26mSeh{+$Oy`G6ELilnQI2W}N2Wtw zIjiOUhlwG!>(@sU{w)2=Lb7+CskICRnrAtT&on*Xlp^R59~;*>FB&qtV!GBiqdLU*P)uk@3|T zk~;VKb8>c!u6E)T)7`|TRG#c5-hoLOMa zx?{xVzJi_*jlW+6I08Z6z2- z2zFO(MTvVgX4sX(+)75|62uV~LU0}vu`jv)SI1*jey3RTrz?+PUln!S1&8%_od0x#GX(yp6QIze#-E7U#;b8^&=fbSS2zK30Ige6Xy!rsNq0%II zjiFK*}YkVJ|iTkNwTj))_22QArb`kV;M*iqJmT+mRWYW!cr=dWYs$tstG>x z*pc8|nQ|#_8QQxbl2l75;jfuH1s$F~wH+(h=Qsze-K1Y(;5zNxIOYvTN*n6hEu0Pw z6@1{~?mqneyPU1*RdD!sakr zuF`z(M4uO%E&>`Ueo(Dz-|m3V!iPuKubH)822+U{QVZ?Tq^wNXna29<|D%SMa$Wv8@egn?4-hXMeyx(IX$yr{dr#a; zj@*LtK95`H<9%`>4htBWB#@S-a}S93A4%|NXP)v~zJhoDityW{(grSSmDS(xY8m? zx8^m<#AWkeP;~u~I$37OH!N;qkwV7Wug2a6N1Mu^%5AKJ*UW$S?w*9Cq{dWn&U6G(!b9*(Z&52kxLzLbMIEN3ndE&w zxNBC&y)1;<vizFy z8y1aRJqI=*M>&qa6JEEu2P#_;i0lqjoK8KO865p-2Ja2;F@q6jMl75mXkX}1#fX$#wP^XGS{=JQ&X}$bD@IfcDI0_nX;zDc(B|RGHrn}N)z0W` z*h}ezkkHe~C-r^YKasJM@E?DKIY2trN_4f z4Yo2<(VVZ|z7*b=&^tDJ2dB1%+eh28mO)TUqxUvs+1c3~SYQC=9G1**NZ^wA(+q4^ z)}Gj<*8-#i1qmQz3A%inr|J+Ox5j~4s(rXeLX)k*K%mEMP22^OD?}7#sx+$KnH7pj zH72pomcZ@NNYpHPc00<7J7##}g>}Zop0)sdOtc3zj=KZ#_g_R$1(uavJe@EEfL76v^A*SUJ^ybE`Bye`5f_cC*UA!D+r#rh3 zb1hhuKfjQ{^=?Go+RFdY7*~zzOdX#2AU5ePE{&4t{1fLbe(aTK6)>E^xppje^%W2-PM9G1;YG+{6JY4 z<4C)waA~PQEElm46;8reZLYM4YEEhr03QXaZF#!pq+Xs%e?pS0^@xaxC8`!pHNK$8 zSsnBKSrQW)OFmxtD6F?uh;*q^y;v6QJk2H-{^s%Us|x0>zpJtCIR%_Ta?dbe8l8?A z=F{b-)tsf`OqYU+ii$b;2YiL2w`g*F$(Jnx9qQrIX6)Up3HGeBLfK$V5n_$sA6nB@ zI_uWp6(a9R5WB(vruss6HIc~KrH#7@MYA9E`E0yl(wqI*P`hyb@v+63B5hK%vjaJO zlAKWbH&re%`^xuXGcS|8Ya<|XM@Va}%FCJtv~l1xxyi+7=`V~6-$ z2o#zypn^4eN`^E5SUzjxV7Z(k9^6IHBOld&6E>0au8UmEJ@&Uv9=#|j|wzY8ddgFX-Zr{ zndO7M-^+R2z1EA<)g_Q>J?7*745Cu&dtI}l1TR^mRoXN;lK$me;BuO44csgrrvm&Z$Z{l7Q=AoCw1BjIVfh%*` zyYm}k73*tjPryXY0F-gasQLKt*fR;iZfEbT$fcMx@;mCz1(F=y<~ho)dyBx^37}_a z0rmn%b-e<QWAauV?-LyB6PoHpp{Lx0OY^~<7>ba)D)p#4 zsVu1m-3rFl#i-d45eGhZoW&t*QwprO&>oisCMbRY? zO=MS)W>d@S$PRtB_KBRY$$hOgZ1CD>s4Kr`*LVIP8nfK7QCtI7wB5UF8ykRHP}}-= zc4js0+uJ$iA-T2h8FD7~iI))|2XuSu)Jt49oHB|B3p~0_7>M3kCTN!E_}vQZ_M8dM zFeK^c*i&V*&Y1I^61p5z8#KH=)w=##p4<;%al!dhcKnHKNdZI*!Tb>O$v@(Q9F-pD zw%312yf(7%&mPHKq}L_gs*9ye4c@jHc12e^59fu*Hs3DO>o|m5wI-#dppFV9VF)^HSN(B(I#&i4Ue`9xIC1gcI*ASE zcRj2>6VAPqKLoA3_j!h4_7ChTtCPq|#XCJ=oJGTMurbUj9aW0-*uyQ$i&%ZnU+6Gy zu{1uF95bPiD++K_%gCUsaS8(*xgfdxIC--eAZjvt(c!r{)17<}uD@vfmQ`R)kX3!v zc^Yl{BLN9hq;#dqSHh?Ho&NC;%GZlJ&eV6%Z3h{(D+ zTZ1-&s>V#oE~f5={Fm@j8Z<4j68r6_)~okJU1p~fkCv0PE|jn`1E~*l8qFE_U6)e~ z$Gu5IT|bRuXX}<|tnOSbP-qZ z2v5wvwSC@B-f#JREv(-6i0C5l{SeIr({g5yq-~4;$Ggjs78sjoYi!g1_reV3Sv-8 zcYpfKx1S!5X|ms=0WkfS^(gHTHYmF+iKv5QjfkE6Ih*3tR)v6|Z1(tDo-1lK^w6_mvuU?+)tB&=N(qX3L zyU@QW(KR%@DK_sT3|Q&AV{Of*?qZvj0W(Bd{2OFhJb!Y$CQf61$N^v~8d6c??*}=i zMXmEAE)63$!{gDBM23D~xQHUvjn zvXa%LwC(%!bv;~e#|p`jqH2DjJ8<~xCV_Uo@^f8W6)}|>y<$DyAKuL+CZd_kJJ(k` zO_xX0y*BR;8Dq_9lfLma&LDSK7=-(4tDWg-KTaL24V~sF*Omn~Mcs6rd!_bT(3bpX zO35t#QMBLzfeJ|4@`uO%ALCT&QW4(XT24!n& z+Ypm8c&Y!h}Jy*s5OaUMMF%unWS%_D)k^fzO;uOY{Q2uy{1RI4- zd^cULhXtiLi42J6qy{%;xFxQMx7XhIbk$A2cstFk{Bh4h%tQl(rPGb2Gc9Zf|69jH zj=m1*I)WN=b*xPw(_oI4Jk#mxv$X4-duj;!O23J$W`o4u9yehHz;j^e8rE?bwLI_b zcFy9&&613ryPV{|sLvuUh}W%f#1@cc2DEECmB%JpO-Dzbe?FhP0LWl~i8SU}qM^aq z9kF_`y~n;Id>Y?S0&!7kre6zANw8l!d(&%mQ8s0JJ5G_xPnZ!}i*_=O4BZeLRGQ|h zPU`H!eQ9dWE^Kkq(nBoH4kH@n`5z)Ftr#5C#BkZnYUEZj(#k@y z3?&DN*e)(R*uk!>w&CX(WFKyb+R?8G>GVvJmr~K^vs>U$_EIbrR{#&1%s+3vcq4OS zck%lvV^WKhRDZx=ewevBt!E426WSiu$O6yl21)FzKTKB-{C5Fu)O z2z7As8Yi5M(lb$fZ#aTj%8xkVsSPrH1qoa=aCO};hV(f)quPP%%2J!>=^r&aa-L~uNfP(tzWdy+~Y z*r*LQO}j=xgj~>Gc|9=`d_3pr$FJh-d#b-9t#>Q#=A`;J9Puw+Ux{6J;f!+?{rQq? zC&U5$NaHFT9r49AO9SO7eRZBYa*9k*&h^qMpdQzL?r=M7(goM`x8>atP8OX&tu=22 z6f`Unq5?fR8H1&m@SD~!wIUS?>=0tCd{MsM$Imz}{X0Yo0sR-R{VoTg{V0-zBqmeO z7RwyB*L^mk@{n5RpwDQeo#Y{F5i|(JRlG2v>!`CswVH3vVT5f ImRZhX?S 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 z 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

    K!};ekd<09aM!so(^1BNLazI8!k2p@UESK+M^{ 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

    ORkqKE=C&Eos`_QEf^k|HS5IHA|LUjeweb#Ax} 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

    *G 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