richie-education 2.11.0 → 2.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -182,5 +182,9 @@
182
182
  "components.UserLogin.spinnerText": {
183
183
  "description": "Accessibility text for the spinner in the login area.",
184
184
  "message": "Loading login status..."
185
+ },
186
+ "components.useStaticFilters.courses": {
187
+ "description": "localized human_name label for coursesConfig filter name",
188
+ "message": "Courses"
185
189
  }
186
190
  }
@@ -182,5 +182,9 @@
182
182
  "components.UserLogin.spinnerText": {
183
183
  "description": "Accessibility text for the spinner in the login area.",
184
184
  "message": "Cargando estado de inicio de sesión..."
185
+ },
186
+ "components.useStaticFilters.courses": {
187
+ "description": "localized human_name label for coursesConfig filter name",
188
+ "message": "Cursos"
185
189
  }
186
190
  }
@@ -182,5 +182,9 @@
182
182
  "components.UserLogin.spinnerText": {
183
183
  "description": "Accessibility text for the spinner in the login area.",
184
184
  "message": "Vérification de l'état de connexion..."
185
+ },
186
+ "components.useStaticFilters.courses": {
187
+ "description": "localized human_name label for coursesConfig filter name",
188
+ "message": "Cours"
185
189
  }
186
190
  }
@@ -182,5 +182,9 @@
182
182
  "components.UserLogin.spinnerText": {
183
183
  "description": "Accessibility text for the spinner in the login area.",
184
184
  "message": "Vérification de l'état de connexion..."
185
+ },
186
+ "components.useStaticFilters.courses": {
187
+ "description": "localized human_name label for coursesConfig filter name",
188
+ "message": "Cours"
185
189
  }
186
190
  }
@@ -182,5 +182,9 @@
182
182
  "components.UserLogin.spinnerText": {
183
183
  "description": "Accessibility text for the spinner in the login area.",
184
184
  "message": "A carregar estado do login..."
185
+ },
186
+ "components.useStaticFilters.courses": {
187
+ "description": "localized human_name label for coursesConfig filter name",
188
+ "message": "Cursos"
185
189
  }
186
190
  }
@@ -182,5 +182,9 @@
182
182
  "components.UserLogin.spinnerText": {
183
183
  "description": "Accessibility text for the spinner in the login area.",
184
184
  "message": "Загрузка статуса входа..."
185
+ },
186
+ "components.useStaticFilters.courses": {
187
+ "description": "localized human_name label for coursesConfig filter name",
188
+ "message": "Курсы"
185
189
  }
186
190
  }
@@ -0,0 +1,31 @@
1
+ import { render } from '@testing-library/react';
2
+ import Banner, { BannerType } from '.';
3
+
4
+ describe('Banner', () => {
5
+ it('displays a message', () => {
6
+ const { getByText } = render(
7
+ <Banner type={BannerType.INFO} message="A message for test purpose" />,
8
+ );
9
+
10
+ const $message = getByText('A message for test purpose');
11
+ expect(Object.values($message.classList)).toEqual(['banner__message']);
12
+ });
13
+
14
+ it('has a type property', () => {
15
+ const types = Object.keys(BannerType);
16
+ const randomIndex = Math.floor(Math.random() * types.length);
17
+ const randomType = types[randomIndex] as BannerType;
18
+
19
+ const { container } = render(<Banner type={randomType} message="A message for test purpose" />);
20
+ const $banner = container.querySelector(`.banner.banner--${randomType}`);
21
+
22
+ expect($banner).not.toBeNull();
23
+ });
24
+
25
+ it('has a rounded boolean property', () => {
26
+ const { container } = render(<Banner message="A message for test purpose" rounded />);
27
+ const $banner = container.querySelector('.banner.banner--info.banner--rounded');
28
+
29
+ expect($banner).not.toBeNull();
30
+ });
31
+ });
@@ -0,0 +1,29 @@
1
+ import { useMemo } from 'react';
2
+
3
+ export enum BannerType {
4
+ ERROR = 'error',
5
+ INFO = 'info',
6
+ SUCCESS = 'success',
7
+ WARNING = 'warning',
8
+ }
9
+
10
+ interface BannerProps {
11
+ message: string;
12
+ type?: BannerType;
13
+ rounded?: boolean;
14
+ }
15
+
16
+ const Banner = ({ message, rounded, type = BannerType.INFO }: BannerProps) => {
17
+ const className = useMemo(
18
+ (): string => ['banner', `banner--${type}`, ...(rounded ? ['banner--rounded'] : [])].join(' '),
19
+ [type, rounded],
20
+ );
21
+
22
+ return (
23
+ <div className={className}>
24
+ <p className="banner__message">{message}</p>
25
+ </div>
26
+ );
27
+ };
28
+
29
+ export default Banner;
@@ -54,7 +54,7 @@ describe('components/CourseGlimpse', () => {
54
54
  // The link that wraps the course glimpse should have no title as its content is explicit enough
55
55
  expect(screen.getByRole('link')).not.toHaveAttribute('title');
56
56
  // The course glimpse shows the relevant information
57
- screen.getByText('Course 42');
57
+ screen.getByRole('heading', { name: 'Course 42', level: 3 });
58
58
  screen.getByText('123abc');
59
59
  screen.getByText('Some Organization');
60
60
  // Matches on 'Starts on Mar 14, 2019', date is wrapped with intl <span>
@@ -98,7 +98,7 @@ describe('components/CourseGlimpse', () => {
98
98
  );
99
99
 
100
100
  // Make sure the component renders and shows the state
101
- screen.getByText('Course 42');
101
+ screen.getByRole('heading', { name: 'Course 42', level: 3 });
102
102
  screen.getByText('Archived');
103
103
  });
104
104
 
@@ -109,7 +109,7 @@ describe('components/CourseGlimpse', () => {
109
109
  </IntlProvider>,
110
110
  );
111
111
 
112
- screen.getByText('Course 42');
112
+ screen.getByRole('heading', { name: 'Course 42', level: 3 });
113
113
  screen.getByText('Cover');
114
114
  });
115
115
 
@@ -120,6 +120,9 @@ describe('components/CourseGlimpse', () => {
120
120
  </IntlProvider>,
121
121
  );
122
122
 
123
- expect(screen.getByText('-').parentElement).toHaveClass('course-glimpse__code');
123
+ expect(screen.getByText('-').parentElement).toHaveClass(
124
+ 'course-glimpse__metadata',
125
+ 'course-glimpse__metadata--code',
126
+ );
124
127
  });
125
128
  });
@@ -51,7 +51,9 @@ const CourseGlimpseBase = ({ context, course }: CourseGlimpseProps & CommonDataP
51
51
  </div>
52
52
  ) : null}
53
53
  <div className="course-glimpse__wrapper">
