From 6127447609d9b900249a20721fdf00448bc52f07 Mon Sep 17 00:00:00 2001 From: Ranajit Roy Date: Wed, 24 Apr 2024 17:10:11 -0600 Subject: [PATCH 01/18] updated data collector to collect for a month --- flask-data-gatherer/src/flask_data_gatherer.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/flask-data-gatherer/src/flask_data_gatherer.py b/flask-data-gatherer/src/flask_data_gatherer.py index 0ef6d51..07219df 100644 --- a/flask-data-gatherer/src/flask_data_gatherer.py +++ b/flask-data-gatherer/src/flask_data_gatherer.py @@ -3,6 +3,9 @@ import requests import jsonpickle import os +import time +from datetime import datetime +from dateutil.relativedelta import relativedelta import logging logging.basicConfig(level=logging.DEBUG) @@ -42,6 +45,7 @@ def db_setup(): table_creation_script = "CREATE TABLE IF NOT EXISTS `crime` (OBJECTID int NOT NULL UNIQUE, INCIDENT_ID double, OFFENSE_ID varchar(20), OFFENSE_CODE varchar(4), OFFENSE_CODE_EXTENSION int, OFFENSE_TYPE_ID varchar(30), OFFENSE_CATEGORY_ID varchar(30), FIRST_OCCURRENCE_DATE long, LAST_OCCURRENCE_DATE long, REPORTED_DATE long, INCIDENT_ADDRESS varchar(100), GEO_X double, GEO_Y double, GEO_LON double, GEO_LAT double, DISTRICT_ID varchar(3), PRECINCT_ID varchar(4), NEIGHBORHOOD_ID varchar(100), IS_CRIME int, IS_TRAFFIC int, VICTIM_COUNT double, PRIMARY KEY (`OBJECTID`));" cursor.execute(table_creation_script) + cursor.execute("DELETE FROM crime") cursor.execute('SELECT COUNT(*) FROM crime') count = cursor.fetchall() if (count[0][0] == 0): @@ -50,16 +54,21 @@ def db_setup(): app.logger.info("Pull Data from API") # TODO: decide the minimum number of rows we want in the table. Minimized due to space in Cloud SQL server - init_num = 10 + init_num = 10000 - newest = f"https://services1.arcgis.com/zdB7qR0BtYrg0Xpl/ArcGIS/rest/services/ODC_CRIME_OFFENSES_P/FeatureServer/324/query?where=OBJECTID%3E%3D0&objectIds=&time=&geometry=&geometryType=esriGeometryEnvelope&inSR=&spatialRel=esriSpatialRelIntersects&resultType=standard&distance=0.0&units=esriSRUnit_Meter&relationParam=&returnGeodetic=false&outFields=OBJECTID%2C+INCIDENT_ID%2C+OFFENSE_ID%2C+OFFENSE_CODE%2C+OFFENSE_CODE_EXTENSION%2C+OFFENSE_TYPE_ID%2C+OFFENSE_CATEGORY_ID%2C+FIRST_OCCURRENCE_DATE%2C+LAST_OCCURRENCE_DATE%2C+REPORTED_DATE%2C+INCIDENT_ADDRESS%2C+GEO_X%2C+GEO_Y%2C+GEO_LON%2C+GEO_LAT%2C+DISTRICT_ID%2C+PRECINCT_ID%2C+NEIGHBORHOOD_ID%2C+IS_CRIME%2C+IS_TRAFFIC%2C+VICTIM_COUNT&returnGeometry=false&featureEncoding=esriDefault&multipatchOption=xyFootprint&maxAllowableOffset=&geometryPrecision=&outSR=&defaultSR=&datumTransformation=&applyVCSProjection=false&returnIdsOnly=false&returnUniqueIdsOnly=false&returnCountOnly=false&returnExtentOnly=false&returnQueryGeometry=false&returnDistinctValues=false&cacheHint=false&orderByFields=OBJECTID+desc&groupByFieldsForStatistics=&outStatistics=&having=&resultOffset=&resultRecordCount={init_num}&returnZ=false&returnM=false&returnExceededLimitFeatures=true&quantizationParameters=&sqlFormat=standard&f=pjson&token=" + newest = f"https://services1.arcgis.com/zdB7qR0BtYrg0Xpl/ArcGIS/rest/services/ODC_CRIME_OFFENSES_P/FeatureServer/324/query?where=OBJECTID%3E%3D0&objectIds=&time=&geometry=&geometryType=esriGeometryEnvelope&inSR=&spatialRel=esriSpatialRelIntersects&resultType=standard&distance=0.0&units=esriSRUnit_Meter&relationParam=&returnGeodetic=false&outFields=OBJECTID%2C+INCIDENT_ID%2C+OFFENSE_ID%2C+OFFENSE_CODE%2C+OFFENSE_CODE_EXTENSION%2C+OFFENSE_TYPE_ID%2C+OFFENSE_CATEGORY_ID%2C+FIRST_OCCURRENCE_DATE%2C+LAST_OCCURRENCE_DATE%2C+REPORTED_DATE%2C+INCIDENT_ADDRESS%2C+GEO_X%2C+GEO_Y%2C+GEO_LON%2C+GEO_LAT%2C+DISTRICT_ID%2C+PRECINCT_ID%2C+NEIGHBORHOOD_ID%2C+IS_CRIME%2C+IS_TRAFFIC%2C+VICTIM_COUNT&returnGeometry=false&featureEncoding=esriDefault&multipatchOption=xyFootprint&maxAllowableOffset=&geometryPrecision=&outSR=&defaultSR=&datumTransformation=&applyVCSProjection=false&returnIdsOnly=false&returnUniqueIdsOnly=false&returnCountOnly=false&returnExtentOnly=false&returnQueryGeometry=false&returnDistinctValues=false&cacheHint=false&orderByFields=REPORTED_DATE+desc&groupByFieldsForStatistics=&outStatistics=&having=&resultOffset=&resultRecordCount={init_num}&returnZ=false&returnM=false&returnExceededLimitFeatures=true&quantizationParameters=&sqlFormat=standard&f=pjson&token=" r = requests.post(newest) data = r.json() - + values = [] entries = data['features'] + timeToFilter = datetime.today() - relativedelta(months=1) + reportedDateFilter = int(time.mktime(timeToFilter.timetuple()) * 1000) + for row in entries: + if(row["attributes"]["REPORTED_DATE"] < reportedDateFilter): + continue rowdata = list(row["attributes"].values()) value = "(" From fc804399e0e94326ea8238ccf334145a315f3b7c Mon Sep 17 00:00:00 2001 From: Ranajit Roy Date: Wed, 24 Apr 2024 17:17:21 -0600 Subject: [PATCH 02/18] updated data collector to collect previous 30 days --- flask-data-gatherer/src/flask_data_gatherer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/flask-data-gatherer/src/flask_data_gatherer.py b/flask-data-gatherer/src/flask_data_gatherer.py index 07219df..15e909c 100644 --- a/flask-data-gatherer/src/flask_data_gatherer.py +++ b/flask-data-gatherer/src/flask_data_gatherer.py @@ -63,9 +63,9 @@ def db_setup(): values = [] entries = data['features'] - timeToFilter = datetime.today() - relativedelta(months=1) + timeToFilter = datetime.today().replace(hour=0, minute=0, second=0, microsecond=0) - relativedelta(days=30) reportedDateFilter = int(time.mktime(timeToFilter.timetuple()) * 1000) - + print(reportedDateFilter) for row in entries: if(row["attributes"]["REPORTED_DATE"] < reportedDateFilter): continue From d2a13c8a22c15df35af503383d5414542a507e9e Mon Sep 17 00:00:00 2001 From: Ranajit Roy Date: Thu, 25 Apr 2024 00:00:10 -0600 Subject: [PATCH 03/18] data collector collects crimes for last 30 days --- flask-data-gatherer/src/flask_data_gatherer.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/flask-data-gatherer/src/flask_data_gatherer.py b/flask-data-gatherer/src/flask_data_gatherer.py index 15e909c..a32e27c 100644 --- a/flask-data-gatherer/src/flask_data_gatherer.py +++ b/flask-data-gatherer/src/flask_data_gatherer.py @@ -42,7 +42,7 @@ def db_setup(): if (len(tables) == 0 or 'crime' not in tables[0]): app.logger.info("Recreate crime table") - table_creation_script = "CREATE TABLE IF NOT EXISTS `crime` (OBJECTID int NOT NULL UNIQUE, INCIDENT_ID double, OFFENSE_ID varchar(20), OFFENSE_CODE varchar(4), OFFENSE_CODE_EXTENSION int, OFFENSE_TYPE_ID varchar(30), OFFENSE_CATEGORY_ID varchar(30), FIRST_OCCURRENCE_DATE long, LAST_OCCURRENCE_DATE long, REPORTED_DATE long, INCIDENT_ADDRESS varchar(100), GEO_X double, GEO_Y double, GEO_LON double, GEO_LAT double, DISTRICT_ID varchar(3), PRECINCT_ID varchar(4), NEIGHBORHOOD_ID varchar(100), IS_CRIME int, IS_TRAFFIC int, VICTIM_COUNT double, PRIMARY KEY (`OBJECTID`));" + table_creation_script = "CREATE TABLE IF NOT EXISTS `crime` (OBJECTID int NOT NULL UNIQUE, INCIDENT_ID double, OFFENSE_ID varchar(20), OFFENSE_CODE varchar(4), OFFENSE_CODE_EXTENSION int, OFFENSE_TYPE_ID varchar(30), OFFENSE_CATEGORY_ID varchar(30), FIRST_OCCURRENCE_DATE long, LAST_OCCURRENCE_DATE long, REPORTED_DATE BIGINT NOT NULL, INCIDENT_ADDRESS varchar(100), GEO_X double, GEO_Y double, GEO_LON double, GEO_LAT double, DISTRICT_ID varchar(3), PRECINCT_ID varchar(4), NEIGHBORHOOD_ID varchar(100), IS_CRIME int, IS_TRAFFIC int, VICTIM_COUNT double, PRIMARY KEY (`OBJECTID`));" cursor.execute(table_creation_script) cursor.execute("DELETE FROM crime") @@ -67,6 +67,8 @@ def db_setup(): reportedDateFilter = int(time.mktime(timeToFilter.timetuple()) * 1000) print(reportedDateFilter) for row in entries: + if(row["attributes"]["REPORTED_DATE"] is None): + continue if(row["attributes"]["REPORTED_DATE"] < reportedDateFilter): continue rowdata = list(row["attributes"].values()) From a6a7f61f81e34fffcec91b00072e657d5b470fe0 Mon Sep 17 00:00:00 2001 From: Ranajit Roy Date: Thu, 25 Apr 2024 00:00:20 -0600 Subject: [PATCH 04/18] added a new query for last 30 days crimes --- flask-backend/src/flask_server.py | 60 ++++++++++++++++++++++++++++--- 1 file changed, 56 insertions(+), 4 deletions(-) diff --git a/flask-backend/src/flask_server.py b/flask-backend/src/flask_server.py index c147c7a..1039c39 100644 --- a/flask-backend/src/flask_server.py +++ b/flask-backend/src/flask_server.py @@ -1,7 +1,11 @@ +from functools import cmp_to_key from flask import Flask, request, Response from flask_cors import CORS import jsonpickle import os +import time +from datetime import datetime +from dateutil.relativedelta import relativedelta import logging logging.basicConfig(level=logging.DEBUG) @@ -49,7 +53,7 @@ def health(): 'data' : True } except Exception as error: - response = { + response = { 'error' : error } status = 500 @@ -71,6 +75,54 @@ def multiply(x, y): response_pickled = jsonpickle.encode(response) return Response(response=response_pickled, status=status, mimetype='application/json') + @app.route('/api/crime_freq', methods=["GET"]) + def get_crime_freq(): + status = 200 + try: + cursor = mydb.cursor() + timeToFilter = datetime.today().replace(hour=0, minute=0, second=0, microsecond=0) - relativedelta(days=29) + reportedDateFilter = int(time.mktime(timeToFilter.timetuple()) * 1000) + cursor.execute(f"select floor((REPORTED_DATE - {reportedDateFilter}) / 86400000) as day, count(*) as crimes_reported from crime group by 1") + raw_data = cursor.fetchall() + row_headers = [x[0] for x in cursor.description] + print(row_headers) + json_data = [] + + for r in raw_data: + if(int(r[0]) < 0): + continue + json_data.append({ + 'day': int(r[0]), + 'crimes': r[1] + }) + + added_json_data = [] + for i in range(0,30): + found = False + for r in json_data: + if i == r['day']: + found = True + break + if not found: + added_json_data.append({ + 'day': i, + 'crimes': 0 + }) + json_data = json_data + added_json_data + json_data = sorted(json_data, key=cmp_to_key(lambda x1, x2: x1['day'] - x2['day'])) + response = { + 'data' : json_data + } + + print(response) + except Exception as error: + response = { + 'error' : error + } + status = 500 + response_pickled = jsonpickle.encode(response) + return Response(response=response_pickled, status=status, mimetype='application/json') + @app.route('/api/crime_totals', methods=["GET"]) def get_crime_totals(): status = 200 @@ -101,7 +153,6 @@ def get_crime_totals(): status = 500 response_pickled = jsonpickle.encode(response) return Response(response=response_pickled, status=status, mimetype='application/json') - @app.route('/api/alldata', methods=["GET"]) def get_all(): @@ -119,8 +170,9 @@ def get_all(): endTime = int(request.args["endTime"]) print("reached") cursor = mydb.cursor() - print(f"SELECT * FROM crime WHERE FIRST_OCCURRENCE_DATE < {endTime} AND FIRST_OCCURRENCE_DATE > {startTime} ORDER BY (POWER(GEO_LAT-{lat}, 2)+POWER(GEO_LON-{long}, 2)) LIMIT {pagesize} OFFSET {(pageno-1)*pagesize}") - cursor.execute(f"SELECT * FROM crime WHERE FIRST_OCCURRENCE_DATE < {endTime} AND FIRST_OCCURRENCE_DATE > {startTime} ORDER BY (POWER(GEO_LAT-{lat}, 2)+POWER(GEO_LON-{long}, 2)) LIMIT {pagesize} OFFSET {(pageno-1)*pagesize}") + queryToExecute = f"SELECT * FROM crime WHERE REPORTED_DATE < {endTime} AND REPORTED_DATE > {startTime} ORDER BY (POWER(GEO_LAT-{lat}, 2)+POWER(GEO_LON-{long}, 2)) LIMIT {pagesize} OFFSET {(pageno-1)*pagesize}" + print(queryToExecute) + cursor.execute(queryToExecute) raw_data = cursor.fetchall() row_headers = [x[0] for x in cursor.description] print(row_headers) From 39387de9275dfad3ca1f28cffa5677db3a22a437 Mon Sep 17 00:00:00 2001 From: Ranajit Roy Date: Thu, 25 Apr 2024 00:01:00 -0600 Subject: [PATCH 05/18] Maps modified --- react-frontend/src/search/map-section/MapSection.tsx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/react-frontend/src/search/map-section/MapSection.tsx b/react-frontend/src/search/map-section/MapSection.tsx index aef4750..f501175 100644 --- a/react-frontend/src/search/map-section/MapSection.tsx +++ b/react-frontend/src/search/map-section/MapSection.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useRef } from "react"; +import React from "react"; import { MapContainer, Marker, Popup, TileLayer, useMap, useMapEvents } from "react-leaflet"; import dropIconImg from "../../assets/location-pin.png" import crimeIconImg from "../../assets/crime-pin.png" @@ -23,7 +23,7 @@ const MapSection = (props: GlobalStateProps) => { }) const HandleMapClick = () => { - const mapEvents = useMapEvents({ + useMapEvents({ click: (e) => { props.setGlobalState((prev)=> { return { @@ -92,7 +92,11 @@ const MapSection = (props: GlobalStateProps) => { { props.globalState.crimeList.data.map((item) => { - return + return + +

