Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
62 commits
Select commit Hold shift + click to select a range
1f36c58
Merge pull request #1944 from mertbagt/sync-playback-to-transcription
mertbagt Sep 26, 2025
19d92ec
fix(notifications): Adding Daily option to notification settings drop…
Mephistic Sep 30, 2025
f569d7f
Debug bill detail page translations (#1953)
jicruz96 Sep 30, 2025
f6480e8
refactor CardTitle to be generic; update usage (#1942)
jasrose Oct 2, 2025
3c933eb
remove redundant font-family declarations (#1926)
jicruz96 Oct 2, 2025
1918a48
create Browse Hearings page and hearings search index
jicruz96 Oct 3, 2025
bbf9daa
merge new changes
jicruz96 Oct 4, 2025
ef14b8b
create hearings search index
jicruz96 Oct 4, 2025
cf45e56
update events type
jicruz96 Oct 4, 2025
5d9fe4d
Merge branch 'browse-hearings-page-2' into browse-hearings
jicruz96 Oct 4, 2025
6c4a03c
rename base -> shared
jicruz96 Oct 4, 2025
b4f1330
remove redundant file
jicruz96 Oct 4, 2025
4cbe155
fix miscellaneous translations + build warnings (#1934)
jicruz96 Oct 4, 2025
ea91f87
Merge branch 'main' into browse-hearings
jicruz96 Oct 4, 2025
9a20c8a
refactor HearingHit component to use styled card and avoid nested anc…
jicruz96 Oct 4, 2025
46bbc80
add SearchPage stories and mock instant search adapter
jicruz96 Oct 4, 2025
92784dc
Minor updates to goals and mission (#1962)
nesanders Oct 8, 2025
e435d7e
contain hyperlink size
mertbagt Oct 9, 2025
54a3775
bills under consideration
mertbagt Oct 9, 2025
bde9393
refactored See all
mertbagt Oct 9, 2025
4e38d67
display bills in agenda
mertbagt Oct 9, 2025
07eb3a3
handle BillsInAgenda when undefined
mertbagt Oct 9, 2025
e62718c
simply see members button
mertbagt Oct 12, 2025
d5b0a44
voting modal
mertbagt Oct 12, 2025
27c396a
handle recommended actions
mertbagt Oct 13, 2025
a13c33c
Create search component for hearing page (#1954)
HuanFengYeh Oct 14, 2025
bfb5023
Backfill Hearing Transcriptions Script (#1951)
kiminkim724 Oct 14, 2025
985f54f
cleanup
mertbagt Oct 14, 2025
cef8244
Merge branch 'main' into sidebar-votes
mertbagt Oct 14, 2025
993fa7e
merge translations
mertbagt Oct 14, 2025
73387a2
conflict resolution
mertbagt Oct 14, 2025
26d0ae4
resolve conflict
mertbagt Oct 14, 2025
fddcdc8
tweak to match figma
mertbagt Oct 15, 2025
adfb914
sync to figma
mertbagt Oct 15, 2025
e8d8ce1
Fix test failure (#1968)
chiroptical Oct 22, 2025
759ef7d
Use setup-firebase instead of the old one (#1958)
chiroptical Oct 22, 2025
de9ce4e
Use the correct inputs to setup_firebase (#1969)
chiroptical Oct 22, 2025
58cdbeb
removed unprovable claim
mertbagt Oct 24, 2025
9465aa0
removed no recommendations
mertbagt Oct 24, 2025
409e0c0
modal vote question
mertbagt Oct 24, 2025
840e84e
top level vote results
mertbagt Oct 24, 2025
2527a4a
added branch to member list
mertbagt Oct 24, 2025
e68c36b
member line data
mertbagt Oct 24, 2025
f4c4a1d
inner modal styling
mertbagt Oct 24, 2025
2ca2581
cleanup
mertbagt Oct 24, 2025
5f966a0
cleanup 2
mertbagt Oct 24, 2025
d418f94
prettier
mertbagt Oct 24, 2025
a6b69cb
prettier attempt 2
mertbagt Oct 24, 2025
dfd6000
cleanup3
mertbagt Oct 25, 2025
b27b21d
Update tools version in deployment workflow (#1970)
Mephistic Oct 28, 2025
2de7e82
... (#1973)
chiroptical Oct 29, 2025
692e479
Add court sessions data structure and update hearing components to us…
jicruz96 Oct 29, 2025
1c03b0e
Merge branch 'main' into browse-hearings
jicruz96 Oct 29, 2025
497f65a
Merge pull request #1967 from mertbagt/sidebar-votes
mertbagt Oct 30, 2025
3eacfb9
Merge branch 'main' into browse-hearings
mertbagt Nov 5, 2025
7bb12bc
Merge pull request #1961 from jicruz96/browse-hearings
mertbagt Nov 5, 2025
8745020
chore(firestore): Update firestore indexes to reflect new index for t…
Mephistic Nov 5, 2025
37a0a22
tweaks (#1979)
mertbagt Nov 10, 2025
3dbe710
Browse hearings sort patch (#1980)
jicruz96 Nov 12, 2025
567266c
Added overflow-wrap: break-word to testimony description. (#1976)
delexagon Nov 12, 2025
e171ce0
Add summary backfill (#1948)
chiroptical Nov 12, 2025
469320d
Use normalize_summary for document creation (#1981)
chiroptical Nov 12, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 15 additions & 12 deletions .github/workflows/deploy-python-backend-dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,19 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v5
- name: Install Python 3.11
run: |
sudo add-apt-repository ppa:deadsnakes/ppa -y
sudo apt update
sudo apt install python3.11 python3.11-venv python3-pip
- name: Build and deploy to Firebase
uses: w9jds/firebase-action@v13.18.0
- name: Setup build environment
uses: ./.github/actions/setup-repo
- name: Setup python
uses: actions/setup-python@v6
with:
args: deploy --force --only functions:maple-llm
env:
GCP_SA_KEY: ${{ secrets.GCP_SERVICE_ACCOUNT_KEY }}
ASSEMBLY_API_KEY: ${{ secrets.ASSEMBLY_API_KEY }}
PROJECT_ID: digital-testimony-dev
python-version: "3.11"
- name: Setup Firebase
# The only tag on this repo is v1.0.0, but it is very old
# This SHA is main as of 2025-10-21
uses: w9jds/setup-firebase@869785322147e6a53d463a55db0a5af1b4ce4ba6
with:
tools-version: 13.18.0
gcp_sa_key: ${{ secrets.GCP_SERVICE_ACCOUNT_KEY }}
project_id: digital-testimony-dev
- name: Deploy Python firebase functions
run: firebase deploy --force --only functions:maple-llm
1 change: 0 additions & 1 deletion components/BillStatusCard/BillStatusCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,6 @@ const StatusStyle = styled.div`
background-color: white;
color: black;

font-family: Nunito;
font-style: normal;
font-weight: 500;
font-size: 1.5rem;
Expand Down
22 changes: 12 additions & 10 deletions components/Card/Card.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -43,16 +43,18 @@ export const Card = (CardProps: CardProps) => {
} = CardProps

const headerContent = header ? (
<CardTitle
header={header}
subheader={subheader}
timestamp={timestamp}
imgSrc={imgSrc}
inHeaderElement={inHeaderElement}
/>
) : headerElement ? (
headerElement
) : null
<CardBootstrap.Body className="align-items-center d-flex px-2 pt-2 pb-0">
<CardBootstrap.Body className="px-3 py-0">
<CardTitle>
<CardBootstrap.Title className="align-items-start fs-6 lh-sm mb-1 text-secondary">
<strong>{header}</strong>
</CardBootstrap.Title>
</CardTitle>
</CardBootstrap.Body>
</CardBootstrap.Body>
) : (
headerElement ?? null
)

const bodyContent = body ? (
body
Expand Down
226 changes: 15 additions & 211 deletions components/Card/CardTitle.tsx
Original file line number Diff line number Diff line change
@@ -1,218 +1,22 @@
import { useTranslation } from "next-i18next"
import { ReactElement } from "react"
import CardBootstrap from "react-bootstrap/Card"
import { formatBillId } from "components/formatting"
import { Internal } from "components/links"
import clsx from "clsx"
import React from "react"

interface CardTitleProps {
authorUid?: string
billId?: string
court?: string
header?: string
subheader?: string
timestamp?: string
imgSrc?: string
inHeaderElement?: ReactElement
isBillMatch?: boolean
isUserMatch?: boolean
type?: string
userRole?: string
isNewsfeed?: string
type CardTitleBaseProps = {
title?: React.ReactNode
className?: string
children?: React.ReactNode
}

export const CardTitle = (props: CardTitleProps) => {
const {
authorUid,
billId,
court,
header,
isBillMatch,
isUserMatch,
subheader,
type,
userRole,
isNewsfeed
} = props

const CardTitle: React.FC<CardTitleBaseProps> = ({
title,
children,
className
}) => {
return (
<CardBootstrap.Body className={`align-items-center d-flex px-2 pt-2 pb-0`}>
<CardHeaderImg type={type} userRole={userRole} />
<CardBootstrap.Body className="px-3 py-0">
<CardTitleHeadline
authorUid={authorUid}
billId={billId}
court={court}
header={header}
subheader={subheader}
type={type}
/>
{isNewsfeed ? (
<CardTitleFollowing
billId={billId}
header={header}
subheader={subheader}
isBillMatch={isBillMatch}
isUserMatch={isUserMatch}
type={type}
/>
) : (
<></>
)}
</CardBootstrap.Body>
</CardBootstrap.Body>
<div className={clsx("card-title", className)}>{title ?? children}</div>
)
}

const CardHeaderImg = (props: CardTitleProps) => {
const { type, userRole } = props

let avatar = `individualUser.svg`
if (userRole == `organization`) {
avatar = `OrganizationUser.svg`
}

switch (type) {
case "testimony":
return (
<div className="justify-content-middle d-flex flex-column align-items-center">
<img alt="capitol building" src={avatar} width="32" height="32" />
</div>
)
case "bill":
return (
<div className="justify-content-middle d-flex flex-column align-items-center">
<img
alt="capitol building"
src={`/images/bill-capitol.svg`}
width="32"
height="32"
/>
</div>
)
default:
return <></>
}
}

const CardTitleHeadline = (props: CardTitleProps) => {
const { authorUid, billId, court, header, subheader, type } = props
const { t } = useTranslation("common")

switch (type) {
case "testimony":
return (
<>
{header && subheader && (
<CardBootstrap.Title
className={`align-items-start fs-6 lh-sm mb-1 text-secondary`}
>
<Internal href={`/profile?id=${authorUid}`}>
<strong>{subheader}</strong>
</Internal>

{t("newsfeed.endorsed")}
<a href={`/bills/${court}/${billId}`}>
{billId && <strong>{formatBillId(billId)}</strong>}
</a>
</CardBootstrap.Title>
)}
</>
)
case "bill":
return (
<>
{header && (
<CardBootstrap.Title
className={`align-items-start fs-6 lh-sm mb-1 text-secondary`}
>
{billId && (
<a href={`/bills/${court}/${billId}`}>
<strong>{formatBillId(billId)}</strong>
</a>
)}{" "}
{subheader && (
<>
{t("newsfeed.actionUpdate")}
{subheader}
</>
)}
</CardBootstrap.Title>
)}
</>
)
default:
return (
<CardBootstrap.Title
className={`align-items-start fs-6 lh-sm mb-1 text-secondary`}
>
<strong>{header}</strong>
</CardBootstrap.Title>
)
}
}

const CardTitleFollowing = (props: CardTitleProps) => {
const { billId, header, isBillMatch, isUserMatch, subheader, type } = props
const { t } = useTranslation("common")

if (type == ``) {
return <></>
} else if (type === `bill`) {
return (
<>
{header && (
<CardBootstrap.Title
className={`align-items-start fs-6 lh-sm mb-1 text-body-tertiary`}
>
{isBillMatch ? (
<>{t("newsfeed.follow")}</>
) : (
<>{t("newsfeed.notFollow")}</>
)}
{billId && <strong>{formatBillId(billId)}</strong>}
</CardBootstrap.Title>
)}
</>
)
} else if (isBillMatch && isUserMatch) {
return (
<CardBootstrap.Title
className={`align-items-start fs-6 lh-sm mb-1 text-body-tertiary`}
>
{t("newsfeed.follow")}
{billId && <strong>{formatBillId(billId)}</strong>}
{t("newsfeed.and")}
{subheader}
</CardBootstrap.Title>
)
} else if (isBillMatch === true && isUserMatch === false) {
return (
<CardBootstrap.Title
className={`align-items-start fs-6 lh-sm mb-1 text-body-tertiary`}
>
{t("newsfeed.follow")}
{billId && <strong>{formatBillId(billId)}</strong>}
</CardBootstrap.Title>
)
} else if (isBillMatch === false && isUserMatch === true) {
return (
<CardBootstrap.Title
className={`align-items-start fs-6 lh-sm mb-1 text-body-tertiary`}
>
{t("newsfeed.follow")}
{subheader}
</CardBootstrap.Title>
)
} else {
return (
<CardBootstrap.Title
className={`align-items-start fs-6 lh-sm mb-1 text-body-tertiary`}
>
{t("newsfeed.notFollowEither")}
{billId && <strong>{formatBillId(billId)}</strong>}
{t("newsfeed.or")}
{subheader}
</CardBootstrap.Title>
)
}
}
// keep both named + default so existing imports don’t break
export { CardTitle }
export default CardTitle
1 change: 0 additions & 1 deletion components/ContactInfo/ContactInfo.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ export const Container = styled.div`
align-items: flex-end;
gap: 5px;
font-size: 22;
font-family: Nunito;
`
export const Link = styled.a`
color: inherit;
Expand Down
3 changes: 3 additions & 0 deletions components/EditProfilePage/ProfileSettingsModal.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,9 @@ export default function ProfileSettingsModal({
variant="outline-secondary"
/>
<Dropdown.Menu className={`col-12 bg-white `}>
<Dropdown.Item onClick={() => setNotifications("Daily")}>
{t("email.daily")}
</Dropdown.Item>
<Dropdown.Item onClick={() => setNotifications("Weekly")}>
{t("email.weekly")}
</Dropdown.Item>
Expand Down
3 changes: 0 additions & 3 deletions components/EditProfilePage/StyledEditProfileComponents.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ export const StyledTabNav = styled(Nav).attrs(props => ({
}

text-align: center;
font-family: Nunito;
font-size: 1.25rem;
color: var(--bs-dark);

Expand Down Expand Up @@ -82,7 +81,6 @@ export const TabNavItem = ({
export const StyledDropdownNav = styled(NavDropdown).attrs(props => ({
className: props.className
}))`
font-family: Nunito;
font-size: 1.25rem;
width: auto;
margin: auto;
Expand Down Expand Up @@ -140,7 +138,6 @@ export const StyledHr = styled.hr`

export const Header = styled(Row)`
font-size: 3rem;
font-family: Nunito;
font-weight: 500;
margin-top: 3.5rem;
margin-bottom: 3.5rem;
Expand Down
1 change: 0 additions & 1 deletion components/FollowingCard/FollowingCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ const Container = styled.div`
const Link = styled.a`
text-decoration: none;
color: inherit;
font-family: Nunito;
font-size: 20px;
line-height: 25px;
`
Expand Down
9 changes: 6 additions & 3 deletions components/Footer/Footer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import CustomDropdown, {
} from "components/Footer/CustomFooterDropdown"
import { FooterContainer } from "./FooterContainer"
import { NEWSLETTER_SIGNUP_URL } from "components/common"
import { flags } from "../featureFlags"

export type PageFooterProps = {
children?: any
Expand All @@ -24,15 +25,13 @@ const TextHeader = styled.h6`
font-size: 1rem;
font-weight: bold;
color: #fff;
font-family: Nunito;
padding: 0.5rem 1rem 0 0;
margin: 0;
`

const BrowseHeader = styled(NavLink)`
font-size: 1rem;
color: #fff;
font-family: Nunito;
padding: 0.5rem 1rem 0 0;
margin: 0 0 10px 0;

Expand All @@ -50,7 +49,6 @@ const BrowseHeader = styled(NavLink)`

const StyledInternalLink = styled(NavLink)`
color: rgba(255, 255, 255, 0.55);
font-family: Nunito;
letter-spacing: -0.63px;
padding-top: 4;
margin: 5px 0;
Expand Down Expand Up @@ -220,6 +218,11 @@ const BrowseList = () => {
<BrowseHeader href="/testimony">
{t("navigation.browseTestimony")}
</BrowseHeader>
{flags().hearingsAndTranscriptions ? (
<BrowseHeader href="/hearings">
{t("navigation.browseHearings")}
</BrowseHeader>
) : null}
<BrowseHeader href="/bills">{t("navigation.browseBills")}</BrowseHeader>
</>
)
Expand Down
Loading