Skip to content

Commit ad63191

Browse files
feat: add the firearms veto referendum and associated schema changes (#2109)
1 parent 4893610 commit ad63191

6 files changed

Lines changed: 67 additions & 2 deletions

File tree

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# ballotQuestions/2026/24-firearms-referendum.yaml
2+
#
3+
# Referendum petition (Article 48 §2) to repeal Chapter 135 of the Acts of 2024,
4+
# "An Act Modernizing Firearm Laws." Filed with the Secretary of the
5+
# Commonwealth on Aug. 9, 2024 by ten qualified voters; certified for the
6+
# November 2026 ballot. Underlying bill is H.4885 of the 193rd General Court.
7+
#
8+
# id: descriptive. Unlike initiative petitions (which carry an AG YY-NN
9+
# docket number — e.g. 25-03), referendum petitions in MA are not assigned
10+
# a docket number; the Secretary's transmittal letter to the AG identifies
11+
# the petition only by the chapter it seeks to repeal.
12+
id: "24-firearms-referendum"
13+
billId: "H4885"
14+
title: "Referendum on the 2024 firearms law (Chapter 135)"
15+
court: 193
16+
electionYear: 2026
17+
type: referendum
18+
ballotStatus: certified
19+
ballotQuestionNumber: null
20+
relatedBillIds: []
21+
description: null
22+
atAGlance: null
23+
fullSummary: |-
24+
This referendum asks voters whether to repeal Chapter 135 of the Acts of 2024,
25+
"An Act Modernizing Firearm Laws," an omnibus law passed by the Legislature
26+
and signed by Governor Healey in 2024 that made several changes to the
27+
state's firearm regulations.
28+
29+
Opponents of the law gathered enough certified signatures to qualify a
30+
referendum petition for the November 2026 ballot. A YES vote keeps the law
31+
in effect. A NO vote repeals it.
32+
33+
An official summary prepared by the Attorney General will appear in the
34+
state's Information for Voters guide closer to the election.
35+
pdfUrl: "https://malegislature.gov/Laws/SessionLaws/Acts/2024/Chapter135"

components/ballotquestions/BallotQuestionHeader.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { useTranslation } from "next-i18next"
12
import Link from "next/link"
23
import { Container, Row, Col } from "react-bootstrap"
34
import { useAuth } from "../auth"
@@ -16,6 +17,7 @@ export const BallotQuestionHeader = ({
1617
ballotQuestion: BallotQuestion
1718
bill: Bill | null
1819
}) => {
20+
const { t } = useTranslation("search")
1921
const { notifications } = useFlags()
2022
const { user } = useAuth()
2123
const statusLabel = getBallotQuestionStatusLabel(ballotQuestion.ballotStatus)
@@ -36,6 +38,8 @@ export const BallotQuestionHeader = ({
3638
return "Constitutional Amendment"
3739
case "advisory":
3840
return "Advisory Question"
41+
case "referendum":
42+
return t("ballot_question_type.referendum")
3943
default:
4044
return "Ballot Question"
4145
}

components/ballotquestions/OverviewTab.tsx

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { Trans, useTranslation } from "next-i18next"
12
import type { ReactNode } from "react"
23
import { Col, Row } from "react-bootstrap"
34
import { BallotQuestion, Bill } from "../db"
@@ -14,6 +15,7 @@ export const OverviewTab = ({
1415
bill: Bill | null
1516
hearings: Hearing[]
1617
}) => {
18+
const { t } = useTranslation("search")
1719
const sortedHearings = [...hearings].sort((a, b) => b.startsAt - a.startsAt)
1820
const sectionCopyStyle = {
1921
color: "#334155",
@@ -47,6 +49,21 @@ export const OverviewTab = ({
4749
</div>
4850
</SectionCard>
4951

52+
{ballotQuestion.type === "referendum" && (
53+
<SectionCard>
54+
<h3 className="h5 mb-2 text-dark">
55+
{t("ballot_question_referendum_how_vote_works.title")}
56+
</h3>
57+
<p className="mb-0" style={sectionCopyStyle}>
58+
<Trans
59+
i18nKey="ballot_question_referendum_how_vote_works.body"
60+
ns="search"
61+
components={[<strong key="yes" />, <strong key="no" />]}
62+
/>
63+
</p>
64+
</SectionCard>
65+
)}
66+
5067
{ballotQuestion.atAGlance && ballotQuestion.atAGlance.length > 0 && (
5168
<SectionCard>
5269
<h3 className="h5 mb-3 text-dark">Key Details</h3>

functions/src/ballotQuestions/types.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ export const BallotQuestion = withDefaults(
3636
L("initiative_constitutional"),
3737
L("legislative_referral"),
3838
L("constitutional_amendment"),
39-
L("advisory")
39+
L("advisory"),
40+
L("referendum")
4041
),
4142
ballotStatus: BallotQuestionStatus,
4243
ballotQuestionNumber: Union(Number, Null),

pages/ballotQuestions/[id].tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,8 @@ export const getServerSideProps: GetServerSideProps = async ctx => {
100100
"common",
101101
"footer",
102102
"testimony",
103-
"profile"
103+
"profile",
104+
"search"
104105
]))
105106
}
106107
}

public/locales/en/search.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,13 @@
2828
"rejected": "Rejected",
2929
"accepted": "Accepted"
3030
},
31+
"ballot_question_type": {
32+
"referendum": "Veto Referendum"
33+
},
34+
"ballot_question_referendum_how_vote_works": {
35+
"title": "How the vote works",
36+
"body": "This is a referendum on a law the Legislature has already enacted. <0>A YES vote keeps this law in effect.</0> <1>A NO vote repeals it.</1>"
37+
},
3138
"ballot_question_results_summary": "Showing {{count}} questions",
3239
"ballot_question_reset_filters": "Reset filters",
3340
"ballot_question_no_summary": "No summary available yet.",

0 commit comments

Comments
 (0)