54
- <p className="course-glimpse__title">{course.title}</p>
54
+ <h3 className="course-glimpse__title" title={course.title}>
55
+ {course.title}
56
+ </h3>
55
57
  {course.organization_highlighted_cover_image ? (
56
58
  <div className="course-glimpse__organization-logo">
57
59
  {/* alt forced to empty string because it's a decorative image */}
@@ -63,13 +65,15 @@ const CourseGlimpseBase = ({ context, course }: CourseGlimpseProps & CommonDataP
63
65
  />
64
66
  </div>
65
67
  ) : null}
66
- <div className="course-glimpse__organization">
68
+ <div className="course-glimpse__metadata course-glimpse__metadata--organization">
67
69
  <svg aria-hidden={true} role="img" className="icon">
68
70
  <use xlinkHref="#icon-org" />
69
71
  </svg>
70
- <span>{course.organization_highlighted}</span>
72
+ <span className="title" title={course.organization_highlighted}>
73
+ {course.organization_highlighted}
74
+ </span>
71
75
  </div>
72
- <div className="course-glimpse__code">
76
+ <div className="course-glimpse__metadata course-glimpse__metadata--code">
73
77
  <svg aria-hidden={true} role="img" className="icon">
74
78
  <use xlinkHref="#icon-barcode" />
75
79
  </svg>
@@ -4,6 +4,8 @@ import fetchMock from 'fetch-mock';
4
4
 
5
5
  import { FilterDefinition } from 'types/filters';
6
6
  import { Deferred } from 'utils/test/deferred';
7
+ import { IntlProvider } from 'react-intl';
8
+ import { PropsWithChildren } from 'react';
7
9
  import { useStaticFilters } from '.';
8
10
 
9
11
  describe('data/useStaticFilters', () => {
@@ -51,12 +53,16 @@ describe('data/useStaticFilters', () => {
51
53
  subjects,
52
54
  };
53
55
 
56
+ const wrapper = ({ children }: PropsWithChildren<any>) => (
57
+ <IntlProvider locale="en">{children}</IntlProvider>
58
+ );
59
+
54
60
  afterEach(() => fetchMock.restore());
55
61
 
56
62
  it('gets and returns the static filter definitions', async () => {
57
63
  const deferred = new Deferred();
58
64
  fetchMock.get('/api/v1.0/filter-definitions/', deferred.promise);
59
- const { result } = renderHook(useStaticFilters);
65
+ const { result } = renderHook(useStaticFilters, { wrapper });
60
66
 
61
67
  // No request is made until we actually use the hook's return value
62
68
  expect(fetchMock.called('/api/v1.0/filter-definitions/')).toEqual(false);
@@ -83,7 +89,7 @@ describe('data/useStaticFilters', () => {
83
89
 
84
90
  it('includes a course config when requested', async () => {
85
91
  fetchMock.get('/api/v1.0/filter-definitions/', staticFilterDefinitions);
86
- const { result } = renderHook(() => useStaticFilters(true));
92
+ const { result } = renderHook(() => useStaticFilters(true), { wrapper });
87
93
 
88
94
  let filters;
89
95
  await act(async () => {
@@ -3,6 +3,7 @@ import { useRef, useState } from 'react';
3
3
  import { FilterDefinition, StaticFilterDefinitions } from 'types/filters';
4
4
  import { Nullable } from 'types/utils';
5
5
  import { useAsyncEffect } from 'utils/useAsyncEffect';
6
+ import { defineMessages, useIntl } from 'react-intl';
6
7
 
7
8
  // Our search and autosuggestion pipeline operated based on filter definitions. Obviously, we can't filters
8
9
  // courses by courses, but we still need a filter-definition-like config to run courses autocompletion.
@@ -15,6 +16,14 @@ const coursesConfig: FilterDefinition = {
15
16
  position: 99,
16
17
  };
17
18
 
19
+ const messages = defineMessages({
20
+ courses: {
21
+ defaultMessage: 'Courses',
22
+ description: 'localized human_name label for coursesConfig filter name',
23
+ id: 'components.useStaticFilters.courses',
24
+ },
25
+ });
26
+
18
27
  /**
19
28
  * Hook to provide static filter definitions to components as a promise while abstracting away
20
29
  * data-fetching & caching logic.
@@ -23,6 +32,7 @@ const coursesConfig: FilterDefinition = {
23
32
  */
24
33
  export const useStaticFilters = (includeCoursesConfig = false) => {
25
34
  const [needsFilters, setNeedsFilters] = useState(false);
35
+ const intl = useIntl();
26
36
 
27
37
  const filtersResolver = useRef<Nullable<(filters: StaticFilterDefinitions) => void>>(null);
28
38
  const [filtersPromise] = useState<Promise<StaticFilterDefinitions>>(
@@ -40,7 +50,14 @@ export const useStaticFilters = (includeCoursesConfig = false) => {
40
50
 
41
51
  filtersResolver.current!({
42
52
  ...filters,
43
- ...(includeCoursesConfig ? { courses: coursesConfig } : {}),
53
+ ...(includeCoursesConfig
54
+ ? {
55
+ courses: {
56
+ ...coursesConfig,
57
+ human_name: intl.formatMessage(messages.courses),
58
+ },
59
+ }
60
+ : {}),
44
61
  });
45
62
  }
46
63
  }, [needsFilters]);
@@ -1 +1 @@
1
- {"components.CourseGlimpse.cover":"Cover","components.CourseGlimpseList.courseCount":"Showing {start, number} to {end, number} of {courseCount, number} {courseCount, plural, one {course} other {courses}} matching your search","components.CourseRunEnrollment.enroll":"Enroll now","components.CourseRunEnrollment.enrolled":"You are enrolled in this course run","components.CourseRunEnrollment.enrollmentClosed":"Enrollment in this course run is closed at the moment","components.CourseRunEnrollment.enrollmentFailed":"Your enrollment request failed.","components.CourseRunEnrollment.goToCourse":"Go to course","components.CourseRunEnrollment.loadingInitial":"Loading enrollment information...","components.CourseRunEnrollment.loginToEnroll":"Log in to enroll","components.DesktopUserMenu.menuPurpose":"Access to your profile settings","components.LanguageSelector.currentlySelected":"(currently selected)","components.LanguageSelector.languages":"Languages","components.LanguageSelector.selectLanguage":"Select a language:","components.LanguageSelector.switchToLanguage":"Switch to {language}","components.PaginateCourseSearch.currentlyReadingLastPageN":"Currently reading last page {page}","components.PaginateCourseSearch.currentlyReadingPageN":"Currently reading page {page}","components.PaginateCourseSearch.lastPageN":"Last page {page}","components.PaginateCourseSearch.nextPageN":"Next page {page}","components.PaginateCourseSearch.pageN":"Page {page}","components.PaginateCourseSearch.pagination":"Pagination","components.PaginateCourseSearch.previousPageN":"Previous page {page}","components.RootSearchSuggestField.searchFieldPlaceholder":"Search for courses","components.Search.errorMessage":"Something's wrong! Courses could not be loaded.","components.Search.hideFiltersPane":"Hide filters pane","components.Search.showFiltersPane":"Show filters pane","components.Search.spinnerText":"Loading search results...","components.Search.textQueryLengthWarning":"Text search requires at least 3 characters. { query } is not long enough to search. Search results will not be affected by this query.","components.SearchFilterGroupModal.closeModal":"Close modal","components.SearchFilterGroupModal.error":"There was an error while searching for {filterName}.","components.SearchFilterGroupModal.inputLabel":"Search for filters to add","components.SearchFilterGroupModal.inputPlaceholder":"Search in { filterName }","components.SearchFilterGroupModal.loadMoreResults":"Load more results","components.SearchFilterGroupModal.loadingResults":"Loading search results...","components.SearchFilterGroupModal.modalTitle":"Add filters for {filterName}","components.SearchFilterGroupModal.moreOptionsButton":"More options","components.SearchFilterGroupModal.queryTooShort":"Type at least 3 characters to start searching.","components.SearchFilterValueParent.ariaHideChildren":"Hide additional filters for {filterValueName}","components.SearchFilterValueParent.ariaShowChildren":"Show more filters for {filterValueName}","components.SearchFiltersPane.clearFilters":"Clear {activeFilterCount, number} active {activeFilterCount, plural, one {filter} other {filters}}","components.SearchFiltersPane.title":"Filter courses","components.SearchInput.button":"Search","components.SearchSuggestField.searchFieldPlaceholder":"Search for courses, organizations, categories","components.UserLogin.logIn":"Log in","components.UserLogin.logOut":"Log out","components.UserLogin.signup":"Sign up","components.UserLogin.spinnerText":"Loading login status..."}
1
+ {"components.CourseGlimpse.cover":"Cover","components.CourseGlimpseList.courseCount":"Showing {start, number} to {end, number} of {courseCount, number} {courseCount, plural, one {course} other {courses}} matching your search","components.CourseRunEnrollment.enroll":"Enroll now","components.CourseRunEnrollment.enrolled":"You are enrolled in this course run","components.CourseRunEnrollment.enrollmentClosed":"Enrollment in this course run is closed at the moment","components.CourseRunEnrollment.enrollmentFailed":"Your enrollment request failed.","components.CourseRunEnrollment.goToCourse":"Go to course","components.CourseRunEnrollment.loadingInitial":"Loading enrollment information...","components.CourseRunEnrollment.loginToEnroll":"Log in to enroll","components.DesktopUserMenu.menuPurpose":"Access to your profile settings","components.LanguageSelector.currentlySelected":"(currently selected)","components.LanguageSelector.languages":"Languages","components.LanguageSelector.selectLanguage":"Select a language:","components.LanguageSelector.switchToLanguage":"Switch to {language}","components.PaginateCourseSearch.currentlyReadingLastPageN":"Currently reading last page {page}","components.PaginateCourseSearch.currentlyReadingPageN":"Currently reading page {page}","components.PaginateCourseSearch.lastPageN":"Last page {page}","components.PaginateCourseSearch.nextPageN":"Next page {page}","components.PaginateCourseSearch.pageN":"Page {page}","components.PaginateCourseSearch.pagination":"Pagination","components.PaginateCourseSearch.previousPageN":"Previous page {page}","components.RootSearchSuggestField.searchFieldPlaceholder":"Search for courses","components.Search.errorMessage":"Something's wrong! Courses could not be loaded.","components.Search.hideFiltersPane":"Hide filters pane","components.Search.showFiltersPane":"Show filters pane","components.Search.spinnerText":"Loading search results...","components.Search.textQueryLengthWarning":"Text search requires at least 3 characters. { query } is not long enough to search. Search results will not be affected by this query.","components.SearchFilterGroupModal.closeModal":"Close modal","components.SearchFilterGroupModal.error":"There was an error while searching for {filterName}.","components.SearchFilterGroupModal.inputLabel":"Search for filters to add","components.SearchFilterGroupModal.inputPlaceholder":"Search in { filterName }","components.SearchFilterGroupModal.loadMoreResults":"Load more results","components.SearchFilterGroupModal.loadingResults":"Loading search results...","components.SearchFilterGroupModal.modalTitle":"Add filters for {filterName}","components.SearchFilterGroupModal.moreOptionsButton":"More options","components.SearchFilterGroupModal.queryTooShort":"Type at least 3 characters to start searching.","components.SearchFilterValueParent.ariaHideChildren":"Hide additional filters for {filterValueName}","components.SearchFilterValueParent.ariaShowChildren":"Show more filters for {filterValueName}","components.SearchFiltersPane.clearFilters":"Clear {activeFilterCount, number} active {activeFilterCount, plural, one {filter} other {filters}}","components.SearchFiltersPane.title":"Filter courses","components.SearchInput.button":"Search","components.SearchSuggestField.searchFieldPlaceholder":"Search for courses, organizations, categories","components.UserLogin.logIn":"Log in","components.UserLogin.logOut":"Log out","components.UserLogin.signup":"Sign up","components.UserLogin.spinnerText":"Loading login status...","components.useStaticFilters.courses":"Courses"}
@@ -1 +1 @@
1
- {"components.CourseGlimpse.cover":"Portada","components.CourseGlimpseList.courseCount":"Mostrando {start, number} a {end, number} de {courseCount, number} ¡ {courseCount, plural, one {curso} other {cursos}} que coinciden con su búsqueda","components.CourseRunEnrollment.enroll":"Inscribirse ahora","components.CourseRunEnrollment.enrolled":"Se ha inscrito en este curso","components.CourseRunEnrollment.enrollmentClosed":"La inscripción en este curso está cerrada por el momento","components.CourseRunEnrollment.enrollmentFailed":"Su solicitud de inscripción ha fallado.","components.CourseRunEnrollment.goToCourse":"Ir al curso","components.CourseRunEnrollment.loadingInitial":"Cargando información de inscripción...","components.CourseRunEnrollment.loginToEnroll":"Inicia sesión para inscribirse","components.DesktopUserMenu.menuPurpose":"Acceso a la configuración de su perfil","components.LanguageSelector.currentlySelected":"(actualmente seleccionado)","components.LanguageSelector.languages":"Idiomas","components.LanguageSelector.selectLanguage":"Seleccione un idioma:","components.LanguageSelector.switchToLanguage":"Cambiar a {language}","components.PaginateCourseSearch.currentlyReadingLastPageN":"Leyendo la última página {page}","components.PaginateCourseSearch.currentlyReadingPageN":"Actualmente leyendo la página {page}","components.PaginateCourseSearch.lastPageN":"Última página {page}","components.PaginateCourseSearch.nextPageN":"Página siguiente {page}","components.PaginateCourseSearch.pageN":"Página {page}","components.PaginateCourseSearch.pagination":"Paginación","components.PaginateCourseSearch.previousPageN":"Página anterior {page}","components.RootSearchSuggestField.searchFieldPlaceholder":"Buscar cursos","components.Search.errorMessage":"¡Algo está mal! No se han podido cargar los cursos.","components.Search.hideFiltersPane":"Ocultar panel de filtros","components.Search.showFiltersPane":"Mostrar panel de filtros","components.Search.spinnerText":"Cargando resultados de búsqueda...","components.Search.textQueryLengthWarning":"La búsqueda de texto requiere al menos 3 caracteres. { query } no es lo suficientemente larga para buscar. Los resultados de la búsqueda no se verán afectados por esta consulta.","components.SearchFilterGroupModal.closeModal":"Cerrar ventana modal","components.SearchFilterGroupModal.error":"Se ha producido un error al buscar {filterName}.","components.SearchFilterGroupModal.inputLabel":"Buscar filtros para añadir","components.SearchFilterGroupModal.inputPlaceholder":"Buscar en { filterName }","components.SearchFilterGroupModal.loadMoreResults":"Cargar más resultados","components.SearchFilterGroupModal.loadingResults":"Cargando resultados de búsqueda...","components.SearchFilterGroupModal.modalTitle":"Añadir filtros para {filterName}","components.SearchFilterGroupModal.moreOptionsButton":"Más opciones","components.SearchFilterGroupModal.queryTooShort":"Escriba por lo menos 3 caracteres para iniciar la búsqueda.","components.SearchFilterValueParent.ariaHideChildren":"Ocultar filtros adicionales para {filterValueName}","components.SearchFilterValueParent.ariaShowChildren":"Mostrar más filtros para {filterValueName}","components.SearchFiltersPane.clearFilters":"Retirar {activeFilterCount, number} activo {activeFilterCount, plural, one {filtro} other {filtros}}","components.SearchFiltersPane.title":"Filtrar cursos","components.SearchInput.button":"Buscar","components.SearchSuggestField.searchFieldPlaceholder":"Buscar cursos, organizaciones, categorías","components.UserLogin.logIn":"Iniciar sesión","components.UserLogin.logOut":"Cerrar sesión","components.UserLogin.signup":"Registrarse","components.UserLogin.spinnerText":"Cargando estado de inicio de sesión..."}
1
+ {"components.CourseGlimpse.cover":"Portada","components.CourseGlimpseList.courseCount":"Mostrando {start, number} a {end, number} de {courseCount, number} ¡ {courseCount, plural, one {curso} other {cursos}} que coinciden con su búsqueda","components.CourseRunEnrollment.enroll":"Inscribirse ahora","components.CourseRunEnrollment.enrolled":"Se ha inscrito en este curso","components.CourseRunEnrollment.enrollmentClosed":"La inscripción en este curso está cerrada por el momento","components.CourseRunEnrollment.enrollmentFailed":"Su solicitud de inscripción ha fallado.","components.CourseRunEnrollment.goToCourse":"Ir al curso","components.CourseRunEnrollment.loadingInitial":"Cargando información de inscripción...","components.CourseRunEnrollment.loginToEnroll":"Inicia sesión para inscribirse","components.DesktopUserMenu.menuPurpose":"Acceso a la configuración de su perfil","components.LanguageSelector.currentlySelected":"(actualmente seleccionado)","components.LanguageSelector.languages":"Idiomas","components.LanguageSelector.selectLanguage":"Seleccione un idioma:","components.LanguageSelector.switchToLanguage":"Cambiar a {language}","components.PaginateCourseSearch.currentlyReadingLastPageN":"Leyendo la última página {page}","components.PaginateCourseSearch.currentlyReadingPageN":"Actualmente leyendo la página {page}","components.PaginateCourseSearch.lastPageN":"Última página {page}","components.PaginateCourseSearch.nextPageN":"Página siguiente {page}","components.PaginateCourseSearch.pageN":"Página {page}","components.PaginateCourseSearch.pagination":"Paginación","components.PaginateCourseSearch.previousPageN":"Página anterior {page}","components.RootSearchSuggestField.searchFieldPlaceholder":"Buscar cursos","components.Search.errorMessage":"¡Algo está mal! No se han podido cargar los cursos.","components.Search.hideFiltersPane":"Ocultar panel de filtros","components.Search.showFiltersPane":"Mostrar panel de filtros","components.Search.spinnerText":"Cargando resultados de búsqueda...","components.Search.textQueryLengthWarning":"La búsqueda de texto requiere al menos 3 caracteres. { query } no es lo suficientemente larga para buscar. Los resultados de la búsqueda no se verán afectados por esta consulta.","components.SearchFilterGroupModal.closeModal":"Cerrar ventana modal","components.SearchFilterGroupModal.error":"Se ha producido un error al buscar {filterName}.","components.SearchFilterGroupModal.inputLabel":"Buscar filtros para añadir","components.SearchFilterGroupModal.inputPlaceholder":"Buscar en { filterName }","components.SearchFilterGroupModal.loadMoreResults":"Cargar más resultados","components.SearchFilterGroupModal.loadingResults":"Cargando resultados de búsqueda...","components.SearchFilterGroupModal.modalTitle":"Añadir filtros para {filterName}","components.SearchFilterGroupModal.moreOptionsButton":"Más opciones","components.SearchFilterGroupModal.queryTooShort":"Escriba por lo menos 3 caracteres para iniciar la búsqueda.","components.SearchFilterValueParent.ariaHideChildren":"Ocultar filtros adicionales para {filterValueName}","components.SearchFilterValueParent.ariaShowChildren":"Mostrar más filtros para {filterValueName}","components.SearchFiltersPane.clearFilters":"Retirar {activeFilterCount, number} activo {activeFilterCount, plural, one {filtro} other {filtros}}","components.SearchFiltersPane.title":"Filtrar cursos","components.SearchInput.button":"Buscar","components.SearchSuggestField.searchFieldPlaceholder":"Buscar cursos, organizaciones, categorías","components.UserLogin.logIn":"Iniciar sesión","components.UserLogin.logOut":"Cerrar sesión","components.UserLogin.signup":"Registrarse","components.UserLogin.spinnerText":"Cargando estado de inicio de sesión...","components.useStaticFilters.courses":"Cursos"}
@@ -1 +1 @@
1
- {"components.CourseGlimpse.cover":"Couverture","components.CourseGlimpseList.courseCount":"Résultats {start, number} à {end, number} sur {courseCount, number} {courseCount, plural, one {cours} other {cours}} correspondant à votre recherche","components.CourseRunEnrollment.enroll":"S’inscrire maintenant","components.CourseRunEnrollment.enrolled":"Vous êtes inscrit à cette session","components.CourseRunEnrollment.enrollmentClosed":"L'inscription à ce cours est fermée pour le moment","components.CourseRunEnrollment.enrollmentFailed":"Votre demande d'inscription a échoué.","components.CourseRunEnrollment.goToCourse":"Accéder au cours","components.CourseRunEnrollment.loadingInitial":"Chargement des critères d'inscription...","components.CourseRunEnrollment.loginToEnroll":"Connectez-vous pour vous inscrire","components.DesktopUserMenu.menuPurpose":"Accéder aux préférences de votre profil","components.LanguageSelector.currentlySelected":"(actuellement sélectionné)","components.LanguageSelector.languages":"Langues","components.LanguageSelector.selectLanguage":"Sélectionnez une langue:","components.LanguageSelector.switchToLanguage":"Voir en {language}","components.PaginateCourseSearch.currentlyReadingLastPageN":"Actuellement sur la dernière page: {page}","components.PaginateCourseSearch.currentlyReadingPageN":"Actuellement sur la page {page}","components.PaginateCourseSearch.lastPageN":"Dernière page: {page}","components.PaginateCourseSearch.nextPageN":"Page suivante: {page}","components.PaginateCourseSearch.pageN":"Page {page}","components.PaginateCourseSearch.pagination":"Pagination","components.PaginateCourseSearch.previousPageN":"Page précédente: {page}","components.RootSearchSuggestField.searchFieldPlaceholder":"Recherche de cours","components.Search.errorMessage":"Quelque chose s'est mal passé ! Les cours n'ont pas pu être chargés.","components.Search.hideFiltersPane":"Cacher le menu des filtres","components.Search.showFiltersPane":"Montrer le menu des filtres","components.Search.spinnerText":"Chargement des résultats de recherche...","components.Search.textQueryLengthWarning":"La recherche de texte nécessite au moins 3 caractères. { query } n'est pas assez long. Les résultats de recherche ne seront pas affectés par cette requête.","components.SearchFilterGroupModal.closeModal":"Fermer le modal","components.SearchFilterGroupModal.error":"La recherche de filtres pour {filterName} a rencontré une erreur.","components.SearchFilterGroupModal.inputLabel":"Rechercher des filtres à ajouter","components.SearchFilterGroupModal.inputPlaceholder":"Rechercher parmi les { filterName }","components.SearchFilterGroupModal.loadMoreResults":"Charger plus de résultats","components.SearchFilterGroupModal.loadingResults":"Chargement des résultats de recherche...","components.SearchFilterGroupModal.modalTitle":"Ajouter des filtres pour {filterName}","components.SearchFilterGroupModal.moreOptionsButton":"Plus de choix","components.SearchFilterGroupModal.queryTooShort":"Tapez 3 caractères ou plus pour commencer à chercher.","components.SearchFilterValueParent.ariaHideChildren":"Cacher les filtres supplémentaires pour {filterValueName}","components.SearchFilterValueParent.ariaShowChildren":"Montrer plus de filtres pour {filterValueName}","components.SearchFiltersPane.clearFilters":"Retirer {activeFilterCount, number} {activeFilterCount, plural, one {filtre actif} other {filtres actifs}}","components.SearchFiltersPane.title":"Filtrer les cours","components.SearchInput.button":"Chercher","components.SearchSuggestField.searchFieldPlaceholder":"Recherche des cours, des organisations, des catégories","components.UserLogin.logIn":"Connexion","components.UserLogin.logOut":"Déconnexion","components.UserLogin.signup":"Inscription","components.UserLogin.spinnerText":"Vérification de l'état de connexion..."}
1
+ {"components.CourseGlimpse.cover":"Couverture","components.CourseGlimpseList.courseCount":"Résultats {start, number} à {end, number} sur {courseCount, number} {courseCount, plural, one {cours} other {cours}} correspondant à votre recherche","components.CourseRunEnrollment.enroll":"S’inscrire maintenant","components.CourseRunEnrollment.enrolled":"Vous êtes inscrit à cette session","components.CourseRunEnrollment.enrollmentClosed":"L'inscription à ce cours est fermée pour le moment","components.CourseRunEnrollment.enrollmentFailed":"Votre demande d'inscription a échoué.","components.CourseRunEnrollment.goToCourse":"Accéder au cours","components.CourseRunEnrollment.loadingInitial":"Chargement des critères d'inscription...","components.CourseRunEnrollment.loginToEnroll":"Connectez-vous pour vous inscrire","components.DesktopUserMenu.menuPurpose":"Accéder aux préférences de votre profil","components.LanguageSelector.currentlySelected":"(actuellement sélectionné)","components.LanguageSelector.languages":"Langues","components.LanguageSelector.selectLanguage":"Sélectionnez une langue:","components.LanguageSelector.switchToLanguage":"Voir en {language}","components.PaginateCourseSearch.currentlyReadingLastPageN":"Actuellement sur la dernière page: {page}","components.PaginateCourseSearch.currentlyReadingPageN":"Actuellement sur la page {page}","components.PaginateCourseSearch.lastPageN":"Dernière page: {page}","components.PaginateCourseSearch.nextPageN":"Page suivante: {page}","components.PaginateCourseSearch.pageN":"Page {page}","components.PaginateCourseSearch.pagination":"Pagination","components.PaginateCourseSearch.previousPageN":"Page précédente: {page}","components.RootSearchSuggestField.searchFieldPlaceholder":"Recherche de cours","components.Search.errorMessage":"Quelque chose s'est mal passé ! Les cours n'ont pas pu être chargés.","components.Search.hideFiltersPane":"Cacher le menu des filtres","components.Search.showFiltersPane":"Montrer le menu des filtres","components.Search.spinnerText":"Chargement des résultats de recherche...","components.Search.textQueryLengthWarning":"La recherche de texte nécessite au moins 3 caractères. { query } n'est pas assez long. Les résultats de recherche ne seront pas affectés par cette requête.","components.SearchFilterGroupModal.closeModal":"Fermer le modal","components.SearchFilterGroupModal.error":"La recherche de filtres pour {filterName} a rencontré une erreur.","components.SearchFilterGroupModal.inputLabel":"Rechercher des filtres à ajouter","components.SearchFilterGroupModal.inputPlaceholder":"Rechercher parmi les { filterName }","components.SearchFilterGroupModal.loadMoreResults":"Charger plus de résultats","components.SearchFilterGroupModal.loadingResults":"Chargement des résultats de recherche...","components.SearchFilterGroupModal.modalTitle":"Ajouter des filtres pour {filterName}","components.SearchFilterGroupModal.moreOptionsButton":"Plus de choix","components.SearchFilterGroupModal.queryTooShort":"Tapez 3 caractères ou plus pour commencer à chercher.","components.SearchFilterValueParent.ariaHideChildren":"Cacher les filtres supplémentaires pour {filterValueName}","components.SearchFilterValueParent.ariaShowChildren":"Montrer plus de filtres pour {filterValueName}","components.SearchFiltersPane.clearFilters":"Retirer {activeFilterCount, number} {activeFilterCount, plural, one {filtre actif} other {filtres actifs}}","components.SearchFiltersPane.title":"Filtrer les cours","components.SearchInput.button":"Chercher","components.SearchSuggestField.searchFieldPlaceholder":"Recherche des cours, des organisations, des catégories","components.UserLogin.logIn":"Connexion","components.UserLogin.logOut":"Déconnexion","components.UserLogin.signup":"Inscription","components.UserLogin.spinnerText":"Vérification de l'état de connexion...","components.useStaticFilters.courses":"Cours"}
@@ -1 +1 @@
1
- {"components.CourseGlimpse.cover":"Couverture","components.CourseGlimpseList.courseCount":"Résultats {start, number} à {end, number} sur {courseCount, number} {courseCount, plural, one {cours} other {cours}} correspondant à votre recherche","components.CourseRunEnrollment.enroll":"S’inscrire maintenant","components.CourseRunEnrollment.enrolled":"Vous êtes inscrit à cette session","components.CourseRunEnrollment.enrollmentClosed":"L'inscription à ce cours est fermée pour le moment","components.CourseRunEnrollment.enrollmentFailed":"Votre demande d'inscription a échoué.","components.CourseRunEnrollment.goToCourse":"Accéder au cours","components.CourseRunEnrollment.loadingInitial":"Chargement des critères d'inscription...","components.CourseRunEnrollment.loginToEnroll":"Connectez-vous pour vous inscrire","components.DesktopUserMenu.menuPurpose":"Accéder aux préférences de votre profil","components.LanguageSelector.currentlySelected":"(actuellement sélectionné)","components.LanguageSelector.languages":"Langues","components.LanguageSelector.selectLanguage":"Sélectionnez une langue:","components.LanguageSelector.switchToLanguage":"Voir en {language}","components.PaginateCourseSearch.currentlyReadingLastPageN":"Actuellement sur la dernière page: {page}","components.PaginateCourseSearch.currentlyReadingPageN":"Actuellement sur la page {page}","components.PaginateCourseSearch.lastPageN":"Dernière page: {page}","components.PaginateCourseSearch.nextPageN":"Page suivante: {page}","components.PaginateCourseSearch.pageN":"Page {page}","components.PaginateCourseSearch.pagination":"Pagination","components.PaginateCourseSearch.previousPageN":"Page précédente: {page}","components.RootSearchSuggestField.searchFieldPlaceholder":"Recherche de cours","components.Search.errorMessage":"Quelque chose s'est mal passé ! Les cours n'ont pas pu être chargés.","components.Search.hideFiltersPane":"Cacher le menu des filtres","components.Search.showFiltersPane":"Montrer le menu des filtres","components.Search.spinnerText":"Chargement des résultats de recherche...","components.Search.textQueryLengthWarning":"La recherche de texte nécessite au moins 3 caractères. { query } n'est pas assez long pour la recherche. Les résultats de recherche ne seront pas affectés par cette requête.","components.SearchFilterGroupModal.closeModal":"Fermer la fenêtre modale","components.SearchFilterGroupModal.error":"La recherche de filtres pour {filterName} a rencontré une erreur.","components.SearchFilterGroupModal.inputLabel":"Rechercher des filtres à ajouter","components.SearchFilterGroupModal.inputPlaceholder":"Rechercher parmi les { filterName }","components.SearchFilterGroupModal.loadMoreResults":"Charger plus de résultats","components.SearchFilterGroupModal.loadingResults":"Chargement des résultats de recherche...","components.SearchFilterGroupModal.modalTitle":"Ajouter des filtres pour {filterName}","components.SearchFilterGroupModal.moreOptionsButton":"Plus de choix","components.SearchFilterGroupModal.queryTooShort":"Tapez 3 caractères ou plus pour commencer à chercher.","components.SearchFilterValueParent.ariaHideChildren":"Cacher les filtres supplémentaires pour {filterValueName}","components.SearchFilterValueParent.ariaShowChildren":"Montrer plus de filtres pour {filterValueName}","components.SearchFiltersPane.clearFilters":"Retirer {activeFilterCount, number} {activeFilterCount, plural, one {filtre actif} other {filtres actifs}}","components.SearchFiltersPane.title":"Filtrer les cours","components.SearchInput.button":"Recherche","components.SearchSuggestField.searchFieldPlaceholder":"Recherche des cours, des organisations, des catégories","components.UserLogin.logIn":"Connexion","components.UserLogin.logOut":"Déconnexion","components.UserLogin.signup":"Inscription","components.UserLogin.spinnerText":"Vérification de l'état de connexion..."}
1
+ {"components.CourseGlimpse.cover":"Couverture","components.CourseGlimpseList.courseCount":"Résultats {start, number} à {end, number} sur {courseCount, number} {courseCount, plural, one {cours} other {cours}} correspondant à votre recherche","components.CourseRunEnrollment.enroll":"S’inscrire maintenant","components.CourseRunEnrollment.enrolled":"Vous êtes inscrit à cette session","components.CourseRunEnrollment.enrollmentClosed":"L'inscription à ce cours est fermée pour le moment","components.CourseRunEnrollment.enrollmentFailed":"Votre demande d'inscription a échoué.","components.CourseRunEnrollment.goToCourse":"Accéder au cours","components.CourseRunEnrollment.loadingInitial":"Chargement des critères d'inscription...","components.CourseRunEnrollment.loginToEnroll":"Connectez-vous pour vous inscrire","components.DesktopUserMenu.menuPurpose":"Accéder aux préférences de votre profil","components.LanguageSelector.currentlySelected":"(actuellement sélectionné)","components.LanguageSelector.languages":"Langues","components.LanguageSelector.selectLanguage":"Sélectionnez une langue:","components.LanguageSelector.switchToLanguage":"Voir en {language}","components.PaginateCourseSearch.currentlyReadingLastPageN":"Actuellement sur la dernière page: {page}","components.PaginateCourseSearch.currentlyReadingPageN":"Actuellement sur la page {page}","components.PaginateCourseSearch.lastPageN":"Dernière page: {page}","components.PaginateCourseSearch.nextPageN":"Page suivante: {page}","components.PaginateCourseSearch.pageN":"Page {page}","components.PaginateCourseSearch.pagination":"Pagination","components.PaginateCourseSearch.previousPageN":"Page précédente: {page}","components.RootSearchSuggestField.searchFieldPlaceholder":"Recherche de cours","components.Search.errorMessage":"Quelque chose s'est mal passé ! Les cours n'ont pas pu être chargés.","components.Search.hideFiltersPane":"Cacher le menu des filtres","components.Search.showFiltersPane":"Montrer le menu des filtres","components.Search.spinnerText":"Chargement des résultats de recherche...","components.Search.textQueryLengthWarning":"La recherche de texte nécessite au moins 3 caractères. { query } n'est pas assez long pour la recherche. Les résultats de recherche ne seront pas affectés par cette requête.","components.SearchFilterGroupModal.closeModal":"Fermer la fenêtre modale","components.SearchFilterGroupModal.error":"La recherche de filtres pour {filterName} a rencontré une erreur.","components.SearchFilterGroupModal.inputLabel":"Rechercher des filtres à ajouter","components.SearchFilterGroupModal.inputPlaceholder":"Rechercher parmi les { filterName }","components.SearchFilterGroupModal.loadMoreResults":"Charger plus de résultats","components.SearchFilterGroupModal.loadingResults":"Chargement des résultats de recherche...","components.SearchFilterGroupModal.modalTitle":"Ajouter des filtres pour {filterName}","components.SearchFilterGroupModal.moreOptionsButton":"Plus de choix","components.SearchFilterGroupModal.queryTooShort":"Tapez 3 caractères ou plus pour commencer à chercher.","components.SearchFilterValueParent.ariaHideChildren":"Cacher les filtres supplémentaires pour {filterValueName}","components.SearchFilterValueParent.ariaShowChildren":"Montrer plus de filtres pour {filterValueName}","components.SearchFiltersPane.clearFilters":"Retirer {activeFilterCount, number} {activeFilterCount, plural, one {filtre actif} other {filtres actifs}}","components.SearchFiltersPane.title":"Filtrer les cours","components.SearchInput.button":"Recherche","components.SearchSuggestField.searchFieldPlaceholder":"Recherche des cours, des organisations, des catégories","components.UserLogin.logIn":"Connexion","components.UserLogin.logOut":"Déconnexion","components.UserLogin.signup":"Inscription","components.UserLogin.spinnerText":"Vérification de l'état de connexion...","components.useStaticFilters.courses":"Cours"}
@@ -1 +1 @@
1
- {"components.CourseGlimpse.cover":"Capa","components.CourseGlimpseList.courseCount":"A mostrar de {start, number} a {end, number} de {courseCount, number} {courseCount, plural, one {curso} other {cursos}} de acordo com a sua pesquisa","components.CourseRunEnrollment.enroll":"Inscreva-se já","components.CourseRunEnrollment.enrolled":"Está inscrito nesta edição do curso","components.CourseRunEnrollment.enrollmentClosed":"A inscrição nesta edição do curso está fechada de momento","components.CourseRunEnrollment.enrollmentFailed":"Ocorreu um erro ao processar a inscrição.","components.CourseRunEnrollment.goToCourse":"Ir para o curso","components.CourseRunEnrollment.loadingInitial":"A carregar a informação da inscrição...","components.CourseRunEnrollment.loginToEnroll":"Faça login para se inscrever","components.DesktopUserMenu.menuPurpose":"Acesso às suas configurações de perfil","components.LanguageSelector.currentlySelected":"(selecionado)","components.LanguageSelector.languages":"Idiomas","components.LanguageSelector.selectLanguage":"Selecione um idioma:","components.LanguageSelector.switchToLanguage":"Mudar idioma para {language}","components.PaginateCourseSearch.currentlyReadingLastPageN":"A ler a última página {page}","components.PaginateCourseSearch.currentlyReadingPageN":"A ler a página {page}","components.PaginateCourseSearch.lastPageN":"Última página {page}","components.PaginateCourseSearch.nextPageN":"Página seguinte {page}","components.PaginateCourseSearch.pageN":"Página {page}","components.PaginateCourseSearch.pagination":"Paginação","components.PaginateCourseSearch.previousPageN":"Página anterior {page}","components.RootSearchSuggestField.searchFieldPlaceholder":"Pesquisar cursos","components.Search.errorMessage":"Ocorreu um erro! Não foi possível carregar os cursos.","components.Search.hideFiltersPane":"Ocultar painel de filtros","components.Search.showFiltersPane":"Mostrar painel de filtros","components.Search.spinnerText":"A carregar os resultados da pesquisa...","components.Search.textQueryLengthWarning":"A pesquisa de texto requer pelo menos 3 caracteres. { query } não é longo o suficiente para pesquisar. Os resultados da pesquisa não serão alterados por esta consulta.","components.SearchFilterGroupModal.closeModal":"Fechar modal","components.SearchFilterGroupModal.error":"Ocorreu um erro ao pesquisar por {filterName}.","components.SearchFilterGroupModal.inputLabel":"Pesquisar por filtros para adicionar","components.SearchFilterGroupModal.inputPlaceholder":"Pesquisar em { filterName }","components.SearchFilterGroupModal.loadMoreResults":"Carregar mais resultados","components.SearchFilterGroupModal.loadingResults":"A carregar os resultados da pesquisa...","components.SearchFilterGroupModal.modalTitle":"Adicionar filtros para {filterName}","components.SearchFilterGroupModal.moreOptionsButton":"Mais opções","components.SearchFilterGroupModal.queryTooShort":"Digite pelo menos 3 caracteres para iniciar a pesquisa.","components.SearchFilterValueParent.ariaHideChildren":"Ocultar filtros adicionais para {filterValueName}","components.SearchFilterValueParent.ariaShowChildren":"Mostrar mais filtros para {filterValueName}","components.SearchFiltersPane.clearFilters":"Limpar {activeFilterCount, number} {activeFilterCount, plural, one {filtro} other {filtros}} {activeFilterCount, plural, one {ativo} other {ativos}}","components.SearchFiltersPane.title":"Filtrar cursos","components.SearchInput.button":"Pesquisar","components.SearchSuggestField.searchFieldPlaceholder":"Pesquisar cursos, organizações, categorias","components.UserLogin.logIn":"Entrar","components.UserLogin.logOut":"Sair","components.UserLogin.signup":"Registar","components.UserLogin.spinnerText":"A carregar estado do login..."}
1
+ {"components.CourseGlimpse.cover":"Capa","components.CourseGlimpseList.courseCount":"A mostrar de {start, number} a {end, number} de {courseCount, number} {courseCount, plural, one {curso} other {cursos}} de acordo com a sua pesquisa","components.CourseRunEnrollment.enroll":"Inscreva-se já","components.CourseRunEnrollment.enrolled":"Está inscrito nesta edição do curso","components.CourseRunEnrollment.enrollmentClosed":"A inscrição nesta edição do curso está fechada de momento","components.CourseRunEnrollment.enrollmentFailed":"Ocorreu um erro ao processar a inscrição.","components.CourseRunEnrollment.goToCourse":"Ir para o curso","components.CourseRunEnrollment.loadingInitial":"A carregar a informação da inscrição...","components.CourseRunEnrollment.loginToEnroll":"Faça login para se inscrever","components.DesktopUserMenu.menuPurpose":"Acesso às suas configurações de perfil","components.LanguageSelector.currentlySelected":"(selecionado)","components.LanguageSelector.languages":"Idiomas","components.LanguageSelector.selectLanguage":"Selecione um idioma:","components.LanguageSelector.switchToLanguage":"Mudar idioma para {language}","components.PaginateCourseSearch.currentlyReadingLastPageN":"A ler a última página {page}","components.PaginateCourseSearch.currentlyReadingPageN":"A ler a página {page}","components.PaginateCourseSearch.lastPageN":"Última página {page}","components.PaginateCourseSearch.nextPageN":"Página seguinte {page}","components.PaginateCourseSearch.pageN":"Página {page}","components.PaginateCourseSearch.pagination":"Paginação","components.PaginateCourseSearch.previousPageN":"Página anterior {page}","components.RootSearchSuggestField.searchFieldPlaceholder":"Pesquisar cursos","components.Search.errorMessage":"Ocorreu um erro! Não foi possível carregar os cursos.","components.Search.hideFiltersPane":"Ocultar painel de filtros","components.Search.showFiltersPane":"Mostrar painel de filtros","components.Search.spinnerText":"A carregar os resultados da pesquisa...","components.Search.textQueryLengthWarning":"A pesquisa de texto requer pelo menos 3 caracteres. { query } não é longo o suficiente para pesquisar. Os resultados da pesquisa não serão alterados por esta consulta.","components.SearchFilterGroupModal.closeModal":"Fechar modal","components.SearchFilterGroupModal.error":"Ocorreu um erro ao pesquisar por {filterName}.","components.SearchFilterGroupModal.inputLabel":"Pesquisar por filtros para adicionar","components.SearchFilterGroupModal.inputPlaceholder":"Pesquisar em { filterName }","components.SearchFilterGroupModal.loadMoreResults":"Carregar mais resultados","components.SearchFilterGroupModal.loadingResults":"A carregar os resultados da pesquisa...","components.SearchFilterGroupModal.modalTitle":"Adicionar filtros para {filterName}","components.SearchFilterGroupModal.moreOptionsButton":"Mais opções","components.SearchFilterGroupModal.queryTooShort":"Digite pelo menos 3 caracteres para iniciar a pesquisa.","components.SearchFilterValueParent.ariaHideChildren":"Ocultar filtros adicionais para {filterValueName}","components.SearchFilterValueParent.ariaShowChildren":"Mostrar mais filtros para {filterValueName}","components.SearchFiltersPane.clearFilters":"Limpar {activeFilterCount, number} {activeFilterCount, plural, one {filtro} other {filtros}} {activeFilterCount, plural, one {ativo} other {ativos}}","components.SearchFiltersPane.title":"Filtrar cursos","components.SearchInput.button":"Pesquisar","components.SearchSuggestField.searchFieldPlaceholder":"Pesquisar cursos, organizações, categorias","components.UserLogin.logIn":"Entrar","components.UserLogin.logOut":"Sair","components.UserLogin.signup":"Registar","components.UserLogin.spinnerText":"A carregar estado do login...","components.useStaticFilters.courses":"Cursos"}
@@ -1 +1 @@
1
- {"components.CourseGlimpse.cover":"Обложка","components.CourseGlimpseList.courseCount":"Показано от {start, number} до {end, number} на {courseCount, number} {courseCount, plural, one {курсе} few {курсах} many {курсах} other {курсах}} в соответствии с вашим поиском","components.CourseRunEnrollment.enroll":"Записаться сейчас","components.CourseRunEnrollment.enrolled":"Вы зачислены на этот курс","components.CourseRunEnrollment.enrollmentClosed":"Регистрация на курс в данный момент закрыта","components.CourseRunEnrollment.enrollmentFailed":"Не удалось выполнить запрос на зачисление.","components.CourseRunEnrollment.goToCourse":"Перейти к курсу","components.CourseRunEnrollment.loadingInitial":"Загрузка информации о зачислении...","components.CourseRunEnrollment.loginToEnroll":"Войти для записи","components.DesktopUserMenu.menuPurpose":"Доступ к настройкам вашего профиля","components.LanguageSelector.currentlySelected":"(сейчас выбрано)","components.LanguageSelector.languages":"Языки","components.LanguageSelector.selectLanguage":"Выберите язык:","components.LanguageSelector.switchToLanguage":"Переключиться на {language}","components.PaginateCourseSearch.currentlyReadingLastPageN":"В настоящее время чтение последней страницы {page}","components.PaginateCourseSearch.currentlyReadingPageN":"Сейчас чтение страницы {page}","components.PaginateCourseSearch.lastPageN":"Последняя страница {page}","components.PaginateCourseSearch.nextPageN":"Следующая страница {page}","components.PaginateCourseSearch.pageN":"Страница {page}","components.PaginateCourseSearch.pagination":"Постраничная навигация","components.PaginateCourseSearch.previousPageN":"Предыдущая страница {page}","components.RootSearchSuggestField.searchFieldPlaceholder":"Поиск курсов","components.Search.errorMessage":"Что-то не так! Курсы не могут быть загружены.","components.Search.hideFiltersPane":"Скрыть панель фильтров","components.Search.showFiltersPane":"Показать панель фильтров","components.Search.spinnerText":"Загрузка результатов поиска...","components.Search.textQueryLengthWarning":"Текстовый поиск требует не менее 3 символов. { query } не достаточно длинный, чтобы искать. Этот запрос не повлияет на результаты поиска.","components.SearchFilterGroupModal.closeModal":"Закрыть модальное окно","components.SearchFilterGroupModal.error":"Произошла ошибка при поиске {filterName}.","components.SearchFilterGroupModal.inputLabel":"Поиск фильтров для добавления","components.SearchFilterGroupModal.inputPlaceholder":"Искать в { filterName }","components.SearchFilterGroupModal.loadMoreResults":"Загрузить больше результатов","components.SearchFilterGroupModal.loadingResults":"Загрузка результатов поиска...","components.SearchFilterGroupModal.modalTitle":"Добавить фильтры для {filterName}","components.SearchFilterGroupModal.moreOptionsButton":"Ещё опции","components.SearchFilterGroupModal.queryTooShort":"Введите минимум 3 символа, чтобы начать поиск.","components.SearchFilterValueParent.ariaHideChildren":"Скрыть дополнительные фильтры для {filterValueName}","components.SearchFilterValueParent.ariaShowChildren":"Показать больше фильтров для {filterValueName}","components.SearchFiltersPane.clearFilters":"Очистите {activeFilterCount, number} {activeFilterCount, plural, one {активный фильтр} few {активных фильтра} many {активных фильтров} other {активных фильтров}}","components.SearchFiltersPane.title":"Фильтровать курсы","components.SearchInput.button":"Поиск","components.SearchSuggestField.searchFieldPlaceholder":"Поиск курсов, организаций, категорий","components.UserLogin.logIn":"Вход","components.UserLogin.logOut":"Выход","components.UserLogin.signup":"Зарегистрироваться","components.UserLogin.spinnerText":"Загрузка статуса входа..."}
1
+ {"components.CourseGlimpse.cover":"Обложка","components.CourseGlimpseList.courseCount":"Показано от {start, number} до {end, number} на {courseCount, number} {courseCount, plural, one {курсе} few {курсах} many {курсах} other {курсах}} в соответствии с вашим поиском","components.CourseRunEnrollment.enroll":"Записаться сейчас","components.CourseRunEnrollment.enrolled":"Вы зачислены на этот курс","components.CourseRunEnrollment.enrollmentClosed":"Регистрация на курс в данный момент закрыта","components.CourseRunEnrollment.enrollmentFailed":"Не удалось выполнить запрос на зачисление.","components.CourseRunEnrollment.goToCourse":"Перейти к курсу","components.CourseRunEnrollment.loadingInitial":"Загрузка информации о зачислении...","components.CourseRunEnrollment.loginToEnroll":"Войти для записи","components.DesktopUserMenu.menuPurpose":"Доступ к настройкам вашего профиля","components.LanguageSelector.currentlySelected":"(сейчас выбрано)","components.LanguageSelector.languages":"Языки","components.LanguageSelector.selectLanguage":"Выберите язык:","components.LanguageSelector.switchToLanguage":"Переключиться на {language}","components.PaginateCourseSearch.currentlyReadingLastPageN":"В настоящее время чтение последней страницы {page}","components.PaginateCourseSearch.currentlyReadingPageN":"Сейчас чтение страницы {page}","components.PaginateCourseSearch.lastPageN":"Последняя страница {page}","components.PaginateCourseSearch.nextPageN":"Следующая страница {page}","components.PaginateCourseSearch.pageN":"Страница {page}","components.PaginateCourseSearch.pagination":"Постраничная навигация","components.PaginateCourseSearch.previousPageN":"Предыдущая страница {page}","components.RootSearchSuggestField.searchFieldPlaceholder":"Поиск курсов","components.Search.errorMessage":"Что-то не так! Курсы не могут быть загружены.","components.Search.hideFiltersPane":"Скрыть панель фильтров","components.Search.showFiltersPane":"Показать панель фильтров","components.Search.spinnerText":"Загрузка результатов поиска...","components.Search.textQueryLengthWarning":"Текстовый поиск требует не менее 3 символов. { query } не достаточно длинный, чтобы искать. Этот запрос не повлияет на результаты поиска.","components.SearchFilterGroupModal.closeModal":"Закрыть модальное окно","components.SearchFilterGroupModal.error":"Произошла ошибка при поиске {filterName}.","components.SearchFilterGroupModal.inputLabel":"Поиск фильтров для добавления","components.SearchFilterGroupModal.inputPlaceholder":"Искать в { filterName }","components.SearchFilterGroupModal.loadMoreResults":"Загрузить больше результатов","components.SearchFilterGroupModal.loadingResults":"Загрузка результатов поиска...","components.SearchFilterGroupModal.modalTitle":"Добавить фильтры для {filterName}","components.SearchFilterGroupModal.moreOptionsButton":"Ещё опции","components.SearchFilterGroupModal.queryTooShort":"Введите минимум 3 символа, чтобы начать поиск.","components.SearchFilterValueParent.ariaHideChildren":"Скрыть дополнительные фильтры для {filterValueName}","components.SearchFilterValueParent.ariaShowChildren":"Показать больше фильтров для {filterValueName}","components.SearchFiltersPane.clearFilters":"Очистите {activeFilterCount, number} {activeFilterCount, plural, one {активный фильтр} few {активных фильтра} many {активных фильтров} other {активных фильтров}}","components.SearchFiltersPane.title":"Фильтровать курсы","components.SearchInput.button":"Поиск","components.SearchSuggestField.searchFieldPlaceholder":"Поиск курсов, организаций, категорий","components.UserLogin.logIn":"Вход","components.UserLogin.logOut":"Выход","components.UserLogin.signup":"Зарегистрироваться","components.UserLogin.spinnerText":"Загрузка статуса входа...","components.useStaticFilters.courses":"Курсы"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "richie-education",
3
- "version": "2.11.0",
3
+ "version": "2.12.0",
4
4
  "description": "A CMS to build learning portals for Open Education",
5
5
  "main": "sandbox/manage.py",
6
6
  "scripts": {
@@ -35,17 +35,17 @@
35
35
  "not dead"
36
36
  ],
37
37
  "dependencies": {
38
- "@babel/core": "7.16.7",
38
+ "@babel/core": "7.16.12",
39
39
  "@babel/plugin-syntax-dynamic-import": "7.8.3",
40
- "@babel/plugin-transform-modules-commonjs": "7.16.7",
41
- "@babel/preset-env": "7.16.7",
40
+ "@babel/plugin-transform-modules-commonjs": "7.16.8",
41
+ "@babel/preset-env": "7.16.11",
42
42
  "@babel/preset-react": "7.16.7",
43
43
  "@babel/preset-typescript": "7.16.7",
44
- "@formatjs/cli": "4.5.0",
45
- "@formatjs/intl-relativetimeformat": "9.4.1",
44
+ "@formatjs/cli": "4.8.1",
45
+ "@formatjs/intl-relativetimeformat": "9.5.1",
46
46
  "@helpscout/helix": "0.2.0",
47
- "@sentry/browser": "6.16.1",
48
- "@sentry/types": "6.16.1",
47
+ "@sentry/browser": "6.17.3",
48
+ "@sentry/types": "6.17.3",
49
49
  "@testing-library/jest-dom": "5.16.1",
50
50
  "@testing-library/react": "12.1.2",
51
51
  "@testing-library/react-hooks": "7.0.2",
@@ -61,21 +61,21 @@
61
61
  "@types/react-autosuggest": "10.1.5",
62
62
  "@types/react-dom": "17.0.11",
63
63
  "@types/react-modal": "3.13.1",
64
- "@typescript-eslint/eslint-plugin": "5.8.1",
65
- "@typescript-eslint/parser": "5.8.1",
66
- "babel-jest": "27.4.5",
64
+ "@typescript-eslint/eslint-plugin": "5.10.1",
65
+ "@typescript-eslint/parser": "5.10.1",
66
+ "babel-jest": "27.4.6",
67
67
  "babel-loader": "8.2.3",
68
68
  "babel-plugin-react-intl": "8.2.25",
69
69
  "bootstrap": ">=4.6.0 <5",
70
70
  "cljs-merge": "1.1.1",
71
- "core-js": "3.20.2",
71
+ "core-js": "3.20.3",
72
72
  "downshift": "6.1.7",
73
- "eslint": "8.3.0",
73
+ "eslint": "8.8.0",
74
74
  "eslint-config-airbnb": "19.0.4",
75
75
  "eslint-config-airbnb-typescript": "16.1.0",
76
76
  "eslint-config-prettier": "8.3.0",
77
- "eslint-plugin-compat": "4.0.0",
78
- "eslint-plugin-formatjs": "2.20.1",
77
+ "eslint-plugin-compat": "4.0.1",
78
+ "eslint-plugin-formatjs": "2.20.5",
79
79
  "eslint-plugin-import": "2.25.4",
80
80
  "eslint-plugin-jsx-a11y": "6.5.1",
81
81
  "eslint-plugin-prettier": "4.0.0",
@@ -86,25 +86,25 @@
86
86
  "glob": "7.2.0",
87
87
  "iframe-resizer": "4.3.2",
88
88
  "intl-pluralrules": "1.3.1",
89
- "jest": "27.4.5",
89
+ "jest": "27.4.7",
90
90
  "js-cookie": "3.0.1",
91
91
  "lodash-es": "4.17.21",
92
92
  "mdn-polyfills": "5.20.0",
93
- "node-fetch": "<3",
93
+ "node-fetch": ">2.6.6 <3",
94
94
  "nodemon": "2.0.15",
95
95
  "prettier": "2.5.1",
96
- "query-string": "7.0.1",
96
+ "query-string": "7.1.0",
97
97
  "react": "17.0.2",
98
98
  "react-autosuggest": "10.1.0",
99
99
  "react-dom": "17.0.2",
100
- "react-intl": "5.24.1",
100
+ "react-intl": "5.24.4",
101
101
  "react-modal": "3.14.4",
102
- "react-query": "3.34.7",
103
- "sass": "1.45.2",
104
- "source-map-loader": "3.0.0",
105
- "typescript": "4.5.4",
106
- "webpack": "5.65.0",
107
- "webpack-cli": "4.9.1",
102
+ "react-query": "3.34.12",
103
+ "sass": "1.49.0",
104
+ "source-map-loader": "3.0.1",
105
+ "typescript": "4.5.5",
106
+ "webpack": "5.67.0",
107
+ "webpack-cli": "4.9.2",
108
108
  "whatwg-fetch": "3.6.2",
109
109
  "xhr-mock": "2.5.1",
110
110
  "yargs": "17.3.1"
@@ -349,6 +349,10 @@ $r-theme: (
349
349
  license-label-color: r-color('denim'),
350
350
  checkmark-list-decoration: url('../../richie/images/components/checkmark.svg'),
351
351
  view-more-runs-color: r-color('firebrick6'),
352
+ run-catalog-visibility-hidden-logo: url('../../richie/images/catalog_visibility/hidden.svg'),
353
+ run-catalog-visibility-course-only-logo:
354
+ url('../../richie/images/catalog_visibility/course_only.svg'),
355
+ run-catalog-visibility-logo-color: r-color('indianred3'),
352
356
  ),
353
357
  organization-detail: (
354
358
  banner-empty-background: r-color('smoke'),
@@ -1,6 +1,15 @@
1
1
  // Course detail template stylesheet
2
2
  //
3
3
 
4
+ @mixin course-detail-run-descriptions-catalog-visibility-mask($mask-logo) {
5
+ -webkit-mask: $mask-logo;
6
+ mask: $mask-logo;
7
+ -webkit-mask-size: contain;
8
+ mask-size: contain;
9
+ mask-repeat: no-repeat;
10
+ -webkit-mask-repeat: no-repeat;
11
+ }
12
+
4
13
  .course-detail {
5
14
  $detail-selector: &;
6
15
  margin: 0 auto;
@@ -131,6 +140,36 @@
131
140
  }
132
141
  }
133
142
  }
143
+
144
+ // Add CSS style only to edit mode
145
+ &--hidden,
146
+ &--course_only {
147
+ h3.cms-render-model::before {
148
+ content: '';
149
+ background-size: 1rem 1rem;
150
+ display: inline-block;
151
+ width: 1.5rem;
152
+ height: 1rem;
153
+ margin-left: -1.5rem;
154
+ background-repeat: no-repeat;
155
+ background-color: r-theme-val(course-detail, run-catalog-visibility-logo-color);
156
+ }
157
+ }
158
+
159
+ &--hidden {
160
+ h3.cms-render-model::before {
161
+ @include course-detail-run-descriptions-catalog-visibility-mask(
162
+ r-theme-val(course-detail, run-catalog-visibility-hidden-logo)
163
+ );
164
+ }
165
+ }
166
+ &--course_only {
167
+ h3.cms-render-model::before {
168
+ @include course-detail-run-descriptions-catalog-visibility-mask(
169
+ r-theme-val(course-detail, run-catalog-visibility-course-only-logo)
170
+ );
171
+ }
172
+ }
134
173
  }
135
174
 
136
175
  &__run-session-link {
@@ -151,6 +190,29 @@
151
190
  margin-top: 1rem;
152
191
  }
153
192
  }
193
+
194
+ // Add CSS style only to edit mode
195
+ &--course_only.cms-render-model::before,
196
+ &--hidden.cms-render-model::before {
197
+ content: '';
198
+ background-size: 1rem 1rem;
199
+ display: inline-block;
200
+ width: 1.2rem;
201
+ height: 1rem;
202
+ margin-left: -1.4rem;
203
+ background-repeat: no-repeat;
204
+ background-color: r-theme-val(course-detail, run-catalog-visibility-logo-color);
205
+ }
206
+ &--hidden.cms-render-model::before {
207
+ @include course-detail-run-descriptions-catalog-visibility-mask(
208
+ r-theme-val(course-detail, run-catalog-visibility-hidden-logo)
209
+ );
210
+ }
211
+ &--course_only.cms-render-model::before {
212
+ @include course-detail-run-descriptions-catalog-visibility-mask(
213
+ r-theme-val(course-detail, run-catalog-visibility-course-only-logo)
214
+ );
215
+ }
154
216
  }
155
217
 
156
218
  &__programs {
@@ -47,7 +47,7 @@ $course-glimpse-content-padding-sides: 0.7rem !default;
47
47
  $border: 0,
48
48
  $background: r-theme-val(course-glimpse, card-background),
49
49
  $media-margin: 0,
50
- $wrapper-padding: 1.7rem $course-glimpse-content-padding-sides 3rem,
50
+ $wrapper-padding: 1.7rem $course-glimpse-content-padding-sides 0.5rem,
51
51
  $foot-divider: null
52
52
  );
53
53
 
@@ -140,57 +140,57 @@ $course-glimpse-content-padding-sides: 0.7rem !default;
140
140
 
141
141
  &__wrapper {
142
142
  @include sv-flex(1, 0, auto);
143
- position: relative;
144
- }
145
-
146
- &__code {
147
143
  display: flex;
148
- position: absolute;
149
- bottom: 0.4rem;
150
- left: 0;
151
- right: 0;
152
- padding: 0 0.6rem;
153
- font-size: 0.7rem;
154
- color: r-theme-val(course-glimpse, code-color);
155
- line-height: 1.1rem;
156
- margin-bottom: 0;
157
-
158
- .icon {
159
- @include sv-flex(1, 0, 1.4rem);
160
- width: 1.4rem;
161
- height: 0.9rem;
162
- margin-bottom: 0.15rem;
163
- margin-right: 0.5rem;
164
- fill: r-theme-val(course-glimpse, code-color);
165
- }
144
+ flex-direction: column;
145
+ position: relative;
166
146
  }
167
147
 
168
148
  &__title {
169
149
  @include font-size($h6-font-size);
150
+ -webkit-box-orient: vertical;
151
+ -webkit-line-clamp: 3;
152
+ color: r-theme-val(course-glimpse, title-color);
153
+ display: block;
154
+ display: -webkit-box;
170
155
  font-family: $r-font-family-montserrat;
171
156
  font-weight: $font-weight-boldest;
172
- color: r-theme-val(course-glimpse, title-color);
157
+ flex: 1 0 1.3em * 3; // 3 lines;
158
+ line-height: 1.3em;
159
+ margin-bottom: 1rem;
160
+ overflow: hidden;
173
161
  }
174
162
 
175
- &__organization {
176
- display: flex;
177
- position: absolute;
178
- bottom: 1.6rem;
179
- left: 0;
180
- right: 0;
181
- padding: 0 0.6rem;
163
+ &__metadata {
182
164
  align-items: center;
183
165
  color: r-theme-val(course-glimpse, organization-color);
184
- font-size: 0.9rem;
185
- line-height: 1.1;
166
+ display: flex;
167
+ font-size: 0.7rem;
168
+ line-height: 1.1em;
169
+
170
+ &--organization {
171
+ color: r-theme-val(course-glimpse, organization-color);
172
+ }
173
+
174
+ &--code {
175
+ color: r-theme-val(course-glimpse, code-color);
176
+ }
186
177
 
187
178
  .icon {
188
179
  @include sv-flex(1, 0, 1.4rem);
189
- width: 1.4rem;
180
+ fill: currentColor;
190
181
  height: 0.9rem;
191
182
  margin-bottom: 0.15rem;
192
183
  margin-right: 0.5rem;
193
- fill: r-theme-val(course-glimpse, organization-color);
184
+ width: 1.4rem;
185
+ }
186
+
187
+ .title {
188
+ -webkit-box-orient: vertical;
189
+ -webkit-line-clamp: 2;
190
+ display: block;
191
+ display: -webkit-box;
192
+ max-height: 2.2em; // 2 lines
193
+ overflow: hidden;
194
194
  }
195
195
  }
196
196
 
@@ -205,7 +205,7 @@ $course-glimpse-content-padding-sides: 0.7rem !default;
205
205
  overflow: hidden;
206
206
  padding: 0.25rem;
207
207
  position: absolute;
208
- right: 0rem;
208
+ right: 0;
209
209
  top: -3.53rem;
210
210
  width: 4.3rem;
211
211
  z-index: 0;
@@ -17,7 +17,8 @@
17
17
 
18
18
  &__suggestions-container {
19
19
  @extend .dropdown-menu;
20
- width: 100%;
20
+ max-width: 480px;
21
+ min-width: 100%;
21
22
 
22
23
  &--open {
23
24
  display: block; // Show/hide is managed by react-autosuggest with the --open state
@@ -30,6 +31,9 @@
30
31
 
31
32
  &__suggestion {
32
33
  @extend .dropdown-item;
34
+ text-overflow: ellipsis;
35
+ overflow: hidden;
36
+ white-space: nowrap;
33
37
 
34
38
  &:hover {
35
39
  cursor: pointer;