From 39469462727671adc17a682a4ac9b86cd1add4f4 Mon Sep 17 00:00:00 2001 From: dcordz <17937472+dcordz@users.noreply.github.com> Date: Sun, 3 Nov 2024 20:14:38 -0500 Subject: [PATCH] Padawan (#42) * padawan - settimeout to keep container alive while user is on page * padawan - deploy script * padawan - ignore wireguard * padawan - remove turnstile * inertia - remove redux and use inertia instead * inertia - add maryland svg, fix census query * inertia - fix notification subscriptions create/destroy, fix census lookup of congressional districts * inertia - add maryland svg, fix census query, add unique index to bill.external_id * inertia - fix rspec, get new tapioca dsl + gems * inertia - rspec test ruby version * inertia - typescript and eslint gh actions * inertia - rspec action * inertia - fix eslint - https://github.com/t3-oss/create-t3-turbo/issues/984\#issuecomment-2210934687 * inertia - add ssl certs for github + address some sonar issues * main - remove uneeded code * inertia - update deps * inertia - upgraded deps * padawan - update deps, node version, minor adjustments * padawan - re-version schema * padawan - eslint lint * padawan - replace dart-sass with sass, use npm ci instead of install * padawan - remove lock.json and node modules and reinstall * padawan - fake bill data, seeds, button sizes --- .../components/bill/BillComponent.tsx | 2 +- app/frontend/components/bill/BillSummary.tsx | 2 +- .../components/bill/BillsListItem.tsx | 89 +- .../dialogs/ContactLegislatorDialog.tsx | 11 +- .../components/dialogs/InviteIconDialog.tsx | 2 +- .../components/dialogs/invites/InviteBody.tsx | 2 +- .../forms/ContactLegislatorFormEditable.tsx | 2 +- .../components/legislator/Legislator.tsx | 2 +- .../components/legislator/LegislatorCard.tsx | 5 +- .../legislator/LegislatorCardSocialItem.tsx | 5 +- .../legislator/LegislatorCardSocialRow.tsx | 30 +- .../components/legislator/LegislatorEmail.tsx | 2 +- .../components/legislator/LegislatorPhone.tsx | 2 +- .../legislator/LegislatorTwitter.tsx | 2 +- app/frontend/pages/Bills.tsx | 11 +- app/frontend/pages/Legislators.tsx | 46 +- app/frontend/sway_utils/index.ts | 8 +- db/seeds/models/bill.rb | 40 +- package-lock.json | 16 + package.json | 1 + .../maryland/baltimore/bills.json | 1001 +++++++++++++++++ 21 files changed, 1158 insertions(+), 123 deletions(-) diff --git a/app/frontend/components/bill/BillComponent.tsx b/app/frontend/components/bill/BillComponent.tsx index 6abe4da4..2b49287b 100644 --- a/app/frontend/components/bill/BillComponent.tsx +++ b/app/frontend/components/bill/BillComponent.tsx @@ -218,7 +218,7 @@ const BillComponent: React.FC = ({ bill, sponsor, positions, userVote }) Data From:  {(VOTING_WEBSITES_BY_LOCALE as Record)[localeName]}  - + diff --git a/app/frontend/components/bill/BillSummary.tsx b/app/frontend/components/bill/BillSummary.tsx index a8e907f7..c6e0af92 100644 --- a/app/frontend/components/bill/BillSummary.tsx +++ b/app/frontend/components/bill/BillSummary.tsx @@ -51,7 +51,7 @@ const BillSummary: React.FC = ({ summary, cutoff, handleClick }) => { className="bold" > More Info  - + , ], ); diff --git a/app/frontend/components/bill/BillsListItem.tsx b/app/frontend/components/bill/BillsListItem.tsx index ef9a9d25..a98cf78e 100644 --- a/app/frontend/components/bill/BillsListItem.tsx +++ b/app/frontend/components/bill/BillsListItem.tsx @@ -3,7 +3,7 @@ import { IS_MOBILE_PHONE, ROUTES } from "app/frontend/sway_constants"; import { titleize } from "app/frontend/sway_utils"; import { lazy, useCallback } from "react"; -import { Button } from "react-bootstrap"; +import { Button, Fade } from "react-bootstrap"; import { FiInfo } from "react-icons/fi"; import { sway } from "sway"; @@ -22,9 +22,10 @@ interface IProps { userVote?: sway.IUserVote; index: number; isLastItem: boolean; + inView: boolean; } -const BillsListItem: React.FC = ({ bill, userVote, isLastItem }) => { +const BillsListItem: React.FC = ({ bill, userVote, isLastItem, inView }) => { const [locale] = useLocale(); const { category, externalId, title } = bill; @@ -34,50 +35,54 @@ const BillsListItem: React.FC = ({ bill, userVote, isLastItem }) => { }, [bill.id]); return ( -
-
-
-
- + +
+
+
+
+ +
+
+ {category && {titleize(category)}} +
+
+
+
{`Bill ${externalId}`}
+
{title}
-
{category && {titleize(category)}}
-
-
-
{`Bill ${externalId}`}
-
{title}
-
- -
- - {bill.voteDateTimeUtc && !bill.active && ( -
- Legislators that voted on this bill may no longer be in office. -
- )} + +
+ + {bill.voteDateTimeUtc && !bill.active && ( +
+ Legislators that voted on this bill may no longer be in office. +
+ )} +
+ {locale && userVote && !IS_MOBILE_PHONE && ( +
+ + + +
+ )}
- {locale && userVote && !IS_MOBILE_PHONE && ( -
- - - -
- )} -
+ ); }; diff --git a/app/frontend/components/dialogs/ContactLegislatorDialog.tsx b/app/frontend/components/dialogs/ContactLegislatorDialog.tsx index 45b2935d..6ed8f134 100644 --- a/app/frontend/components/dialogs/ContactLegislatorDialog.tsx +++ b/app/frontend/components/dialogs/ContactLegislatorDialog.tsx @@ -136,12 +136,17 @@ const ContactLegislatorDialog: React.FC = ({ userVote, legislator, open, format: "text/plain", onCopy: () => notify({ + id: `legislator-${legislator.id}-${type}`, level: "info", - title: `Copied ${type} to clipboard.`, + title: ( + + Copied {type} to clipboard. + + ), }), }); return ""; - }, [getLegislatorEmail, getLegislatorPhone, type]); + }, [getLegislatorEmail, getLegislatorPhone, type, legislator.id]); const render = useMemo(() => { if (type === "email" && !legislator.email) { @@ -245,7 +250,7 @@ const ContactLegislatorDialog: React.FC = ({ userVote, legislator, open,  Cancel diff --git a/app/frontend/components/dialogs/InviteIconDialog.tsx b/app/frontend/components/dialogs/InviteIconDialog.tsx index fd2c261e..a2c349d9 100644 --- a/app/frontend/components/dialogs/InviteIconDialog.tsx +++ b/app/frontend/components/dialogs/InviteIconDialog.tsx @@ -15,7 +15,7 @@ const InviteIconDialog = ({ withText }: { withText?: boolean; iconStyle?: React. return ( - + {withText && Invite Friends} diff --git a/app/frontend/components/dialogs/invites/InviteBody.tsx b/app/frontend/components/dialogs/invites/InviteBody.tsx index 975cc8ba..97e4cd65 100644 --- a/app/frontend/components/dialogs/invites/InviteBody.tsx +++ b/app/frontend/components/dialogs/invites/InviteBody.tsx @@ -27,7 +27,7 @@ const InviteBody: React.FC = () => {

Invite your friends using this link:

diff --git a/app/frontend/components/forms/ContactLegislatorFormEditable.tsx b/app/frontend/components/forms/ContactLegislatorFormEditable.tsx index 435b3506..f0d82015 100644 --- a/app/frontend/components/forms/ContactLegislatorFormEditable.tsx +++ b/app/frontend/components/forms/ContactLegislatorFormEditable.tsx @@ -45,7 +45,7 @@ const ContactLegislatorFormEditable: React.FC = ({ user, legislator, use
{"To: "} {methods.getLegislatorEmailPreview()} - +
diff --git a/app/frontend/components/legislator/Legislator.tsx b/app/frontend/components/legislator/Legislator.tsx index f8552a62..f1623bb1 100644 --- a/app/frontend/components/legislator/Legislator.tsx +++ b/app/frontend/components/legislator/Legislator.tsx @@ -9,7 +9,7 @@ interface IProps { } const Legislator_: React.FC = ({ legislator }) => { - return ; + return ; }; const Legislator = Legislator_; diff --git a/app/frontend/components/legislator/LegislatorCard.tsx b/app/frontend/components/legislator/LegislatorCard.tsx index de0622f5..686d6564 100644 --- a/app/frontend/components/legislator/LegislatorCard.tsx +++ b/app/frontend/components/legislator/LegislatorCard.tsx @@ -16,15 +16,16 @@ const LegislatorMobileChartsContainer = lazy(() => import("./charts/LegislatorMo interface IProps { legislator: sway.ILegislator; + inView: boolean; } -const LegislatorCard: React.FC = ({ legislator }) => { +const LegislatorCard: React.FC = ({ legislator, inView }) => { const [locale] = useLocale(); const { items: userLegislatorScore, isLoading } = useUserLegislatorScore(legislator); return ( - +
diff --git a/app/frontend/components/legislator/LegislatorCardSocialItem.tsx b/app/frontend/components/legislator/LegislatorCardSocialItem.tsx index 77453134..2deb3b86 100644 --- a/app/frontend/components/legislator/LegislatorCardSocialItem.tsx +++ b/app/frontend/components/legislator/LegislatorCardSocialItem.tsx @@ -34,15 +34,16 @@ const LegislatorCardSocialItem: React.FC = ({ title, text, handleCopy, I
-
diff --git a/app/frontend/components/legislator/LegislatorCardSocialRow.tsx b/app/frontend/components/legislator/LegislatorCardSocialRow.tsx index 64d0c4c8..47d1088c 100644 --- a/app/frontend/components/legislator/LegislatorCardSocialRow.tsx +++ b/app/frontend/components/legislator/LegislatorCardSocialRow.tsx @@ -11,17 +11,25 @@ interface IProps { } const LegislatorCardSocialRow: React.FC = ({ legislator }) => { - const handleCopy = useCallback((value: string) => { - copy(value, { - message: "Click to Copy", - format: "text/plain", - onCopy: () => - notify({ - level: "info", - title: `Copied ${value} to clipboard.`, - }), - }); - }, []); + const handleCopy = useCallback( + (value: string) => { + copy(value, { + message: "Click to Copy", + format: "text/plain", + onCopy: () => + notify({ + id: `legislator-${legislator.id}-${value}`, + level: "info", + title: ( + + Copied {value} to clipboard. + + ), + }), + }); + }, + [legislator.id], + ); return (
diff --git a/app/frontend/components/legislator/LegislatorEmail.tsx b/app/frontend/components/legislator/LegislatorEmail.tsx index abe4ca40..1805668e 100644 --- a/app/frontend/components/legislator/LegislatorEmail.tsx +++ b/app/frontend/components/legislator/LegislatorEmail.tsx @@ -10,7 +10,7 @@ interface IProps { } const Button = ({ handleOpen }: { handleOpen: () => void }) => { - return ; + return ; }; const LegislatorEmail: React.FC = ({ legislator, handleCopy }) => { diff --git a/app/frontend/components/legislator/LegislatorPhone.tsx b/app/frontend/components/legislator/LegislatorPhone.tsx index 42ee1ee7..74384cb7 100644 --- a/app/frontend/components/legislator/LegislatorPhone.tsx +++ b/app/frontend/components/legislator/LegislatorPhone.tsx @@ -11,7 +11,7 @@ interface IProps { } const Button = ({ handleOpen }: { handleOpen: () => void }) => { - return ; + return ; }; const LegislatorPhone: React.FC = ({ legislator, handleCopy }) => { diff --git a/app/frontend/components/legislator/LegislatorTwitter.tsx b/app/frontend/components/legislator/LegislatorTwitter.tsx index 36f3ecea..9c3e3dd0 100644 --- a/app/frontend/components/legislator/LegislatorTwitter.tsx +++ b/app/frontend/components/legislator/LegislatorTwitter.tsx @@ -24,7 +24,7 @@ const Button = ({ city, twitter }: { twitter: string; city: string }) => { } }; - return ; + return ; }; const LegislatorTwitter: React.FC = ({ legislator: { twitter }, handleCopy }) => { diff --git a/app/frontend/pages/Bills.tsx b/app/frontend/pages/Bills.tsx index 08f57ccd..f5ba48c2 100644 --- a/app/frontend/pages/Bills.tsx +++ b/app/frontend/pages/Bills.tsx @@ -9,6 +9,7 @@ import { sway } from "sway"; import BillsListCategoriesHeader from "../components/bill/BillsListCategoriesHeader"; import BillsListItem from "../components/bill/BillsListItem"; import LocaleSelector from "../components/user/LocaleSelector"; +import { InView } from "react-intersection-observer"; const Bills_: React.FC<{ bills: sway.IBill[] }> = ({ bills }) => { const [locale] = useLocale(); @@ -27,7 +28,15 @@ const Bills_: React.FC<{ bills: sway.IBill[] }> = ({ bills }) => { ); } - return bills.map((b, i) => ); + return bills.map((b, i) => ( + + {({ inView, ref }) => ( +
+ +
+ )} +
+ )); }, [bills, categories, locale.name]); return ( diff --git a/app/frontend/pages/Legislators.tsx b/app/frontend/pages/Legislators.tsx index 58c7c2a9..a8e23324 100644 --- a/app/frontend/pages/Legislators.tsx +++ b/app/frontend/pages/Legislators.tsx @@ -8,8 +8,9 @@ import { useAxiosPost } from "app/frontend/hooks/useAxios"; import { useLocale } from "app/frontend/hooks/useLocales"; import { toFormattedLocaleName } from "app/frontend/sway_utils"; import { isEmpty } from "lodash"; -import { Fragment, useCallback, useMemo } from "react"; +import { useCallback, useMemo } from "react"; import { Button } from "react-bootstrap"; +import { InView } from "react-intersection-observer"; import { sway } from "sway"; interface IProps { @@ -21,27 +22,6 @@ interface IProps { const Legislators_: React.FC = ({ legislators: representatives }) => { const [locale] = useLocale(); - // useEffect(() => { - // const searchParams = new URLSearchParams(window.location.search); - // const queryStringCompletedRegistration = - // searchParams && searchParams.get(NOTIFY_COMPLETED_REGISTRATION); - // if (queryStringCompletedRegistration === "1") { - // if (localGet(NOTIFY_COMPLETED_REGISTRATION)) { - // searchParams.delete(NOTIFY_COMPLETED_REGISTRATION); - // } else { - // localSet(NOTIFY_COMPLETED_REGISTRATION, "1"); - // notify({ - // level: "success", - // title: withTadas("Welcome to Sway"), - // message: "Click/tap here to start voting and earning Sway!", - // tada: true, - // duration: 200000, - // onClick: () => navigate(ROUTES.billOfTheWeek), - // }); - // } - // } - // }, [navigate, search]); - const reps = useMemo( () => representatives.filter((l) => !locale?.id || l.swayLocaleId === locale?.id), [locale?.id, representatives], @@ -49,18 +29,22 @@ const Legislators_: React.FC = ({ legislators: representatives }) => { const render = useMemo(() => { return reps.map((legislator: sway.ILegislator, index: number) => ( - -
- -
- {index === reps.length - 1 ? null : ( -
-
- + + {({ inView, ref }) => ( +
+
+
+ {index === reps.length - 1 ? null : ( +
+
+ +
+
+ )}
)} - +
)); }, [reps]); diff --git a/app/frontend/sway_utils/index.ts b/app/frontend/sway_utils/index.ts index bd317260..3f66c869 100644 --- a/app/frontend/sway_utils/index.ts +++ b/app/frontend/sway_utils/index.ts @@ -53,6 +53,7 @@ if (!Array.prototype.last) { // const GAINED_SWAY_MESSAGE = "You gained some Sway!"; export const notify = ({ + id, level, title, message, @@ -60,15 +61,16 @@ export const notify = ({ duration: _duration, onClick: _onClick, }: { + id?: string; level: sway.TAlertLevel; - title: string; + title: string | JSX.Element; message?: string; tada?: boolean; duration?: number; onClick?: () => void; }): string => { const options = { - id: `${level}-${title}-${message}`, + id: id || (typeof title === "string" ? `${level}-${title}-${message}` : undefined), position: "bottom-center", // position: IS_MOBILE_PHONE ? toast.POSITION.TOP_CENTER : toast.POSITION.TOP_RIGHT, // autoClose: duration === 0 ? false : duration || undefined, @@ -97,7 +99,7 @@ export const notify = ({ // options["onClick"] = onClick; // } - const notification = message ? `${title} ${message}` : title; + const notification = message && typeof title === "string" ? `${title} ${message}` : title; if (level === "success") { return toast.success(notification, options); diff --git a/db/seeds/models/bill.rb b/db/seeds/models/bill.rb index c96d2f50..d7ca9af4 100644 --- a/db/seeds/models/bill.rb +++ b/db/seeds/models/bill.rb @@ -10,54 +10,56 @@ class SeedBill def self.run(sway_locales) sway_locales.each do |sway_locale| T.let(read_bills(sway_locale), T::Array[T::Hash[String, String]]).each do |json| - SeedBill.new.seed(T.let(json, T::Hash[String, String]), sway_locale) if json.fetch('external_id', nil).present? + SeedBill.new.seed(T.let(json, T::Hash[String, String]), sway_locale) if json.fetch("external_id", nil).present? end end end sig { params(sway_locale: SwayLocale).returns(T::Array[T::Hash[String, String]]) } def self.read_bills(sway_locale) - T.let(JSON.parse(File.read("storage/seeds/data/#{sway_locale.reversed_name.gsub('-', '/')}/bills.json")), - T::Array[T::Hash[String, String]]) + T.let(JSON.parse(File.read("storage/seeds/data/#{sway_locale.reversed_name.tr("-", "/")}/bills.json")), + T::Array[T::Hash[String, String]]) end sig { params(time_string: T.nilable(String)).returns(T.nilable(Time)) } def self.time(time_string) - Time.parse(time_string) if time_string + Time.zone.parse(time_string) if time_string end - def initialize; end + def initialize + end sig { params(json: T::Hash[String, T.untyped], sway_locale: SwayLocale).returns(Bill) } def seed(json, sway_locale) bill = Bill.find_or_initialize_by( - external_id: json.fetch('external_id', nil) + external_id: json.fetch("external_id", nil) ) - bill.external_version = json.fetch('external_version', nil) - bill.title = json.fetch('title', nil) - bill.link = json.fetch('link', nil) - bill.chamber = json.fetch('chamber', nil) - bill.introduced_date_time_utc = json.fetch('introduced_date_time_utc', nil) - bill.house_vote_date_time_utc = json.fetch('house_vote_date_time_utc', nil) - bill.senate_vote_date_time_utc = json.fetch('senate_vote_date_time_utc', nil) - bill.level = json.fetch('level', nil) - bill.category = json.fetch('category', nil) - bill.summary = json.fetch('summary', nil) + bill.external_version = json.fetch("external_version", nil) + bill.title = json.fetch("title", nil) + bill.link = json.fetch("link", nil) + bill.chamber = json.fetch("chamber", nil) + bill.introduced_date_time_utc = Date.strptime(json.fetch("introduced_date_time_utc", Time.zone.now.strftime("%m/%d/%Y")), "%m/%d/%Y") + bill.house_vote_date_time_utc = json.fetch("house_vote_date_time_utc", nil) + bill.senate_vote_date_time_utc = json.fetch("senate_vote_date_time_utc", nil) + bill.level = json.fetch("level", nil) + bill.category = json.fetch("category", nil) + bill.summary = json.fetch("summary", nil) bill.legislator = Legislator.where( - external_id: json.fetch('external_id', nil) + external_id: json.fetch("external_id", nil) ).or( Legislator.where( first_name: T.cast(json, T::Hash[String, T::Hash[String, String]]).dig( - 'legislator', 'first_name' + "legislator", "first_name" ), last_name: T.cast(json, T::Hash[String, T::Hash[String, String]]).dig( - 'legislator', 'last_name' + "legislator", "last_name" ) ) ).find { |l| l.sway_locale.eql?(sway_locale) } bill.sway_locale = sway_locale + bill.save! bill end diff --git a/package-lock.json b/package-lock.json index 31c03382..9ad163e1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,6 +28,7 @@ "react-google-recaptcha-v3": "^1.10.1", "react-hot-toast": "^2.4.1", "react-icons": "^5.3.0", + "react-intersection-observer": "^9.13.1", "react-markdown": "^9.0.1", "react-select": "^5.8.2", "react-social-icons": "^6.18.0", @@ -8026,6 +8027,21 @@ "react": "*" } }, + "node_modules/react-intersection-observer": { + "version": "9.13.1", + "resolved": "https://registry.npmjs.org/react-intersection-observer/-/react-intersection-observer-9.13.1.tgz", + "integrity": "sha512-tSzDaTy0qwNPLJHg8XZhlyHTgGW6drFKTtvjdL+p6um12rcnp8Z5XstE+QNBJ7c64n5o0Lj4ilUleA41bmDoMw==", + "license": "MIT", + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", diff --git a/package.json b/package.json index 177d04ed..39b31b8c 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "react-google-recaptcha-v3": "^1.10.1", "react-hot-toast": "^2.4.1", "react-icons": "^5.3.0", + "react-intersection-observer": "^9.13.1", "react-markdown": "^9.0.1", "react-select": "^5.8.2", "react-social-icons": "^6.18.0", diff --git a/storage/seeds/data/united_states/maryland/baltimore/bills.json b/storage/seeds/data/united_states/maryland/baltimore/bills.json index 3806a445..3fada94b 100644 --- a/storage/seeds/data/united_states/maryland/baltimore/bills.json +++ b/storage/seeds/data/united_states/maryland/baltimore/bills.json @@ -18,5 +18,1006 @@ "status": "committee", "audio_bucket_path": null, "audio_by_line": null + }, + { + "external_id": "01-1001", + "external_version": "0", + "title": "Community Safety Initiative - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=001&GUID=12345678-ABCD-1234-ABCD-1234567890AB", + "chamber": "council", + "introduced_date_time_utc": "01/10/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "police", + "legislator": { + "first_name": "Brandon", + "last_name": "Scott" + }, + "active": true, + "status": "passed", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1002", + "external_version": "0", + "title": "Affordable Housing Plan - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=002&GUID=12345678-ABCD-1234-ABCD-1234567890AC", + "chamber": "council", + "introduced_date_time_utc": "02/10/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "housing", + "legislator": { + "first_name": "Nick", + "last_name": "Mosby" + }, + "active": true, + "status": "committee", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1003", + "external_version": "0", + "title": "Public Health Awareness Campaign - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=003&GUID=12345678-ABCD-1234-ABCD-1234567890AD", + "chamber": "council", + "introduced_date_time_utc": "03/10/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "health", + "legislator": { + "first_name": "Zeke", + "last_name": "Cohen" + }, + "active": true, + "status": "failed", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1004", + "external_version": "0", + "title": "Infrastructure Improvement Act - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=004&GUID=12345678-ABCD-1234-ABCD-1234567890AE", + "chamber": "council", + "introduced_date_time_utc": "04/10/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "infrastructure", + "legislator": { + "first_name": "Danielle", + "last_name": "McCray" + }, + "active": true, + "status": "passed", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1005", + "external_version": "0", + "title": "Education Reform Initiative - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=005&GUID=12345678-ABCD-1234-ABCD-1234567890AF", + "chamber": "council", + "introduced_date_time_utc": "05/10/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "education", + "legislator": { + "first_name": "Ryan", + "last_name": "Dorsey" + }, + "active": true, + "status": "committee", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1006", + "external_version": "0", + "title": "Civil Rights Protection Act - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=006&GUID=12345678-ABCD-1234-ABCD-1234567890AG", + "chamber": "council", + "introduced_date_time_utc": "06/10/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "civil rights", + "legislator": { + "first_name": "Mark", + "last_name": "Conway" + }, + "active": true, + "status": "vetoed", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1007", + "external_version": "0", + "title": "Transportation Equity Bill - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=007&GUID=12345678-ABCD-1234-ABCD-1234567890AH", + "chamber": "council", + "introduced_date_time_utc": "07/10/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "transportation", + "legislator": { + "first_name": "Sharon", + "last_name": "Middleton" + }, + "active": false, + "status": "committee", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1008", + "external_version": "0", + "title": "Political Reform Package - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=008&GUID=12345678-ABCD-1234-ABCD-1234567890AI", + "chamber": "council", + "introduced_date_time_utc": "08/10/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "political reform", + "legislator": { + "first_name": "James", + "last_name": "Torrence" + }, + "active": true, + "status": "passed", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1009", + "external_version": "0", + "title": "Neighborhood Revitalization Act - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=009&GUID=12345678-ABCD-1234-ABCD-1234567890AJ", + "chamber": "council", + "introduced_date_time_utc": "09/10/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "economy", + "legislator": { + "first_name": "Kristefer", + "last_name": "Burnett" + }, + "active": true, + "status": "committee", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1010", + "external_version": "0", + "title": "Emergency Response Plan - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=010&GUID=12345678-ABCD-1234-ABCD-1234567890AK", + "chamber": "council", + "introduced_date_time_utc": "10/10/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "infrastructure", + "legislator": { + "first_name": "John", + "last_name": "Bullock" + }, + "active": true, + "status": "failed", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1011", + "external_version": "0", + "title": "Youth Engagement Initiative - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=011&GUID=12345678-ABCD-1234-ABCD-1234567890AL", + "chamber": "council", + "introduced_date_time_utc": "11/10/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "education", + "legislator": { + "first_name": "Phylicia", + "last_name": "Porter" + }, + "active": true, + "status": "passed", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1012", + "external_version": "0", + "title": "Green Spaces Development - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=012&GUID=12345678-ABCD-1234-ABCD-1234567890AM", + "chamber": "council", + "introduced_date_time_utc": "12/10/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "environment", + "legislator": { + "first_name": "Eric", + "last_name": "Costello" + }, + "active": true, + "status": "committee", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1013", + "external_version": "0", + "title": "Digital Equity Act - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=013&GUID=12345678-ABCD-1234-ABCD-1234567890AN", + "chamber": "council", + "introduced_date_time_utc": "01/15/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "political reform", + "legislator": { + "first_name": "Robert", + "last_name": "Stokes" + }, + "active": true, + "status": "vetoed", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1014", + "external_version": "0", + "title": "Clean Water Initiative - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=014&GUID=12345678-ABCD-1234-ABCD-1234567890AO", + "chamber": "council", + "introduced_date_time_utc": "02/15/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "health", + "legislator": { + "first_name": "Antonio", + "last_name": "Glover" + }, + "active": true, + "status": "passed", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1015", + "external_version": "0", + "title": "Job Creation Act - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=015&GUID=12345678-ABCD-1234-ABCD-1234567890AP", + "chamber": "council", + "introduced_date_time_utc": "03/15/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "economy", + "legislator": { + "first_name": "Odette", + "last_name": "Ramos" + }, + "active": true, + "status": "committee", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1016", + "external_version": "0", + "title": "Affordable Childcare Program - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=016&GUID=12345678-ABCD-1234-ABCD-1234567890AQ", + "chamber": "council", + "introduced_date_time_utc": "04/15/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "education", + "legislator": { + "first_name": "Brandon", + "last_name": "Scott" + }, + "active": false, + "status": "failed", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1017", + "external_version": "0", + "title": "Urban Farming Initiative - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=017&GUID=12345678-ABCD-1234-ABCD-1234567890AR", + "chamber": "council", + "introduced_date_time_utc": "05/15/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "environment", + "legislator": { + "first_name": "Nick", + "last_name": "Mosby" + }, + "active": true, + "status": "passed", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1018", + "external_version": "0", + "title": "Bicycle Infrastructure Bill - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=018&GUID=12345678-ABCD-1234-ABCD-1234567890AS", + "chamber": "council", + "introduced_date_time_utc": "06/15/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "transportation", + "legislator": { + "first_name": "Zeke", + "last_name": "Cohen" + }, + "active": true, + "status": "committee", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1019", + "external_version": "0", + "title": "Mental Health Support Act - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=019&GUID=12345678-ABCD-1234-ABCD-1234567890AT", + "chamber": "council", + "introduced_date_time_utc": "07/15/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "health", + "legislator": { + "first_name": "Danielle", + "last_name": "McCray" + }, + "active": true, + "status": "vetoed", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1020", + "external_version": "0", + "title": "Small Business Support Program - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=020&GUID=12345678-ABCD-1234-ABCD-1234567890AU", + "chamber": "council", + "introduced_date_time_utc": "08/15/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "economy", + "legislator": { + "first_name": "Ryan", + "last_name": "Dorsey" + }, + "active": false, + "status": "committee", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1021", + "external_version": "0", + "title": "Community Mental Health Awareness - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=021&GUID=12345678-ABCD-1234-ABCD-1234567890AV", + "chamber": "council", + "introduced_date_time_utc": "09/15/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "health", + "legislator": { + "first_name": "Sharon", + "last_name": "Middleton" + }, + "active": true, + "status": "passed", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1022", + "external_version": "0", + "title": "Access to Education Fund - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=022&GUID=12345678-ABCD-1234-ABCD-1234567890AW", + "chamber": "council", + "introduced_date_time_utc": "10/15/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "education", + "legislator": { + "first_name": "Kristefer", + "last_name": "Burnett" + }, + "active": true, + "status": "committee", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1023", + "external_version": "0", + "title": "Public Transportation Enhancement - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=023&GUID=12345678-ABCD-1234-ABCD-1234567890AX", + "chamber": "council", + "introduced_date_time_utc": "11/15/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "transportation", + "legislator": { + "first_name": "Eric", + "last_name": "Costello" + }, + "active": true, + "status": "passed", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1024", + "external_version": "0", + "title": "Crime Prevention Strategy - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=024&GUID=12345678-ABCD-1234-ABCD-1234567890AY", + "chamber": "council", + "introduced_date_time_utc": "12/15/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "police", + "legislator": { + "first_name": "Ryan", + "last_name": "Dorsey" + }, + "active": true, + "status": "committee", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1025", + "external_version": "0", + "title": "Sustainable Energy Program - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=025&GUID=12345678-ABCD-1234-ABCD-1234567890AZ", + "chamber": "council", + "introduced_date_time_utc": "01/01/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "environment", + "legislator": { + "first_name": "Antonio", + "last_name": "Glover" + }, + "active": true, + "status": "passed", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1026", + "external_version": "0", + "title": "Historic Preservation Bill - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=026&GUID=12345678-ABCD-1234-ABCD-1234567890BA", + "chamber": "council", + "introduced_date_time_utc": "02/01/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "political reform", + "legislator": { + "first_name": "John", + "last_name": "Bullock" + }, + "active": false, + "status": "failed", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1027", + "external_version": "0", + "title": "Child Nutrition Program - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=027&GUID=12345678-ABCD-1234-ABCD-1234567890BB", + "chamber": "council", + "introduced_date_time_utc": "03/01/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "health", + "legislator": { + "first_name": "Danielle", + "last_name": "McCray" + }, + "active": true, + "status": "committee", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1028", + "external_version": "0", + "title": "Urban Transportation Plan - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=028&GUID=12345678-ABCD-1234-ABCD-1234567890BC", + "chamber": "council", + "introduced_date_time_utc": "04/01/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "transportation", + "legislator": { + "first_name": "Zeke", + "last_name": "Cohen" + }, + "active": true, + "status": "passed", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1029", + "external_version": "0", + "title": "Senior Citizen Assistance Program - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=029&GUID=12345678-ABCD-1234-ABCD-1234567890BD", + "chamber": "council", + "introduced_date_time_utc": "05/01/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "economy", + "legislator": { + "first_name": "Phylicia", + "last_name": "Porter" + }, + "active": false, + "status": "vetoed", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1030", + "external_version": "0", + "title": "Community Health Clinics Expansion - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=030&GUID=12345678-ABCD-1234-ABCD-1234567890BE", + "chamber": "council", + "introduced_date_time_utc": "06/01/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "health", + "legislator": { + "first_name": "Mark", + "last_name": "Conway" + }, + "active": true, + "status": "committee", + "audio_bucket_path": null, + "audio_by_line": null + }, + + { + "external_id": "01-1031", + "external_version": "0", + "title": "Affordable Housing Initiative - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=031&GUID=12345678-ABCD-1234-ABCD-1234567890BF", + "chamber": "council", + "introduced_date_time_utc": "07/01/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "housing", + "legislator": { + "first_name": "Nick", + "last_name": "Mosby" + }, + "active": true, + "status": "passed", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1032", + "external_version": "0", + "title": "Public Safety Training Program - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=032&GUID=12345678-ABCD-1234-ABCD-1234567890BG", + "chamber": "council", + "introduced_date_time_utc": "08/01/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "police", + "legislator": { + "first_name": "Sharon", + "last_name": "Middleton" + }, + "active": true, + "status": "committee", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1033", + "external_version": "0", + "title": "Food Security Initiative - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=033&GUID=12345678-ABCD-1234-ABCD-1234567890BH", + "chamber": "council", + "introduced_date_time_utc": "09/01/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "health", + "legislator": { + "first_name": "Eric", + "last_name": "Costello" + }, + "active": true, + "status": "passed", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1034", + "external_version": "0", + "title": "Digital Literacy Program - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=034&GUID=12345678-ABCD-1234-ABCD-1234567890BI", + "chamber": "council", + "introduced_date_time_utc": "10/01/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "education", + "legislator": { + "first_name": "Zeke", + "last_name": "Cohen" + }, + "active": false, + "status": "failed", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1035", + "external_version": "0", + "title": "Neighborhood Revitalization Project - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=035&GUID=12345678-ABCD-1234-ABCD-1234567890BJ", + "chamber": "council", + "introduced_date_time_utc": "11/01/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "housing", + "legislator": { + "first_name": "Mark", + "last_name": "Conway" + }, + "active": true, + "status": "committee", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1036", + "external_version": "0", + "title": "Youth Employment Initiative - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=036&GUID=12345678-ABCD-1234-ABCD-1234567890BK", + "chamber": "council", + "introduced_date_time_utc": "12/01/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "economy", + "legislator": { + "first_name": "Antonio", + "last_name": "Glover" + }, + "active": true, + "status": "passed", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1037", + "external_version": "0", + "title": "Transportation Equity Plan - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=037&GUID=12345678-ABCD-1234-ABCD-1234567890BL", + "chamber": "council", + "introduced_date_time_utc": "01/01/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "transportation", + "legislator": { + "first_name": "Phylicia", + "last_name": "Porter" + }, + "active": false, + "status": "vetoed", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1038", + "external_version": "0", + "title": "Community Arts Funding - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=038&GUID=12345678-ABCD-1234-ABCD-1234567890BM", + "chamber": "council", + "introduced_date_time_utc": "02/01/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "education", + "legislator": { + "first_name": "John", + "last_name": "Bullock" + }, + "active": true, + "status": "committee", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1039", + "external_version": "0", + "title": "Health Access for All - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=039&GUID=12345678-ABCD-1234-ABCD-1234567890BN", + "chamber": "council", + "introduced_date_time_utc": "03/01/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "health", + "legislator": { + "first_name": "Brandon", + "last_name": "Scott" + }, + "active": true, + "status": "passed", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1040", + "external_version": "0", + "title": "Civic Engagement Initiative - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=040&GUID=12345678-ABCD-1234-ABCD-1234567890BO", + "chamber": "council", + "introduced_date_time_utc": "04/01/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "political reform", + "legislator": { + "first_name": "Ryan", + "last_name": "Dorsey" + }, + "active": false, + "status": "failed", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1041", + "external_version": "0", + "title": "Youth Mental Health Services - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=041&GUID=12345678-ABCD-1234-ABCD-1234567890BP", + "chamber": "council", + "introduced_date_time_utc": "05/01/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "health", + "legislator": { + "first_name": "Antonio", + "last_name": "Glover" + }, + "active": true, + "status": "passed", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1042", + "external_version": "0", + "title": "Green Spaces Development - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=042&GUID=12345678-ABCD-1234-ABCD-1234567890BQ", + "chamber": "council", + "introduced_date_time_utc": "06/01/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "environment", + "legislator": { + "first_name": "Kristefer", + "last_name": "Burnett" + }, + "active": true, + "status": "committee", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1043", + "external_version": "0", + "title": "Accessible Public Transportation - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=043&GUID=12345678-ABCD-1234-ABCD-1234567890BR", + "chamber": "council", + "introduced_date_time_utc": "07/01/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "transportation", + "legislator": { + "first_name": "Danielle", + "last_name": "McCray" + }, + "active": true, + "status": "passed", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1044", + "external_version": "0", + "title": "Civic Education Curriculum - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=044&GUID=12345678-ABCD-1234-ABCD-1234567890BS", + "chamber": "council", + "introduced_date_time_utc": "08/01/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "education", + "legislator": { + "first_name": "Robert", + "last_name": "Stokes" + }, + "active": false, + "status": "failed", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1045", + "external_version": "0", + "title": "Small Business Development Fund - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=045&GUID=12345678-ABCD-1234-ABCD-1234567890BT", + "chamber": "council", + "introduced_date_time_utc": "09/01/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "economy", + "legislator": { + "first_name": "Nick", + "last_name": "Mosby" + }, + "active": true, + "status": "committee", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1046", + "external_version": "0", + "title": "Veterans Assistance Program - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=046&GUID=12345678-ABCD-1234-ABCD-1234567890BU", + "chamber": "council", + "introduced_date_time_utc": "10/01/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "civil rights", + "legislator": { + "first_name": "John", + "last_name": "Bullock" + }, + "active": true, + "status": "passed", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1047", + "external_version": "0", + "title": "Digital Equity Initiative - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=047&GUID=12345678-ABCD-1234-ABCD-1234567890BV", + "chamber": "council", + "introduced_date_time_utc": "11/01/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "political reform", + "legislator": { + "first_name": "Phylicia", + "last_name": "Porter" + }, + "active": false, + "status": "vetoed", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1048", + "external_version": "0", + "title": "Community Policing Enhancement - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=048&GUID=12345678-ABCD-1234-ABCD-1234567890BW", + "chamber": "council", + "introduced_date_time_utc": "12/01/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "police", + "legislator": { + "first_name": "Brandon", + "last_name": "Scott" + }, + "active": true, + "status": "committee", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1049", + "external_version": "0", + "title": "Local Farming Support Program - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=049&GUID=12345678-ABCD-1234-ABCD-1234567890BX", + "chamber": "council", + "introduced_date_time_utc": "01/01/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "economy", + "legislator": { + "first_name": "Ryan", + "last_name": "Dorsey" + }, + "active": true, + "status": "passed", + "audio_bucket_path": null, + "audio_by_line": null + }, + { + "external_id": "01-1050", + "external_version": "0", + "title": "Environmental Justice Policy - Fiscal Year 2025", + "link": "https://example.legistar.com/LegislationDetail.aspx?ID=050&GUID=12345678-ABCD-1234-ABCD-1234567890BY", + "chamber": "council", + "introduced_date_time_utc": "02/01/2024", + "house_vote_date_time_utc": null, + "senate_vote_date_time_utc": null, + "level": "local", + "category": "environment", + "legislator": { + "first_name": "Zeke", + "last_name": "Cohen" + }, + "active": false, + "status": "failed", + "audio_bucket_path": null, + "audio_by_line": null } ]