diff --git a/frontend/app/src/app/app.module.ts b/frontend/app/src/app/app.module.ts index fd6549a6..182aed52 100644 --- a/frontend/app/src/app/app.module.ts +++ b/frontend/app/src/app/app.module.ts @@ -70,6 +70,7 @@ import {setDefaultOptions} from 'date-fns'; import {DateFnsConfigurationService} from 'ngx-date-fns'; import {Capacitor} from '@capacitor/core'; import {SplashScreen} from '@capacitor/splash-screen'; +import {SportCoursesModule} from './modules/sport-courses/sport-courses.module'; registerLocaleData(localeDe); @@ -170,6 +171,7 @@ export function createTranslateLoader(http: HttpClient) { ScheduleModule, SettingsModule, StorageModule, + SportCoursesModule, ThingTranslateModule.forRoot(), TranslateModule.forRoot({ defaultLanguage: 'en', diff --git a/frontend/app/src/app/modules/data/chips/action-chip-list.component.ts b/frontend/app/src/app/modules/data/chips/action-chip-list.component.ts index a2f7fed8..f97d3a20 100644 --- a/frontend/app/src/app/modules/data/chips/action-chip-list.component.ts +++ b/frontend/app/src/app/modules/data/chips/action-chip-list.component.ts @@ -13,7 +13,7 @@ * this program. If not, see . */ import {Component, Input} from '@angular/core'; -import {SCDateSeries, SCThingType, SCThings} from '@openstapps/core'; +import {SCThingType, SCThings} from '@openstapps/core'; /** * Shows a horizontal list of action chips @@ -47,9 +47,7 @@ export class ActionChipListComponent { const isNullIsland = maybeCoords ? maybeCoords[0] === 0 && maybeCoords[1] === 0 : false; this.applicable = { locate: false, // TODO: reimplement this at a later date - event: - item.type === SCThingType.AcademicEvent || - (item.type === SCThingType.DateSeries && (item as SCDateSeries).dates.length > 0), + event: item.type === SCThingType.AcademicEvent || item.type === SCThingType.SportCourse, navigate: (hasDirectGeo || isInPlace) && !isNullIsland, }; } diff --git a/frontend/app/src/app/modules/data/data-icon.config.ts b/frontend/app/src/app/modules/data/data-icon.config.ts index 774c1db9..cea1532e 100644 --- a/frontend/app/src/app/modules/data/data-icon.config.ts +++ b/frontend/app/src/app/modules/data/data-icon.config.ts @@ -39,7 +39,7 @@ export const DataIcons: Record = { 'room': SCIcon`meeting_room`, 'semester': SCIcon`date_range`, 'setting': SCIcon`settings`, - 'sport course': SCIcon`sports_soccer`, + 'sport course': SCIcon`sports_gymnastics`, 'study module': SCIcon`view_module`, 'ticket': SCIcon`confirmation_number`, 'todo': SCIcon`task`, diff --git a/frontend/app/src/app/modules/data/data.module.ts b/frontend/app/src/app/modules/data/data.module.ts index 09697966..6ee63621 100644 --- a/frontend/app/src/app/modules/data/data.module.ts +++ b/frontend/app/src/app/modules/data/data.module.ts @@ -107,6 +107,8 @@ import {SemesterListItemComponent} from './types/semester/semester-list-item.com import {VideoDetailContentComponent} from './types/video/video-detail-content.component'; import {VideoListItemComponent} from './types/video/video-list-item.component'; import {ShareButtonComponent} from './elements/share-button.component'; +import {SanitizeHtmlPipe} from '../../util/sanitize-html.pipe'; +import {BypassTrustUrlPipe} from '../../util/bypass-trust-url.pipe'; /** * Module for handling data @@ -193,6 +195,8 @@ import {ShareButtonComponent} from './elements/share-button.component'; MarkdownModule.forRoot(), MenuModule, IonIconModule, + SanitizeHtmlPipe, + BypassTrustUrlPipe, MomentModule.forRoot({ relativeTimeThresholdOptions: { m: 59, diff --git a/frontend/app/src/app/modules/data/elements/offers-detail.component.ts b/frontend/app/src/app/modules/data/elements/offers-detail.component.ts index c806734c..9cea7603 100644 --- a/frontend/app/src/app/modules/data/elements/offers-detail.component.ts +++ b/frontend/app/src/app/modules/data/elements/offers-detail.component.ts @@ -13,12 +13,23 @@ * this program. If not, see . */ import {Component, Input} from '@angular/core'; -import {SCAcademicPriceGroup, SCThingThatCanBeOfferedOffer} from '@openstapps/core'; +import {SCAcademicPriceGroup, SCThingThatCanBeOffered, SCThingType, SCThings} from '@openstapps/core'; +import {SimpleBrowser} from 'src/app/util/browser.factory'; + +type WithRequired = T & {[P in K]-?: T[P]}; @Component({ selector: 'stapps-offers-detail', templateUrl: 'offers-detail.html', }) export class OffersDetailComponent { - @Input() offers: Array>; + @Input() item: SCThings & WithRequired, 'offers'>; + + constructor(readonly browser: SimpleBrowser) {} + + async submit(id: string) { + if (this.item.type === SCThingType.DateSeries && this.item.event.type === SCThingType.SportCourse) { + this.browser.open(`${this.item.event.sameAs}#${id}`); + } + } } diff --git a/frontend/app/src/app/modules/data/elements/offers-detail.html b/frontend/app/src/app/modules/data/elements/offers-detail.html index 6755b9cc..5b5c71ec 100644 --- a/frontend/app/src/app/modules/data/elements/offers-detail.html +++ b/frontend/app/src/app/modules/data/elements/offers-detail.html @@ -16,7 +16,7 @@ {{ 'data.detail.offers.TITLE' | translate | titlecase }} -
+
@@ -45,16 +45,24 @@ - - - - - -

{{ 'data.detail.offers.sold_out' | translate }}

-
-
-
-
+ {{'data.detail.offers.' + offer.availability | translate}} + + + + + + +

{{ 'data.detail.offers.' + offer.availability | translate }}

+
+
+
+
+
diff --git a/frontend/app/src/app/modules/data/elements/offers-in-list.html b/frontend/app/src/app/modules/data/elements/offers-in-list.html index 72fe6d1e..8bfc237d 100644 --- a/frontend/app/src/app/modules/data/elements/offers-in-list.html +++ b/frontend/app/src/app/modules/data/elements/offers-in-list.html @@ -18,7 +18,7 @@

{{ price | currency : 'EUR' : 'symbol' : undefined : 'de' }}

-

{{ 'data.detail.offers.sold_out' | translate }}

+

{{ 'data.detail.offers.out of stock' | translate }}

{{ _offers[0].inPlace.name }}

- -
-
- {{ 'description' | thingTranslate: item }} -
-
- - - -
diff --git a/frontend/app/src/app/modules/data/elements/title-card.component.scss b/frontend/app/src/app/modules/data/elements/title-card.component.scss index bef81d40..4328b1fb 100644 --- a/frontend/app/src/app/modules/data/elements/title-card.component.scss +++ b/frontend/app/src/app/modules/data/elements/title-card.component.scss @@ -13,14 +13,6 @@ * this program. If not, see . */ -.text-accordion { - overflow: hidden; - display: -webkit-box; - text-overflow: ellipsis; - - -webkit-box-orient: vertical; -} - ion-card { --background: var(--ion-color-primary); @@ -40,10 +32,6 @@ ion-card { ion-card-content { padding: 0 0 var(--header-spacing-bottom); - .description * { - color: var(--ion-color-primary-contrast); - } - .opening-hours { color: var(--ion-color-primary-contrast); } diff --git a/frontend/app/src/app/modules/data/elements/title-card.component.ts b/frontend/app/src/app/modules/data/elements/title-card.component.ts index 9c18fc9e..2c88c4a8 100644 --- a/frontend/app/src/app/modules/data/elements/title-card.component.ts +++ b/frontend/app/src/app/modules/data/elements/title-card.component.ts @@ -13,81 +13,17 @@ * this program. If not, see . */ -import {Component, ElementRef, HostListener, Input, OnChanges, OnInit, ViewChild} from '@angular/core'; +import {Component, Input} from '@angular/core'; import {SCThings} from '@openstapps/core'; -import {SCIcon} from '../../../util/ion-icon/icon'; - -const AccordionButtonState = { - collapsed: SCIcon`expand_more`, - expanded: SCIcon`expand_less`, -}; @Component({ selector: 'stapps-title-card', templateUrl: './title-card.component.html', styleUrls: ['./title-card.component.scss'], }) -export class TitleCardComponent implements OnInit, OnChanges { +export class TitleCardComponent { /** * The item whose title (and description) to display */ @Input() item: SCThings; - - @ViewChild('accordionTextArea') accordionTextArea: ElementRef; - - buttonState = AccordionButtonState.collapsed; - - buttonShown = true; - - descriptionLinesShown: number; - - descriptionLinesTotal: number; - - descriptionPreviewLines = 3; - - descriptionLinesToDisplay = 0; - - ngOnInit(): void { - if (this.item.description) { - this.descriptionLinesToDisplay = this.descriptionPreviewLines; - setTimeout(() => this.checkTextElipsis(), 100); - } - } - - ngOnChanges() { - this.checkTextElipsis(); - } - - @HostListener('window:resize', ['$event']) - checkTextElipsis() { - if (this.accordionTextArea === undefined) { - return; - } - const element = this.accordionTextArea.nativeElement as HTMLElement; - - const lineHeight = Number.parseInt(getComputedStyle(element).getPropertyValue('line-height')); - this.descriptionLinesTotal = element?.scrollHeight / lineHeight; - this.descriptionLinesShown = element?.offsetHeight / lineHeight; - if (this.buttonState === AccordionButtonState.expanded) { - this.descriptionLinesToDisplay = this.descriptionLinesTotal; - } - const isElipsed = element?.offsetHeight < element?.scrollHeight; - this.buttonShown = - (isElipsed && this.buttonState === AccordionButtonState.collapsed) || - (!isElipsed && this.buttonState === AccordionButtonState.expanded); - } - - toggleDescriptionAccordion() { - if (this.descriptionLinesToDisplay > 0) { - this.descriptionLinesToDisplay = - this.descriptionLinesToDisplay === this.descriptionPreviewLines - ? this.descriptionLinesTotal - : this.descriptionPreviewLines; - } - this.buttonState = - this.buttonState === AccordionButtonState.collapsed - ? AccordionButtonState.expanded - : AccordionButtonState.collapsed; - setTimeout(() => this.checkTextElipsis(), 0); - } } diff --git a/frontend/app/src/app/modules/data/list/data-list-item-host.directive.ts b/frontend/app/src/app/modules/data/list/data-list-item-host.directive.ts index 7b839536..55f38fdd 100644 --- a/frontend/app/src/app/modules/data/list/data-list-item-host.directive.ts +++ b/frontend/app/src/app/modules/data/list/data-list-item-host.directive.ts @@ -40,7 +40,7 @@ const DataListItemIndex: Partial>> = { [SCThingType.Dish]: DishListItemComponent, [SCThingType.DateSeries]: DateSeriesListItemComponent, [SCThingType.AcademicEvent]: EventListItemComponent, - [SCThingType.SportCourse]: DateSeriesListItemComponent, + [SCThingType.SportCourse]: EventListItemComponent, [SCThingType.Favorite]: FavoriteListItemComponent, [SCThingType.Message]: MessageListItemComponent, [SCThingType.Organization]: OrganizationListItemComponent, diff --git a/frontend/app/src/app/modules/data/types/date-series/date-series-detail-content.html b/frontend/app/src/app/modules/data/types/date-series/date-series-detail-content.html index f2e661e4..e35c12bb 100644 --- a/frontend/app/src/app/modules/data/types/date-series/date-series-detail-content.html +++ b/frontend/app/src/app/modules/data/types/date-series/date-series-detail-content.html @@ -50,7 +50,7 @@ [title]="'performers' | propertyNameTranslate : item | titlecase" [content]="item.performers" > - + {{ 'event' | propertyNameTranslate : item | titlecase }} diff --git a/frontend/app/src/app/modules/data/types/date-series/date-series-list-item.html b/frontend/app/src/app/modules/data/types/date-series/date-series-list-item.html index 6824333e..31d77895 100644 --- a/frontend/app/src/app/modules/data/types/date-series/date-series-list-item.html +++ b/frontend/app/src/app/modules/data/types/date-series/date-series-list-item.html @@ -20,7 +20,7 @@ {{ 'event.name' | thingTranslate : item }}

- + {{ item.repeatFrequency | durationLocalized : true | sentencecase }}, {{ item.dates[0] | dateFormat : 'weekday:long' }} @@ -30,7 +30,7 @@

- {{ 'categories' | thingTranslate : item.event | join : ', ' }} diff --git a/frontend/app/src/app/modules/data/types/dish/dish-detail-content.html b/frontend/app/src/app/modules/data/types/dish/dish-detail-content.html index 7228e06f..097e00d0 100644 --- a/frontend/app/src/app/modules/data/types/dish/dish-detail-content.html +++ b/frontend/app/src/app/modules/data/types/dish/dish-detail-content.html @@ -14,7 +14,7 @@ --> - + . */ import {Component, Input} from '@angular/core'; -import {SCAcademicEvent, SCSportCourse, SCThing, SCThingTranslator, SCTranslations} from '@openstapps/core'; +import { + SCAcademicEvent, + SCDateSeries, + SCSportCourse, + SCThing, + SCThingType, + SCTranslations, +} from '@openstapps/core'; +import {DataProvider} from '../../data.provider'; /** * TODO @@ -24,30 +32,41 @@ import {SCAcademicEvent, SCSportCourse, SCThing, SCThingTranslator, SCTranslatio styleUrls: ['event-detail-content.scss'], }) export class EventDetailContentComponent { - /** - * TODO - */ - @Input() item: SCAcademicEvent | SCSportCourse; + @Input() set item(value: SCAcademicEvent | SCSportCourse) { + this._item = value; + this.dateSeries = this.dataProvider + .search({ + filter: { + type: 'boolean', + arguments: { + operation: 'and', + filters: [ + { + type: 'value', + arguments: { + field: 'type', + value: SCThingType.DateSeries, + }, + }, + { + type: 'value', + arguments: { + field: 'event.uid', + value: value.uid, + }, + }, + ], + }, + }, + }) + .then(result => result.data as SCDateSeries[]); + } + + _item: SCAcademicEvent | SCSportCourse; + + dateSeries: Promise; - /** - * TODO - */ @Input() language: keyof SCTranslations; - /** - * TODO - */ - objectKeys = Object.keys; - - /** - * TODO - */ - translator: SCThingTranslator; - - /** - * TODO - */ - constructor() { - this.translator = new SCThingTranslator(this.language); - } + constructor(readonly dataProvider: DataProvider) {} } diff --git a/frontend/app/src/app/modules/data/types/event/event-detail-content.html b/frontend/app/src/app/modules/data/types/event/event-detail-content.html index 61e6f7d7..144bd363 100644 --- a/frontend/app/src/app/modules/data/types/event/event-detail-content.html +++ b/frontend/app/src/app/modules/data/types/event/event-detail-content.html @@ -12,39 +12,39 @@ ~ You should have received a copy of the GNU General Public License along with ~ this program. If not, see . --> +

- - + - + - + {{ 'superCatalogs' | propertyNameTranslate : 'catalog' | titlecase }} + diff --git a/frontend/app/src/app/modules/data/types/event/event-detail-content.scss b/frontend/app/src/app/modules/data/types/event/event-detail-content.scss index fb0e8f07..ba35e8d1 100644 --- a/frontend/app/src/app/modules/data/types/event/event-detail-content.scss +++ b/frontend/app/src/app/modules/data/types/event/event-detail-content.scss @@ -13,6 +13,10 @@ * this program. If not, see . */ +p { + margin-inline: var(--spacing-md); +} + stapps-add-event-action-chip { position: absolute; top: 0; diff --git a/frontend/app/src/app/modules/data/types/event/event-list-item.component.ts b/frontend/app/src/app/modules/data/types/event/event-list-item.component.ts index 77b7a8aa..19d19cc6 100644 --- a/frontend/app/src/app/modules/data/types/event/event-list-item.component.ts +++ b/frontend/app/src/app/modules/data/types/event/event-list-item.component.ts @@ -22,6 +22,7 @@ import {DataListItemComponent} from '../../list/data-list-item.component'; @Component({ selector: 'stapps-event-list-item', templateUrl: 'event-list-item.html', + styleUrls: ['event-list-item.scss'], }) export class EventListItemComponent extends DataListItemComponent { /** diff --git a/frontend/app/src/app/modules/data/types/event/event-list-item.html b/frontend/app/src/app/modules/data/types/event/event-list-item.html index fc460d60..c4e127e2 100644 --- a/frontend/app/src/app/modules/data/types/event/event-list-item.html +++ b/frontend/app/src/app/modules/data/types/event/event-list-item.html @@ -14,27 +14,25 @@ --> - +
{{ 'name' | thingTranslate: item }} -

{{ 'description' | thingTranslate: item }}

+

{{ 'name' | thingTranslate: item.academicTerms[0] }}

- {{ 'type' | thingTranslate: item | titlecase }} - - {{ 'categories' | thingTranslate: item | join: ', ' | titlecase }} - + + {{ 'type' | thingTranslate: item | titlecase }} + + {{ 'categories' | thingTranslate: item | join: ', ' | titlecase }} + +
- - - {{ 'name' | thingTranslate: item }} -

{{ 'description' | thingTranslate: item }}

-

{{ 'name' | thingTranslate: item.academicTerms[0] }}

- {{ 'type' | thingTranslate: item }} -
-
diff --git a/frontend/app/src/app/modules/data/types/event/event-list-item.scss b/frontend/app/src/app/modules/data/types/event/event-list-item.scss new file mode 100644 index 00000000..33ea4d0d --- /dev/null +++ b/frontend/app/src/app/modules/data/types/event/event-list-item.scss @@ -0,0 +1,5 @@ +.title-sub { + max-height: 2.8rem; + overflow: hidden; + opacity: 0.8; +} diff --git a/frontend/app/src/app/modules/data/types/video/video-detail-content.html b/frontend/app/src/app/modules/data/types/video/video-detail-content.html index 3802bd30..3f835130 100644 --- a/frontend/app/src/app/modules/data/types/video/video-detail-content.html +++ b/frontend/app/src/app/modules/data/types/video/video-detail-content.html @@ -29,4 +29,4 @@ [content]="item.datePublished | amDateFormat : 'll'" > - + diff --git a/frontend/app/src/app/modules/sport-courses/sport-course-search-page.component.ts b/frontend/app/src/app/modules/sport-courses/sport-course-search-page.component.ts new file mode 100644 index 00000000..80a0d048 --- /dev/null +++ b/frontend/app/src/app/modules/sport-courses/sport-course-search-page.component.ts @@ -0,0 +1,20 @@ +import {Component} from '@angular/core'; +import {DataModule} from '../data/data.module'; +import {TranslateModule} from '@ngx-translate/core'; +import {SCSearchFilter, SCThingType} from '@openstapps/core'; + +@Component({ + selector: 'stapps-sport-course-search-page', + templateUrl: 'sport-course-search-page.html', + standalone: true, + imports: [DataModule, TranslateModule], +}) +export class SportCourseSearchPageComponent { + forcedFilter: SCSearchFilter = { + type: 'value', + arguments: { + field: 'type', + value: SCThingType.SportCourse, + }, + }; +} diff --git a/frontend/app/src/app/modules/sport-courses/sport-course-search-page.html b/frontend/app/src/app/modules/sport-courses/sport-course-search-page.html new file mode 100644 index 00000000..79052bdf --- /dev/null +++ b/frontend/app/src/app/modules/sport-courses/sport-course-search-page.html @@ -0,0 +1,6 @@ + diff --git a/frontend/app/src/app/modules/sport-courses/sport-courses.module.ts b/frontend/app/src/app/modules/sport-courses/sport-courses.module.ts new file mode 100644 index 00000000..4fa8157c --- /dev/null +++ b/frontend/app/src/app/modules/sport-courses/sport-courses.module.ts @@ -0,0 +1,8 @@ +import {NgModule} from '@angular/core'; +import {RouterModule} from '@angular/router'; +import {SportCourseSearchPageComponent} from './sport-course-search-page.component'; + +@NgModule({ + imports: [RouterModule.forChild([{path: 'sport-courses', component: SportCourseSearchPageComponent}])], +}) +export class SportCoursesModule {} diff --git a/frontend/app/src/app/translation/thing-translate.parser.ts b/frontend/app/src/app/translation/thing-translate.parser.ts index a2cfb1a4..19061b16 100644 --- a/frontend/app/src/app/translation/thing-translate.parser.ts +++ b/frontend/app/src/app/translation/thing-translate.parser.ts @@ -45,7 +45,7 @@ export class ThingTranslateDefaultParser extends ThingTranslateParser { let property = instance as any; for (const key of keyPathChain) { - property = property[key] ?? undefined; + property = property?.[key] ?? undefined; } return property; diff --git a/frontend/app/src/app/util/bypass-trust-url.pipe.ts b/frontend/app/src/app/util/bypass-trust-url.pipe.ts new file mode 100644 index 00000000..0487cf8c --- /dev/null +++ b/frontend/app/src/app/util/bypass-trust-url.pipe.ts @@ -0,0 +1,15 @@ +import {Pipe, PipeTransform} from '@angular/core'; +import {DomSanitizer} from '@angular/platform-browser'; + +@Pipe({ + name: 'bypassSecurityTrustResourceUrl', + standalone: true, + pure: true, +}) +export class BypassTrustUrlPipe implements PipeTransform { + constructor(private sanitizer: DomSanitizer) {} + + transform(url: string) { + return this.sanitizer.bypassSecurityTrustUrl(url); + } +} diff --git a/frontend/app/src/app/util/sanitize-html.pipe.ts b/frontend/app/src/app/util/sanitize-html.pipe.ts new file mode 100644 index 00000000..d480b950 --- /dev/null +++ b/frontend/app/src/app/util/sanitize-html.pipe.ts @@ -0,0 +1,15 @@ +import {Pipe, PipeTransform, SecurityContext} from '@angular/core'; +import {DomSanitizer, SafeHtml} from '@angular/platform-browser'; + +@Pipe({ + name: 'sanitizeHtml', + standalone: true, + pure: true, +}) +export class SanitizeHtmlPipe implements PipeTransform { + constructor(private sanitizer: DomSanitizer) {} + + transform(value: string): SafeHtml { + return this.sanitizer.sanitize(SecurityContext.HTML, value)!; + } +} diff --git a/frontend/app/src/assets/i18n/de.json b/frontend/app/src/assets/i18n/de.json index 214344ad..78694506 100644 --- a/frontend/app/src/assets/i18n/de.json +++ b/frontend/app/src/assets/i18n/de.json @@ -153,7 +153,10 @@ "employee": "Angestellte", "guest": "Gäste", "student": "Studierende", - "sold_out": "Ausverkauft!" + "out of stock": "Ausverkauft!", + "in stock": "Verfügbar", + "limited availability": "Begrenzte Verfügbarkeit", + "online only": "Nur online" } }, "chips": { @@ -420,6 +423,10 @@ "instruction": "Finde alle Informationen rund ums Studium und den Campus", "nothing_found": "Keine Ergebnisse" }, + "sportCourses": { + "title": "Sportkurse", + "placeholder": "Sportkurse" + }, "hebisSearch": { "title": "Bibliothekssuche", "type": "Bibliothek", diff --git a/frontend/app/src/assets/i18n/en.json b/frontend/app/src/assets/i18n/en.json index 9c7abe84..8bfd8a56 100644 --- a/frontend/app/src/assets/i18n/en.json +++ b/frontend/app/src/assets/i18n/en.json @@ -153,7 +153,10 @@ "employee": "Employees", "guest": "Guests", "student": "Students", - "sold_out": "Sold Out!" + "out of stock": "Sold Out!", + "in stock": "Available", + "limited": "Limited availability", + "online only": "Online only" } }, "chips": { @@ -420,6 +423,10 @@ "instruction": "Find all information related to your studies and campus", "nothing_found": "No results" }, + "sportCourses": { + "title": "Sport Courses", + "placeholder": "Sport courses" + }, "hebisSearch": { "title": "Library Search", "type": "Library", diff --git a/frontend/app/src/assets/icons.min.woff2 b/frontend/app/src/assets/icons.min.woff2 index 52a98aba..a7225ce0 100644 Binary files a/frontend/app/src/assets/icons.min.woff2 and b/frontend/app/src/assets/icons.min.woff2 differ diff --git a/frontend/app/src/config/profile-page-sections.ts b/frontend/app/src/config/profile-page-sections.ts index 37e80000..876147ae 100644 --- a/frontend/app/src/config/profile-page-sections.ts +++ b/frontend/app/src/config/profile-page-sections.ts @@ -93,6 +93,28 @@ export const profilePageSections: SCSection[] = [ }, ...SCSectionLinkConstantValues, }, + { + name: 'Sport Courses', + icon: SCIcon`sports_gymnastics`, + link: ['/sport-courses'], + translations: { + de: { + name: 'Sportkurse', + }, + }, + ...SCSectionLinkConstantValues, + }, + { + name: 'Job Postings', + icon: SCIcon`work`, + link: ['/jobs'], + translations: { + de: { + name: 'Stellenangebote', + }, + }, + ...SCSectionLinkConstantValues, + }, { name: 'Settings', icon: SCIcon`settings`, diff --git a/frontend/app/src/environments/environment.ts b/frontend/app/src/environments/environment.ts index b7aa5441..4eb14438 100644 --- a/frontend/app/src/environments/environment.ts +++ b/frontend/app/src/environments/environment.ts @@ -18,7 +18,7 @@ // The list of which env maps to which file can be found in `.angular-cli.json`. export const environment = { - backend_url: 'https://mobile.server.uni-frankfurt.de', + backend_url: 'http://localhost:3000', app_host: 'mobile.app.uni-frankfurt.de', custom_url_scheme: 'de.anyschool.app', backend_version: '4.1.0',