Skip to content

Commit ba95b3f

Browse files
committed
Add title attributes to Marker icons
1 parent 729c13f commit ba95b3f

51 files changed

Lines changed: 569 additions & 322 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/components/CallToAction/Download/index.astro

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
*/
66
import { BuildError } from '@lib/errors/BuildError'
77
import List from '@components/List/index.astro'
8-
import Marker from '@components/List/marker.astro'
8+
import Marker from '@components/Marker/index.astro'
99
1010
export interface Props {
1111
/** Optional base id for internal aria relationships */

src/components/Consent/Preferences/client/__tests__/index.spec.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,7 @@ describe('ConsentPreferencesElement', () => {
242242
analyticsCheckbox!.checked = true
243243
functionalCheckbox!.checked = false
244244
marketingCheckbox!.checked = true
245+
marketingCheckbox!.dispatchEvent(new window.Event('change', { bubbles: true }))
245246

246247
const saveBtn = window.document.getElementById(
247248
'consent-save-preferences'
@@ -255,4 +256,26 @@ describe('ConsentPreferencesElement', () => {
255256
expect(updateConsent).toHaveBeenCalledWith('marketing', true)
256257
})
257258
})
259+
260+
it('enables save button only when preferences differ from saved consent', async () => {
261+
await renderConsentPreferences(({ window }) => {
262+
const saveBtn = window.document.getElementById(
263+
'consent-save-preferences'
264+
) as HTMLButtonElement | null
265+
const functionalCheckbox = window.document.getElementById(
266+
'functional-cookies'
267+
) as HTMLInputElement | null
268+
269+
expect(saveBtn).not.toBeNull()
270+
expect(functionalCheckbox).not.toBeNull()
271+
expect(saveBtn!.disabled).toBe(true)
272+
273+
functionalCheckbox!.checked = true
274+
functionalCheckbox!.dispatchEvent(new window.Event('change', { bubbles: true }))
275+
expect(saveBtn!.disabled).toBe(false)
276+
277+
saveBtn!.dispatchEvent(new window.MouseEvent('click', { bubbles: true }))
278+
expect(saveBtn!.disabled).toBe(true)
279+
})
280+
})
258281
})