{item["OFFENSE_TYPE_ID"]}

+
+
}) } From fe014a8ce588f02a2850e730980806dedae1e530 Mon Sep 17 00:00:00 2001 From: Ranajit Roy Date: Thu, 25 Apr 2024 00:01:10 -0600 Subject: [PATCH 06/18] Header added --- react-frontend/src/App.css | 1 - react-frontend/src/App.tsx | 2 ++ react-frontend/src/Header.css | 21 +++++++++++++++++++++ react-frontend/src/Header.tsx | 11 +++++++++-- react-frontend/src/analytics/Analytics.tsx | 7 +++++++ react-frontend/src/index.css | 9 +++------ 6 files changed, 42 insertions(+), 9 deletions(-) create mode 100644 react-frontend/src/Header.css create mode 100644 react-frontend/src/analytics/Analytics.tsx diff --git a/react-frontend/src/App.css b/react-frontend/src/App.css index 4e4b0a9..9cb2734 100644 --- a/react-frontend/src/App.css +++ b/react-frontend/src/App.css @@ -1,7 +1,6 @@ .App { width: 80vw; max-width: 1800px; - background-color: #2e2222; display: flex; flex-direction: column; justify-content: center; diff --git a/react-frontend/src/App.tsx b/react-frontend/src/App.tsx index bf2dcea..d8e49d6 100644 --- a/react-frontend/src/App.tsx +++ b/react-frontend/src/App.tsx @@ -2,6 +2,7 @@ import React, { useState } from 'react'; import './App.css'; import Search from './search/Search'; import { GlobalState } from './types'; +import Header from './Header'; function App() { @@ -25,6 +26,7 @@ function App() { return (
+
); diff --git a/react-frontend/src/Header.css b/react-frontend/src/Header.css new file mode 100644 index 0000000..1651b0b --- /dev/null +++ b/react-frontend/src/Header.css @@ -0,0 +1,21 @@ +#navbar { + display: flex; + align-items: center; + justify-content: center; +} + +.navbutton { + margin: 0 10px; + padding: 10px 10px; + cursor: pointer; + transition: ease-in 100ms; +} + +input[type=radio] + label.navbutton { + font-weight: 400; + border-bottom: #00000000 2px solid; +} +input[type=radio]:checked + label.navbutton { + font-weight: 900; + border-bottom: var(--font-default-color) 2px solid; +} \ No newline at end of file diff --git a/react-frontend/src/Header.tsx b/react-frontend/src/Header.tsx index 4e796b7..ee10d4a 100644 --- a/react-frontend/src/Header.tsx +++ b/react-frontend/src/Header.tsx @@ -1,10 +1,17 @@ import React from "react"; +import "./Header.css" + const Header = () => { return ( ); } diff --git a/react-frontend/src/analytics/Analytics.tsx b/react-frontend/src/analytics/Analytics.tsx new file mode 100644 index 0000000..a9bdaed --- /dev/null +++ b/react-frontend/src/analytics/Analytics.tsx @@ -0,0 +1,7 @@ +const Analytics = () => { + return
+ +
+} + +export default Analytics; \ No newline at end of file diff --git a/react-frontend/src/index.css b/react-frontend/src/index.css index 5faca70..cf01c45 100644 --- a/react-frontend/src/index.css +++ b/react-frontend/src/index.css @@ -3,6 +3,8 @@ justify-content: center; align-items: stretch; font-size: 20px; + --font-default-color: #fff4f0; + color: var(--font-default-color); } body { @@ -12,12 +14,7 @@ body { sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; - background: - linear-gradient(63deg, #999 23%, transparent 23%) 7px 0, - linear-gradient(63deg, transparent 74%, #999 78%), - linear-gradient(63deg, transparent 34%, #999 38%, #999 58%, transparent 62%), - #444; - background-size: 16px 48px; + background-color: #2b2a2a; } code { From d6eb73c4e951bc3c246dee71b9aeb14c32d0cc74 Mon Sep 17 00:00:00 2001 From: Ranajit Roy Date: Thu, 25 Apr 2024 00:01:20 -0600 Subject: [PATCH 07/18] CrimeList updated --- react-frontend/src/search/list-section/CrimeListSection.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/react-frontend/src/search/list-section/CrimeListSection.tsx b/react-frontend/src/search/list-section/CrimeListSection.tsx index 9f8e9ad..ad578af 100644 --- a/react-frontend/src/search/list-section/CrimeListSection.tsx +++ b/react-frontend/src/search/list-section/CrimeListSection.tsx @@ -9,7 +9,7 @@ const CrimeListSection = (props: GlobalStateProps) => { Offense Type Incident Address - First Occurrence + Reported Crime? Traffic? Victims @@ -20,7 +20,7 @@ const CrimeListSection = (props: GlobalStateProps) => { {item["OFFENSE_TYPE_ID"]} {item["INCIDENT_ADDRESS"]} - {new Date(parseInt(item["FIRST_OCCURRENCE_DATE"])).toLocaleDateString()} + {new Date(parseInt(item["REPORTED_DATE"])).toLocaleDateString()} {item["IS_CRIME"]} {item["IS_TRAFFIC"]} {item["VICTIM_COUNT"]} From 6c20188c4052d85af705ea125206ec82aa1e1a73 Mon Sep 17 00:00:00 2001 From: Ranajit Roy Date: Thu, 25 Apr 2024 00:02:00 -0600 Subject: [PATCH 08/18] Section transition added --- react-frontend/src/App.css | 28 +++++++++++++++++++++- react-frontend/src/App.tsx | 9 +++++-- react-frontend/src/Header.css | 4 ++-- react-frontend/src/Header.tsx | 18 ++++++++++---- react-frontend/src/analytics/Analytics.tsx | 10 +++++--- react-frontend/src/index.css | 4 +++- react-frontend/src/search/Search.tsx | 2 +- react-frontend/src/types.ts | 1 + 8 files changed, 62 insertions(+), 14 deletions(-) diff --git a/react-frontend/src/App.css b/react-frontend/src/App.css index 9cb2734..06a23f5 100644 --- a/react-frontend/src/App.css +++ b/react-frontend/src/App.css @@ -3,6 +3,32 @@ max-width: 1800px; display: flex; flex-direction: column; - justify-content: center; + justify-content: start; min-height: 100vh; } + +#SectionContainer { + position: relative; + display: flex; + justify-content: center; +} + +#search-div { + position: absolute; + opacity: 0%; + transform: translateX(-100%); + transition: ease-out 300ms; +} + +#analytics-div { + position: absolute; + opacity: 0%; + transform: translateX(100%); + transition: ease-out 300ms; +} + +#search-div.sectionactive, #analytics-div.sectionactive { + opacity: 100%; + transform: translateX(0%); + transition: ease-in 300ms; +} \ No newline at end of file diff --git a/react-frontend/src/App.tsx b/react-frontend/src/App.tsx index d8e49d6..84e9e69 100644 --- a/react-frontend/src/App.tsx +++ b/react-frontend/src/App.tsx @@ -3,11 +3,13 @@ import './App.css'; import Search from './search/Search'; import { GlobalState } from './types'; import Header from './Header'; +import Analytics from './analytics/Analytics'; function App() { const [globalState, setGlobalState] = useState({ + active: "search", filters: { long: -105.2668960437206, lat: 40.00943069669764, @@ -26,8 +28,11 @@ function App() { return (
-
- +
+
+ + +
); } diff --git a/react-frontend/src/Header.css b/react-frontend/src/Header.css index 1651b0b..196d181 100644 --- a/react-frontend/src/Header.css +++ b/react-frontend/src/Header.css @@ -13,9 +13,9 @@ input[type=radio] + label.navbutton { font-weight: 400; - border-bottom: #00000000 2px solid; + border-bottom: #00000000 4px solid; } input[type=radio]:checked + label.navbutton { font-weight: 900; - border-bottom: var(--font-default-color) 2px solid; + border-bottom: var(--accent-color) 4px solid; } \ No newline at end of file diff --git a/react-frontend/src/Header.tsx b/react-frontend/src/Header.tsx index ee10d4a..50b8aec 100644 --- a/react-frontend/src/Header.tsx +++ b/react-frontend/src/Header.tsx @@ -1,15 +1,25 @@ -import React from "react"; +import React, { ChangeEvent } from "react"; import "./Header.css" +import { GlobalStateProps } from "./types"; + +const Header = (props: GlobalStateProps) => { + const handleChange = (e: ChangeEvent) => { + props.setGlobalState(prev => { + return { + ...prev, + active: e.target.value + } + }) + } -const Header = () => { return ( diff --git a/react-frontend/src/analytics/Analytics.tsx b/react-frontend/src/analytics/Analytics.tsx index a9bdaed..bf2b45d 100644 --- a/react-frontend/src/analytics/Analytics.tsx +++ b/react-frontend/src/analytics/Analytics.tsx @@ -1,7 +1,11 @@ -const Analytics = () => { - return
+import { GlobalStateProps } from "../types"; -
+const Analytics = (props: GlobalStateProps) => { + return ( +
+

Something

+
+ ); } export default Analytics; \ No newline at end of file diff --git a/react-frontend/src/index.css b/react-frontend/src/index.css index cf01c45..73ca873 100644 --- a/react-frontend/src/index.css +++ b/react-frontend/src/index.css @@ -4,7 +4,10 @@ align-items: stretch; font-size: 20px; --font-default-color: #fff4f0; + --accent-color: #ff936c; + --background-color: #2b2a2a; color: var(--font-default-color); + background-color: var(--background-color); } body { @@ -14,7 +17,6 @@ body { sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; - background-color: #2b2a2a; } code { diff --git a/react-frontend/src/search/Search.tsx b/react-frontend/src/search/Search.tsx index f567540..f0deb4b 100644 --- a/react-frontend/src/search/Search.tsx +++ b/react-frontend/src/search/Search.tsx @@ -8,7 +8,7 @@ import CrimeListSection from "./list-section/CrimeListSection"; const Search = (props:GlobalStateProps) => { return ( -
+
diff --git a/react-frontend/src/types.ts b/react-frontend/src/types.ts index ba69eeb..a2641df 100644 --- a/react-frontend/src/types.ts +++ b/react-frontend/src/types.ts @@ -1,6 +1,7 @@ import React from "react"; type GlobalState = { + active: string; filters: { long: number; lat: number; From 19c48e58b82f7103511b70f30039317eb04cd979 Mon Sep 17 00:00:00 2001 From: Ranajit Roy Date: Thu, 25 Apr 2024 00:02:10 -0600 Subject: [PATCH 09/18] Input box changes --- react-frontend/src/App.css | 2 - .../search/filter-section/FilterSection.css | 63 ++++++++++++++++++- .../search/filter-section/FilterSection.tsx | 22 +++++-- 3 files changed, 79 insertions(+), 8 deletions(-) diff --git a/react-frontend/src/App.css b/react-frontend/src/App.css index 06a23f5..c05d1c4 100644 --- a/react-frontend/src/App.css +++ b/react-frontend/src/App.css @@ -14,14 +14,12 @@ } #search-div { - position: absolute; opacity: 0%; transform: translateX(-100%); transition: ease-out 300ms; } #analytics-div { - position: absolute; opacity: 0%; transform: translateX(100%); transition: ease-out 300ms; diff --git a/react-frontend/src/search/filter-section/FilterSection.css b/react-frontend/src/search/filter-section/FilterSection.css index d9984f2..6dff067 100644 --- a/react-frontend/src/search/filter-section/FilterSection.css +++ b/react-frontend/src/search/filter-section/FilterSection.css @@ -1,7 +1,68 @@ #filter-section { display: flex; - align-items: stretch; + flex-direction: column; + align-items: center; justify-content: center; width: 70vw; margin: 5vh 0; +} + +#filter-fields { + display: flex; + align-items: center; + justify-content: center; +} + +#filter-fields > span { + position: relative; + width: 250px; + display: block; + margin: 20px 10px; + height: 60px; +} + +#filter-fields input { + position: absolute; + width: 226px; + outline: none; + background-color: var(--background-color); + color: var(--font-default-color); + font-size: 1.2rem; + border-radius: 8px; + border: var(--accent-color) 2px solid; + padding: 15px 10px; +} + +#filter-fields label { + z-index: 1; + position: absolute; + color: var(--accent-color); + background-color: var(--background-color); + left: 15px; + top: -15px; + padding: 0 10px; +} + +input[type="date"]::-webkit-calendar-picker-indicator { + background-color: var(--accent-color); + border-radius: 2px; +} + +input::-webkit-outer-spin-button, +input::-webkit-inner-spin-button { + -webkit-appearance: none; + margin: 0; +} + +/* Firefox */ +input[type=number] { + appearance: textfield; + -moz-appearance: textfield; +} + +input[type=number] { +} + +input[type=number]::before { + } \ No newline at end of file diff --git a/react-frontend/src/search/filter-section/FilterSection.tsx b/react-frontend/src/search/filter-section/FilterSection.tsx index 3110fb1..7a5c03e 100644 --- a/react-frontend/src/search/filter-section/FilterSection.tsx +++ b/react-frontend/src/search/filter-section/FilterSection.tsx @@ -91,17 +91,29 @@ const FilterSection = (props:GlobalStateProps) => { return (
- - - - + + + + + + + + + + + + + + + +
+
-
); } From 9cb16c7174a1942a8c05c77d305d49b17b2ebd48 Mon Sep 17 00:00:00 2001 From: Ranajit Roy Date: Thu, 25 Apr 2024 00:02:20 -0600 Subject: [PATCH 10/18] App and filter section changes --- react-frontend/src/App.css | 13 +++-- .../search/filter-section/FilterSection.css | 50 ++++++++++++++----- .../search/filter-section/FilterSection.tsx | 17 ++++--- 3 files changed, 58 insertions(+), 22 deletions(-) diff --git a/react-frontend/src/App.css b/react-frontend/src/App.css index c05d1c4..49f71ff 100644 --- a/react-frontend/src/App.css +++ b/react-frontend/src/App.css @@ -1,28 +1,35 @@ .App { - width: 80vw; - max-width: 1800px; display: flex; + width: 95%; flex-direction: column; justify-content: start; min-height: 100vh; + overflow: hidden; } #SectionContainer { position: relative; - display: flex; + display: grid; + grid-template-columns: 1fr; + grid-template-rows: 1fr; justify-content: center; + align-content: center; } #search-div { opacity: 0%; transform: translateX(-100%); transition: ease-out 300ms; + grid-row: 1/2; + grid-column: 1/2; } #analytics-div { opacity: 0%; transform: translateX(100%); transition: ease-out 300ms; + grid-row: 1/2; + grid-column: 1/2; } #search-div.sectionactive, #analytics-div.sectionactive { diff --git a/react-frontend/src/search/filter-section/FilterSection.css b/react-frontend/src/search/filter-section/FilterSection.css index 6dff067..d255533 100644 --- a/react-frontend/src/search/filter-section/FilterSection.css +++ b/react-frontend/src/search/filter-section/FilterSection.css @@ -13,17 +13,17 @@ justify-content: center; } -#filter-fields > span { +#filter-section span { position: relative; - width: 250px; + width: 230px; display: block; margin: 20px 10px; height: 60px; } -#filter-fields input { +#filter-section input { position: absolute; - width: 226px; + width: 206px; outline: none; background-color: var(--background-color); color: var(--font-default-color); @@ -33,7 +33,7 @@ padding: 15px 10px; } -#filter-fields label { +#filter-section label { z-index: 1; position: absolute; color: var(--accent-color); @@ -48,6 +48,39 @@ input[type="date"]::-webkit-calendar-picker-indicator { border-radius: 2px; } +span#date1, span#date2 { + width: 200px; +} + +#filter-section input[type="date"] { + width: 176px; +} + +#filter-section button { + outline: none; + padding: 12px 20px; + font-size: 1.3rem; + background-color: var(--accent-color); + border: var(--accent-color); + border-radius: 8px; + cursor: pointer; + margin: 15px 0; + font-weight: 600; +} + +#page-fields { + display: flex; + align-items: center; + margin: 20px 0; +} + +#page-fields > span { + width: 150px; +} +#page-fields input { + width: 126px; +} + input::-webkit-outer-spin-button, input::-webkit-inner-spin-button { -webkit-appearance: none; @@ -58,11 +91,4 @@ input::-webkit-inner-spin-button { input[type=number] { appearance: textfield; -moz-appearance: textfield; -} - -input[type=number] { -} - -input[type=number]::before { - } \ No newline at end of file diff --git a/react-frontend/src/search/filter-section/FilterSection.tsx b/react-frontend/src/search/filter-section/FilterSection.tsx index 7a5c03e..49a13de 100644 --- a/react-frontend/src/search/filter-section/FilterSection.tsx +++ b/react-frontend/src/search/filter-section/FilterSection.tsx @@ -99,19 +99,22 @@ const FilterSection = (props:GlobalStateProps) => { - - - + + + - - - + + +
- + + + +
From 665414834497fbb81bd4c48b8ed91e279d688ad1 Mon Sep 17 00:00:00 2001 From: Ranajit Roy Date: Thu, 25 Apr 2024 00:02:30 -0600 Subject: [PATCH 11/18] padding changed --- .../src/search/filter-section/FilterSection.css | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/react-frontend/src/search/filter-section/FilterSection.css b/react-frontend/src/search/filter-section/FilterSection.css index d255533..53da6ae 100644 --- a/react-frontend/src/search/filter-section/FilterSection.css +++ b/react-frontend/src/search/filter-section/FilterSection.css @@ -23,14 +23,14 @@ #filter-section input { position: absolute; - width: 206px; + width: 202px; outline: none; background-color: var(--background-color); color: var(--font-default-color); font-size: 1.2rem; border-radius: 8px; border: var(--accent-color) 2px solid; - padding: 15px 10px; + padding: 15px 12px; } #filter-section label { @@ -53,7 +53,7 @@ span#date1, span#date2 { } #filter-section input[type="date"] { - width: 176px; + width: 172px; } #filter-section button { @@ -78,7 +78,7 @@ span#date1, span#date2 { width: 150px; } #page-fields input { - width: 126px; + width: 122px; } input::-webkit-outer-spin-button, From 62a79146aecc22bd5f84b823ec126a9ea7a51f40 Mon Sep 17 00:00:00 2001 From: Ranajit Roy Date: Thu, 25 Apr 2024 00:02:40 -0600 Subject: [PATCH 12/18] small tweaks --- react-frontend/src/App.css | 2 ++ react-frontend/src/search/map-section/MapSection.css | 8 +++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/react-frontend/src/App.css b/react-frontend/src/App.css index 49f71ff..4f6b28e 100644 --- a/react-frontend/src/App.css +++ b/react-frontend/src/App.css @@ -22,6 +22,7 @@ transition: ease-out 300ms; grid-row: 1/2; grid-column: 1/2; + justify-self: center; } #analytics-div { @@ -30,6 +31,7 @@ transition: ease-out 300ms; grid-row: 1/2; grid-column: 1/2; + justify-self: center; } #search-div.sectionactive, #analytics-div.sectionactive { diff --git a/react-frontend/src/search/map-section/MapSection.css b/react-frontend/src/search/map-section/MapSection.css index dd42cbd..8997480 100644 --- a/react-frontend/src/search/map-section/MapSection.css +++ b/react-frontend/src/search/map-section/MapSection.css @@ -1,9 +1,15 @@ +#map-section { + z-index: 500; + overflow: hidden; + border-radius: 8px; + margin: 5vh 0 0 0; +} + .leaflet-container { width: 70vw; height: 50vh; max-width: 1700px; max-height: 600px; - margin: 5vh 0 0 0; } .dropIcon { From 843d503e53bc7c8b88ce0f1efb9deaecf726be12 Mon Sep 17 00:00:00 2001 From: Ranajit Roy Date: Thu, 25 Apr 2024 01:47:48 -0600 Subject: [PATCH 13/18] added table data --- react-frontend/package.json | 3 +- react-frontend/src/App.css | 3 + react-frontend/src/App.tsx | 10 +- react-frontend/src/api-interface.ts | 5 +- react-frontend/src/index.css | 1 + react-frontend/src/search/Search.css | 1 + .../search/filter-section/FilterSection.css | 3 +- .../search/list-section/CrimeListSection.css | 40 +++++- .../search/list-section/CrimeListSection.tsx | 68 ++++++--- .../src/search/map-section/MapSection.tsx | 129 +++++++++--------- react-frontend/src/types.ts | 5 +- 11 files changed, 172 insertions(+), 96 deletions(-) diff --git a/react-frontend/package.json b/react-frontend/package.json index 1c382e0..b9431c9 100644 --- a/react-frontend/package.json +++ b/react-frontend/package.json @@ -44,5 +44,6 @@ }, "devDependencies": { "@types/leaflet": "^1.9.11" - } + }, + "proxy": "http://localhost:5000" } diff --git a/react-frontend/src/App.css b/react-frontend/src/App.css index 4f6b28e..d6d851d 100644 --- a/react-frontend/src/App.css +++ b/react-frontend/src/App.css @@ -23,6 +23,7 @@ grid-row: 1/2; grid-column: 1/2; justify-self: center; + z-index: 10; } #analytics-div { @@ -32,10 +33,12 @@ grid-row: 1/2; grid-column: 1/2; justify-self: center; + z-index: 10; } #search-div.sectionactive, #analytics-div.sectionactive { opacity: 100%; transform: translateX(0%); transition: ease-in 300ms; + z-index: 20; } \ No newline at end of file diff --git a/react-frontend/src/App.tsx b/react-frontend/src/App.tsx index 84e9e69..224311a 100644 --- a/react-frontend/src/App.tsx +++ b/react-frontend/src/App.tsx @@ -11,20 +11,22 @@ function App() { const [globalState, setGlobalState] = useState({ active: "search", filters: { - long: -105.2668960437206, lat: 40.00943069669764, + long: -105.2668960437206, startDate: new Date().toJSON().slice(0, 10), endDate: new Date().toJSON().slice(0, 10) }, - fetched: false, + map: { + lat: 40.00943069669764, + long: -105.2668960437206 + }, crimeList: { page_no: 1, - page_size: 10, + page_size: 20, data: [] } }); - console.log(globalState) return (
diff --git a/react-frontend/src/api-interface.ts b/react-frontend/src/api-interface.ts index 4f2d2f4..619bd3c 100644 --- a/react-frontend/src/api-interface.ts +++ b/react-frontend/src/api-interface.ts @@ -13,10 +13,9 @@ const getAllData = (props: GlobalStateProps) => { .then(json => { props.setGlobalState((prev) => { return { - ...props.globalState, - fetched: true, + ...prev, crimeList: { - ...props.globalState.crimeList, + ...prev.crimeList, data: json["data"] } } diff --git a/react-frontend/src/index.css b/react-frontend/src/index.css index 73ca873..ba495b3 100644 --- a/react-frontend/src/index.css +++ b/react-frontend/src/index.css @@ -6,6 +6,7 @@ --font-default-color: #fff4f0; --accent-color: #ff936c; --background-color: #2b2a2a; + --background-light-color: #424040; color: var(--font-default-color); background-color: var(--background-color); } diff --git a/react-frontend/src/search/Search.css b/react-frontend/src/search/Search.css index 349d20a..48019e6 100644 --- a/react-frontend/src/search/Search.css +++ b/react-frontend/src/search/Search.css @@ -3,4 +3,5 @@ flex-direction: column; align-items: center; justify-content: space-around; + margin-bottom: 100px; } \ No newline at end of file diff --git a/react-frontend/src/search/filter-section/FilterSection.css b/react-frontend/src/search/filter-section/FilterSection.css index 53da6ae..60c0f3f 100644 --- a/react-frontend/src/search/filter-section/FilterSection.css +++ b/react-frontend/src/search/filter-section/FilterSection.css @@ -4,7 +4,7 @@ align-items: center; justify-content: center; width: 70vw; - margin: 5vh 0; + margin: 30px 0 0 0; } #filter-fields { @@ -79,6 +79,7 @@ span#date1, span#date2 { } #page-fields input { width: 122px; + cursor: pointer; } input::-webkit-outer-spin-button, diff --git a/react-frontend/src/search/list-section/CrimeListSection.css b/react-frontend/src/search/list-section/CrimeListSection.css index 4f86fdd..05e8f57 100644 --- a/react-frontend/src/search/list-section/CrimeListSection.css +++ b/react-frontend/src/search/list-section/CrimeListSection.css @@ -3,9 +3,45 @@ flex-direction: column; align-items: center; justify-content: center; - margin-top: 60px; + margin-bottom: 100px; } -.CrimeList > * { +table { + border-collapse: collapse; + width: 85vw; + max-width: 1200px; + border: var(--accent-color) 2px solid; + border-radius: 8px; +} + +tbody tr:nth-child(even) { + background-color: var(--background-light-color); + } + +.headerrow { + background-color: var(--accent-color); + color: black; +} + +.headerrow > th { + padding: 5px 10px; +} + + +.CrimeList { margin: 10px 0; +} + +.datarow { + position: relative; +} + +.datarow > a { + width: 100%; + height: 100%; +} + +.datacell { + padding: 8px 8px; + border-left: var(--accent-color) 1px solid; } \ No newline at end of file diff --git a/react-frontend/src/search/list-section/CrimeListSection.tsx b/react-frontend/src/search/list-section/CrimeListSection.tsx index ad578af..bcc7274 100644 --- a/react-frontend/src/search/list-section/CrimeListSection.tsx +++ b/react-frontend/src/search/list-section/CrimeListSection.tsx @@ -3,32 +3,56 @@ import { GlobalStateProps } from "../../types"; import "./CrimeListSection.css" const CrimeListSection = (props: GlobalStateProps) => { + + const clickHandler = (pair: [number, number]) => { + // window.scrollTo(0,0) + props.setGlobalState(prev => { + return { + ...prev, + map: { + lat: pair[0], + long: pair[1] + } + } + }) + } + return ( -
+
- - - - - - - - + + + + + + + + + + { - props.globalState.crimeList.data.map((item) => { - return ( - - - - - - - - - ); - } - ) + props.globalState.crimeList.data.length > 0? + props.globalState.crimeList.data.map((item) => { + return ( + + + + + + + + ); + } + ): + + + + + + + } +
Offense TypeIncident AddressReportedCrime?Traffic?Victims
Incident IDOffense TypeIncident AddressReported OnVictims
{item["OFFENSE_TYPE_ID"]}{item["INCIDENT_ADDRESS"]}{new Date(parseInt(item["REPORTED_DATE"])).toLocaleDateString()}{item["IS_CRIME"]}{item["IS_TRAFFIC"]}{item["VICTIM_COUNT"]}
{item["INCIDENT_ID"]}{item["OFFENSE_TYPE_ID"]}{item["INCIDENT_ADDRESS"].trim()}{new Date(parseInt(item["REPORTED_DATE"])).toLocaleDateString()}{item["VICTIM_COUNT"]}
-----
); diff --git a/react-frontend/src/search/map-section/MapSection.tsx b/react-frontend/src/search/map-section/MapSection.tsx index f501175..354c8bf 100644 --- a/react-frontend/src/search/map-section/MapSection.tsx +++ b/react-frontend/src/search/map-section/MapSection.tsx @@ -1,4 +1,4 @@ -import React from "react"; +import React, { useEffect } from "react"; import { MapContainer, Marker, Popup, TileLayer, useMap, useMapEvents } from "react-leaflet"; import dropIconImg from "../../assets/location-pin.png" import crimeIconImg from "../../assets/crime-pin.png" @@ -8,6 +8,68 @@ import "./MapSection.css" import { GlobalStateProps } from "../../types"; import { Icon, featureGroup, latLng, marker } from "leaflet"; + + +const RecenterMapAllCrimeData = (props: GlobalStateProps) => { + const map = useMap(); + useEffect(() => { + if(props.globalState.crimeList.data.length > 0) { + let group = featureGroup( + [ + marker( + latLng( + props.globalState.filters.lat, + props.globalState.filters.long + ) + ), + ...props.globalState.crimeList.data.map((item) => { + return marker( + latLng( + parseFloat(item["GEO_LAT"]), + parseFloat(item["GEO_LON"]) + ) + ) + }) + ] + ) + map.fitBounds(group.getBounds(), { + animate: true, + padding: [10,10] + }) + + } + }, [props.globalState.crimeList.data] + ) + + return null; +} + +const RecenterMapSingleCrimeData = (props: GlobalStateProps) => { + const map = useMap(); + useEffect(() => { + map.setView([props.globalState.map.lat, props.globalState.map.long]); + }, [props.globalState.map]); + return null; +} + +const HandleMapClick = (props: GlobalStateProps) => { + useMapEvents({ + click: (e) => { + props.setGlobalState((prev)=> { + return { + ...prev, + filters: { + ...prev.filters, + lat: e.latlng.lat, + long: e.latlng.lng + } + }; + }) + }, + }); + return null; +} + const MapSection = (props: GlobalStateProps) => { const crimeIcon = new Icon({ @@ -22,64 +84,6 @@ const MapSection = (props: GlobalStateProps) => { className: "dropIcon" }) - const HandleMapClick = () => { - useMapEvents({ - click: (e) => { - props.setGlobalState((prev)=> { - return { - ...prev, - filters: { - ...prev.filters, - lat: e.latlng.lat, - long: e.latlng.lng - } - }; - }) - }, - }); - return null; - } - - const RecenterMap = () => { - const map = useMap(); - - if(props.globalState.crimeList.data.length > 0 && props.globalState.fetched) { - let group = featureGroup( - [ - marker( - latLng( - props.globalState.filters.lat, - props.globalState.filters.long - ) - ), - ...props.globalState.crimeList.data.map((item) => { - return marker( - latLng( - parseFloat(item["GEO_LAT"]), - parseFloat(item["GEO_LON"]) - ) - ) - }) - ] - ) - console.log("centering") - // map.setView([parseFloat(data[0]["GEO_LAT"]), parseFloat(data[0]["GEO_LON"])]); - map.fitBounds(group.getBounds(), { - animate: true, - padding: [10,10] - }) - props.setGlobalState(prev => { - return { - ...prev, - fetched: false - } - }) - - } - - return null; - } - return (
@@ -87,12 +91,13 @@ const MapSection = (props: GlobalStateProps) => { attribution='© OpenStreetMap contributors' url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" /> - - + + + { props.globalState.crimeList.data.map((item) => { - return + return

{item["OFFENSE_TYPE_ID"]}

diff --git a/react-frontend/src/types.ts b/react-frontend/src/types.ts index a2641df..36d8868 100644 --- a/react-frontend/src/types.ts +++ b/react-frontend/src/types.ts @@ -8,7 +8,10 @@ type GlobalState = { startDate: string; endDate: string; }; - fetched: boolean; + map: { + lat: number; + long: number; + }; crimeList: { page_no: number; page_size: number; From d06c4f9cc33dd459ce9b2196a1188a7f3aad0fb7 Mon Sep 17 00:00:00 2001 From: Ranajit Roy Date: Thu, 25 Apr 2024 02:32:56 -0600 Subject: [PATCH 14/18] favicon added --- .../public/android-chrome-192x192.png | Bin 0 -> 14375 bytes .../public/android-chrome-512x512.png | Bin 0 -> 37361 bytes react-frontend/public/apple-touch-icon.png | Bin 0 -> 13769 bytes react-frontend/public/favicon-16x16.png | Bin 0 -> 672 bytes react-frontend/public/favicon-32x32.png | Bin 0 -> 1537 bytes react-frontend/public/favicon.ico | Bin 3870 -> 15406 bytes react-frontend/public/index.html | 4 +-- react-frontend/public/logo192.png | Bin 5347 -> 0 bytes react-frontend/public/logo512.png | Bin 9664 -> 0 bytes react-frontend/public/manifest.json | 26 +----------------- 10 files changed, 3 insertions(+), 27 deletions(-) create mode 100644 react-frontend/public/android-chrome-192x192.png create mode 100644 react-frontend/public/android-chrome-512x512.png create mode 100644 react-frontend/public/apple-touch-icon.png create mode 100644 react-frontend/public/favicon-16x16.png create mode 100644 react-frontend/public/favicon-32x32.png delete mode 100644 react-frontend/public/logo192.png delete mode 100644 react-frontend/public/logo512.png diff --git a/react-frontend/public/android-chrome-192x192.png b/react-frontend/public/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..4ad726c255631df686001adab24f5174dd83b61d GIT binary patch literal 14375 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 literal 0 HcmV?d00001 diff --git a/react-frontend/public/android-chrome-512x512.png b/react-frontend/public/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..5dfddf7ebf6b15f7bd5930d6474387f3ac714225 GIT binary patch literal 37361 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 literal 0 HcmV?d00001 diff --git a/react-frontend/public/apple-touch-icon.png b/react-frontend/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..2f3eaa99642db1afc3fba81890922fcc3f88e977 GIT binary patch literal 13769 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 literal 0 HcmV?d00001 diff --git a/react-frontend/public/favicon-16x16.png b/react-frontend/public/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..6da388dd9969cedafc1cf125a858c8b609b1a797 GIT binary patch literal 672 zcmV;R0$=@!P)Px%T1iAfR5(v#WPk!=Utcc9zk=E9tgMmjtgKr985sWl{Pp|N&p*Ew@_u_f=fHsj ze_(2nX+{voz#~C{i;Zc!nTe5xgS`!df~*w7r|-WRo<4obaA5yIhKpCOo%qf0!}sjw z%PRaaBCv$L~d5SNf(`2X)e!_y~E7!Djf#PI0Jv(t*wlEyFJ zyj$ci^>}Aa|0Z};f>R;{G%%TX+zn%5VUFTpW7YispYiX{U%xK>{qtub$l0#pS@V4a zAH?O^fB(<$=Wh~Y?4d;Px)yGcYrR9Hv7mU~dtRTRg+cYphajrT6#nkI;uA|ng=h_@u*glQ^hxTKlc6gvGw z(;vNOY9?!@My>wQ3ND93|)`pe+EYvvBml<+^=3cX8a=h%2Kb zF$ixvK(mDcA@PxlAr=Y2FbqHeD`&&dkOfAQ863wA*@4}x-TYx&ZTa651$hV{E;D}% z2)>qxMPhkS0HUHI5fK>)xk3S{)CZK>VK5lb)!7N{RV{Abx{aRRK3HwGE<(uKrlUot zCIT@IK$VsM2?5?$1P5U5oM(`_Bn^sC1)dP|;Ui?g@CZ8lS#Wmh%t0x|_4W>&IDQ=3 z_8ZU}j4UC@)f_E8Mk%1ZHwd%U zJ}y4XvN(G9FwQq!M6bSoh)^!6siw5a8wh9QkvqSn2o4Z0U7C)>T*@&OMtgPkaPN6IC22$B9#?!CGw|-vSbsm0!Rx%+3X>7;JcTBf|Ve&R1`6k|$sq9K^02 zyU>2~HmKdMYOXE0;PwROEmg~f47nAq2obB*d5D-9Ihnp2^ZE7UNgVmP27Ud8R!wzr zw5MPrPjUWE0iRzmKYBLQ8#h2C5_$4-Y46eX;D_(`j#SURtf?va(NiENz@m&bfmWWR z)lcRdws>JYmakkfEIuZ%j7B5MN=tFMO$#&2I=VmI@qu~@G4>tDFMB1)PHA1Rzn@4I z8-r!pFF-1ldh&PLdvrP+s;orY)oWlaR!otHY^~U{eU~@R;{-`uM*fT7p-kp070;M9 z70)FmU~Y6Y_b}MEWWT3wv@LWIj?*I~|i`9Ua%v+oy+qzz93F*G~@*tCUK` zUjg77j3&#SZXI&w46=oa8!JfRg?d*IE=B30MQbD$f5|oiybU1KAxK3cA^1E76cjca zhar}Q#p?WNTS4ugX=+N!9CxnX_R(5{!B}*+TPIkh?6nszvobuug!cQ{t{_|jjFP6L zr0|VWWhy9>3`%E%Acz8vC$bxqwop6omkV`8%@00CZ(?tK?qe{<<&Y7V#=14xeh9Rg4?Y-kp;y(v)B&1)&rh%b{0gM|X zR}hZ{U?LEY4Ztgi4qe7$1#k;7QvsqkwLEr!M?ug4A3!E%{}%vP5HwN_q8q6G-vFEt nU&bVW$NLtbQ6Quq;BEQ`&qRSS;DPli00000NkvXXu0mjfF8|C# literal 0 HcmV?d00001 diff --git a/react-frontend/public/favicon.ico b/react-frontend/public/favicon.ico index a11777cc471a4344702741ab1c8a588998b1311a..dc109625d6becf67c01a57016d7f45d48354249f 100644 GIT binary patch literal 15406 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 literal 3870 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 baj7?x%VD!5Cxk2YbYLNVeiXvvpMCWYo=by@ diff --git a/react-frontend/public/index.html b/react-frontend/public/index.html index aa069f2..0961296 100644 --- a/react-frontend/public/index.html +++ b/react-frontend/public/index.html @@ -7,7 +7,7 @@ - React App + Betafish Crime Spotter diff --git a/react-frontend/public/logo192.png b/react-frontend/public/logo192.png deleted file mode 100644 index fc44b0a3796c0e0a64c3d858ca038bd4570465d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5347 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 b{|{}U^kRn2wo}j7|0ATu<;8xA7zX}7|B6mN diff --git a/react-frontend/public/manifest.json b/react-frontend/public/manifest.json index 080d6c7..45dc8a2 100644 --- a/react-frontend/public/manifest.json +++ b/react-frontend/public/manifest.json @@ -1,25 +1 @@ -{ - "short_name": "React App", - "name": "Create React App Sample", - "icons": [ - { - "src": "favicon.ico", - "sizes": "64x64 32x32 24x24 16x16", - "type": "image/x-icon" - }, - { - "src": "logo192.png", - "type": "image/png", - "sizes": "192x192" - }, - { - "src": "logo512.png", - "type": "image/png", - "sizes": "512x512" - } - ], - "start_url": ".", - "display": "standalone", - "theme_color": "#000000", - "background_color": "#ffffff" -} +{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file From 2b53a41f4ad35fc2849c2458fd19594547209671 Mon Sep 17 00:00:00 2001 From: Ranajit Roy Date: Thu, 25 Apr 2024 02:33:28 -0600 Subject: [PATCH 15/18] icon added --- react-frontend/src/Header.css | 9 +++++++++ react-frontend/src/Header.tsx | 5 ++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/react-frontend/src/Header.css b/react-frontend/src/Header.css index 196d181..7c9cc53 100644 --- a/react-frontend/src/Header.css +++ b/react-frontend/src/Header.css @@ -1,3 +1,12 @@ +#logosplash { + display: flex; + align-items: center; +} +#logo { + width: 70px; + margin: 0 20px; +} + #navbar { display: flex; align-items: center; diff --git a/react-frontend/src/Header.tsx b/react-frontend/src/Header.tsx index 50b8aec..8ed8bde 100644 --- a/react-frontend/src/Header.tsx +++ b/react-frontend/src/Header.tsx @@ -15,7 +15,10 @@ const Header = (props: GlobalStateProps) => { return (