diff --git a/map/serializers.py b/map/serializers.py index 03dd912..abd7a57 100644 --- a/map/serializers.py +++ b/map/serializers.py @@ -2,14 +2,17 @@ from map.models import CommunityArea, RestaurantPermit - class CommunityAreaSerializer(serializers.ModelSerializer): class Meta: model = CommunityArea - fields = ["name", "num_permits"] + fields = ["name", "area_id", "num_permits"] + area_id = serializers.SerializerMethodField() num_permits = serializers.SerializerMethodField() + def get_area_id(self, obj): + return obj.area_id + def get_num_permits(self, obj): """ TODO: supplement each community area object with the number @@ -30,5 +33,5 @@ def get_num_permits(self, obj): } ] """ - - pass + year = int(self.context.get("year")) + return RestaurantPermit.objects.filter( community_area_id=str(obj.area_id), issue_date__year=year).count() diff --git a/map/static/js/RestaurantPermitMap.js b/map/static/js/RestaurantPermitMap.js index 57f8ea0..e7e84aa 100644 --- a/map/static/js/RestaurantPermitMap.js +++ b/map/static/js/RestaurantPermitMap.js @@ -41,25 +41,52 @@ export default function RestaurantPermitMap() { const [currentYearData, setCurrentYearData] = useState([]) const [year, setYear] = useState(2026) - - const yearlyDataEndpoint = `/map-data/?year=${year}` + const [maxNumPermits, setMaxNumPermits] = useState(0) + const [totalNumPermits, setTotalNumPermits] = useState(0) useEffect(() => { - fetch() + fetch(`/map-data/?year=${year}`) .then((res) => res.json()) .then((data) => { - /** - * TODO: Fetch the data needed to supply to map with data - */ - }) - }, [yearlyDataEndpoint]) + setCurrentYearData(data); + }); + }, [year]); + useEffect(() => { + var current_maxNumPermits = 0 + var current_totalNumPermits = 0 + currentYearData.forEach(function (area, index) { + if (area['num_permits'] > current_maxNumPermits) { + current_maxNumPermits = area['num_permits']; + } + current_totalNumPermits = current_totalNumPermits + 1; + }); + setMaxNumPermits(current_maxNumPermits); + setTotalNumPermits(current_totalNumPermits); + }, [currentYearData]); function getColor(percentageOfPermits) { /** * TODO: Use this function in setAreaInteraction to set a community * area's color using the communityAreaColors constant above */ + if (percentageOfPermits == 0) { + return communityAreaColors[0]; + } else if (percentageOfPermits < 0.10) { + return communityAreaColors[1]; + } else if (percentageOfPermits < 0.25) { + return communityAreaColors[2]; + } + else { + return communityAreaColors[3]; + } + } + + // Needs performance improvement (I would do the initial data processing differently) + // TODO fix area loop (it's giving me a number rather than an object?) + function findPermitCount(area_id) { + var area = currentYearData.find((element) => element['area_id'].toString() == area_id) + return area ? area['num_permits'] : -1; } function setAreaInteraction(feature, layer) { @@ -70,9 +97,13 @@ export default function RestaurantPermitMap() { * 2) On hover, display a popup with the community area's raw * permit count for the year */ - layer.setStyle() - layer.on("", () => { - layer.bindPopup("") + var permit_count = findPermitCount(feature.properties.area_num_1) + var percentageOfPermits = Boolean(totalNumPermits) ? permit_count / totalNumPermits : 0; + layer.setStyle({fillColor: getColor(percentageOfPermits), strokeWeight: 5, fillOpacity: 0.6}) + layer.on("click", () => { + if (feature.properties.community) { + layer.bindPopup(`${feature.properties.community}'s permit count ${permit_count}`) + } layer.openPopup() }) } @@ -81,11 +112,10 @@ export default function RestaurantPermitMap() { <>

- Restaurant permits issued this year: {/* TODO: display this value */} + Restaurant permits issued this year: {totalNumPermits}

- Maximum number of restaurant permits in a single area: - {/* TODO: display this value */} + Maximum number of restaurant permits in a single area: {maxNumPermits}