From 84069055f5a4ae5da4822b320a1e850ca6d1f3c8 Mon Sep 17 00:00:00 2001 From: Andrea Barbasso <´andrea.barbasso@4science.com´> Date: Mon, 15 Jul 2024 17:36:48 +0200 Subject: [PATCH 1/9] [CST-15593] migrate from klaro to orejime --- cypress/support/e2e.ts | 4 +- package.json | 2 +- .../google-recaptcha.service.spec.ts | 2 +- .../google-recaptcha.service.ts | 2 +- src/app/footer/footer.component.ts | 4 +- .../register-email-form.component.html | 2 +- .../register-email-form.component.ts | 8 +- ...pec.ts => browser-orejime.service.spec.ts} | 40 ++-- ....service.ts => browser-orejime.service.ts} | 124 ++++++----- src/app/shared/cookies/klaro-configuration.ts | 199 ------------------ .../shared/cookies/orejime-configuration.ts | 182 ++++++++++++++++ .../{klaro.service.ts => orejime.service.ts} | 6 +- .../google-analytics.service.spec.ts | 48 ++--- .../statistics/google-analytics.service.ts | 10 +- src/assets/i18n/ar.json5 | 6 - src/assets/i18n/ca.json5 | 18 -- src/assets/i18n/cs.json5 | 20 +- src/assets/i18n/el.json5 | 1 - src/assets/i18n/en.json5 | 16 +- src/assets/i18n/es.json5 | 18 -- src/assets/i18n/fi.json5 | 18 -- src/assets/i18n/hi.json5 | 2 - src/assets/i18n/hu.json5 | 23 -- src/assets/i18n/it.json5 | 20 +- src/assets/i18n/kk.json5 | 3 - src/assets/i18n/pl.json5 | 6 - src/assets/i18n/pt-BR.json5 | 18 -- src/assets/i18n/pt-PT.json5 | 18 -- src/assets/i18n/sr-cyr.json5 | 6 - src/assets/i18n/sr-lat.json5 | 6 - src/assets/i18n/vi.json5 | 8 +- src/modules/app/browser-app.config.ts | 8 +- src/modules/app/browser-init.service.ts | 12 +- src/styles/_custom_variables.scss | 6 +- src/styles/_global-styles.scss | 32 +-- src/styles/_vendor.scss | 1 + yarn.lock | 71 ++++--- 37 files changed, 399 insertions(+), 571 deletions(-) rename src/app/shared/cookies/{browser-klaro.service.spec.ts => browser-orejime.service.spec.ts} (91%) rename src/app/shared/cookies/{browser-klaro.service.ts => browser-orejime.service.ts} (69%) delete mode 100644 src/app/shared/cookies/klaro-configuration.ts create mode 100644 src/app/shared/cookies/orejime-configuration.ts rename src/app/shared/cookies/{klaro.service.ts => orejime.service.ts} (63%) diff --git a/cypress/support/e2e.ts b/cypress/support/e2e.ts index 73d3c76a990..c1b6bc6d3fd 100644 --- a/cypress/support/e2e.ts +++ b/cypress/support/e2e.ts @@ -54,9 +54,9 @@ before(() => { // Runs once before the first test in each "block" beforeEach(() => { - // Pre-agree to all Klaro cookies by setting the klaro-anonymous cookie + // Pre-agree to all Orejime cookies by setting the orejime-anonymous cookie // This just ensures it doesn't get in the way of matching other objects in the page. - cy.setCookie('klaro-anonymous', '{%22authentication%22:true%2C%22preferences%22:true%2C%22acknowledgement%22:true%2C%22google-analytics%22:true%2C%22google-recaptcha%22:true}'); + cy.setCookie('orejime-anonymous', '{%22authentication%22:true%2C%22preferences%22:true%2C%22acknowledgement%22:true%2C%22google-analytics%22:true%2C%22google-recaptcha%22:true}'); // Remove any CSRF cookies saved from prior tests cy.clearCookie(DSPACE_XSRF_COOKIE); diff --git a/package.json b/package.json index a8d505eff92..9b8bdb190ce 100644 --- a/package.json +++ b/package.json @@ -112,7 +112,6 @@ "json5": "^2.2.3", "jsonschema": "1.4.1", "jwt-decode": "^3.1.2", - "klaro": "^0.7.18", "lodash": "^4.17.21", "lru-cache": "^7.14.1", "markdown-it": "^13.0.1", @@ -127,6 +126,7 @@ "ngx-pagination": "6.0.3", "ngx-ui-switch": "^14.1.0", "nouislider": "^15.7.1", + "orejime": "^2.3.0", "pem": "1.14.7", "prop-types": "^15.8.1", "react-copy-to-clipboard": "^5.1.0", diff --git a/src/app/core/google-recaptcha/google-recaptcha.service.spec.ts b/src/app/core/google-recaptcha/google-recaptcha.service.spec.ts index 957cc649bf8..94b03bba463 100644 --- a/src/app/core/google-recaptcha/google-recaptcha.service.spec.ts +++ b/src/app/core/google-recaptcha/google-recaptcha.service.spec.ts @@ -30,7 +30,7 @@ describe('GoogleRecaptchaService', () => { findByPropertyName: createSuccessfulRemoteDataObject$({ values: ['googleRecaptchaToken'] }), }); cookieService = jasmine.createSpyObj('cookieService', { - get: '{%22token_item%22:true%2C%22impersonation%22:true%2C%22redirect%22:true%2C%22language%22:true%2C%22klaro%22:true%2C%22has_agreed_end_user%22:true%2C%22google-analytics%22:true}', + get: '{%22token_item%22:true%2C%22impersonation%22:true%2C%22redirect%22:true%2C%22language%22:true%2C%22orejime%22:true%2C%22has_agreed_end_user%22:true%2C%22google-analytics%22:true}', set: () => { /* empty */ }, diff --git a/src/app/core/google-recaptcha/google-recaptcha.service.ts b/src/app/core/google-recaptcha/google-recaptcha.service.ts index b4028f98358..c23223b6785 100644 --- a/src/app/core/google-recaptcha/google-recaptcha.service.ts +++ b/src/app/core/google-recaptcha/google-recaptcha.service.ts @@ -105,7 +105,7 @@ export class GoogleRecaptchaService { tap(([recaptchaVersionRD, recaptchaModeRD, recaptchaKeyRD]) => { if ( - this.cookieService.get('klaro-anonymous') && this.cookieService.get('klaro-anonymous')[CAPTCHA_NAME] && + this.cookieService.get('orejime-anonymous') && this.cookieService.get('orejime-anonymous')[CAPTCHA_NAME] && recaptchaKeyRD.hasSucceeded && recaptchaVersionRD.hasSucceeded && isNotEmpty(recaptchaVersionRD.payload?.values) && isNotEmpty(recaptchaKeyRD.payload?.values) ) { diff --git a/src/app/footer/footer.component.ts b/src/app/footer/footer.component.ts index 99e74ed4aa1..6a6e5e94d7e 100644 --- a/src/app/footer/footer.component.ts +++ b/src/app/footer/footer.component.ts @@ -23,7 +23,7 @@ import { import { NotifyInfoService } from '../core/coar-notify/notify-info/notify-info.service'; import { AuthorizationDataService } from '../core/data/feature-authorization/authorization-data.service'; import { FeatureID } from '../core/data/feature-authorization/feature-id'; -import { KlaroService } from '../shared/cookies/klaro.service'; +import { OrejimeService } from '../shared/cookies/orejime.service'; import { hasValue } from '../shared/empty.util'; @Component({ @@ -46,7 +46,7 @@ export class FooterComponent implements OnInit { coarLdnEnabled$: Observable; constructor( - @Optional() public cookies: KlaroService, + @Optional() public cookies: OrejimeService, protected authorizationService: AuthorizationDataService, protected notifyInfoService: NotifyInfoService, @Inject(APP_CONFIG) protected appConfig: AppConfig, diff --git a/src/app/register-email-form/register-email-form.component.html b/src/app/register-email-form/register-email-form.component.html index a38c4a81c02..729edbb93f8 100644 --- a/src/app/register-email-form/register-email-form.component.html +++ b/src/app/register-email-form/register-email-form.component.html @@ -38,7 +38,7 @@

{{MESSAGE_PREFIX + '.header'|translate}}

-

{{ MESSAGE_PREFIX + '.google-recaptcha.open-cookie-settings' | translate }}

+

{{ MESSAGE_PREFIX + '.google-recaptcha.open-cookie-settings' | translate }}

diff --git a/src/app/register-email-form/register-email-form.component.ts b/src/app/register-email-form/register-email-form.component.ts index ac13abb865e..90841f30881 100644 --- a/src/app/register-email-form/register-email-form.component.ts +++ b/src/app/register-email-form/register-email-form.component.ts @@ -54,7 +54,7 @@ import { import { Registration } from '../core/shared/registration.model'; import { AlertComponent } from '../shared/alert/alert.component'; import { AlertType } from '../shared/alert/alert-type'; -import { KlaroService } from '../shared/cookies/klaro.service'; +import { OrejimeService } from '../shared/cookies/orejime.service'; import { isNotEmpty } from '../shared/empty.util'; import { GoogleRecaptchaComponent } from '../shared/google-recaptcha/google-recaptcha.component'; import { NotificationsService } from '../shared/notifications/notifications.service'; @@ -126,7 +126,7 @@ export class RegisterEmailFormComponent implements OnDestroy, OnInit { private configService: ConfigurationDataService, public googleRecaptchaService: GoogleRecaptchaService, public cookieService: CookieService, - @Optional() public klaroService: KlaroService, + @Optional() public orejimeService: OrejimeService, private changeDetectorRef: ChangeDetectorRef, private notificationsService: NotificationsService, ) { @@ -247,8 +247,8 @@ export class RegisterEmailFormComponent implements OnDestroy, OnInit { * Return true if the user has accepted the required cookies for reCaptcha */ isRecaptchaCookieAccepted(): boolean { - const klaroAnonymousCookie = this.cookieService.get('klaro-anonymous'); - return isNotEmpty(klaroAnonymousCookie) ? klaroAnonymousCookie[CAPTCHA_NAME] : false; + const orejimeAnonymousCookie = this.cookieService.get('orejime-anonymous'); + return isNotEmpty(orejimeAnonymousCookie) ? orejimeAnonymousCookie[CAPTCHA_NAME] : false; } /** diff --git a/src/app/shared/cookies/browser-klaro.service.spec.ts b/src/app/shared/cookies/browser-orejime.service.spec.ts similarity index 91% rename from src/app/shared/cookies/browser-klaro.service.spec.ts rename to src/app/shared/cookies/browser-orejime.service.spec.ts index 953734d38c5..d0fe608c3f9 100644 --- a/src/app/shared/cookies/browser-klaro.service.spec.ts +++ b/src/app/shared/cookies/browser-orejime.service.spec.ts @@ -20,12 +20,12 @@ import { createSuccessfulRemoteDataObject$, } from '../remote-data.utils'; import { - BrowserKlaroService, + BrowserOrejimeService, COOKIE_MDFIELD, -} from './browser-klaro.service'; -import { ANONYMOUS_STORAGE_NAME_KLARO } from './klaro-configuration'; +} from './browser-orejime.service'; +import { ANONYMOUS_STORAGE_NAME_OREJIME } from './orejime-configuration'; -describe('BrowserKlaroService', () => { +describe('BrowserOrejimeService', () => { const trackingIdProp = 'google.analytics.key'; const trackingIdTestValue = 'mock-tracking-id'; const googleAnalytics = 'google-analytics'; @@ -37,7 +37,7 @@ describe('BrowserKlaroService', () => { let cookieService; let user; - let service: BrowserKlaroService; + let service: BrowserOrejimeService; let configurationDataService: ConfigurationDataService; const createConfigSuccessSpy = (...values: string[]) => jasmine.createSpyObj('configurationDataService', { findByPropertyName: createSuccessfulRemoteDataObject$({ @@ -70,7 +70,7 @@ describe('BrowserKlaroService', () => { configurationDataService = createConfigSuccessSpy(recaptchaValue); findByPropertyName = configurationDataService.findByPropertyName; cookieService = jasmine.createSpyObj('cookieService', { - get: '{%22token_item%22:true%2C%22impersonation%22:true%2C%22redirect%22:true%2C%22language%22:true%2C%22klaro%22:true%2C%22has_agreed_end_user%22:true%2C%22google-analytics%22:true}', + get: '{%22token_item%22:true%2C%22impersonation%22:true%2C%22redirect%22:true%2C%22language%22:true%2C%22orejime%22:true%2C%22has_agreed_end_user%22:true%2C%22google-analytics%22:true}', set: () => { /* empty */ }, @@ -78,7 +78,7 @@ describe('BrowserKlaroService', () => { TestBed.configureTestingModule({ providers: [ - BrowserKlaroService, + BrowserOrejimeService, { provide: TranslateService, useValue: translateService, @@ -101,7 +101,7 @@ describe('BrowserKlaroService', () => { }, ], }); - service = TestBed.inject(BrowserKlaroService); + service = TestBed.inject(BrowserOrejimeService); appName = 'testName'; purpose = 'test purpose'; testKey = 'this.is.a.fake.message.key'; @@ -115,7 +115,7 @@ describe('BrowserKlaroService', () => { }, }, }, - services: [{ + apps: [{ name: appName, purposes: [purpose], }, { @@ -125,7 +125,7 @@ describe('BrowserKlaroService', () => { }; - service.klaroConfig = mockConfig; + service.orejimeConfig = mockConfig; }); it('should be created', () => { @@ -248,7 +248,7 @@ describe('BrowserKlaroService', () => { scheduler.schedule(() => service.getSavedPreferences().subscribe()); scheduler.flush(); - expect(cookieService.get).toHaveBeenCalledWith(ANONYMOUS_STORAGE_NAME_KLARO); + expect(cookieService.get).toHaveBeenCalledWith(ANONYMOUS_STORAGE_NAME_OREJIME); }); }); @@ -261,7 +261,7 @@ describe('BrowserKlaroService', () => { scheduler.schedule(() => service.getSavedPreferences().subscribe()); scheduler.flush(); - expect(cookieService.get).toHaveBeenCalledWith('klaro-' + user.uuid); + expect(cookieService.get).toHaveBeenCalledWith('orejime-' + user.uuid); }); }); }); @@ -320,12 +320,12 @@ describe('BrowserKlaroService', () => { configurationDataService.findByPropertyName = findByPropertyName; }); - it('should not filter googleAnalytics when servicesToHide are empty', () => { - const filteredConfig = (service as any).filterConfigServices([]); + it('should not filter googleAnalytics when appsToHide is empty', () => { + const filteredConfig = (service as any).filterConfigApps([]); expect(filteredConfig).toContain(jasmine.objectContaining({ name: googleAnalytics })); }); - it('should filter services using names passed as servicesToHide', () => { - const filteredConfig = (service as any).filterConfigServices([googleAnalytics]); + it('should filter apps using names passed as appsToHide', () => { + const filteredConfig = (service as any).filterConfigApps([googleAnalytics]); expect(filteredConfig).not.toContain(jasmine.objectContaining({ name: googleAnalytics })); }); it('should have been initialized with googleAnalytics', () => { @@ -337,7 +337,7 @@ describe('BrowserKlaroService', () => { }), ); service.initialize(); - expect(service.klaroConfig.services).toContain(jasmine.objectContaining({ name: googleAnalytics })); + expect(service.orejimeConfig.apps).toContain(jasmine.objectContaining({ name: googleAnalytics })); }); it('should filter googleAnalytics when empty configuration is retrieved', () => { configurationDataService.findByPropertyName = @@ -363,7 +363,7 @@ describe('BrowserKlaroService', () => { ); service.initialize(); - expect(service.klaroConfig.services).not.toContain(jasmine.objectContaining({ name: googleAnalytics })); + expect(service.orejimeConfig.apps).not.toContain(jasmine.objectContaining({ name: googleAnalytics })); }); it('should filter googleAnalytics when an error occurs', () => { configurationDataService.findByPropertyName = @@ -381,7 +381,7 @@ describe('BrowserKlaroService', () => { }), ); service.initialize(); - expect(service.klaroConfig.services).not.toContain(jasmine.objectContaining({ name: googleAnalytics })); + expect(service.orejimeConfig.apps).not.toContain(jasmine.objectContaining({ name: googleAnalytics })); }); it('should filter googleAnalytics when an invalid payload is retrieved', () => { configurationDataService.findByPropertyName = @@ -399,7 +399,7 @@ describe('BrowserKlaroService', () => { }), ); service.initialize(); - expect(service.klaroConfig.services).not.toContain(jasmine.objectContaining({ name: googleAnalytics })); + expect(service.orejimeConfig.apps).not.toContain(jasmine.objectContaining({ name: googleAnalytics })); }); }); }); diff --git a/src/app/shared/cookies/browser-klaro.service.ts b/src/app/shared/cookies/browser-orejime.service.ts similarity index 69% rename from src/app/shared/cookies/browser-klaro.service.ts rename to src/app/shared/cookies/browser-orejime.service.ts index f673a417363..e23b19c58be 100644 --- a/src/app/shared/cookies/browser-klaro.service.ts +++ b/src/app/shared/cookies/browser-orejime.service.ts @@ -25,17 +25,21 @@ import { EPersonDataService } from '../../core/eperson/eperson-data.service'; import { EPerson } from '../../core/eperson/models/eperson.model'; import { CAPTCHA_NAME } from '../../core/google-recaptcha/google-recaptcha.service'; import { CookieService } from '../../core/services/cookie.service'; +import { + NativeWindowRef, + NativeWindowService, +} from '../../core/services/window.service'; import { getFirstCompletedRemoteData } from '../../core/shared/operators'; import { hasValue, isEmpty, isNotEmpty, } from '../empty.util'; -import { KlaroService } from './klaro.service'; +import { OrejimeService } from './orejime.service'; import { - ANONYMOUS_STORAGE_NAME_KLARO, - klaroConfiguration, -} from './klaro-configuration'; + ANONYMOUS_STORAGE_NAME_OREJIME, + getOrejimeConfiguration, +} from './orejime-configuration'; /** * Metadata field to store a user's cookie consent preferences in @@ -63,21 +67,21 @@ const cookiePurposeMessagePrefix = 'cookies.consent.purpose.'; const updateDebounce = 300; /** - * By using this injection token instead of importing directly we can keep Klaro out of the main bundle + * By using this injection token instead of importing directly we can keep Orejime out of the main bundle */ -const LAZY_KLARO = new InjectionToken>( - 'Lazily loaded Klaro', +const LAZY_OREJIME = new InjectionToken>( + 'Lazily loaded Orejime', { providedIn: 'root', - factory: async () => (await import('klaro/dist/klaro-no-translations')), + factory: async () => (await import('orejime/dist/orejime')), }, ); /** - * Browser implementation for the KlaroService, representing a service for handling Klaro consent preferences and UI + * Browser implementation for the OrejimeService, representing a service for handling Orejime consent preferences and UI */ @Injectable() -export class BrowserKlaroService extends KlaroService { +export class BrowserOrejimeService extends OrejimeService { private readonly GOOGLE_ANALYTICS_KEY = 'google.analytics.key'; @@ -85,18 +89,22 @@ export class BrowserKlaroService extends KlaroService { private readonly GOOGLE_ANALYTICS_SERVICE_NAME = 'google-analytics'; + /** - * Initial Klaro configuration + * Initial Orejime configuration */ - klaroConfig = cloneDeep(klaroConfiguration); + orejimeConfig = cloneDeep(getOrejimeConfiguration(this._window)); + + private orejimeInstance: any; constructor( + @Inject(NativeWindowService) private _window: NativeWindowRef, private translateService: TranslateService, private authService: AuthService, private ePersonService: EPersonDataService, private configService: ConfigurationDataService, private cookieService: CookieService, - @Inject(LAZY_KLARO) private lazyKlaro: Promise, + @Inject(LAZY_OREJIME) private lazyOrejime: Promise, ) { super(); } @@ -106,13 +114,9 @@ export class BrowserKlaroService extends KlaroService { * - Retrieves the current authenticated user * - Checks if the translation service is ready * - Initialize configuration for users - * - Add and translate klaro configuration messages + * - Add and translate orejime configuration messages */ initialize() { - if (!environment.info.enablePrivacyStatement) { - delete this.klaroConfig.privacyPolicy; - this.klaroConfig.translations.zz.consentNotice.description = 'cookies.consent.content-notice.description.no-privacy'; - } const hideGoogleAnalytics$ = this.configService.findByPropertyName(this.GOOGLE_ANALYTICS_KEY).pipe( getFirstCompletedRemoteData(), @@ -126,16 +130,16 @@ export class BrowserKlaroService extends KlaroService { ), ); - const servicesToHide$: Observable = observableCombineLatest([hideGoogleAnalytics$, hideRegistrationVerification$]).pipe( + const appsToHide$: Observable = observableCombineLatest([hideGoogleAnalytics$, hideRegistrationVerification$]).pipe( map(([hideGoogleAnalytics, hideRegistrationVerification]) => { - const servicesToHideArray: string[] = []; + const appsToHideArray: string[] = []; if (hideGoogleAnalytics) { - servicesToHideArray.push(this.GOOGLE_ANALYTICS_SERVICE_NAME); + appsToHideArray.push(this.GOOGLE_ANALYTICS_SERVICE_NAME); } if (hideRegistrationVerification) { - servicesToHideArray.push(CAPTCHA_NAME); + appsToHideArray.push(CAPTCHA_NAME); } - return servicesToHideArray; + return appsToHideArray; }), ); @@ -145,8 +149,8 @@ export class BrowserKlaroService extends KlaroService { const translationServiceReady$ = this.translateService.get('loading.default').pipe(take(1)); - observableCombineLatest([user$, servicesToHide$, translationServiceReady$]) - .subscribe(([user, servicesToHide, _]: [EPerson, string[], string]) => { + observableCombineLatest([user$, appsToHide$, translationServiceReady$]) + .subscribe(([user, appsToHide, _]: [EPerson, string[], string]) => { user = cloneDeep(user); if (hasValue(user)) { @@ -154,10 +158,15 @@ export class BrowserKlaroService extends KlaroService { } /** - * Add all message keys for services and purposes + * Add all message keys for apps and purposes */ this.addAppMessages(); + /** + * Create categories based on the purposes of the apps + */ + this.createCategories(); + /** * Subscribe on a message to make sure the translation service is ready * Translate all keys in the translation section of the configuration @@ -165,20 +174,22 @@ export class BrowserKlaroService extends KlaroService { */ this.translateConfiguration(); - this.klaroConfig.services = this.filterConfigServices(servicesToHide); - this.lazyKlaro.then(({ setup }) => setup(this.klaroConfig)); + this.orejimeConfig.apps = this.filterConfigApps(appsToHide); + this.lazyOrejime.then(({ init }) => { + this.orejimeInstance = init(this.orejimeConfig); + }); }); } /** - * Return saved preferences stored in the klaro cookie + * Return saved preferences stored in the orejime cookie */ getSavedPreferences(): Observable { return this.getUser$().pipe( map((user: EPerson) => { let storageName; if (isEmpty(user)) { - storageName = ANONYMOUS_STORAGE_NAME_KLARO; + storageName = ANONYMOUS_STORAGE_NAME_OREJIME; } else { storageName = this.getStorageName(user.uuid); } @@ -192,10 +203,10 @@ export class BrowserKlaroService extends KlaroService { * @param user The authenticated user */ private initializeUser(user: EPerson) { - this.klaroConfig.callback = debounce((consent, app) => this.updateSettingsForUsers(user), updateDebounce); - this.klaroConfig.storageName = this.getStorageName(user.uuid); + this.orejimeConfig.callback = debounce((consent, app) => this.updateSettingsForUsers(user), updateDebounce); + this.orejimeConfig.storageName = this.getStorageName(user.uuid); - const anonCookie = this.cookieService.get(ANONYMOUS_STORAGE_NAME_KLARO); + const anonCookie = this.cookieService.get(ANONYMOUS_STORAGE_NAME_OREJIME); if (hasValue(this.getSettingsForUser(user))) { this.restoreSettingsForUsers(user); } else if (hasValue(anonCookie)) { @@ -250,26 +261,26 @@ export class BrowserKlaroService extends KlaroService { * Show the cookie consent form */ showSettings() { - this.lazyKlaro.then(({ show }) => show(this.klaroConfig)); + this.orejimeInstance.show(); } /** - * Add message keys for all services and purposes + * Add message keys for all apps and purposes */ addAppMessages() { - this.klaroConfig.services.forEach((app) => { - this.klaroConfig.translations.zz[app.name] = { + this.orejimeConfig.apps.forEach((app) => { + this.orejimeConfig.translations.zz[app.name] = { title: this.getTitleTranslation(app.name), description: this.getDescriptionTranslation(app.name), }; app.purposes.forEach((purpose) => { - this.klaroConfig.translations.zz.purposes[purpose] = this.getPurposeTranslation(purpose); + this.orejimeConfig.translations.zz.purposes[purpose] = this.getPurposeTranslation(purpose); }); }); } /** - * Translate the translation section from the Klaro configuration + * Translate the translation section from the Orejime configuration */ translateConfiguration() { /** @@ -277,7 +288,26 @@ export class BrowserKlaroService extends KlaroService { */ this.translateService.setDefaultLang(environment.defaultLanguage); - this.translate(this.klaroConfig.translations.zz); + this.translate(this.orejimeConfig.translations.zz); + } + + /** + * Create categories based on the purposes of the apps + */ + createCategories() { + this.orejimeConfig.categories = this.orejimeConfig.apps.reduce((accumulator, current) => { + let category = accumulator.find((cat) => cat.name === current.purposes[0]); + if (!category) { + category = { + name: current.purposes[0], + title: this.translateService.instant(this.getPurposeTranslation(current.purposes[0])), + apps: [], + }; + accumulator.push(category); + } + category.apps.push(current.name); + return accumulator; + }, []); } /** @@ -295,7 +325,7 @@ export class BrowserKlaroService extends KlaroService { } /** - * Retrieves the stored Klaro consent settings for a user + * Retrieves the stored Orejime consent settings for a user * @param user The user to resolve the consent for */ getSettingsForUser(user: EPerson) { @@ -304,7 +334,7 @@ export class BrowserKlaroService extends KlaroService { } /** - * Stores the Klaro consent settings for a user in a metadata field + * Stores the Orejime consent settings for a user in a metadata field * @param user The user to save the settings for * @param config The consent settings for the user to save */ @@ -344,18 +374,18 @@ export class BrowserKlaroService extends KlaroService { } /** - * Create the storage name for klaro cookies based on the user's identifier + * Create the storage name for orejime cookies based on the user's identifier * @param identifier The user's uuid */ getStorageName(identifier: string) { - return 'klaro-' + identifier; + return 'orejime-' + identifier; } /** - * remove the google analytics from the services + * remove the Google Analytics from the apps */ - private filterConfigServices(servicesToHide: string[]): Pick[] { - return this.klaroConfig.services.filter(service => !servicesToHide.some(name => name === service.name)); + private filterConfigApps(appsToHide: string[]) { + return this.orejimeConfig.apps.filter(service => !appsToHide.some(name => name === service.name)); } } diff --git a/src/app/shared/cookies/klaro-configuration.ts b/src/app/shared/cookies/klaro-configuration.ts deleted file mode 100644 index c2fb7738a0c..00000000000 --- a/src/app/shared/cookies/klaro-configuration.ts +++ /dev/null @@ -1,199 +0,0 @@ -import { - IMPERSONATING_COOKIE, - REDIRECT_COOKIE, -} from '../../core/auth/auth.service'; -import { TOKENITEM } from '../../core/auth/models/auth-token-info.model'; -import { - CAPTCHA_COOKIE, - CAPTCHA_NAME, -} from '../../core/google-recaptcha/google-recaptcha.service'; -import { LANG_COOKIE } from '../../core/locale/locale.service'; - -/** - * Cookie for has_agreed_end_user - */ -export const HAS_AGREED_END_USER = 'dsHasAgreedEndUser'; - -/** - * Storage name used to store klaro cookie - */ -export const ANONYMOUS_STORAGE_NAME_KLARO = 'klaro-anonymous'; - -export const GOOGLE_ANALYTICS_KLARO_KEY = 'google-analytics'; - -/** - * Klaro configuration - * For more information see https://kiprotect.com/docs/klaro/annotated-config - */ -export const klaroConfiguration: any = { - storageName: ANONYMOUS_STORAGE_NAME_KLARO, - - privacyPolicy: './info/privacy', - - /* - Setting 'hideLearnMore' to 'true' will hide the "learn more / customize" link in - the consent notice. We strongly advise against using this under most - circumstances, as it keeps the user from customizing their consent choices. - */ - hideLearnMore: false, - - /* - Setting 'acceptAll' to 'true' will show an "accept all" button in the notice and - modal, which will enable all third-party services if the user clicks on it. If set - to 'false', there will be an "accept" button that will only enable the services that - are enabled in the consent modal. - */ - acceptAll: true, - - /* - You can also set a custom expiration time for the Klaro cookie. By default, it - will expire after 30 days. Only relevant if 'storageMethod' is set to 'cookie'. - */ - cookieExpiresAfterDays: 365, - - htmlTexts: true, - - /* - You can overwrite existing translations and add translations for your app - descriptions and purposes. See `src/translations/` for a full list of - translations that can be overwritten: - https://github.com/KIProtect/klaro/tree/master/src/translations - */ - translations: { - /* - The `zz` key contains default translations that will be used as fallback values. - This can e.g. be useful for defining a fallback privacy policy URL. - FOR DSPACE: We use 'zz' to map to our own i18n translations for klaro, see - translateConfiguration() in browser-klaro.service.ts. All the below i18n keys are specified - in your /src/assets/i18n/*.json5 translation pack. - */ - zz: { - acceptAll: 'cookies.consent.accept-all', - acceptSelected: 'cookies.consent.accept-selected', - close: 'cookies.consent.close', - consentModal: { - title: 'cookies.consent.content-modal.title', - description: 'cookies.consent.content-modal.description', - }, - consentNotice: { - changeDescription: 'cookies.consent.update', - title: 'cookies.consent.content-notice.title', - description: 'cookies.consent.content-notice.description', - learnMore: 'cookies.consent.content-notice.learnMore', - }, - decline: 'cookies.consent.decline', - ok: 'cookies.consent.ok', - poweredBy: 'Powered by Klaro!', - privacyPolicy: { - name: 'cookies.consent.content-modal.privacy-policy.name', - text: 'cookies.consent.content-modal.privacy-policy.text', - }, - purposeItem: { - service: 'cookies.consent.content-modal.service', - services: 'cookies.consent.content-modal.services', - }, - purposes: { - }, - save: 'cookies.consent.save', - service: { - disableAll: { - description: 'cookies.consent.app.disable-all.description', - title: 'cookies.consent.app.disable-all.title', - }, - optOut: { - description: 'cookies.consent.app.opt-out.description', - title: 'cookies.consent.app.opt-out.title', - }, - purpose: 'cookies.consent.app.purpose', - purposes: 'cookies.consent.app.purposes', - required: { - title: 'cookies.consent.app.required.title', - description: 'cookies.consent.app.required.description', - }, - }, - }, - }, - services: [ - { - name: 'authentication', - purposes: ['functional'], - required: true, - cookies: [ - TOKENITEM, - IMPERSONATING_COOKIE, - REDIRECT_COOKIE, - ], - }, - { - name: 'preferences', - purposes: ['functional'], - required: true, - cookies: [ - LANG_COOKIE, - ], - }, - { - name: 'acknowledgement', - purposes: ['functional'], - required: true, - cookies: [ - [/^klaro-.+$/], - HAS_AGREED_END_USER, - ], - }, - { - name: GOOGLE_ANALYTICS_KLARO_KEY, - purposes: ['statistical'], - required: false, - cookies: [ - // /* - // you an either only provide a cookie name or regular expression (regex) or a list - // consisting of a name or regex, a path and a cookie domain. Providing a path and - // domain is necessary if you have services that set cookies for a path that is not - // "/", or a domain that is not the current domain. If you do not set these values - // properly, the cookie can't be deleted by Klaro, as there is no way to access the - // path or domain of a cookie in JS. Notice that it is not possible to delete - // cookies that were set on a third-party domain, or cookies that have the HTTPOnly - // attribute: https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie#new- - // cookie_domain - // */ - // - // /* - // This rule will match cookies that contain the string '_pk_' and that are set on - // the path '/' and the domain 'klaro.kiprotect.com' - // */ - [/^_ga.?$/], - [/^_gid$/], - // - // /* - // Same as above, only for the 'localhost' domain - // */ - // [/^_pk_.*$/, '/', 'localhost'], - // - // /* - // This rule will match all cookies named 'piwik_ignore' that are set on the path - // '/' on the current domain - // */ - // 'piwik_ignore', - ], - /* - If 'onlyOnce' is set to 'true', the app will only be executed once regardless - how often the user toggles it on and off. This is relevant e.g. for tracking - scripts that would generate new page view events every time Klaro disables and - re-enables them due to a consent change by the user. - */ - onlyOnce: true, - }, - { - name: CAPTCHA_NAME, - purposes: ['registration-password-recovery'], - required: false, - cookies: [ - CAPTCHA_COOKIE, - ], - onAccept: `window.refreshCaptchaScript?.call()`, - onDecline: `window.refreshCaptchaScript?.call()`, - onlyOnce: true, - }, - ], -}; diff --git a/src/app/shared/cookies/orejime-configuration.ts b/src/app/shared/cookies/orejime-configuration.ts new file mode 100644 index 00000000000..fd275f7e77d --- /dev/null +++ b/src/app/shared/cookies/orejime-configuration.ts @@ -0,0 +1,182 @@ +import { + IMPERSONATING_COOKIE, + REDIRECT_COOKIE, +} from '../../core/auth/auth.service'; +import { TOKENITEM } from '../../core/auth/models/auth-token-info.model'; +import { + CAPTCHA_COOKIE, + CAPTCHA_NAME, +} from '../../core/google-recaptcha/google-recaptcha.service'; +import { LANG_COOKIE } from '../../core/locale/locale.service'; +import { NativeWindowRef } from '../../core/services/window.service'; + +/** + * Cookie for has_agreed_end_user + */ +export const HAS_AGREED_END_USER = 'dsHasAgreedEndUser'; + +export const ANONYMOUS_STORAGE_NAME_OREJIME = 'orejime-anonymous'; + +export const GOOGLE_ANALYTICS_OREJIME_KEY = 'google-analytics'; + +/** + * Orejime configuration + * For more information see https://github.com/empreinte-digitale/orejime + */ + +export function getOrejimeConfiguration(_window: NativeWindowRef): any { + return { + storageName: ANONYMOUS_STORAGE_NAME_OREJIME, + + privacyPolicy: './info/privacy', + + // Optional. You can set a custom expiration time for the Orejime cookie, in days. + // defaults to 365. + cookieExpiresAfterDays: 365, + + /* + We need to explicitly enable the 'zz' language, where all translations are set, because Orejime's default is 'en'. + */ + lang: 'zz', + + /* + The appElement selector is used by Orejime to determine where to insert the consent + */ + appElement: 'ds-app', + + /* + You can overwrite existing translations and add translations for your app + descriptions and purposes. See `src/translations/` for a full list of + translations that can be overwritten: + https://github.com/empreinte-digitale/orejime/blob/master/src/translations/en.yml + */ + translations: { + /* + The `zz` key contains default translations that will be used as fallback values. + This can e.g. be useful for defining a fallback privacy policy URL. + FOR DSPACE: We use 'zz' to map to our own i18n translations for orejime, see + translateConfiguration() in browser-orejime.service.ts. All the below i18n keys are specified + in your /src/assets/i18n/*.json5 translation pack. + */ + zz: { + acceptAll: 'cookies.consent.accept-all', + acceptSelected: 'cookies.consent.accept-selected', + close: 'cookies.consent.close', + consentModal: { + title: 'cookies.consent.content-modal.title', + description: 'cookies.consent.content-modal.description', + privacyPolicy: { + name: 'cookies.consent.content-modal.privacy-policy.name', + text: 'cookies.consent.content-modal.privacy-policy.text', + }, + }, + consentNotice: { + changeDescription: 'cookies.consent.update', + description: 'cookies.consent.content-notice.description', + learnMore: 'cookies.consent.content-notice.learnMore', + }, + decline: 'cookies.consent.decline', + declineAll: 'cookies.consent.decline-all', + accept: 'cookies.consent.ok', + save: 'cookies.consent.save', + purposes: {}, + app: { + optOut: { + description: 'cookies.consent.app.opt-out.description', + title: 'cookies.consent.app.opt-out.title', + }, + purpose: 'cookies.consent.app.purpose', + purposes: 'cookies.consent.app.purposes', + required: { + title: 'cookies.consent.app.required.title', + description: 'cookies.consent.app.required.description', + }, + }, + }, + }, + apps: [ + { + name: 'authentication', + purposes: ['functional'], + required: true, + cookies: [ + TOKENITEM, + IMPERSONATING_COOKIE, + REDIRECT_COOKIE, + ], + }, + { + name: 'preferences', + purposes: ['functional'], + required: true, + cookies: [ + LANG_COOKIE, + ], + }, + { + name: 'acknowledgement', + purposes: ['functional'], + required: true, + cookies: [ + [/^orejime-.+$/], + HAS_AGREED_END_USER, + ], + }, + { + name: GOOGLE_ANALYTICS_OREJIME_KEY, + purposes: ['statistical'], + required: false, + cookies: [ + // /* + // you an either only provide a cookie name or regular expression (regex) or a list + // consisting of a name or regex, a path and a cookie domain. Providing a path and + // domain is necessary if you have services that set cookies for a path that is not + // "/", or a domain that is not the current domain. If you do not set these values + // properly, the cookie can't be deleted by Orejime, as there is no way to access the + // path or domain of a cookie in JS. Notice that it is not possible to delete + // cookies that were set on a third-party domain, or cookies that have the HTTPOnly + // attribute: https://developer.mozilla.org/en-US/docs/Web/API/Document/cookie#new- + // cookie_domain + // */ + // + // /* + // This rule will match cookies that contain the string '_pk_' and that are set on + // the path '/' and the domain 'orejime.kiprotect.com' + // */ + [/^_ga.?$/], + [/^_gid$/], + // + // /* + // Same as above, only for the 'localhost' domain + // */ + // [/^_pk_.*$/, '/', 'localhost'], + // + // /* + // This rule will match all cookies named 'piwik_ignore' that are set on the path + // '/' on the current domain + // */ + // 'piwik_ignore', + ], + /* + If 'onlyOnce' is set to 'true', the app will only be executed once regardless + how often the user toggles it on and off. This is relevant e.g. for tracking + scripts that would generate new page view events every time Orejime disables and + re-enables them due to a consent change by the user. + */ + onlyOnce: true, + }, + { + name: CAPTCHA_NAME, + purposes: ['registration-password-recovery'], + required: false, + cookies: [ + CAPTCHA_COOKIE, + ], + callback: (consent: boolean) => { + _window?.nativeWindow.refreshCaptchaScript?.call(); + }, + onlyOnce: true, + }, + ], + }; +} diff --git a/src/app/shared/cookies/klaro.service.ts b/src/app/shared/cookies/orejime.service.ts similarity index 63% rename from src/app/shared/cookies/klaro.service.ts rename to src/app/shared/cookies/orejime.service.ts index 9e28d6ead7a..0640f8d6ff6 100644 --- a/src/app/shared/cookies/klaro.service.ts +++ b/src/app/shared/cookies/orejime.service.ts @@ -2,10 +2,10 @@ import { Injectable } from '@angular/core'; import { Observable } from 'rxjs'; /** - * Abstract class representing a service for handling Klaro consent preferences and UI + * Abstract class representing a service for handling Orejime consent preferences and UI */ @Injectable() -export abstract class KlaroService { +export abstract class OrejimeService { /** * Initializes the service */ @@ -17,7 +17,7 @@ export abstract class KlaroService { abstract showSettings(); /** - * Return saved preferences stored in the klaro cookie + * Return saved preferences stored in the Orejime cookie */ abstract getSavedPreferences(): Observable; } diff --git a/src/app/statistics/google-analytics.service.spec.ts b/src/app/statistics/google-analytics.service.spec.ts index eb35750c4ca..1b8783f3bf7 100644 --- a/src/app/statistics/google-analytics.service.spec.ts +++ b/src/app/statistics/google-analytics.service.spec.ts @@ -6,8 +6,8 @@ import { of } from 'rxjs'; import { ConfigurationDataService } from '../core/data/configuration-data.service'; import { ConfigurationProperty } from '../core/shared/configuration-property.model'; -import { KlaroService } from '../shared/cookies/klaro.service'; -import { GOOGLE_ANALYTICS_KLARO_KEY } from '../shared/cookies/klaro-configuration'; +import { OrejimeService } from '../shared/cookies/orejime.service'; +import { GOOGLE_ANALYTICS_OREJIME_KEY } from '../shared/cookies/orejime-configuration'; import { createFailedRemoteDataObject$, createSuccessfulRemoteDataObject$, @@ -24,7 +24,7 @@ describe('GoogleAnalyticsService', () => { let googleAnalyticsSpy: Angulartics2GoogleAnalytics; let googleTagManagerSpy: Angulartics2GoogleGlobalSiteTag; let configSpy: ConfigurationDataService; - let klaroServiceSpy: jasmine.SpyObj; + let orejimeServiceSpy: jasmine.SpyObj; let scriptElementMock: any; let srcSpy: any; let innerHTMLSpy: any; @@ -47,7 +47,7 @@ describe('GoogleAnalyticsService', () => { 'startTracking', ]); - klaroServiceSpy = jasmine.createSpyObj('KlaroService', { + orejimeServiceSpy = jasmine.createSpyObj('OrejimeService', { 'getSavedPreferences': jasmine.createSpy('getSavedPreferences'), }); @@ -73,11 +73,11 @@ describe('GoogleAnalyticsService', () => { body: bodyElementSpy, }); - klaroServiceSpy.getSavedPreferences.and.returnValue(of({ - GOOGLE_ANALYTICS_KLARO_KEY: true, + orejimeServiceSpy.getSavedPreferences.and.returnValue(of({ + GOOGLE_ANALYTICS_OREJIME_KEY: true, })); - service = new GoogleAnalyticsService(googleAnalyticsSpy, googleTagManagerSpy, klaroServiceSpy, configSpy, documentSpy ); + service = new GoogleAnalyticsService(googleAnalyticsSpy, googleTagManagerSpy, orejimeServiceSpy, configSpy, documentSpy ); }); it('should be created', () => { @@ -97,11 +97,11 @@ describe('GoogleAnalyticsService', () => { findByPropertyName: createFailedRemoteDataObject$(), }); - klaroServiceSpy.getSavedPreferences.and.returnValue(of({ - GOOGLE_ANALYTICS_KLARO_KEY: true, + orejimeServiceSpy.getSavedPreferences.and.returnValue(of({ + GOOGLE_ANALYTICS_OREJIME_KEY: true, })); - service = new GoogleAnalyticsService(googleAnalyticsSpy, googleTagManagerSpy, klaroServiceSpy, configSpy, documentSpy); + service = new GoogleAnalyticsService(googleAnalyticsSpy, googleTagManagerSpy, orejimeServiceSpy, configSpy, documentSpy); }); it('should NOT add a script to the body', () => { @@ -120,10 +120,10 @@ describe('GoogleAnalyticsService', () => { describe('when the tracking id is empty', () => { beforeEach(() => { configSpy = createConfigSuccessSpy(); - klaroServiceSpy.getSavedPreferences.and.returnValue(of({ - [GOOGLE_ANALYTICS_KLARO_KEY]: true, + orejimeServiceSpy.getSavedPreferences.and.returnValue(of({ + [GOOGLE_ANALYTICS_OREJIME_KEY]: true, })); - service = new GoogleAnalyticsService(googleAnalyticsSpy, googleTagManagerSpy, klaroServiceSpy, configSpy, documentSpy); + service = new GoogleAnalyticsService(googleAnalyticsSpy, googleTagManagerSpy, orejimeServiceSpy, configSpy, documentSpy); }); it('should NOT add a script to the body', () => { @@ -141,8 +141,8 @@ describe('GoogleAnalyticsService', () => { describe('when google-analytics cookie preferences are not existing', () => { beforeEach(() => { configSpy = createConfigSuccessSpy(trackingIdV4TestValue); - klaroServiceSpy.getSavedPreferences.and.returnValue(of({})); - service = new GoogleAnalyticsService(googleAnalyticsSpy, googleTagManagerSpy, klaroServiceSpy, configSpy, documentSpy); + orejimeServiceSpy.getSavedPreferences.and.returnValue(of({})); + service = new GoogleAnalyticsService(googleAnalyticsSpy, googleTagManagerSpy, orejimeServiceSpy, configSpy, documentSpy); }); it('should NOT add a script to the body', () => { @@ -161,10 +161,10 @@ describe('GoogleAnalyticsService', () => { describe('when google-analytics cookie preferences are set to false', () => { beforeEach(() => { configSpy = createConfigSuccessSpy(trackingIdV4TestValue); - klaroServiceSpy.getSavedPreferences.and.returnValue(of({ - [GOOGLE_ANALYTICS_KLARO_KEY]: false, + orejimeServiceSpy.getSavedPreferences.and.returnValue(of({ + [GOOGLE_ANALYTICS_OREJIME_KEY]: false, })); - service = new GoogleAnalyticsService(googleAnalyticsSpy, googleTagManagerSpy, klaroServiceSpy, configSpy, documentSpy); + service = new GoogleAnalyticsService(googleAnalyticsSpy, googleTagManagerSpy, orejimeServiceSpy, configSpy, documentSpy); }); it('should NOT add a script to the body', () => { @@ -183,10 +183,10 @@ describe('GoogleAnalyticsService', () => { beforeEach(() => { configSpy = createConfigSuccessSpy(trackingIdV4TestValue); - klaroServiceSpy.getSavedPreferences.and.returnValue(of({ - [GOOGLE_ANALYTICS_KLARO_KEY]: true, + orejimeServiceSpy.getSavedPreferences.and.returnValue(of({ + [GOOGLE_ANALYTICS_OREJIME_KEY]: true, })); - service = new GoogleAnalyticsService(googleAnalyticsSpy, googleTagManagerSpy, klaroServiceSpy, configSpy, documentSpy); + service = new GoogleAnalyticsService(googleAnalyticsSpy, googleTagManagerSpy, orejimeServiceSpy, configSpy, documentSpy); }); it('should create a script tag whose innerHTML contains the tracking id', () => { @@ -220,10 +220,10 @@ describe('GoogleAnalyticsService', () => { beforeEach(() => { configSpy = createConfigSuccessSpy(trackingIdV3TestValue); - klaroServiceSpy.getSavedPreferences.and.returnValue(of({ - [GOOGLE_ANALYTICS_KLARO_KEY]: true, + orejimeServiceSpy.getSavedPreferences.and.returnValue(of({ + [GOOGLE_ANALYTICS_OREJIME_KEY]: true, })); - service = new GoogleAnalyticsService(googleAnalyticsSpy, googleTagManagerSpy, klaroServiceSpy, configSpy, documentSpy); + service = new GoogleAnalyticsService(googleAnalyticsSpy, googleTagManagerSpy, orejimeServiceSpy, configSpy, documentSpy); }); it('should create a script tag whose innerHTML contains the tracking id', () => { diff --git a/src/app/statistics/google-analytics.service.ts b/src/app/statistics/google-analytics.service.ts index 508297c3b9a..d638b0ce391 100644 --- a/src/app/statistics/google-analytics.service.ts +++ b/src/app/statistics/google-analytics.service.ts @@ -11,8 +11,8 @@ import { combineLatest } from 'rxjs'; import { ConfigurationDataService } from '../core/data/configuration-data.service'; import { getFirstCompletedRemoteData } from '../core/shared/operators'; -import { KlaroService } from '../shared/cookies/klaro.service'; -import { GOOGLE_ANALYTICS_KLARO_KEY } from '../shared/cookies/klaro-configuration'; +import { OrejimeService } from '../shared/cookies/orejime.service'; +import { GOOGLE_ANALYTICS_OREJIME_KEY } from '../shared/cookies/orejime-configuration'; import { isEmpty } from '../shared/empty.util'; /** @@ -25,7 +25,7 @@ export class GoogleAnalyticsService { constructor( private googleAnalytics: Angulartics2GoogleAnalytics, private googleGlobalSiteTag: Angulartics2GoogleGlobalSiteTag, - private klaroService: KlaroService, + private orejimeService: OrejimeService, private configService: ConfigurationDataService, @Inject(DOCUMENT) private document: any, ) { @@ -41,12 +41,12 @@ export class GoogleAnalyticsService { const googleKey$ = this.configService.findByPropertyName('google.analytics.key').pipe( getFirstCompletedRemoteData(), ); - const preferences$ = this.klaroService.getSavedPreferences(); + const preferences$ = this.orejimeService.getSavedPreferences(); combineLatest([preferences$, googleKey$]) .subscribe(([preferences, remoteData]) => { // make sure user has accepted Google Analytics consents - if (isEmpty(preferences) || isEmpty(preferences[GOOGLE_ANALYTICS_KLARO_KEY]) || !preferences[GOOGLE_ANALYTICS_KLARO_KEY]) { + if (isEmpty(preferences) || isEmpty(preferences[GOOGLE_ANALYTICS_OREJIME_KEY]) || !preferences[GOOGLE_ANALYTICS_OREJIME_KEY]) { return; } diff --git a/src/assets/i18n/ar.json5 b/src/assets/i18n/ar.json5 index 6d97effb4cc..586ba9424fc 100644 --- a/src/assets/i18n/ar.json5 +++ b/src/assets/i18n/ar.json5 @@ -783,23 +783,17 @@ "cookies.consent.app.purpose": "اللحوم", "cookies.consent.app.required.description": "هذا التطبيق مطلوب تكرارا", "cookies.consent.app.required.title": "(مطلوب مرة أخرى)", - "cookies.consent.app.disable-all.description": "استخدم هذا الزر لتفعيل جميع الخدمات أو جونسونها.", - "cookies.consent.app.disable-all.title": "تفعيل أو تفعيل كل الخدمات", "cookies.consent.update": "لقد قمت بتغيير بعض التغييرات منذ الآن، يرجى تحديث موافقتك.", "cookies.consent.close": "إغلاق", "cookies.consent.decline": "الرفض", "cookies.consent.ok": "لا بأس", "cookies.consent.save": "حفظ", - "cookies.consent.content-notice.title": "الموافقة على ملفات تعريف الارتباط", "cookies.consent.content-notice.description": "لإصلاح بجمع ومعالجة معلوماتك الشخصية للأغراض التالية: الاستثناء، والتفضيلات، والاستخلاص، والإحصاء.
لمعرفة المزيد، يرجى قراءة {privacyPolicy}.", - "cookies.consent.content-notice.description.no-privacy": "لإصلاح بجمع ومعالجة معلوماتك الشخصية للأغراض التالية: الاستثناء، والتفضيلات، والاستخلاص، والإحصاء.", "cookies.consent.content-notice.learnMore": "تخصيص", "cookies.consent.content-modal.description": "من هنا يمكنك رؤية وتخصيص المعلومات التي تجمعها عنك.", "cookies.consent.content-modal.privacy-policy.name": "سياسة الخصوصية", "cookies.consent.content-modal.privacy-policy.text": "لمعرفة المزيد، يرجى قراءة {privacyPolicy}.", "cookies.consent.content-modal.title": "المعلومات التي بجمعها", - "cookies.consent.content-modal.services": "خدمات", - "cookies.consent.content-modal.service": "خدمة", "cookies.consent.app.title.authentication": "استيثاق", "cookies.consent.app.description.authentication": "مطلوب لتسجيل دخولك", "cookies.consent.app.title.preferences": "التفضيلات", diff --git a/src/assets/i18n/ca.json5 b/src/assets/i18n/ca.json5 index e257ebafc58..c382a90a816 100644 --- a/src/assets/i18n/ca.json5 +++ b/src/assets/i18n/ca.json5 @@ -2232,12 +2232,6 @@ // "cookies.consent.app.required.title": "(always required)", "cookies.consent.app.required.title": "(sempre requerit)", - // "cookies.consent.app.disable-all.description": "Use this switch to enable or disable all services.", - "cookies.consent.app.disable-all.description": "Utilitzeu aquest camp per activar o desactivar tots els serveis.", - - // "cookies.consent.app.disable-all.title": "Enable or disable all services", - "cookies.consent.app.disable-all.title": "Activar o desactivar tots els serveis", - // "cookies.consent.update": "There were changes since your last visit, please update your consent.", "cookies.consent.update": "Hi ha hagut canvis des de la darrera visita, si us plau, actualitzeu el vostre consentiment.", @@ -2253,15 +2247,9 @@ // "cookies.consent.save": "Save", "cookies.consent.save": "Guardar", - // "cookies.consent.content-notice.title": "Cookie Consent", - "cookies.consent.content-notice.title": "Cookie Consent", - // "cookies.consent.content-notice.description": "We collect and process your personal information for the following purposes: Authentication, Preferences, Acknowledgement and Statistics.
To learn more, please read our {privacyPolicy}.", "cookies.consent.content-notice.description": "Recopilem i processem la vostra informació personal amb les finalitats següents: Autenticació, Preferències, Reconeixement i Estadístiques.
Per obtenir més informació, llegiu la nostra {privacyPolicy}.", - // "cookies.consent.content-notice.description.no-privacy": "We collect and process your personal information for the following purposes: Authentication, Preferences, Acknowledgement and Statistics.", - "cookies.consent.content-notice.description.no-privacy": "Recopilem i processem la vostra informació personal per als següents propòsits: Autenticació, Preferències, Reconeixement i Estadístiques.", - // "cookies.consent.content-notice.learnMore": "Customize", "cookies.consent.content-notice.learnMore": "Personalitzar", @@ -2277,12 +2265,6 @@ // "cookies.consent.content-modal.title": "Information that we collect", "cookies.consent.content-modal.title": "Informació que recopilem", - // "cookies.consent.content-modal.services": "services", - "cookies.consent.content-modal.services": "serveis", - - // "cookies.consent.content-modal.service": "service", - "cookies.consent.content-modal.service": "servei", - // "cookies.consent.app.title.authentication": "Authentication", "cookies.consent.app.title.authentication": "Autenticació", diff --git a/src/assets/i18n/cs.json5 b/src/assets/i18n/cs.json5 index 0b4168cca94..d4ea21e1107 100644 --- a/src/assets/i18n/cs.json5 +++ b/src/assets/i18n/cs.json5 @@ -2517,12 +2517,6 @@ // "cookies.consent.app.required.title": "(always required)", "cookies.consent.app.required.title": "(vždy vyžadováno)", - // "cookies.consent.app.disable-all.description": "Use this switch to enable or disable all services.", - "cookies.consent.app.disable-all.description": "Pomocí tohoto přepínače povolíte nebo zakážete všechny služby.", - - // "cookies.consent.app.disable-all.title": "Enable or disable all services", - "cookies.consent.app.disable-all.title": "Povolit nebo zakázat všechny služby.", - // "cookies.consent.update": "There were changes since your last visit, please update your consent.", "cookies.consent.update": "Od vaší poslední návštěvy došlo ke změnám, aktualizujte prosím svůj souhlas.", @@ -2538,15 +2532,9 @@ // "cookies.consent.save": "Save", "cookies.consent.save": "Uložit", - // "cookies.consent.content-notice.title": "Cookie Consent", - "cookies.consent.content-notice.title": "Souhlas se soubory Cookie", - // "cookies.consent.content-notice.description": "We collect and process your personal information for the following purposes: Authentication, Preferences, Acknowledgement and Statistics.
To learn more, please read our {privacyPolicy}.", "cookies.consent.content-notice.description": "Vaše osobní údaje shromažďujeme a zpracováváme pro následující účely: Ověření, Preference, Potvrzení a Statistiky.
Chcete-li se dozvědět více, přečtěte si prosím naše {privacyPolicy}.", - // "cookies.consent.content-notice.description.no-privacy": "We collect and process your personal information for the following purposes: Authentication, Preferences, Acknowledgement and Statistics.", - "cookies.consent.content-notice.description.no-privacy": "Vaše osobní údaje shromažďujeme a zpracováváme pro následující účely: Ověření, Preference, Potvrzení a Statistiky. Využíváme osobní údaje pro tyto účely:", - // "cookies.consent.content-notice.learnMore": "Customize", "cookies.consent.content-notice.learnMore": "Přizpůsobit", @@ -2562,12 +2550,6 @@ // "cookies.consent.content-modal.title": "Information that we collect", "cookies.consent.content-modal.title": "Informace, které shromažďujeme", - // "cookies.consent.content-modal.services": "services", - "cookies.consent.content-modal.services": "služby", - - // "cookies.consent.content-modal.service": "service", - "cookies.consent.content-modal.service": "služba", - // "cookies.consent.app.title.authentication": "Authentication", "cookies.consent.app.title.authentication": "Ověřování", @@ -11036,4 +11018,4 @@ "item.page.cc.license.disclaimer": "Except where otherwised noted, this item's license is described as", -} \ No newline at end of file +} diff --git a/src/assets/i18n/el.json5 b/src/assets/i18n/el.json5 index a7e13009ffc..30012732496 100644 --- a/src/assets/i18n/el.json5 +++ b/src/assets/i18n/el.json5 @@ -1004,7 +1004,6 @@ "cookies.consent.content-modal.privacy-policy.text": "Για να μάθετε περισσότερα, διαβάστε την {Πολιτική απορρήτου} μας.", "cookies.consent.content-modal.title": "Πληροφορίες που συλλέγουμε", "cookies.consent.content-notice.description": "Συλλέγουμε και επεξεργαζόμαστε τα προσωπικά σας στοιχεία για τους ακόλουθους σκοπούς: Έλεγχος ταυτότητας, Προτιμήσεις, Αναγνώριση και Στατιστικά.
Για να μάθετε περισσότερα, διαβάστε την {privacyPolicy} μας.", - "cookies.consent.content-notice.description.no-privacy": "Συλλέγουμε και επεξεργαζόμαστε τα προσωπικά σας στοιχεία για τους ακόλουθους σκοπούς: Έλεγχος ταυτότητας, Προτιμήσεις, Αναγνώριση και Στατιστικά.", "cookies.consent.content-notice.learnMore": "Προσαρμογή", "cookies.consent.decline": "Απόρριψη", "cookies.consent.purpose.functional": "Λειτουργικός", diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 8f20c657f94..babc90d436b 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -1582,25 +1582,19 @@ "cookies.consent.app.required.title": "(always required)", - "cookies.consent.app.disable-all.description": "Use this switch to enable or disable all services.", - - "cookies.consent.app.disable-all.title": "Enable or disable all services", - "cookies.consent.update": "There were changes since your last visit, please update your consent.", "cookies.consent.close": "Close", "cookies.consent.decline": "Decline", + "cookies.consent.decline-all": "Decline all", + "cookies.consent.ok": "That's ok", "cookies.consent.save": "Save", - "cookies.consent.content-notice.title": "Cookie Consent", - - "cookies.consent.content-notice.description": "We collect and process your personal information for the following purposes: Authentication, Preferences, Acknowledgement and Statistics.
To learn more, please read our {privacyPolicy}.", - - "cookies.consent.content-notice.description.no-privacy": "We collect and process your personal information for the following purposes: Authentication, Preferences, Acknowledgement and Statistics.", + "cookies.consent.content-notice.description": "We collect and process your personal information for the following purposes: {purposes}", "cookies.consent.content-notice.learnMore": "Customize", @@ -1612,10 +1606,6 @@ "cookies.consent.content-modal.title": "Information that we collect", - "cookies.consent.content-modal.services": "services", - - "cookies.consent.content-modal.service": "service", - "cookies.consent.app.title.authentication": "Authentication", "cookies.consent.app.description.authentication": "Required for signing you in", diff --git a/src/assets/i18n/es.json5 b/src/assets/i18n/es.json5 index 55962d25b5f..62c3ade8737 100644 --- a/src/assets/i18n/es.json5 +++ b/src/assets/i18n/es.json5 @@ -2277,12 +2277,6 @@ // "cookies.consent.app.required.title": "(always required)", "cookies.consent.app.required.title": "(siempre requerido)", - // "cookies.consent.app.disable-all.description": "Use this switch to enable or disable all services.", - "cookies.consent.app.disable-all.description": "Use este campo para habilitar o deshabilitar todos los servicios.", - - // "cookies.consent.app.disable-all.title": "Enable or disable all services", - "cookies.consent.app.disable-all.title": "Habilita o deshabilita todos los servicios", - // "cookies.consent.update": "There were changes since your last visit, please update your consent.", "cookies.consent.update": "Hubo cambios desde su última visita, actualice su consentimiento.", @@ -2298,15 +2292,9 @@ // "cookies.consent.save": "Save", "cookies.consent.save": "Guardar", - // "cookies.consent.content-notice.title": "Cookie Consent", - "cookies.consent.content-notice.title": "Cookie Consent", - // "cookies.consent.content-notice.description": "We collect and process your personal information for the following purposes: Authentication, Preferences, Acknowledgement and Statistics.
To learn more, please read our {privacyPolicy}.", "cookies.consent.content-notice.description": "Recopilamos y procesamos su información personal para los siguientes propósitos: Autenticación, Preferencias, Reconocimiento y Estadísticas.
Para obtener más información, lea nuestra {privacyPolicy}.", - // "cookies.consent.content-notice.description.no-privacy": "We collect and process your personal information for the following purposes: Authentication, Preferences, Acknowledgement and Statistics.", - "cookies.consent.content-notice.description.no-privacy": "Recopilamos y procesamos su información personal para los siguientes propósitos: Autenticación, Preferencias, Reconocimiento y Estadísticas.", - // "cookies.consent.content-notice.learnMore": "Customize", "cookies.consent.content-notice.learnMore": "Personalizar", @@ -2322,12 +2310,6 @@ // "cookies.consent.content-modal.title": "Information that we collect", "cookies.consent.content-modal.title": "Información que recopilamos", - // "cookies.consent.content-modal.services": "services", - "cookies.consent.content-modal.services": "servicios", - - // "cookies.consent.content-modal.service": "service", - "cookies.consent.content-modal.service": "servicio", - // "cookies.consent.app.title.authentication": "Authentication", "cookies.consent.app.title.authentication": "Autenticación", diff --git a/src/assets/i18n/fi.json5 b/src/assets/i18n/fi.json5 index 227d3519e4a..9fe02db4d90 100644 --- a/src/assets/i18n/fi.json5 +++ b/src/assets/i18n/fi.json5 @@ -2341,12 +2341,6 @@ // "cookies.consent.app.required.title": "(always required)", "cookies.consent.app.required.title": "(aina pakollinen)", - // "cookies.consent.app.disable-all.description": "Use this switch to enable or disable all services.", - "cookies.consent.app.disable-all.description": "Tästä kytkimestä voit ottaa kaikki palvelut käyttöön tai poistaa ne käytöstä", - - // "cookies.consent.app.disable-all.title": "Enable or disable all services", - "cookies.consent.app.disable-all.title": "Ota käyttöön tai poista käytöstä kaikki palvelut", - // "cookies.consent.update": "There were changes since your last visit, please update your consent.", "cookies.consent.update": "Viime käyntisi jälkeen on tehty muutoksia. Ole hyvä ja päivitä suostumuksesi.", @@ -2362,15 +2356,9 @@ // "cookies.consent.save": "Save", "cookies.consent.save": "Tallenna", - // "cookies.consent.content-notice.title": "Cookie Consent", - "cookies.consent.content-notice.title": "Evästeiden hyväksyntä", - // "cookies.consent.content-notice.description": "We collect and process your personal information for the following purposes: Authentication, Preferences, Acknowledgement and Statistics.
To learn more, please read our {privacyPolicy}.", "cookies.consent.content-notice.description": "Keräämme ja käsittelemme tietojasi seuraaviin tarkoituksiin: todentaminen, asetukset, kuittaus ja tilastot.
Lisätietoa saat lukemalla tämän: {privacyPolicy}.", - // "cookies.consent.content-notice.description.no-privacy": "We collect and process your personal information for the following purposes: Authentication, Preferences, Acknowledgement and Statistics.", - "cookies.consent.content-notice.description.no-privacy": "Keräämme ja käsittelemme tietojasi seuraaviin tarkoituksiin: todentaminen, asetukset, kuittaus ja tilastot.", - // "cookies.consent.content-notice.learnMore": "Customize", "cookies.consent.content-notice.learnMore": "Räätälöi", @@ -2386,12 +2374,6 @@ // "cookies.consent.content-modal.title": "Information that we collect", "cookies.consent.content-modal.title": "Keräämämme tieto", - // "cookies.consent.content-modal.services": "services", - "cookies.consent.content-modal.services": "palvelut", - - // "cookies.consent.content-modal.service": "service", - "cookies.consent.content-modal.service": "palvelu", - // "cookies.consent.app.title.authentication": "Authentication", "cookies.consent.app.title.authentication": "Todentaminen", diff --git a/src/assets/i18n/hi.json5 b/src/assets/i18n/hi.json5 index 0513f48965c..3f1806bfb2e 100644 --- a/src/assets/i18n/hi.json5 +++ b/src/assets/i18n/hi.json5 @@ -1616,8 +1616,6 @@ "cookies.consent.content-notice.description": "हम निम्नलिखित उद्देश्यों के लिए आपकी व्यक्तिगत जानकारी एकत्र और संसाधित करते हैं: प्रमाणीकरण, प्राथमिकताएं, पावती और सांख्यिकी
अधिक जानने के लिए, कृपया हमारी {privacyPolicy} पढ़ें।", - "cookies.consent.content-notice.description.no-privacy": "हम निम्नलिखित उद्देश्यों के लिए आपकी व्यक्तिगत जानकारी एकत्र और संसाधित करते हैं: प्रमाणीकरण, प्राथमिकताएं, पावती और सांख्यिकी।", - "cookies.consent.content-notice.learnMore": "अनुकूलित करें", "cookies.consent.decline": "अस्वीकार", diff --git a/src/assets/i18n/hu.json5 b/src/assets/i18n/hu.json5 index 1b1702503f9..1c79d894b36 100644 --- a/src/assets/i18n/hu.json5 +++ b/src/assets/i18n/hu.json5 @@ -2498,14 +2498,6 @@ // "cookies.consent.app.required.title": "(always required)", "cookies.consent.app.required.title": "(mindig szükséges)", - // "cookies.consent.app.disable-all.description": "Use this switch to enable or disable all services.", - // TODO New key - Add a translation - "cookies.consent.app.disable-all.description": "Use this switch to enable or disable all services.", - - // "cookies.consent.app.disable-all.title": "Enable or disable all services", - // TODO New key - Add a translation - "cookies.consent.app.disable-all.title": "Enable or disable all services", - // "cookies.consent.update": "There were changes since your last visit, please update your consent.", "cookies.consent.update": "Változások történtek az utolsó látogatása óta, frissítse a beleegyezését.", @@ -2522,16 +2514,9 @@ // "cookies.consent.save": "Save", "cookies.consent.save": "Mentés", - // "cookies.consent.content-notice.title": "Cookie Consent", - "cookies.consent.content-notice.title": "Cookie elfogadása", - // "cookies.consent.content-notice.description": "We collect and process your personal information for the following purposes: Authentication, Preferences, Acknowledgement and Statistics.
To learn more, please read our {privacyPolicy}.", "cookies.consent.content-notice.description": "Mi gyűjtjük és feldolgozzuk a személyes adatait a következő célból: Hitelesítés, Beállítások, Elismerés és Statisztikák.
Részletekért olvassa el: {privacyPolicy}.", - // "cookies.consent.content-notice.description.no-privacy": "We collect and process your personal information for the following purposes: Authentication, Preferences, Acknowledgement and Statistics.", - // TODO New key - Add a translation - "cookies.consent.content-notice.description.no-privacy": "We collect and process your personal information for the following purposes: Authentication, Preferences, Acknowledgement and Statistics.", - // "cookies.consent.content-notice.learnMore": "Customize", "cookies.consent.content-notice.learnMore": "Személyreszab", @@ -2547,14 +2532,6 @@ // "cookies.consent.content-modal.title": "Information that we collect", "cookies.consent.content-modal.title": "Gyűjtött adatok", - // "cookies.consent.content-modal.services": "services", - // TODO New key - Add a translation - "cookies.consent.content-modal.services": "services", - - // "cookies.consent.content-modal.service": "service", - // TODO New key - Add a translation - "cookies.consent.content-modal.service": "service", - // "cookies.consent.app.title.authentication": "Authentication", "cookies.consent.app.title.authentication": "Hitelesítés", diff --git a/src/assets/i18n/it.json5 b/src/assets/i18n/it.json5 index 4a5d3a4881a..098e9752bc5 100644 --- a/src/assets/i18n/it.json5 +++ b/src/assets/i18n/it.json5 @@ -1958,12 +1958,6 @@ // "cookies.consent.app.required.title": "(always required)", "cookies.consent.app.required.title": "(sempre obbligatorio)", - // "cookies.consent.app.disable-all.description": "Use this switch to enable or disable all services.", - "cookies.consent.app.disable-all.description": "Utilizzare questo interruttore per abilitare o disabilitare tutti i servizi.", - - // "cookies.consent.app.disable-all.title": "Enable or disable all services", - "cookies.consent.app.disable-all.title": "Abilitare o disabilitare tutti i servizi", - // "cookies.consent.update": "There were changes since your last visit, please update your consent.", "cookies.consent.update": "Ci sono stati dei cambiamenti dal tuo ultimo accesso, aggiorna il tuo consenso.", @@ -1979,14 +1973,8 @@ // "cookies.consent.save": "Save", "cookies.consent.save": "Salvare", - // "cookies.consent.content-notice.title": "Cookie Consent", - "cookies.consent.content-notice.title": "Consenso ai cookie", - // "cookies.consent.content-notice.description": "We collect and process your personal information for the following purposes: Authentication, Preferences, Acknowledgement and Statistics.
To learn more, please read our {privacyPolicy}.", - "cookies.consent.content-notice.description": "Raccogliamo ed elaboriamo le tue informazioni personali per i seguenti scopi: Autenticazione, Preferenze, Accettazione e Statistiche.
Per saperne di più, leggi la nostra {privacyPolicy}.", - - // "cookies.consent.content-notice.description.no-privacy": "We collect and process your personal information for the following purposes: Authentication, Preferences, Acknowledgement and Statistics.", - "cookies.consent.content-notice.description.no-privacy": "Raccogliamo ed elaboriamo le tue informazioni personali per i seguenti scopi: Autenticazione, Preferenze, Accettazione e Statistiche.", + "cookies.consent.content-notice.description": "Raccogliamo ed elaboriamo le tue informazioni personali per i seguenti scopi: {purposes}", // "cookies.consent.content-notice.learnMore": "Customize", "cookies.consent.content-notice.learnMore": "Personalizza", @@ -2003,12 +1991,6 @@ // "cookies.consent.content-modal.title": "Information that we collect", "cookies.consent.content-modal.title": "Informazioni che raccogliamo", - // "cookies.consent.content-modal.services": "services", - "cookies.consent.content-modal.services": "servizi", - - // "cookies.consent.content-modal.service": "service", - "cookies.consent.content-modal.service": "servizio", - // "cookies.consent.app.title.authentication": "Authentication", "cookies.consent.app.title.authentication": "Autenticazione", diff --git a/src/assets/i18n/kk.json5 b/src/assets/i18n/kk.json5 index 09b31ff9ada..cb446a5838d 100644 --- a/src/assets/i18n/kk.json5 +++ b/src/assets/i18n/kk.json5 @@ -2247,9 +2247,6 @@ // "cookies.consent.content-notice.description": "We collect and process your personal information for the following purposes: Authentication, Preferences, Acknowledgement and Statistics.
To learn more, please read our {privacyPolicy}.", "cookies.consent.content-notice.description": "Біз сіздің жеке ақпаратыңызды келесі мақсаттарда жинаймыз және өңдейміз: Аутентификация, Параметрлері, Растау және Статистикалар.
Көбірек білу үшін, біздің {privacyPolicy} оқуыңызды өтінеміз.", - // "cookies.consent.content-notice.description.no-privacy": "We collect and process your personal information for the following purposes: Authentication, Preferences, Acknowledgement and Statistics.", - "cookies.consent.content-notice.description.no-privacy": "Біз сіздің жеке мәліметтеріңізді келесі мақсаттар үшін жинаймыз және өңдейміз: Аутентификация, Қалаулар, Растау және статистикасы.", - // "cookies.consent.content-notice.learnMore": "Customize", "cookies.consent.content-notice.learnMore": "Баптау", diff --git a/src/assets/i18n/pl.json5 b/src/assets/i18n/pl.json5 index f7fe80eabf5..f90855f9a67 100644 --- a/src/assets/i18n/pl.json5 +++ b/src/assets/i18n/pl.json5 @@ -2689,13 +2689,7 @@ "admin.registries.bitstream-formats.table.id": "ID", "admin.registries.schema.fields.table.id": "ID", "cookies.consent.app.description.google-recaptcha": "Podczas rejestracji i odzyskiwania hasła używamy narzędzia google reCAPTCHA", - "cookies.consent.app.disable-all.description": "Przełącz, aby zaakceptować lub odrzucić wszystkie", - "cookies.consent.app.disable-all.title": "Akceptowacja lub odrzucenie wszystkich", "cookies.consent.app.title.google-recaptcha": "Google reCaptcha", - "cookies.consent.content-modal.service": "usługa", - "cookies.consent.content-modal.services": "usługi", - "cookies.consent.content-notice.description.no-privacy": "Zbieramy i przetwarzamy Twoje dane w celu: autentykacji, ustawień preferencji i zgód oraz do celów statystycznych.", - "cookies.consent.content-notice.title": "Zgoda na ciasteczka", "cookies.consent.ok": "Zgadzam się", "cookies.consent.purpose.registration-password-recovery": "Rejestracja i odzyskiwanie hasła", "cookies.consent.save": "Zapisz", diff --git a/src/assets/i18n/pt-BR.json5 b/src/assets/i18n/pt-BR.json5 index c3b26a09d28..3a205a3b031 100644 --- a/src/assets/i18n/pt-BR.json5 +++ b/src/assets/i18n/pt-BR.json5 @@ -2369,12 +2369,6 @@ // "cookies.consent.app.required.title": "(always required)", "cookies.consent.app.required.title": "(sempre requerido)", - // "cookies.consent.app.disable-all.description": "Use this switch to enable or disable all services.", - "cookies.consent.app.disable-all.description": "Use esse comutador para ativar ou desativar todos os serviços.", - - // "cookies.consent.app.disable-all.title": "Enable or disable all services", - "cookies.consent.app.disable-all.title": "Ativar ou desativar todos os serviços", - // "cookies.consent.update": "There were changes since your last visit, please update your consent.", "cookies.consent.update": "Houve alterações desde sua última visita, atualize seu consentimento.", @@ -2390,15 +2384,9 @@ // "cookies.consent.save": "Save", "cookies.consent.save": "Salvar", - // "cookies.consent.content-notice.title": "Cookie Consent", - "cookies.consent.content-notice.title": "Consentimento de Cookies", - // "cookies.consent.content-notice.description": "We collect and process your personal information for the following purposes: Authentication, Preferences, Acknowledgement and Statistics.
To learn more, please read our {privacyPolicy}.", "cookies.consent.content-notice.description": "Coletamos e processamos suas informações pessoais para os seguintes propósitos: Autenticação, Preferências, Reconhecimento e Estatísticas.
Para aprender mais, por favor leia nossa {privacyPolicy}.", - // "cookies.consent.content-notice.description.no-privacy": "We collect and process your personal information for the following purposes: Authentication, Preferences, Acknowledgement and Statistics.", - "cookies.consent.content-notice.description.no-privacy": "Coletamos e processamos suas informações pessoais para os seguintes propósitos: Autenticação, Preferências, Reconhecimento e Estatísticas.", - // "cookies.consent.content-notice.learnMore": "Customize", "cookies.consent.content-notice.learnMore": "Customizar", @@ -2414,12 +2402,6 @@ // "cookies.consent.content-modal.title": "Information that we collect", "cookies.consent.content-modal.title": "Informações que coletamos", - // "cookies.consent.content-modal.services": "services", - "cookies.consent.content-modal.services": "Serviços", - - // "cookies.consent.content-modal.service": "service", - "cookies.consent.content-modal.service": "serviço", - // "cookies.consent.app.title.authentication": "Authentication", "cookies.consent.app.title.authentication": "Autenticação", diff --git a/src/assets/i18n/pt-PT.json5 b/src/assets/i18n/pt-PT.json5 index 414b70448d1..749bbda578f 100644 --- a/src/assets/i18n/pt-PT.json5 +++ b/src/assets/i18n/pt-PT.json5 @@ -2412,12 +2412,6 @@ // "cookies.consent.app.required.title": "(always required)", "cookies.consent.app.required.title": "(sempre necessária)", - // "cookies.consent.app.disable-all.description": "Use this switch to enable or disable all services.", - "cookies.consent.app.disable-all.description": "Utilize este interruptor para ativar ou desativar todos os serviços.", - - // "cookies.consent.app.disable-all.title": "Enable or disable all services", - "cookies.consent.app.disable-all.title": "Ativar ou desativar todos os serviços", - // "cookies.consent.update": "There were changes since your last visit, please update your consent.", "cookies.consent.update": "Existem alterações desde a sua última visita, atualize o seu consentimento.", @@ -2433,15 +2427,9 @@ // "cookies.consent.save": "Save", "cookies.consent.save": "Guardar", - // "cookies.consent.content-notice.title": "Cookie Consent", - "cookies.consent.content-notice.title": "Consentir cookies", - // "cookies.consent.content-notice.description": "We collect and process your personal information for the following purposes: Authentication, Preferences, Acknowledgement and Statistics.
To learn more, please read our {privacyPolicy}.", "cookies.consent.content-notice.description": "Recolhemos e processamos informação pessoal para os seguintes propósitos: Autenticação, Guardar Preferências, Termos de Uso e Estatísticas.
Para saber mais, por favor leia a nossa {privacyPolicy}.", - // "cookies.consent.content-notice.description.no-privacy": "We collect and process your personal information for the following purposes: Authentication, Preferences, Acknowledgement and Statistics.", - "cookies.consent.content-notice.description.no-privacy": "Recolhemos e processamos as suas informações pessoais para os seguintes fins: Autenticação, Preferências, Reconhecimento e Estatísticas.", - // "cookies.consent.content-notice.learnMore": "Customize", "cookies.consent.content-notice.learnMore": "Pesonalizar", @@ -2457,12 +2445,6 @@ // "cookies.consent.content-modal.title": "Information that we collect", "cookies.consent.content-modal.title": "Informação que recolhemos", - // "cookies.consent.content-modal.services": "services", - "cookies.consent.content-modal.services": "serviços", - - // "cookies.consent.content-modal.service": "service", - "cookies.consent.content-modal.service": "serviço", - // "cookies.consent.app.title.authentication": "Authentication", "cookies.consent.app.title.authentication": "Autenticação", diff --git a/src/assets/i18n/sr-cyr.json5 b/src/assets/i18n/sr-cyr.json5 index 548343ed610..c114fa83de8 100644 --- a/src/assets/i18n/sr-cyr.json5 +++ b/src/assets/i18n/sr-cyr.json5 @@ -658,23 +658,17 @@ "cookies.consent.app.purpose": "Сврха", "cookies.consent.app.required.description": "Ова апликација је увек потребна", "cookies.consent.app.required.title": "(увек потребно)", - "cookies.consent.app.disable-all.description": "Користите овај прекидач да омогућите или онемогућите све услуге.", - "cookies.consent.app.disable-all.title": "Омогућите или онемогућите све услуге", "cookies.consent.update": "Било је промена од ваше последње посете, ажурирајте своју сагласност.", "cookies.consent.close": "Затворити", "cookies.consent.decline": "Одбити", "cookies.consent.ok": "То је у реду", "cookies.consent.save": "сачувати", - "cookies.consent.content-notice.title": "Сагласност за колачиће", "cookies.consent.content-notice.description": "Прикупљамо и обрађујемо ваше личне податке у следеће сврхе: Провера аутентичности, подешавања, потврда и статистика.
Да бисте сазнали више, прочитајте нашу {privacyPolicy}.", - "cookies.consent.content-notice.description.no-privacy": "Прикупљамо и обрађујемо ваше личне податке у следеће сврхе: Провера аутентичности, подешавања, потврда и статистика.", "cookies.consent.content-notice.learnMore": "Прилагодити", "cookies.consent.content-modal.description": "Овде можете видети и прилагодити информације које прикупљамо о вама.", "cookies.consent.content-modal.privacy-policy.name": "Правила о приватности", "cookies.consent.content-modal.privacy-policy.text": "Да сазнате више, прочитајте нашу {privacyPolicy}.", "cookies.consent.content-modal.title": "Информације које прикупљамо", - "cookies.consent.content-modal.services": "Услуге", - "cookies.consent.content-modal.service": "Услуга", "cookies.consent.app.title.authentication": "Провера", "cookies.consent.app.description.authentication": "Потребно за пријављивање", "cookies.consent.app.title.preferences": "Подешавања", diff --git a/src/assets/i18n/sr-lat.json5 b/src/assets/i18n/sr-lat.json5 index 38faa7aa189..a605acfdb11 100644 --- a/src/assets/i18n/sr-lat.json5 +++ b/src/assets/i18n/sr-lat.json5 @@ -658,23 +658,17 @@ "cookies.consent.app.purpose": "Svrha", "cookies.consent.app.required.description": "Ova aplikacija je uvek potrebna", "cookies.consent.app.required.title": "(uvek potrebno)", - "cookies.consent.app.disable-all.description": "Koristite ovaj prekidač da omogućite ili onemogućite sve usluge.", - "cookies.consent.app.disable-all.title": "Omogućite ili onemogućite sve usluge", "cookies.consent.update": "Bilo je promena od vaše poslednje posete, ažurirajte svoju saglasnost.", "cookies.consent.close": "Zatvoriti", "cookies.consent.decline": "Odbiti", "cookies.consent.ok": "To je u redu", "cookies.consent.save": "sačuvati", - "cookies.consent.content-notice.title": "Saglasnost za kolačiće", "cookies.consent.content-notice.description": "Prikupljamo i obrađujemo vaše lične podatke u sledeće svrhe: Provera autentičnosti, podešavanja, potvrda i statistika.
Da biste saznali više, pročitajte našu {privacyPolicy}.", - "cookies.consent.content-notice.description.no-privacy": "Prikupljamo i obrađujemo vaše lične podatke u sledeće svrhe: Provera autentičnosti, podešavanja, potvrda i statistika.", "cookies.consent.content-notice.learnMore": "Prilagoditi", "cookies.consent.content-modal.description": "Ovde možete videti i prilagoditi informacije koje prikupljamo o vama.", "cookies.consent.content-modal.privacy-policy.name": "Pravila o privatnosti", "cookies.consent.content-modal.privacy-policy.text": "Da saznate više, pročitajte našu {privacyPolicy}.", "cookies.consent.content-modal.title": "Informacije koje prikupljamo", - "cookies.consent.content-modal.services": "Usluge", - "cookies.consent.content-modal.service": "Usluga", "cookies.consent.app.title.authentication": "Provera", "cookies.consent.app.description.authentication": "Potrebno za prijavljivanje", "cookies.consent.app.title.preferences": "Podešavanja", diff --git a/src/assets/i18n/vi.json5 b/src/assets/i18n/vi.json5 index 4ebe2c05d14..01a71c3b973 100644 --- a/src/assets/i18n/vi.json5 +++ b/src/assets/i18n/vi.json5 @@ -638,8 +638,6 @@ "cookies.consent.app.description.google-analytics": "Cho phép chúng tôi theo dõi dữ liệu thống kê", "cookies.consent.app.description.google-recaptcha": "Chúng tôi sử dụng dịch vụ google reCAPTCHA trong quá trình đăng ký và khôi phục mật khẩu", "cookies.consent.app.description.preferences": "Bắt buộc để lưu tùy chọn của bạn", - "cookies.consent.app.disable-all.description": "Sử dụng nút chuyển này để bật hoặc tắt tất cả dịch vụ.", - "cookies.consent.app.disable-all.title": "Bật hoặc tắt tất cả dịch vụ", "cookies.consent.app.opt-out.description": "Ứng dụng này đã được tải theo mặc định (nhưng bạn có thể chọn không tham gia)", "cookies.consent.app.purpose": "mục đích", "cookies.consent.app.required.description": "Ứng dụng này luôn được yêu cầu", @@ -652,13 +650,9 @@ "cookies.consent.content-modal.description": "Tại đây bạn có thể xem và tùy chỉnh thông tin mà chúng tôi thu thập được về bạn.", "cookies.consent.content-modal.privacy-policy.name": "chính sách bảo mật", "cookies.consent.content-modal.privacy-policy.text": "Để biết thêm vui lòng đọc {privacyPolicy} của chúng tôi.", - "cookies.consent.content-modal.service": "dịch vụ", - "cookies.consent.content-modal.services": "các dịch vụ", "cookies.consent.content-modal.title": "Thông tin mà chúng tôi thu thập", "cookies.consent.content-notice.description": "Chúng tôi thu thập và xử lý thông tin các nhân của bạn cho các mục đích sau: Xác thực các ưa thích xác nhận và thống kê.
Để biết thêm vui lòng đọc {privacyPolicy} của chúng tôi.", - "cookies.consent.content-notice.description.no-privacy": "Chúng tôi thu thập và xử lý thông tin cá nhân của bạn cho các mục đích sau: Xác thực Cài đặt cá nhân Xác nhận và Thống kê.", "cookies.consent.content-notice.learnMore": "Tùy chỉnh", - "cookies.consent.content-notice.title": "Đồng ý sử dụng cookie", "cookies.consent.decline": "Từ chối", "cookies.consent.ok": "OK", "cookies.consent.purpose.functional": "Chức năng", @@ -2541,4 +2535,4 @@ "system-wide-alert.form.create.error": "Đã xảy ra lỗi trong quá trình tạo cảnh báo toàn hệ thống", "admin.system-wide-alert.breadcrumbs": "Cảnh báo toàn hệ thống", "admin.system-wide-alert.title": "Cảnh báo toàn hệ thống", -} \ No newline at end of file +} diff --git a/src/modules/app/browser-app.config.ts b/src/modules/app/browser-app.config.ts index 6121cfc219d..213b9de2f7e 100644 --- a/src/modules/app/browser-app.config.ts +++ b/src/modules/app/browser-app.config.ts @@ -53,8 +53,8 @@ import { ClientMathService } from '../../app/core/shared/client-math.service'; import { MathService } from '../../app/core/shared/math.service'; import { BrowserXSRFService } from '../../app/core/xsrf/browser-xsrf.service'; import { XSRFService } from '../../app/core/xsrf/xsrf.service'; -import { BrowserKlaroService } from '../../app/shared/cookies/browser-klaro.service'; -import { KlaroService } from '../../app/shared/cookies/klaro.service'; +import { BrowserOrejimeService } from '../../app/shared/cookies/browser-orejime.service'; +import { OrejimeService } from '../../app/shared/cookies/orejime.service'; import { MissingTranslationHelper } from '../../app/shared/translate/missing-translation.helper'; import { GoogleAnalyticsService } from '../../app/statistics/google-analytics.service'; import { SubmissionService } from '../../app/submission/submission.service'; @@ -118,8 +118,8 @@ export const browserAppConfig: ApplicationConfig = mergeApplicationConfig({ useClass: ClientCookieService, }, { - provide: KlaroService, - useClass: BrowserKlaroService, + provide: OrejimeService, + useClass: BrowserOrejimeService, }, { provide: SubmissionService, diff --git a/src/modules/app/browser-init.service.ts b/src/modules/app/browser-init.service.ts index 014a8f5daad..f07671afbee 100644 --- a/src/modules/app/browser-init.service.ts +++ b/src/modules/app/browser-init.service.ts @@ -37,7 +37,7 @@ import { LocaleService } from '../../app/core/locale/locale.service'; import { HeadTagService } from '../../app/core/metadata/head-tag.service'; import { CorrelationIdService } from '../../app/correlation-id/correlation-id.service'; import { InitService } from '../../app/init.service'; -import { KlaroService } from '../../app/shared/cookies/klaro.service'; +import { OrejimeService } from '../../app/shared/cookies/orejime.service'; import { isNotEmpty } from '../../app/shared/empty.util'; import { MenuService } from '../../app/shared/menu/menu.service'; import { ThemeService } from '../../app/shared/theme-support/theme.service'; @@ -75,7 +75,7 @@ export class BrowserInitService extends InitService { protected googleAnalyticsService: GoogleAnalyticsService, protected headTagService: HeadTagService, protected breadcrumbsService: BreadcrumbsService, - protected klaroService: KlaroService, + protected orejimeService: OrejimeService, protected authService: AuthService, protected themeService: ThemeService, protected menuService: MenuService, @@ -123,7 +123,7 @@ export class BrowserInitService extends InitService { this.themeService.listenForThemeChanges(true); this.trackAuthTokenExpiration(); - this.initKlaro(); + this.initOrejime(); await lastValueFrom(this.authenticationReady$()); @@ -155,12 +155,12 @@ export class BrowserInitService extends InitService { } /** - * Initialize Klaro (once authentication is resolved) + * Initialize Orejime (once authentication is resolved) * @protected */ - protected initKlaro() { + protected initOrejime() { this.authenticationReady$().subscribe(() => { - this.klaroService.initialize(); + this.orejimeService.initialize(); }); } diff --git a/src/styles/_custom_variables.scss b/src/styles/_custom_variables.scss index f261f0f400a..2117a6144dc 100644 --- a/src/styles/_custom_variables.scss +++ b/src/styles/_custom_variables.scss @@ -146,7 +146,7 @@ --ds-process-overview-table-user-column-width: 200px; --ds-process-overview-table-info-column-width: 250px; --ds-process-overview-table-actions-column-width: 80px; - - --green1: #1FB300; // This variable represents the success color for the Klaro cookie banner - --button-text-color-cookie: #333; // This variable represents the text color for buttons in the Klaro cookie banner + + --green1: #1FB300; // This variable represents the success color for the Orejime cookie banner + --button-text-color-cookie: #fff; // This variable represents the text color for buttons in the Orejime cookie banner } diff --git a/src/styles/_global-styles.scss b/src/styles/_global-styles.scss index 765b50ae866..cad91b24e99 100644 --- a/src/styles/_global-styles.scss +++ b/src/styles/_global-styles.scss @@ -37,23 +37,27 @@ body { z-index: 0; } -.klaro -.cookie-notice { - .cn-buttons { - .cm-btn.cm-btn-success { - color: var(--button-text-color-cookie); - background-color: var(--green1); - } - .cm-btn.cm-btn-success.cm-btn-accept-all { - color: var(--button-text-color-cookie); - background-color: var(--green1); - } +.orejime-AppContainer .orejime-Notice-actionItem { + &.orejime-Notice-actionItem--save > button { + color: var(--button-text-color-cookie); + background-color: var(--green1); } } -.klaro .cookie-modal a, .klaro .context-notice a, .klaro .cookie-notice a -{ - color: var(--green1); +.orejime-ModalPortal { + .orejime-Button.orejime-AppToggles-enableAll, + .orejime-Modal-saveButton { + color: var(--button-text-color-cookie); + background-color: var(--green1); + } + + .orejime-Modal-closeButton svg { + cursor: pointer; + } + + a { + color: var(--green1); + } } .media-viewer diff --git a/src/styles/_vendor.scss b/src/styles/_vendor.scss index b2b94c28269..ef630cf0987 100644 --- a/src/styles/_vendor.scss +++ b/src/styles/_vendor.scss @@ -3,3 +3,4 @@ @import '~node_modules/bootstrap/scss/bootstrap.scss'; @import '~node_modules/nouislider/dist/nouislider.min'; @import '~node_modules/ngx-ui-switch/ui-switch.component.scss'; +@import '~node_modules/orejime/dist/orejime.scss'; diff --git a/yarn.lock b/yarn.lock index 251232378c6..ce6d57682ae 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5920,6 +5920,11 @@ executable@^4.1.1: dependencies: pify "^2.2.0" +exenv@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/exenv/-/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d" + integrity sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw== + exponential-backoff@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" @@ -7787,11 +7792,6 @@ kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== -klaro@^0.7.18: - version "0.7.18" - resolved "https://registry.yarnpkg.com/klaro/-/klaro-0.7.18.tgz#fef3a05fcd656451b941e11459f37d6c336e84c0" - integrity sha512-Q5nehkGeZuFerisW4oeeB1ax6dHDszWckR70EcxKvhFiJQ61CM0WBSo20yLbdvz8N9MFsOFu4RNCO9JsbkCxgQ== - kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" @@ -8909,6 +8909,14 @@ ora@5.4.1, ora@^5.4.1: strip-ansi "^6.0.0" wcwidth "^1.0.1" +orejime@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/orejime/-/orejime-2.3.0.tgz#1fc6f570c9bcb11538cc5d270997a526d8135af0" + integrity sha512-eDUgd5yEF5pCIUHPNXVDKmgH+4k4GEwxU7eexBFeVESba3ZYDHSDq4ULXiF2LnZwxg+H6Qi28o8rGfGxNeOriA== + dependencies: + "@babel/runtime" "^7.1.2" + react-modal "^3.13.1" + os-tmpdir@^1.0.2, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -9902,6 +9910,21 @@ react-is@^18.0.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== +react-lifecycles-compat@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== + +react-modal@^3.13.1: + version "3.16.1" + resolved "https://registry.yarnpkg.com/react-modal/-/react-modal-3.16.1.tgz#34018528fc206561b1a5467fc3beeaddafb39b2b" + integrity sha512-VStHgI3BVcGo7OXczvnJN7yT2TWHJPDXZWyI/a0ssFNhGZWsPmB8cF0z33ewDXq4VfYMO1vXgiv/g8Nj9NDyWg== + dependencies: + exenv "^1.2.0" + prop-types "^15.7.2" + react-lifecycles-compat "^3.0.0" + warning "^4.0.3" + react-mosaic-component@^4.0.1: version "4.1.1" resolved "https://registry.yarnpkg.com/react-mosaic-component/-/react-mosaic-component-4.1.1.tgz#48a34e5e5c16654075212666c2aebeb488bab9f2" @@ -11056,16 +11079,7 @@ streamroller@^3.1.5: debug "^4.3.4" fs-extra "^8.1.0" -"string-width-cjs@npm:string-width@^4.2.0": - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -11124,7 +11138,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -11145,13 +11159,6 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - strip-ansi@^7.0.1: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -11857,6 +11864,13 @@ void-elements@^2.0.0: resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" integrity sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung== +warning@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== + dependencies: + loose-envify "^1.0.0" + watchpack@2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" @@ -12197,7 +12211,7 @@ wildcard@^2.0.0: resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -12215,15 +12229,6 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From a9da80caaef3bf4e8c64aa56c61451e18f850575 Mon Sep 17 00:00:00 2001 From: Andrea Barbasso <´andrea.barbasso@4science.com´> Date: Mon, 16 Sep 2024 10:23:26 +0200 Subject: [PATCH 2/9] [CST-15593] run npm i for orejime --- package-lock.json | 261 ++++++++++++++++++++++++++++++---------------- 1 file changed, 169 insertions(+), 92 deletions(-) diff --git a/package-lock.json b/package-lock.json index f3d68567452..cebdf17570c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -58,7 +58,6 @@ "json5": "^2.2.3", "jsonschema": "1.4.1", "jwt-decode": "^3.1.2", - "klaro": "^0.7.18", "lodash": "^4.17.21", "lru-cache": "^7.14.1", "markdown-it": "^13.0.1", @@ -73,6 +72,7 @@ "ngx-pagination": "6.0.3", "ngx-ui-switch": "^14.1.0", "nouislider": "^15.7.1", + "orejime": "^2.3.0", "pem": "1.14.7", "reflect-metadata": "^0.1.13", "rxjs": "^7.8.0", @@ -1855,39 +1855,6 @@ "semver": "bin/semver.js" } }, - "node_modules/@babel/eslint-parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.7.tgz", - "integrity": "sha512-SO5E3bVxDuxyNxM5agFv480YA2HO6ohZbGxbazZdIk3KQOPOGVNw6q78I9/lbviIf95eq6tPozeYnJLbjnC8IA==", - "dependencies": { - "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || >=14.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" - } - }, - "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "engines": { - "node": ">=10" - } - }, - "node_modules/@babel/eslint-parser/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/generator": { "version": "7.23.6", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", @@ -4614,6 +4581,7 @@ "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, "dependencies": { "eslint-visitor-keys": "^3.3.0" }, @@ -4628,6 +4596,7 @@ "version": "4.11.0", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", + "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -4636,6 +4605,7 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -4658,6 +4628,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -4673,6 +4644,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4682,6 +4654,7 @@ "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, "dependencies": { "type-fest": "^0.20.2" }, @@ -4695,12 +4668,14 @@ "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -4712,6 +4687,7 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, "engines": { "node": ">=10" }, @@ -4723,6 +4699,7 @@ "version": "8.57.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -4748,6 +4725,7 @@ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "deprecated": "Use @eslint/config-array instead", + "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^2.0.2", "debug": "^4.3.1", @@ -4761,6 +4739,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4770,6 +4749,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -4781,6 +4761,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, "engines": { "node": ">=12.22" }, @@ -4793,7 +4774,8 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", - "deprecated": "Use @eslint/object-schema instead" + "deprecated": "Use @eslint/object-schema instead", + "dev": true }, "node_modules/@iiif/vocabulary": { "version": "1.0.26", @@ -5389,34 +5371,6 @@ "@angular/core": "^14.0.0" } }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { - "version": "5.1.1-v1", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", - "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", - "dependencies": { - "eslint-scope": "5.1.1" - } - }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -7354,7 +7308,8 @@ "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true }, "node_modules/@vitejs/plugin-basic-ssl": { "version": "1.1.0", @@ -7654,6 +7609,7 @@ "version": "8.12.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -7685,6 +7641,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -8955,6 +8912,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, "engines": { "node": ">=6" } @@ -9273,6 +9231,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -9286,6 +9245,7 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, "dependencies": { "isobject": "^3.0.1" }, @@ -9889,6 +9849,7 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -10422,7 +10383,8 @@ "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true }, "node_modules/deepmerge": { "version": "4.3.1", @@ -10672,6 +10634,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, "dependencies": { "esutils": "^2.0.2" }, @@ -11360,6 +11323,7 @@ "version": "8.57.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -11907,6 +11871,7 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -11918,6 +11883,7 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -11933,6 +11899,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -11947,6 +11914,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -11956,6 +11924,7 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -11971,6 +11940,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -11981,12 +11951,14 @@ "node_modules/eslint/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true }, "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, "engines": { "node": ">=10" }, @@ -11998,6 +11970,7 @@ "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -12013,6 +11986,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -12028,6 +12002,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -12039,6 +12014,7 @@ "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, "dependencies": { "type-fest": "^0.20.2" }, @@ -12053,6 +12029,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -12060,12 +12037,14 @@ "node_modules/eslint/node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "node_modules/eslint/node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -12080,6 +12059,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -12091,6 +12071,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -12105,6 +12086,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -12116,6 +12098,7 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, "engines": { "node": ">=10" }, @@ -12127,6 +12110,7 @@ "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -12156,6 +12140,7 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, "dependencies": { "estraverse": "^5.1.0" }, @@ -12167,6 +12152,7 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, "dependencies": { "estraverse": "^5.2.0" }, @@ -12178,6 +12164,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, "engines": { "node": ">=4.0" } @@ -12186,6 +12173,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -12253,6 +12241,11 @@ "node": ">=4" } }, + "node_modules/exenv": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", + "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==" + }, "node_modules/exponential-backoff": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", @@ -12634,7 +12627,8 @@ "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, "node_modules/fast-glob": { "version": "3.3.2", @@ -12659,12 +12653,14 @@ "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true }, "node_modules/fast-printf": { "version": "1.6.9", @@ -12734,6 +12730,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, "dependencies": { "flat-cache": "^3.0.4" }, @@ -12866,6 +12863,7 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, "bin": { "flat": "cli.js" } @@ -12874,6 +12872,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -12886,7 +12885,8 @@ "node_modules/flatted": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==" + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true }, "node_modules/follow-redirects": { "version": "1.15.6", @@ -13033,7 +13033,8 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true }, "node_modules/fscreen": { "version": "1.2.0", @@ -13186,6 +13187,7 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -13222,6 +13224,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -13231,6 +13234,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -13326,7 +13330,8 @@ "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true }, "node_modules/gzip-size": { "version": "6.0.0", @@ -13752,6 +13757,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", + "dev": true, "engines": { "node": ">= 4" } @@ -13805,6 +13811,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -13820,6 +13827,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, "engines": { "node": ">=4" } @@ -13859,6 +13867,7 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, "engines": { "node": ">=0.8.19" } @@ -13883,6 +13892,7 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -14258,6 +14268,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, "engines": { "node": ">=8" } @@ -14452,6 +14463,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -14979,7 +14991,8 @@ "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true }, "node_modules/json-parse-even-better-errors": { "version": "3.0.2", @@ -15005,7 +15018,8 @@ "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true }, "node_modules/json-stringify-safe": { "version": "5.0.1", @@ -15598,6 +15612,7 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, "dependencies": { "json-buffer": "3.0.1" } @@ -15606,20 +15621,11 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/klaro": { - "version": "0.7.21", - "resolved": "https://registry.npmjs.org/klaro/-/klaro-0.7.21.tgz", - "integrity": "sha512-PbF23xYGPObhg2GL0yqskPqRTziv3RTwVi9QZiBEB/BVulS/e1fFprgRiW6f4utPjb61q/16fWgPwHuuXJZYRA==", - "dependencies": { - "@babel/eslint-parser": "^7.23.10", - "sass": "^1.25.0", - "webpack-merge": "^5.10.0" - } - }, "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -15764,6 +15770,7 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -15948,7 +15955,8 @@ "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true }, "node_modules/lodash.once": { "version": "4.1.1", @@ -16874,7 +16882,8 @@ "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true }, "node_modules/needle": { "version": "3.3.1", @@ -17799,6 +17808,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, "dependencies": { "wrappy": "1" } @@ -17874,6 +17884,7 @@ "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -17979,6 +17990,19 @@ "node": ">=8" } }, + "node_modules/orejime": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/orejime/-/orejime-2.3.0.tgz", + "integrity": "sha512-eDUgd5yEF5pCIUHPNXVDKmgH+4k4GEwxU7eexBFeVESba3ZYDHSDq4ULXiF2LnZwxg+H6Qi28o8rGfGxNeOriA==", + "dependencies": { + "@babel/runtime": "^7.1.2", + "react-modal": "^3.13.1" + }, + "peerDependencies": { + "react": "^0.14.0 || ^15.0.0 || ^16", + "react-dom": "^0.14.0 || ^15.0.0 || ^16" + } + }, "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -18005,6 +18029,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -18291,6 +18316,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, "dependencies": { "callsites": "^3.0.0" }, @@ -18392,6 +18418,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, "engines": { "node": ">=8" } @@ -18400,6 +18427,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -18408,6 +18436,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, "engines": { "node": ">=8" } @@ -19492,6 +19521,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, "engines": { "node": ">= 0.8.0" } @@ -19971,6 +20001,29 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "node_modules/react-modal": { + "version": "3.16.1", + "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.16.1.tgz", + "integrity": "sha512-VStHgI3BVcGo7OXczvnJN7yT2TWHJPDXZWyI/a0ssFNhGZWsPmB8cF0z33ewDXq4VfYMO1vXgiv/g8Nj9NDyWg==", + "dependencies": { + "exenv": "^1.2.0", + "prop-types": "^15.7.2", + "react-lifecycles-compat": "^3.0.0", + "warning": "^4.0.3" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18", + "react-dom": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18" + } + }, "node_modules/react-mosaic-component": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/react-mosaic-component/-/react-mosaic-component-4.1.1.tgz", @@ -20564,6 +20617,7 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -20861,6 +20915,7 @@ "version": "1.62.1", "resolved": "https://registry.npmjs.org/sass/-/sass-1.62.1.tgz", "integrity": "sha512-NHpxIzN29MXvWiuswfc1W3I0N8SXBd8UR26WntmDlRYf0bSADnwnOjsyMZ3lMezSlArD33Vs3YFhp7dWvL770A==", + "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -21010,7 +21065,8 @@ "node_modules/sass/node_modules/immutable": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz", - "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==" + "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==", + "dev": true }, "node_modules/sax": { "version": "1.4.1", @@ -21355,6 +21411,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, "dependencies": { "kind-of": "^6.0.2" }, @@ -21371,6 +21428,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -21382,6 +21440,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, "engines": { "node": ">=8" } @@ -22078,6 +22137,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, "engines": { "node": ">=8" }, @@ -22343,7 +22403,8 @@ "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true }, "node_modules/throttle-debounce": { "version": "2.3.0", @@ -22624,6 +22685,7 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, "dependencies": { "prelude-ls": "^1.2.1" }, @@ -22946,6 +23008,7 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -22954,6 +23017,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, "engines": { "node": ">=6" } @@ -23515,6 +23579,14 @@ "node": ">=0.10.0" } }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", @@ -23881,6 +23953,7 @@ "version": "5.10.0", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, "dependencies": { "clone-deep": "^4.0.1", "flat": "^5.0.2", @@ -24114,12 +24187,14 @@ "node_modules/wildcard": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==" + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -24225,7 +24300,8 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true }, "node_modules/ws": { "version": "8.17.1", @@ -24335,6 +24411,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, "engines": { "node": ">=10" }, From 58c5d742b7e7a00605de8982ea2b2b95ad3ff1b7 Mon Sep 17 00:00:00 2001 From: Andrea Barbasso <´andrea.barbasso@4science.com´> Date: Mon, 16 Sep 2024 11:44:08 +0200 Subject: [PATCH 3/9] [CST-15593] fix orejime startup error this was happening because of hidden apps not being removed from category arrays. --- src/app/shared/cookies/browser-orejime.service.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/app/shared/cookies/browser-orejime.service.ts b/src/app/shared/cookies/browser-orejime.service.ts index e23b19c58be..aa9d56d9eea 100644 --- a/src/app/shared/cookies/browser-orejime.service.ts +++ b/src/app/shared/cookies/browser-orejime.service.ts @@ -382,9 +382,13 @@ export class BrowserOrejimeService extends OrejimeService { } /** - * remove the Google Analytics from the apps + * remove apps that should be hidden from the configuration */ private filterConfigApps(appsToHide: string[]) { + this.orejimeConfig.categories.forEach((category) => { + category.apps = category.apps.filter(service => !appsToHide.some(name => name === service)); + }); + this.orejimeConfig.categories = this.orejimeConfig.categories.filter(category => category.apps.length > 0); return this.orejimeConfig.apps.filter(service => !appsToHide.some(name => name === service.name)); } From 80e1daeb659cfe7461845d4680bed747994e720a Mon Sep 17 00:00:00 2001 From: Andrea Barbasso <´andrea.barbasso@4science.com´> Date: Mon, 16 Sep 2024 14:22:13 +0200 Subject: [PATCH 4/9] [CST-15593] allow orejime to start if privacy statement is disabled --- src/app/shared/cookies/browser-orejime.service.ts | 3 +++ src/assets/i18n/en.json5 | 2 ++ 2 files changed, 5 insertions(+) diff --git a/src/app/shared/cookies/browser-orejime.service.ts b/src/app/shared/cookies/browser-orejime.service.ts index aa9d56d9eea..4a7a182e0a6 100644 --- a/src/app/shared/cookies/browser-orejime.service.ts +++ b/src/app/shared/cookies/browser-orejime.service.ts @@ -117,6 +117,9 @@ export class BrowserOrejimeService extends OrejimeService { * - Add and translate orejime configuration messages */ initialize() { + if (!environment.info.enablePrivacyStatement) { + this.orejimeConfig.translations.zz.consentModal.privacyPolicy.text = 'cookies.consent.content-modal.no-privacy-policy.text'; + } const hideGoogleAnalytics$ = this.configService.findByPropertyName(this.GOOGLE_ANALYTICS_KEY).pipe( getFirstCompletedRemoteData(), diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 5d06f4c19be..8ced30954b9 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -1604,6 +1604,8 @@ "cookies.consent.content-modal.privacy-policy.text": "To learn more, please read our {privacyPolicy}.", + "cookies.consent.content-modal.no-privacy-policy.text": "", + "cookies.consent.content-modal.title": "Information that we collect", "cookies.consent.app.title.authentication": "Authentication", From e2dc89c737abbea43ed195f7f7d31b3844c077ff Mon Sep 17 00:00:00 2001 From: Andrea Barbasso <´andrea.barbasso@4science.com´> Date: Fri, 20 Sep 2024 10:26:46 +0200 Subject: [PATCH 5/9] [CST-15595] fix tests --- src/app/shared/cookies/browser-orejime.service.spec.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/shared/cookies/browser-orejime.service.spec.ts b/src/app/shared/cookies/browser-orejime.service.spec.ts index d0fe608c3f9..a2818052385 100644 --- a/src/app/shared/cookies/browser-orejime.service.spec.ts +++ b/src/app/shared/cookies/browser-orejime.service.spec.ts @@ -126,6 +126,7 @@ describe('BrowserOrejimeService', () => { }; service.orejimeConfig = mockConfig; + service.createCategories(); }); it('should be created', () => { From 0ab4d903d958c1564e73c2ff1ab5a766b3648ea7 Mon Sep 17 00:00:00 2001 From: Andrea Barbasso <´andrea.barbasso@4science.com´> Date: Thu, 31 Oct 2024 10:44:27 +0100 Subject: [PATCH 6/9] [CST-15593] fix orejime cookie name, a11y issues and package-lock --- cypress/support/e2e.ts | 4 ++-- package-lock.json | 19 ++++++++++++++++++- .../google-recaptcha.service.ts | 2 +- .../register-email-form.component.ts | 2 +- .../shared/cookies/orejime-configuration.ts | 2 +- src/styles/_custom_variables.scss | 2 +- src/styles/_global-styles.scss | 2 +- 7 files changed, 25 insertions(+), 8 deletions(-) diff --git a/cypress/support/e2e.ts b/cypress/support/e2e.ts index c1b6bc6d3fd..3c9f4e7b56f 100644 --- a/cypress/support/e2e.ts +++ b/cypress/support/e2e.ts @@ -54,9 +54,9 @@ before(() => { // Runs once before the first test in each "block" beforeEach(() => { - // Pre-agree to all Orejime cookies by setting the orejime-anonymous cookie + // Pre-agree to all Orejime cookies by setting the orejime cookie // This just ensures it doesn't get in the way of matching other objects in the page. - cy.setCookie('orejime-anonymous', '{%22authentication%22:true%2C%22preferences%22:true%2C%22acknowledgement%22:true%2C%22google-analytics%22:true%2C%22google-recaptcha%22:true}'); + cy.setCookie('orejime', '{%22authentication%22:true%2C%22preferences%22:true%2C%22acknowledgement%22:true%2C%22google-analytics%22:true%2C%22google-recaptcha%22:true}'); // Remove any CSRF cookies saved from prior tests cy.clearCookie(DSPACE_XSRF_COOKIE); diff --git a/package-lock.json b/package-lock.json index 43798601f99..4cbcfca9169 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5975,6 +5975,7 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.1.tgz", "integrity": "sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==", + "dev": true, "dependencies": { "detect-libc": "^1.0.3", "is-glob": "^4.0.3", @@ -6010,6 +6011,7 @@ "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "android" @@ -6029,6 +6031,7 @@ "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "darwin" @@ -6048,6 +6051,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "darwin" @@ -6067,6 +6071,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "freebsd" @@ -6086,6 +6091,7 @@ "cpu": [ "arm" ], + "dev": true, "optional": true, "os": [ "linux" @@ -6105,6 +6111,7 @@ "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -6124,6 +6131,7 @@ "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -6143,6 +6151,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -6162,6 +6171,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "linux" @@ -6181,6 +6191,7 @@ "cpu": [ "arm64" ], + "dev": true, "optional": true, "os": [ "win32" @@ -6200,6 +6211,7 @@ "cpu": [ "ia32" ], + "dev": true, "optional": true, "os": [ "win32" @@ -6219,6 +6231,7 @@ "cpu": [ "x64" ], + "dev": true, "optional": true, "os": [ "win32" @@ -6234,7 +6247,8 @@ "node_modules/@parcel/watcher/node_modules/node-addon-api": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==" + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", @@ -10735,6 +10749,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, "bin": { "detect-libc": "bin/detect-libc.js" }, @@ -20599,6 +20614,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==", + "dev": true, "dependencies": { "readdirp": "^4.0.1" }, @@ -20619,6 +20635,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "dev": true, "engines": { "node": ">= 14.16.0" }, diff --git a/src/app/core/google-recaptcha/google-recaptcha.service.ts b/src/app/core/google-recaptcha/google-recaptcha.service.ts index c23223b6785..580bc876f42 100644 --- a/src/app/core/google-recaptcha/google-recaptcha.service.ts +++ b/src/app/core/google-recaptcha/google-recaptcha.service.ts @@ -105,7 +105,7 @@ export class GoogleRecaptchaService { tap(([recaptchaVersionRD, recaptchaModeRD, recaptchaKeyRD]) => { if ( - this.cookieService.get('orejime-anonymous') && this.cookieService.get('orejime-anonymous')[CAPTCHA_NAME] && + this.cookieService.get('orejime') && this.cookieService.get('orejime')[CAPTCHA_NAME] && recaptchaKeyRD.hasSucceeded && recaptchaVersionRD.hasSucceeded && isNotEmpty(recaptchaVersionRD.payload?.values) && isNotEmpty(recaptchaKeyRD.payload?.values) ) { diff --git a/src/app/register-email-form/register-email-form.component.ts b/src/app/register-email-form/register-email-form.component.ts index 90841f30881..e71227f504c 100644 --- a/src/app/register-email-form/register-email-form.component.ts +++ b/src/app/register-email-form/register-email-form.component.ts @@ -247,7 +247,7 @@ export class RegisterEmailFormComponent implements OnDestroy, OnInit { * Return true if the user has accepted the required cookies for reCaptcha */ isRecaptchaCookieAccepted(): boolean { - const orejimeAnonymousCookie = this.cookieService.get('orejime-anonymous'); + const orejimeAnonymousCookie = this.cookieService.get('orejime'); return isNotEmpty(orejimeAnonymousCookie) ? orejimeAnonymousCookie[CAPTCHA_NAME] : false; } diff --git a/src/app/shared/cookies/orejime-configuration.ts b/src/app/shared/cookies/orejime-configuration.ts index fd275f7e77d..e995e04ef5d 100644 --- a/src/app/shared/cookies/orejime-configuration.ts +++ b/src/app/shared/cookies/orejime-configuration.ts @@ -15,7 +15,7 @@ import { NativeWindowRef } from '../../core/services/window.service'; */ export const HAS_AGREED_END_USER = 'dsHasAgreedEndUser'; -export const ANONYMOUS_STORAGE_NAME_OREJIME = 'orejime-anonymous'; +export const ANONYMOUS_STORAGE_NAME_OREJIME = 'orejime'; export const GOOGLE_ANALYTICS_OREJIME_KEY = 'google-analytics'; diff --git a/src/styles/_custom_variables.scss b/src/styles/_custom_variables.scss index 682306c636a..6bddfd58e94 100644 --- a/src/styles/_custom_variables.scss +++ b/src/styles/_custom_variables.scss @@ -148,6 +148,6 @@ --ds-process-overview-table-info-column-width: 250px; --ds-process-overview-table-actions-column-width: 80px; - --green1: #1FB300; // This variable represents the success color for the Orejime cookie banner + --green1: #1c710a; // This variable represents the success color for the Orejime cookie banner --button-text-color-cookie: #fff; // This variable represents the text color for buttons in the Orejime cookie banner } diff --git a/src/styles/_global-styles.scss b/src/styles/_global-styles.scss index 3e0e8c5f828..4934ec3d350 100644 --- a/src/styles/_global-styles.scss +++ b/src/styles/_global-styles.scss @@ -56,7 +56,7 @@ body { } a { - color: var(--green1); + color: var(--bs-white); } } From e516ae86532904223e3dd65c6dc95d63d977c070 Mon Sep 17 00:00:00 2001 From: Andrea Barbasso <´andrea.barbasso@4science.com´> Date: Thu, 31 Oct 2024 11:32:54 +0100 Subject: [PATCH 7/9] [CST-15593] go back to orejime-anonymous cookie --- cypress/support/e2e.ts | 4 ++-- src/app/core/google-recaptcha/google-recaptcha.service.ts | 2 +- src/app/register-email-form/register-email-form.component.ts | 2 +- src/app/shared/cookies/orejime-configuration.ts | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/cypress/support/e2e.ts b/cypress/support/e2e.ts index 3c9f4e7b56f..c1b6bc6d3fd 100644 --- a/cypress/support/e2e.ts +++ b/cypress/support/e2e.ts @@ -54,9 +54,9 @@ before(() => { // Runs once before the first test in each "block" beforeEach(() => { - // Pre-agree to all Orejime cookies by setting the orejime cookie + // Pre-agree to all Orejime cookies by setting the orejime-anonymous cookie // This just ensures it doesn't get in the way of matching other objects in the page. - cy.setCookie('orejime', '{%22authentication%22:true%2C%22preferences%22:true%2C%22acknowledgement%22:true%2C%22google-analytics%22:true%2C%22google-recaptcha%22:true}'); + cy.setCookie('orejime-anonymous', '{%22authentication%22:true%2C%22preferences%22:true%2C%22acknowledgement%22:true%2C%22google-analytics%22:true%2C%22google-recaptcha%22:true}'); // Remove any CSRF cookies saved from prior tests cy.clearCookie(DSPACE_XSRF_COOKIE); diff --git a/src/app/core/google-recaptcha/google-recaptcha.service.ts b/src/app/core/google-recaptcha/google-recaptcha.service.ts index 580bc876f42..c23223b6785 100644 --- a/src/app/core/google-recaptcha/google-recaptcha.service.ts +++ b/src/app/core/google-recaptcha/google-recaptcha.service.ts @@ -105,7 +105,7 @@ export class GoogleRecaptchaService { tap(([recaptchaVersionRD, recaptchaModeRD, recaptchaKeyRD]) => { if ( - this.cookieService.get('orejime') && this.cookieService.get('orejime')[CAPTCHA_NAME] && + this.cookieService.get('orejime-anonymous') && this.cookieService.get('orejime-anonymous')[CAPTCHA_NAME] && recaptchaKeyRD.hasSucceeded && recaptchaVersionRD.hasSucceeded && isNotEmpty(recaptchaVersionRD.payload?.values) && isNotEmpty(recaptchaKeyRD.payload?.values) ) { diff --git a/src/app/register-email-form/register-email-form.component.ts b/src/app/register-email-form/register-email-form.component.ts index e71227f504c..90841f30881 100644 --- a/src/app/register-email-form/register-email-form.component.ts +++ b/src/app/register-email-form/register-email-form.component.ts @@ -247,7 +247,7 @@ export class RegisterEmailFormComponent implements OnDestroy, OnInit { * Return true if the user has accepted the required cookies for reCaptcha */ isRecaptchaCookieAccepted(): boolean { - const orejimeAnonymousCookie = this.cookieService.get('orejime'); + const orejimeAnonymousCookie = this.cookieService.get('orejime-anonymous'); return isNotEmpty(orejimeAnonymousCookie) ? orejimeAnonymousCookie[CAPTCHA_NAME] : false; } diff --git a/src/app/shared/cookies/orejime-configuration.ts b/src/app/shared/cookies/orejime-configuration.ts index e995e04ef5d..aea2bc33384 100644 --- a/src/app/shared/cookies/orejime-configuration.ts +++ b/src/app/shared/cookies/orejime-configuration.ts @@ -15,7 +15,7 @@ import { NativeWindowRef } from '../../core/services/window.service'; */ export const HAS_AGREED_END_USER = 'dsHasAgreedEndUser'; -export const ANONYMOUS_STORAGE_NAME_OREJIME = 'orejime'; +export const ANONYMOUS_STORAGE_NAME_OREJIME = 'orejime-anonymous'; export const GOOGLE_ANALYTICS_OREJIME_KEY = 'google-analytics'; @@ -26,7 +26,7 @@ export const GOOGLE_ANALYTICS_OREJIME_KEY = 'google-analytics'; export function getOrejimeConfiguration(_window: NativeWindowRef): any { return { - storageName: ANONYMOUS_STORAGE_NAME_OREJIME, + cookieName: ANONYMOUS_STORAGE_NAME_OREJIME, privacyPolicy: './info/privacy', From 625771837770a9fa1d5b6441474660ce256e18f2 Mon Sep 17 00:00:00 2001 From: Andrea Barbasso <´andrea.barbasso@4science.com´> Date: Thu, 31 Oct 2024 13:00:21 +0100 Subject: [PATCH 8/9] [CST-15593] improve tests reliability --- cypress/e2e/admin-add-new-modals.cy.ts | 12 ++++++------ cypress/e2e/admin-edit-modals.cy.ts | 6 +++--- cypress/e2e/admin-export-modals.cy.ts | 4 ++-- cypress/e2e/admin-sidebar.cy.ts | 2 +- .../admin-sidebar-section.component.html | 4 +++- .../admin-sidebar-section.component.ts | 3 ++- .../admin/admin-sidebar/admin-sidebar.component.html | 1 + .../admin/admin-sidebar/admin-sidebar.component.ts | 3 ++- .../expandable-admin-sidebar-section.component.html | 2 +- .../expandable-admin-sidebar-section.component.ts | 3 ++- .../collection-item-mapper.component.html | 2 +- .../collection-item-mapper.component.ts | 2 ++ .../item-collection-mapper.component.html | 2 +- .../item-collection-mapper.component.ts | 2 ++ .../admin/admin-sidebar/admin-sidebar.component.ts | 3 ++- 15 files changed, 31 insertions(+), 20 deletions(-) diff --git a/cypress/e2e/admin-add-new-modals.cy.ts b/cypress/e2e/admin-add-new-modals.cy.ts index 565ae154f1e..c783972b757 100644 --- a/cypress/e2e/admin-add-new-modals.cy.ts +++ b/cypress/e2e/admin-add-new-modals.cy.ts @@ -9,10 +9,10 @@ describe('Admin Add New Modals', () => { it('Add new Community modal should pass accessibility tests', () => { // Pin the sidebar open - cy.get('#sidebar-collapse-toggle').click(); + cy.get('[data-test="sidebar-collapse-toggle"]').click(); // Click on entry of menu - cy.get('#admin-menu-section-new-title').click(); + cy.get('[data-test="admin-menu-section-new-title"]').click(); cy.get('a[data-test="menu.section.new_community"]').click(); @@ -22,10 +22,10 @@ describe('Admin Add New Modals', () => { it('Add new Collection modal should pass accessibility tests', () => { // Pin the sidebar open - cy.get('#sidebar-collapse-toggle').click(); + cy.get('[data-test="sidebar-collapse-toggle"]').click(); // Click on entry of menu - cy.get('#admin-menu-section-new-title').click(); + cy.get('[data-test="admin-menu-section-new-title"]').click(); cy.get('a[data-test="menu.section.new_collection"]').click(); @@ -35,10 +35,10 @@ describe('Admin Add New Modals', () => { it('Add new Item modal should pass accessibility tests', () => { // Pin the sidebar open - cy.get('#sidebar-collapse-toggle').click(); + cy.get('[data-test="sidebar-collapse-toggle"]').click(); // Click on entry of menu - cy.get('#admin-menu-section-new-title').click(); + cy.get('[data-test="admin-menu-section-new-title"]').click(); cy.get('a[data-test="menu.section.new_item"]').click(); diff --git a/cypress/e2e/admin-edit-modals.cy.ts b/cypress/e2e/admin-edit-modals.cy.ts index e96d6ce898c..f2f18de8773 100644 --- a/cypress/e2e/admin-edit-modals.cy.ts +++ b/cypress/e2e/admin-edit-modals.cy.ts @@ -9,7 +9,7 @@ describe('Admin Edit Modals', () => { it('Edit Community modal should pass accessibility tests', () => { // Pin the sidebar open - cy.get('#sidebar-collapse-toggle').click(); + cy.get('[data-test="sidebar-collapse-toggle"]').click(); // Click on entry of menu cy.get('#admin-menu-section-edit-title').click(); @@ -22,7 +22,7 @@ describe('Admin Edit Modals', () => { it('Edit Collection modal should pass accessibility tests', () => { // Pin the sidebar open - cy.get('#sidebar-collapse-toggle').click(); + cy.get('[data-test="sidebar-collapse-toggle"]').click(); // Click on entry of menu cy.get('#admin-menu-section-edit-title').click(); @@ -35,7 +35,7 @@ describe('Admin Edit Modals', () => { it('Edit Item modal should pass accessibility tests', () => { // Pin the sidebar open - cy.get('#sidebar-collapse-toggle').click(); + cy.get('[data-test="sidebar-collapse-toggle"]').click(); // Click on entry of menu cy.get('#admin-menu-section-edit-title').click(); diff --git a/cypress/e2e/admin-export-modals.cy.ts b/cypress/e2e/admin-export-modals.cy.ts index 9f69764d197..0efe040fc84 100644 --- a/cypress/e2e/admin-export-modals.cy.ts +++ b/cypress/e2e/admin-export-modals.cy.ts @@ -9,7 +9,7 @@ describe('Admin Export Modals', () => { it('Export metadata modal should pass accessibility tests', () => { // Pin the sidebar open - cy.get('#sidebar-collapse-toggle').click(); + cy.get('[data-test="sidebar-collapse-toggle"]').click(); // Click on entry of menu cy.get('#admin-menu-section-export-title').click(); @@ -22,7 +22,7 @@ describe('Admin Export Modals', () => { it('Export batch modal should pass accessibility tests', () => { // Pin the sidebar open - cy.get('#sidebar-collapse-toggle').click(); + cy.get('[data-test="sidebar-collapse-toggle"]').click(); // Click on entry of menu cy.get('#admin-menu-section-export-title').click(); diff --git a/cypress/e2e/admin-sidebar.cy.ts b/cypress/e2e/admin-sidebar.cy.ts index be1c9d4ef27..318bf2b27e2 100644 --- a/cypress/e2e/admin-sidebar.cy.ts +++ b/cypress/e2e/admin-sidebar.cy.ts @@ -10,7 +10,7 @@ describe('Admin Sidebar', () => { it('should be pinnable and pass accessibility tests', () => { // Pin the sidebar open - cy.get('#sidebar-collapse-toggle').click(); + cy.get('[data-test="sidebar-collapse-toggle"]').click(); // Click on every expandable section to open all menus cy.get('ds-expandable-admin-sidebar-section').click({ multiple: true }); diff --git a/src/app/admin/admin-sidebar/admin-sidebar-section/admin-sidebar-section.component.html b/src/app/admin/admin-sidebar/admin-sidebar-section/admin-sidebar-section.component.html index 24ba17fff47..30a7a3353b9 100644 --- a/src/app/admin/admin-sidebar/admin-sidebar-section/admin-sidebar-section.component.html +++ b/src/app/admin/admin-sidebar/admin-sidebar-section/admin-sidebar-section.component.html @@ -14,7 +14,9 @@
diff --git a/src/app/admin/admin-sidebar/admin-sidebar-section/admin-sidebar-section.component.ts b/src/app/admin/admin-sidebar/admin-sidebar-section/admin-sidebar-section.component.ts index ff9897ce9e8..2910f948a24 100644 --- a/src/app/admin/admin-sidebar/admin-sidebar-section/admin-sidebar-section.component.ts +++ b/src/app/admin/admin-sidebar/admin-sidebar-section/admin-sidebar-section.component.ts @@ -17,6 +17,7 @@ import { MenuID } from '../../../shared/menu/menu-id.model'; import { LinkMenuItemModel } from '../../../shared/menu/menu-item/models/link.model'; import { MenuSection } from '../../../shared/menu/menu-section.model'; import { MenuSectionComponent } from '../../../shared/menu/menu-section/menu-section.component'; +import { BrowserOnlyPipe } from '../../../shared/utils/browser-only.pipe'; /** * Represents a non-expandable section in the admin sidebar @@ -26,7 +27,7 @@ import { MenuSectionComponent } from '../../../shared/menu/menu-section/menu-sec templateUrl: './admin-sidebar-section.component.html', styleUrls: ['./admin-sidebar-section.component.scss'], standalone: true, - imports: [NgClass, RouterLink, TranslateModule], + imports: [NgClass, RouterLink, TranslateModule, BrowserOnlyPipe], }) export class AdminSidebarSectionComponent extends MenuSectionComponent implements OnInit { diff --git a/src/app/admin/admin-sidebar/admin-sidebar.component.html b/src/app/admin/admin-sidebar/admin-sidebar.component.html index f3d5409a642..41376f777e1 100644 --- a/src/app/admin/admin-sidebar/admin-sidebar.component.html +++ b/src/app/admin/admin-sidebar/admin-sidebar.component.html @@ -42,6 +42,7 @@

{{ 'menu.header.admin' | translate }}