src/components/Consent/Preferences/client/index.ts

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,18 @@ export const CONSENT_PREFERENCES_READY_EVENT = 'consent-preferences:ready'
3232
export class ConsentPreferencesElement extends LitElement {
3333
static registeredName = COMPONENT_TAG_NAME
3434

35+
private static readonly saveButtonDisabledClasses = [
36+
'bg-gray-300',
37+
'cursor-not-allowed',
38+
'hover:bg-gray-300',
39+
]
40+
41+
private static readonly saveButtonEnabledClasses = ['bg-spotlight', 'hover:bg-spotlight-offset']
42+
3543
private allowAllBtn!: HTMLButtonElement
3644
private denyAllBtn!: HTMLButtonElement
3745
private saveBtn!: HTMLButtonElement
46+
private toggleChangeHandler: (() => void) | null = null
3847
private domReadyHandler: (() => void) | null = null
3948
private beforePreparationHandler: (() => void) | null = null
4049
private afterSwapHandler: (() => void) | null = null
@@ -85,6 +94,8 @@ export class ConsentPreferencesElement extends LitElement {
8594
this.unsubscribeConsent = null
8695
}
8796

97+
this.removePreferenceToggleListeners()
98+
8899
this.isInitialized = false
89100
delete this.dataset['consentPreferencesReady']
90101
}
@@ -135,6 +146,7 @@ export class ConsentPreferencesElement extends LitElement {
135146

136147
private syncConsentState(consent: ConsentState): void {
137148
this.updateCheckboxes(consent)
149+
this.updateSaveButtonState()
138150
}
139151

140152
private setViewTransitionsHandlers(): void {
@@ -182,6 +194,83 @@ export class ConsentPreferencesElement extends LitElement {
182194
addButtonEventListeners(this.allowAllBtn, () => this.allowAll())
183195
addButtonEventListeners(this.denyAllBtn, () => this.denyAll())
184196
addButtonEventListeners(this.saveBtn, () => this.savePreferences())
197+
198+
if (!this.toggleChangeHandler) {
199+
this.toggleChangeHandler = () => this.updateSaveButtonState()
200+
}
201+
202+
this.bindPreferenceToggleListeners()
203+
}
204+
205+
private bindPreferenceToggleListeners(): void {
206+
this.removePreferenceToggleListeners()
207+
208+
const analyticsCheckbox = document.getElementById('analytics-cookies')
209+
const functionalCheckbox = document.getElementById('functional-cookies')
210+
const marketingCheckbox = document.getElementById('marketing-cookies')
211+
212+
if (!this.toggleChangeHandler) {
213+
return
214+
}
215+
216+
if (isInputElement(analyticsCheckbox)) {
217+
analyticsCheckbox.addEventListener('change', this.toggleChangeHandler)
218+
}
219+
220+
if (isInputElement(functionalCheckbox)) {
221+
functionalCheckbox.addEventListener('change', this.toggleChangeHandler)
222+
}
223+
224+
if (isInputElement(marketingCheckbox)) {
225+
marketingCheckbox.addEventListener('change', this.toggleChangeHandler)
226+
}
227+
}
228+
229+
private removePreferenceToggleListeners(): void {
230+
const analyticsCheckbox = document.getElementById('analytics-cookies')
231+
const functionalCheckbox = document.getElementById('functional-cookies')
232+
const marketingCheckbox = document.getElementById('marketing-cookies')
233+
234+
if (!this.toggleChangeHandler) {
235+
return
236+
}
237+
238+
if (isInputElement(analyticsCheckbox)) {
239+
analyticsCheckbox.removeEventListener('change', this.toggleChangeHandler)
240+
}
241+
242+
if (isInputElement(functionalCheckbox)) {
243+
functionalCheckbox.removeEventListener('change', this.toggleChangeHandler)
244+
}
245+
246+
if (isInputElement(marketingCheckbox)) {
247+
marketingCheckbox.removeEventListener('change', this.toggleChangeHandler)
248+
}
249+
}
250+
251+
private updateSaveButtonState(): void {
252+
const currentPreferences = this.getCurrentPreferences()
253+
const savedPreferences = getConsentSnapshot()
254+
255+
const hasUnsavedChanges =
256+
(currentPreferences.analytics ?? false) !== (savedPreferences.analytics ?? false) ||
257+
(currentPreferences.functional ?? false) !== (savedPreferences.functional ?? false) ||
258+
(currentPreferences.marketing ?? false) !== (savedPreferences.marketing ?? false)
259+
260+
this.saveBtn.disabled = !hasUnsavedChanges
261+
this.saveBtn.setAttribute('aria-disabled', String(!hasUnsavedChanges))
262+
263+
const disabledClasses = ConsentPreferencesElement.saveButtonDisabledClasses
264+
const enabledClasses = ConsentPreferencesElement.saveButtonEnabledClasses
265+
266+
this.saveBtn.classList.remove(...disabledClasses, ...enabledClasses)
267+
268+
if (hasUnsavedChanges) {
269+
this.saveBtn.classList.add(...enabledClasses)
270+
return
271+
}
272+
273+
this.saveBtn.classList.add(...disabledClasses)
185274
}
186275

187276
private updateCheckboxes(preferences: ConsentState): void {
@@ -201,6 +290,10 @@ export class ConsentPreferencesElement extends LitElement {
201290
}
202291

203292
private savePreferences(): void {
293+
if (this.saveBtn.disabled) {
294+
return
295+
}
296+
204297
const preferences = this.getCurrentPreferences()
205298

206299
updateConsent('analytics', preferences.analytics ?? false)

src/components/Consent/Preferences/index.astro

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,9 @@ import logoSvg from '@assets/images/site/logo.svg'
209209
</button>
210210
<button
211211
id="consent-save-preferences"
212-
class="px-6 py-2 bg-gray-300 text-white rounded-lg hover:bg-gray-700transition-colors duration-200 font-medium"
212+
class="px-6 py-2 bg-gray-300 text-white rounded-lg hover:bg-gray-300 cursor-not-allowed transition-colors duration-200 font-medium"
213+
disabled
214+
aria-disabled="true"
213215
>
214216
Save My Preferences
215217
</button>

src/components/Errors/NotFoundHero/index.astro

Lines changed: 0 additions & 33 deletions
This file was deleted.

src/components/List/layouts/CheckIconsList.astro

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
import Marker from "@components/List/marker.astro"
2+
import Marker from "@components/Marker/index.astro"
33
44
export type Props = {
55
items: {

src/components/List/layouts/ChevronList.astro

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
import Marker from "@components/List/marker.astro"
2+
import Marker from "@components/Marker/index.astro"
33
44
export type Props = {
55
items: {

src/components/List/layouts/ColoredMarkerList.astro

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,7 @@ export type Props = {
1313
size?: number
1414
}
1515
16-
type ColoredMarkerListItem = Props['items'][number]
17-
1816
const { items, classes, size = 2 }: Props = Astro.props
19-
const coloredItems: ColoredMarkerListItem[] = items.map((item: ColoredMarkerListItem) => ({
20-
text: item.text,
21-
color: item.color,
22-
...(item.lead ? { lead: item.lead } : {}),
23-
}))
2417
2518
const ulClass = ["list-none pl-0 text-content mt-4 mb-2 space-y-2", classes?.ul]
2619
const liClass = ["flex items-start", classes?.li]
@@ -29,7 +22,7 @@ const emClass = ["mr-2 not-italic font-bold", classes?.em]
2922

3023
<ul class:list={ulClass}>
3124
{
32-
coloredItems.map((item) => (
25+
items.map((item) => (
3326
<li class:list={liClass}>
3427
<span class:list={[`w-${size} h-${size} rounded-full mt-3 mr-3 shrink-0`, item.color]} />
3528
<em class:list={emClass}>{item.lead}</em>

src/components/List/layouts/PlainIconList.astro

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
import Marker from '@components/List/marker.astro'
2+
import Marker from '@components/Marker/index.astro'
33
44
export type Props = {
55
items: {

src/components/List/layouts/TwoColumnCheckIconsList.astro

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
import Marker from "@components/List/marker.astro"
2+
import Marker from "@components/Marker/index.astro"
33
44
export type Props = {
55
items: {

0 commit comments

Comments
 (0)