RGAA : mise en conformité Tableaux (#2307)

* feat: Ajoute un résumé au <table> sur la page budget

* feat: Ajoute un summary + des th

* feat: Ajoute un aria-label sur les noms de trimestre

* fix: Retire le aria-label sur table

* feat: Ajoute un caption au tableau Budget > lecteur d'écran

* feat: Ajoute caption sur les deux table modifiés

* feat: Ajoute un titre au tableau chomage partiel

* feat: Ajoute un caption

* feat: Ajoute des th sur les entêtes de lignes

* feat: Ajoute des th sur les entêtes de lignes

* wip: Ajoute les role et scope qui vont bien

* feat: Améliore structure

* feat: lecteur évite de lire le tiret + ajout d'attributs

* fix: Corrige le style

* fix: Style

* fix: Style
pull/2328/head
Benjamin Arias 2022-10-20 10:00:40 +02:00 committed by GitHub
parent f48846a6dd
commit a2ffdd1c19
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 346 additions and 149 deletions

View File

@ -136,6 +136,24 @@ button:enabled {
${SROnly}
}
.visually-hidden {
position: absolute;
position: absolute !important;
width: 1px !important;
height: 1px !important;
padding: 0 !important;
margin: -1px !important;
overflow: hidden !important;
clip: rect(0,0,0,0) !important;
white-space: nowrap !important;
border: 0 !important;
}
figure {
margin: 0;
padding: 0;
}
.print-only {
display: none;
}

View File

@ -269,6 +269,9 @@ Situation personnelle: Personal situation
Suivant: Next
Supprimer les données sauvegardées.: Delete saved data.
Supprimer toute ma situation: Delete my entire situation
Tableau affichant pour chaque mois de la période précédemment sélectionnée le montant de réductions pour la situation sélectionnée.:
Table showing for each month of the previously selected period the amount of
discounts for the selected situation.
Taux: Rate
Taux calculé: Calculated rate
Taux moyen: Average rate
@ -433,6 +436,12 @@ autoentrepreneur:
titre: Auto-entrepeneur
back: Return to the simulation
barème: scale
budget:
tableCaption: Table showing the budget for the year {{year}} by expense item.
The first column shows the current year ({{year}}) on the first line, then
the expense items and finally the total before and after tax. The other
columns show the expenses for each quarter. The last column shows the totals
for each expense item as well as the aggregated total before and after tax.
calcul-avec: "Calculation from <1></1>with :"
cancelExample: Back to your situation
car dépend de: because it depends on
@ -443,6 +452,9 @@ checklist:
showmore:
closed: Read more
open: Hide details
chomagePartiel:
tableCaption: Table showing net salary and cost to the employer with or without
partial unemployment.
cible: target
clickexample: Click on a situation to see the result
comparaisonRégimes:
@ -820,6 +832,14 @@ entreprise:
est un SIREN non diffusible: is a non-distributable SIREN
examples: Examples
expected: the expected result was
explications:
tableCaption: Table displaying the lines of your tax return associated with the
tax exemptions in place for each type of activity. The first column displays
the different types of activity (BIC, BNC). The second column shows the
lines of your tax return that allow you to determine your taxable income for
each type of activity. The other columns display the exemptions in place as
well as the lines of the tax return or add your exemptions for each type of
activity.
facteur: multiplier
fail: This test failed
feedback:

View File

@ -176,6 +176,9 @@ Situation personnelle: Situation personnelle
Suivant: Suivant
Supprimer les données sauvegardées.: Supprimer les données sauvegardées.
Supprimer toute ma situation: Supprimer toute ma situation
Tableau affichant pour chaque mois de la période précédemment sélectionnée le montant de réductions pour la situation sélectionnée.:
Tableau affichant pour chaque mois de la période précédemment sélectionnée le
montant de réductions pour la situation sélectionnée.
Total des retenues: Total des retenues
Tout effacer: Tout effacer
Tout le site: Tout le site
@ -314,6 +317,13 @@ autoentrepreneur:
titre: Auto-entrepreneur
titre: Entreprise individuelle ou auto-entrepreneur
back: Retourner à la simulation
budget:
tableCaption: Tableau affichant le bugdet de l'année {{year}} par poste de
dépenses. La première colonne affiche l'année en cours ({{year}}) sur la
première ligne puis les postes de dépenses et pour finir le total HT et
total TTC. Les autres colonnes affichent les dépenses pour chaque trimestre.
La dernière colonne affiche les totaux pour chaque poste de dépenses ainsi
que les totaux HT et TTC agrégés.
cards:
simulator-resource:
cta: Accéder au simulateur
@ -321,6 +331,9 @@ checklist:
showmore:
closed: En savoir plus
open: Masquer les détails
chomagePartiel:
tableCaption: Tableau indiquant le salaire net et le coût pour l'employeur avec
ou sans chômage partiel.
comparaisonRégimes:
ACRE: <0>ACRE</0><1>1 an <1>(automatique et inconditionnelle)</1></1><2>Entre 3
et 4 trimestres <2>(sous conditions d'éligibilité)</2></2>
@ -592,6 +605,15 @@ entreprise:
titre: À faire pour créer votre entreprise
titre2: Recommandé avant le début de l'activité
est un SIREN non diffusible: est un SIREN non diffusible
explications:
tableCaption: Tableau affichant les lignes de votre liasse fiscale associées aux
exonérations fiscales en place pour chaque type d'activité. La première
colonne affiche les différents types d'activité (BIC, BNC). La deuxième
colonne indique les lignes de votre liasse fiscale qui vous permettent de
déterminer votre résultat fiscal, et ce pour chaque type d'activité. Les
autres colonnes affichent les exonérations en place ainsi que les lignes de
liasse fiscale ou ajouter vos exonérations et ce pour chaque type
d'activité.
feedback:
beta-testeur: Pour continuer à donner votre avis et accéder aux nouveautés en
avant-première, <2>inscrivez-vous sur la liste des beta-testeur</2>

View File

@ -7,7 +7,7 @@ import { Item, Select } from '@/design-system/field/Select'
import { H1, H2 } from '@/design-system/typography/heading'
import { formatValue } from 'publicodes'
import { useState } from 'react'
import { useTranslation } from 'react-i18next'
import { Trans, useTranslation } from 'react-i18next'
import styled from 'styled-components'
import { TrackPage } from '../../ATInternetTracking'
import Meta from '../../components/utils/Meta'
@ -37,19 +37,25 @@ const arraySum = (arr: number[]) => arr.reduce((a, b) => a + b, 0)
export default function Budget() {
const years = ['2019', '2020', '2021', '2022'] as const
const quarters = ['T1', 'T2', 'T3', 'T4']
const quarters = [
{ label: 'T1', 'aria-label': 'Trimestre 1' },
{ label: 'T2', 'aria-label': 'Trimestre 2' },
{ label: 'T3', 'aria-label': 'Trimestre 3' },
{ label: 'T4', 'aria-label': 'Trimestre 4' },
]
const [selectedYear, setSelectedYear] = useState<typeof years[number]>(
years[years.length - 1]
)
const categories = [
...new Set(
quarters
.map((q) => Object.keys(budget[selectedYear]?.[q] ?? {}))
.map((q) => Object.keys(budget[selectedYear]?.[q.label] ?? {}))
.reduce((acc, curr) => [...acc, ...curr], [])
),
]
const { t, i18n } = useTranslation()
const { language } = useTranslation().i18n
const { language } = i18n
return (
<>
@ -91,31 +97,51 @@ export default function Budget() {
overflow: auto;
`}
>
<RessourcesAllocationTable>
<RessourcesAllocationTable role="table">
<caption className="visually-hidden">
{t(
'budget.tableCaption',
"Tableau affichant le bugdet de l'année {{year}} par poste de dépenses. La première colonne affiche l'année en cours ({{year}}) sur la première ligne puis les postes de dépenses et pour finir le total HT et total TTC. Les autres colonnes affichent les dépenses pour chaque trimestre. La dernière colonne affiche les totaux pour chaque poste de dépenses ainsi que les totaux HT et TTC agrégés.",
{ year: selectedYear }
)}
</caption>
<thead>
<tr>
<td>{selectedYear}</td>
{quarters.map((q) => (
<td key={q}>{q}</td>
<th
role="columnheader"
scope="col"
key={q.label}
aria-label={q['aria-label']}
>
{q.label}
</th>
))}
<td>Total</td>
<th>Total</th>
</tr>
</thead>
<tbody>
{categories.map((label) => (
<tr key={label}>
<td>{label}</td>
<th role="rowheader" scope="row">
{label}
</th>
{quarters.map((q) => {
const value = budget[selectedYear]?.[q]?.[label]
const value = budget[selectedYear]?.[q.label]?.[label]
return (
<td key={q}>
{value
? formatValue(value, {
displayedUnit: '€',
language,
})
: '-'}
<td key={q.label}>
{value ? (
formatValue(value, {
displayedUnit: '€',
language,
})
) : (
<span aria-label="Pas de budget alloué">
<span aria-hidden>-</span>
</span>
)}
</td>
)
})}
@ -123,7 +149,7 @@ export default function Budget() {
{formatValue(
arraySum(
quarters.map(
(q) => budget[selectedYear]?.[q]?.[label] ?? 0
(q) => budget[selectedYear]?.[q.label]?.[label] ?? 0
)
),
{
@ -137,14 +163,16 @@ export default function Budget() {
</tbody>
<tfoot>
<tr>
<td>Total HT</td>
<th role="rowheader" scope="row">
Total HT
</th>
{quarters.map((q) => {
const value = arraySum(
Object.values(budget[selectedYear]?.[q] ?? {})
Object.values(budget[selectedYear]?.[q.label] ?? {})
)
return (
<td key={q}>
<td key={q.label}>
{value
? formatValue(value, {
displayedUnit: '€',
@ -159,7 +187,7 @@ export default function Budget() {
arraySum(
quarters.map((q) =>
arraySum(
Object.values(budget[selectedYear]?.[q] ?? {})
Object.values(budget[selectedYear]?.[q.label] ?? {})
)
)
),
@ -171,15 +199,18 @@ export default function Budget() {
</td>
</tr>
<tr>
<td>Total TTC</td>
<th role="rowheader" scope="row">
Total TTC
</th>
{quarters.map((q) => {
const value = Math.round(
arraySum(Object.values(budget[selectedYear]?.[q] ?? {})) *
1.2
arraySum(
Object.values(budget[selectedYear]?.[q.label] ?? {})
) * 1.2
)
return (
<td key={q}>
<td key={q.label}>
{value
? formatValue(value, {
displayedUnit: '€',
@ -196,7 +227,9 @@ export default function Budget() {
quarters.map(
(q) =>
arraySum(
Object.values(budget[selectedYear]?.[q] ?? {})
Object.values(
budget[selectedYear]?.[q.label] ?? {}
)
) * 1.2
)
)
@ -222,12 +255,14 @@ export default function Budget() {
const RessourcesAllocationTable = styled.table`
width: 100%;
text-align: left;
td {
td,
th {
padding: 6px;
font-family: ${({ theme }) => theme.fonts.main};
}
td:not(:first-child) {
td:not(:first-child),
th:not(:first-child) {
width: 100px;
text-align: right;
}

View File

@ -11,7 +11,7 @@ import { Li, Ul } from '@/design-system/typography/list'
import { DottedName } from 'modele-social'
import { formatValue } from 'publicodes'
import React, { useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next'
import { Trans, useTranslation } from 'react-i18next'
import styled from 'styled-components'
declare global {
@ -170,13 +170,21 @@ function ComparaisonTable({ rows: [head, ...body] }: ComparaisonTableProps) {
columns.length - 1
)
const captionText = (
<Trans i18nKey="chomagePartiel.tableCaption">
Tableau indiquant le salaire net et le coût pour l'employeur avec ou sans
chômage partiel.
</Trans>
)
return (
<>
<ResultTable className="ui__ mobile-version">
<caption className="visually-hidden">{captionText}</caption>
<thead>
<tr>
<th></th>
<th>
<th id="emptyTh1"></th>
<th role="columnheader" scope="col">
<select
onChange={(evt) =>
setCurrentColumnIndex(Number(evt.target.value))
@ -195,9 +203,9 @@ function ComparaisonTable({ rows: [head, ...body] }: ComparaisonTableProps) {
<tbody>
{body.map(([label, ...line], i) => (
<tr key={i}>
<td>
<th role="rowheader" scope="row">
<RowLabel {...label} />
</td>
</th>
<td>
<ValueWithLink {...line[currentColumnIndex]} />
</td>
@ -206,17 +214,22 @@ function ComparaisonTable({ rows: [head, ...body] }: ComparaisonTableProps) {
</tbody>
</ResultTable>
<ResultTable>
<tbody>
<caption className="visually-hidden">{captionText}</caption>
<thead>
<tr>
{head.map((label, i) => (
<th key={i}>{label}</th>
<th key={i} role="columnheader" scope="column">
{label}
</th>
))}
</tr>
</thead>
<tbody>
{body.map(([label, ...line], i) => (
<tr key={i}>
<td>
<th role="rowheader" scope="row">
<RowLabel {...label} />
</td>
</th>
{line.map((cell, j) => (
<td key={j}>
<ValueWithLink {...cell} />
@ -278,12 +291,17 @@ const ResultTable = styled.table`
width: 100%;
border-collapse: collapse;
th {
font-weight: initial;
}
&.ui__.mobile-version {
display: none;
@media (max-width: 660px) {
display: table;
}
td {
td,
th {
text-align: center;
}
}
@ -294,22 +312,29 @@ const ResultTable = styled.table`
display: table;
}
td:nth-child(2) {
td:nth-child(2),
th:nth-child(2) {
font-size: 1em;
opacity: 0.8;
}
td {
td,
th {
vertical-align: top;
text-align: right;
}
}
td {
tbody tr {
border-top: 1px solid rgba(0, 0, 0, 0.1);
}
td,
th {
padding: 0.8rem 1rem 0;
}
td:first-child {
td:first-child,
th:first-child {
text-align: left;
p {
margin-top: 0.2rem;
@ -328,7 +353,9 @@ const ResultTable = styled.table`
text-align: left;
}
td:nth-child(3) {
td:nth-child(3),
th:nth-child(2),
th:nth-child(3) {
font-weight: bold;
p {
font-weight: initial;

View File

@ -93,6 +93,13 @@ export const FormulaireS1S1Bis = ({ onChange }: Props) => {
<ExplicableRule dottedName="secteur . S1 ou S1bis" light bigPopover />
</H3>
<Table>
<caption className="visually-hidden">
<Trans>
Tableau affichant pour chaque mois de la période précédemment
sélectionnée le montant de réductions pour la situation
sélectionnée.
</Trans>
</caption>
<Thead>
<Tr>
<Trans>

View File

@ -25,6 +25,16 @@ const Td = styled.td`
margin: 0.5rem 0;
`
const ThRow = styled.th`
flex: 2;
word-break: break-word;
margin: 0.5rem 0;
&:first-child {
flex: 1 1 0%;
}
`
export const Tr = styled.tr`
display: flex;
flex-direction: column;
@ -189,7 +199,7 @@ export const Row = ({
return (
<Tr>
<Td>{title}</Td>
<ThRow>{title}</ThRow>
<Td>
{items.length > 0 ? (
<Select

View File

@ -1,6 +1,7 @@
import ButtonHelp from '@/design-system/buttons/ButtonHelp'
import { Li, Ul } from '@/design-system/typography/list'
import { baseParagraphStyle, Body } from '@/design-system/typography/paragraphs'
import { Trans } from 'react-i18next'
import styled from 'styled-components'
export const StyledTable = styled.table`
@ -15,12 +16,23 @@ export const StyledTable = styled.table`
background: var(--lightestColor);
}
td {
td,
th {
padding: 0.5rem;
border: 1px solid ${({ theme }) => theme.colors.extended.grey[500]};
}
th {
font-weight: initial;
}
`
const exonerationsHeader = 'exonerationsHeader'
const resultatFiscalHeader = 'resultatFiscalHeader'
const zonesHeader = 'zonesHeader'
const madelinHeader = 'madelinHeader'
const plusValueHeader = 'plusValueHeader'
const suramortissementHeader = 'suramortissementHeader'
export function ExplicationsResultatFiscal() {
return (
<ButtonHelp title="Quelles exonérations inclure ?" type="aide" bigPopover>
@ -43,110 +55,156 @@ export function ExplicationsResultatFiscal() {
Ajoutez les exonérations <strong>(2)</strong>
</Li>
</Ul>
<StyledTable>
<tr>
<td></td>
<td></td>
<td className="ui__ light-bg" colSpan={4}>
Exonérations <strong>(2)</strong>
</td>
</tr>
<tr>
<td></td>
<td className="ui__ light-bg">
Résultat fiscal <strong>(1)</strong>
</td>
<td className="ui__ light-bg notice">
Exonérations liées aux zones / activités
</td>
<td className="ui__ light-bg notice">
Exonérations Madelin et plan dépargne retraite
</td>
<td className="ui__ light-bg notice">
Exonérations de plus-values à court terme
</td>
<td className="ui__ light-bg notice">Suramortissement productif</td>
</tr>
<tr>
<td>BIC réel normal</td>
<td>
<strong>2058-A-SD</strong>
<br />
Ligne XN (bénéfice) Ligne XO (déficit)
</td>
<td>
<strong>2058-A-SD</strong>
<br />
Lignes K9 / L6 / ØV / PP / L2 / 1F / PC / L5 / PA / XC / PB
</td>
<td>
<strong>2053-SD</strong>
<br />
Lignes A7 et A8
</td>
<td>
<strong>2058-A-SD</strong>
<br />
Ligne XG (montant inclus)
</td>
<td>
<strong>2058-A-SD</strong>
<br />
Lignes X9 et YA
</td>
</tr>
<tr>
<td>BIC réel simplifié</td>
<td>
<strong>2033-B-SD</strong>
<br />
Ligne 370 (bénéfice) Ligne 372 (déficit)
</td>
<td>
<strong>2033 B-SD</strong>
<br />
Lignes 986 / 127 / 991 / 345 / 992 / 987 / 989 / 138 / 990 / 993
</td>
<td>
<strong>2033-SD</strong>
<br />
Lignes 325 et 327
</td>
<td>
<strong>2033 B-SD</strong>
<br />
Ligne 350 (montant inclus)
</td>
<td>
<strong>2033 B-SD</strong>
<br />
Lignes 655 et 643
</td>
</tr>
<tr>
<td>BNC déclaration contrôlée</td>
<td>
<strong>2035-B-SD</strong>
<br />
Ligne CP (bénéfice) Ligne CR (déficit)
</td>
<td>
<strong>2035-B-SD </strong>
<br />
Lignes CS / AW / CU / CI / AX / CQ
</td>
<td>
<strong>2035-A-SD </strong>
<br />
Lignes BZ et BU
</td>
<td>
<strong>2035-A-SD</strong>
<br />
Ligne CL (montant inclus)
</td>
<td></td>
</tr>
<StyledTable role="table">
<caption className="visually-hidden">
<Trans i18nKey="explications.tableCaption">
Tableau affichant les lignes de votre liasse fiscale associées aux
exonérations fiscales en place pour chaque type d'activité. La
première colonne affiche les différents types d'activité (BIC, BNC).
La deuxième colonne indique les lignes de votre liasse fiscale qui
vous permettent de déterminer votre résultat fiscal, et ce pour
chaque type d'activité. Les autres colonnes affichent les
exonérations en place ainsi que les lignes de liasse fiscale ou
ajouter vos exonérations et ce pour chaque type d'activité.
</Trans>
</caption>
<thead>
<tr>
<th id="explicationEmptyTh1"></th>
<th id="explicationEmptyTh2"></th>
<th
className="ui__ light-bg"
colSpan={4}
id={exonerationsHeader}
role="columnheader"
>
Exonérations <strong>(2)</strong>
</th>
</tr>
<tr>
<th id="explicationEmptyTh3"></th>
<th className="ui__ light-bg" id={resultatFiscalHeader}>
Résultat fiscal <strong>(1)</strong>
</th>
<th
className="ui__ light-bg notice"
id={zonesHeader}
headers={exonerationsHeader}
>
Exonérations liées aux zones / activités
</th>
<th
className="ui__ light-bg notice"
id={madelinHeader}
headers={exonerationsHeader}
>
Exonérations Madelin et plan dépargne retraite
</th>
<th
className="ui__ light-bg notice"
id={plusValueHeader}
headers={exonerationsHeader}
>
Exonérations de plus-values à court terme
</th>
<th
className="ui__ light-bg notice"
id={suramortissementHeader}
headers={exonerationsHeader}
>
Suramortissement productif
</th>
</tr>
</thead>
<tbody>
<tr>
<th role="rowheader" scope="row">
BIC réel normal
</th>
<td headers={resultatFiscalHeader}>
<strong>2058-A-SD</strong>
<br />
Ligne XN (bénéfice) Ligne XO (déficit)
</td>
<td headers={`${exonerationsHeader} ${zonesHeader}`}>
<strong>2058-A-SD</strong>
<br />
Lignes K9 / L6 / ØV / PP / L2 / 1F / PC / L5 / PA / XC / PB
</td>
<td headers={`${exonerationsHeader} ${madelinHeader}`}>
<strong>2053-SD</strong>
<br />
Lignes A7 et A8
</td>
<td headers={`${exonerationsHeader} ${plusValueHeader}`}>
<strong>2058-A-SD</strong>
<br />
Ligne XG (montant inclus)
</td>
<td headers={`${exonerationsHeader} ${suramortissementHeader}`}>
<strong>2058-A-SD</strong>
<br />
Lignes X9 et YA
</td>
</tr>
<tr>
<th role="rowheader" scope="row">
BIC réel simplifié
</th>
<td headers={resultatFiscalHeader}>
<strong>2033-B-SD</strong>
<br />
Ligne 370 (bénéfice) Ligne 372 (déficit)
</td>
<td headers={`${exonerationsHeader} ${zonesHeader}`}>
<strong>2033 B-SD</strong>
<br />
Lignes 986 / 127 / 991 / 345 / 992 / 987 / 989 / 138 / 990 / 993
</td>
<td headers={`${exonerationsHeader} ${madelinHeader}`}>
<strong>2033-SD</strong>
<br />
Lignes 325 et 327
</td>
<td headers={`${exonerationsHeader} ${plusValueHeader}`}>
<strong>2033 B-SD</strong>
<br />
Ligne 350 (montant inclus)
</td>
<td headers={`${exonerationsHeader} ${suramortissementHeader}`}>
<strong>2033 B-SD</strong>
<br />
Lignes 655 et 643
</td>
</tr>
<tr>
<th role="rowheader" scope="row">
BNC déclaration contrôlée
</th>
<td headers={resultatFiscalHeader}>
<strong>2035-B-SD</strong>
<br />
Ligne CP (bénéfice) Ligne CR (déficit)
</td>
<td headers={`${exonerationsHeader} ${zonesHeader}`}>
<strong>2035-B-SD </strong>
<br />
Lignes CS / AW / CU / CI / AX / CQ
</td>
<td headers={`${exonerationsHeader} ${madelinHeader}`}>
<strong>2035-A-SD </strong>
<br />
Lignes BZ et BU
</td>
<td headers={`${exonerationsHeader} ${plusValueHeader}`}>
<strong>2035-A-SD</strong>
<br />
Ligne CL (montant inclus)
</td>
<td></td>
</tr>
</tbody>
</StyledTable>
</ButtonHelp>
)