diff --git a/frontend/app/src/app/modules/data/list/food-data-list.component.ts b/frontend/app/src/app/modules/data/list/food-data-list.component.ts index f8564f2d..54fbe77a 100644 --- a/frontend/app/src/app/modules/data/list/food-data-list.component.ts +++ b/frontend/app/src/app/modules/data/list/food-data-list.component.ts @@ -12,109 +12,94 @@ * You should have received a copy of the GNU General Public License along with * this program. If not, see . */ -import {Component, OnInit} from '@angular/core'; -import {MapPosition} from '../../map/position.service'; -import {SearchPageComponent} from './search-page.component'; +import {Component} from '@angular/core'; +import {PositionService} from '../../map/position.service'; import {Geolocation} from '@capacitor/geolocation'; -import {BehaviorSubject} from 'rxjs'; +import {BehaviorSubject, catchError} from 'rxjs'; import {pauseWhen} from '../../../util/rxjs/pause-when'; +import {SCSearchFilter} from '@openstapps/core'; +import {ContextMenuService} from '../../menu/context/context-menu.service'; import {takeUntilDestroyed} from '@angular/core/rxjs-interop'; /** * Presents a list of places for eating/drinking */ @Component({ - templateUrl: 'search-page.html', - styleUrls: ['../../data/list/search-page.scss'], + templateUrl: 'food-data-list.html', }) -export class FoodDataListComponent extends SearchPageComponent implements OnInit { - title = 'canteens.title'; - - showNavigation = false; - +export class FoodDataListComponent { isNotInView$ = new BehaviorSubject(true); - /** - * Sets the forced filter to present only places for eating/drinking - */ - ngOnInit() { - this.positionService - .watchCurrentLocation({enableHighAccuracy: false, maximumAge: 1000}) - .pipe(pauseWhen(this.isNotInView$), takeUntilDestroyed(this.destroy$)) - .subscribe({ - next: (position: MapPosition) => { - this.positionService.position = position; + forcedFilter: SCSearchFilter = { + arguments: { + filters: [ + { + arguments: { + field: 'categories', + value: 'canteen', + }, + type: 'value', }, - error: async _error => { - this.positionService.position = undefined; + { + arguments: { + field: 'categories', + value: 'student canteen', + }, + type: 'value', + }, + { + arguments: { + field: 'categories', + value: 'cafe', + }, + type: 'value', + }, + { + arguments: { + field: 'categories', + value: 'restaurant', + }, + type: 'value', + }, + ], + operation: 'or', + }, + type: 'boolean', + }; + + constructor(positionService: PositionService, contextMenuService: ContextMenuService) { + positionService + .watchCurrentLocation({enableHighAccuracy: false, maximumAge: 1000}) + .pipe( + pauseWhen(this.isNotInView$), + takeUntilDestroyed(), + catchError(async _error => { + await Geolocation.checkPermissions(); + }), + ) + .subscribe({ + next(position) { + if (!position) return; + positionService.position = position; + contextMenuService.sortQuery.next([ + { + type: 'distance', + order: 'asc', + arguments: { + field: 'geo', + position: [position.longitude, position.latitude], + }, + }, + ]); + }, + async error() { + positionService.position = undefined; await Geolocation.checkPermissions(); }, }); - this.showDefaultData = true; - - this.sortQuery = [ - { - arguments: {field: 'name'}, - order: 'asc', - type: 'ducet', - }, - ]; - - this.forcedFilter = { - arguments: { - filters: [ - { - arguments: { - field: 'categories', - value: 'canteen', - }, - type: 'value', - }, - { - arguments: { - field: 'categories', - value: 'student canteen', - }, - type: 'value', - }, - { - arguments: { - field: 'categories', - value: 'cafe', - }, - type: 'value', - }, - { - arguments: { - field: 'categories', - value: 'restaurant', - }, - type: 'value', - }, - ], - operation: 'or', - }, - type: 'boolean', - }; - - if (this.positionService.position) { - this.sortQuery = [ - { - type: 'distance', - order: 'asc', - arguments: { - field: 'geo', - position: [this.positionService.position.longitude, this.positionService.position.latitude], - }, - }, - ]; - } - - super.ngOnInit(); } - async ionViewWillEnter() { - await super.ionViewWillEnter(); + ionViewWillEnter() { this.isNotInView$.next(false); } diff --git a/frontend/app/src/app/modules/data/list/food-data-list.html b/frontend/app/src/app/modules/data/list/food-data-list.html new file mode 100644 index 00000000..ef5be677 --- /dev/null +++ b/frontend/app/src/app/modules/data/list/food-data-list.html @@ -0,0 +1,7 @@ + + diff --git a/frontend/app/src/app/modules/data/list/search-page.component.ts b/frontend/app/src/app/modules/data/list/search-page.component.ts index 90ff6d8b..2eb8ebd0 100644 --- a/frontend/app/src/app/modules/data/list/search-page.component.ts +++ b/frontend/app/src/app/modules/data/list/search-page.component.ts @@ -55,17 +55,18 @@ export class SearchPageComponent implements OnInit { @Input() backUrl?: string; - isHebisAvailable = false; - /** * Signalizes that the data is being loaded */ loading = false; /** - * Display the navigation between default and library search + * Navigation elements between search pages */ - @Input() showNavigation = true; + @Input() navigation: Array<{label: string; routerLink?: string[]}> = [ + {label: 'search.type'}, + {label: 'hebisSearch.type', routerLink: ['/hebis-search']}, + ]; /** * Show default data (e.g. when there is user interaction) @@ -82,6 +83,8 @@ export class SearchPageComponent implements OnInit { */ @Input() showTopToolbar = true; + @Input() showContextMenu = true; + /** * Api query filter */ @@ -110,7 +113,7 @@ export class SearchPageComponent implements OnInit { /** * Page size of queries */ - pageSize = 30; + @Input() pageSize = 30; /** * Search value from search bar @@ -343,8 +346,13 @@ export class SearchPageComponent implements OnInit { }); } try { - const features = this.configProvider.getValue('features') as SCFeatureConfiguration; - this.isHebisAvailable = !!features.plugins?.['hebis-plugin']?.urlPath; + // TODO: make this hack more generic + if (this.navigation[1]?.routerLink?.[0] === '/hebis-search') { + const features = this.configProvider.getValue('features') as SCFeatureConfiguration; + if (features.plugins?.['hebis-plugin']?.urlPath === undefined) { + this.navigation = []; + } + } } catch (error) { this.logger.error(error); } diff --git a/frontend/app/src/app/modules/data/list/search-page.html b/frontend/app/src/app/modules/data/list/search-page.html index ee89ae42..bb3e9b64 100644 --- a/frontend/app/src/app/modules/data/list/search-page.html +++ b/frontend/app/src/app/modules/data/list/search-page.html @@ -13,7 +13,9 @@ ~ this program. If not, see . --> - +@if (showContextMenu) { + +} @if (showDrawer && showTopToolbar) { @@ -37,23 +39,30 @@ class="filterable" [autofocus]="!showDefaultData" > - - - + @if (showContextMenu) { + + + + } - @if (showNavigation && isHebisAvailable) { + @if (navigation.length > 0) { - {{ 'search.type' | translate }} - {{ 'hebisSearch.type' | translate }} - + @for (target of navigation; track target) { + @if (target.routerLink) { + {{ target.label | translate }} + + } @else { + {{ target.label | translate }} + } + } } diff --git a/frontend/app/src/app/modules/data/list/search-page.scss b/frontend/app/src/app/modules/data/list/search-page.scss index ce72eed3..191f3de1 100644 --- a/frontend/app/src/app/modules/data/list/search-page.scss +++ b/frontend/app/src/app/modules/data/list/search-page.scss @@ -22,6 +22,9 @@ ion-toolbar { --ion-color-base: none !important; + + // account for back button + min-height: 42px; } ion-toolbar:first-of-type { diff --git a/frontend/app/src/app/modules/data/types/article/article-item.component.ts b/frontend/app/src/app/modules/data/types/article/article-item.component.ts index 66aea6bd..391f37cd 100644 --- a/frontend/app/src/app/modules/data/types/article/article-item.component.ts +++ b/frontend/app/src/app/modules/data/types/article/article-item.component.ts @@ -22,6 +22,7 @@ import {DataListItemComponent} from '../../list/data-list-item.component'; @Component({ selector: 'stapps-article-item', templateUrl: 'article-list-item.html', + styleUrl: 'article-list-item.scss', }) export class ArticleListItemComponent extends DataListItemComponent { /** diff --git a/frontend/app/src/app/modules/data/types/article/article-list-item.html b/frontend/app/src/app/modules/data/types/article/article-list-item.html index bf739672..f32c9065 100644 --- a/frontend/app/src/app/modules/data/types/article/article-list-item.html +++ b/frontend/app/src/app/modules/data/types/article/article-list-item.html @@ -13,26 +13,20 @@ ~ this program. If not, see . --> - - - -

{{ 'name' | thingTranslate: item }}

-

- @for (author of item.authors; track author) { - {{ 'name' | thingTranslate: author }} - } - @if (item.authors && item.authors && item.firstPublished) { - ,  - } - @if (item.firstPublished && !item.lastPublished) { - {{ item.firstPublished }} - } @else { - @if (item.firstPublished && item.lastPublished) { - {{ [item.firstPublished, item.lastPublished] | join: ' - ' }} - } - } -

- {{ 'categories' | thingTranslate: item }} -
-
-
+{{ 'name' | thingTranslate: item }} +

+ @for (author of item.authors; track author) { + {{ 'name' | thingTranslate: author }} + } + @if (item.authors && item.authors && item.firstPublished) { + ,  + } + @if (item.firstPublished && !item.lastPublished) { + {{ item.firstPublished }} + } @else { + @if (item.firstPublished && item.lastPublished) { + {{ [item.firstPublished, item.lastPublished] | join: ' - ' }} + } + } +

+ {{ 'categories' | thingTranslate: item }} diff --git a/frontend/app/src/app/modules/data/types/article/article-list-item.scss b/frontend/app/src/app/modules/data/types/article/article-list-item.scss new file mode 100644 index 00000000..5c3cde6d --- /dev/null +++ b/frontend/app/src/app/modules/data/types/article/article-list-item.scss @@ -0,0 +1,3 @@ +p.title-sub { + white-space: unset; +} diff --git a/frontend/app/src/app/modules/data/types/book/book-list-item.component.ts b/frontend/app/src/app/modules/data/types/book/book-list-item.component.ts index e6b3bc23..dd324058 100644 --- a/frontend/app/src/app/modules/data/types/book/book-list-item.component.ts +++ b/frontend/app/src/app/modules/data/types/book/book-list-item.component.ts @@ -22,6 +22,7 @@ import {DataListItemComponent} from '../../list/data-list-item.component'; @Component({ selector: 'stapps-book-list-item', templateUrl: 'book-list-item.html', + styleUrl: 'book-list-item.scss', }) export class BookListItemComponent extends DataListItemComponent { /** diff --git a/frontend/app/src/app/modules/data/types/book/book-list-item.html b/frontend/app/src/app/modules/data/types/book/book-list-item.html index bf739672..f32c9065 100644 --- a/frontend/app/src/app/modules/data/types/book/book-list-item.html +++ b/frontend/app/src/app/modules/data/types/book/book-list-item.html @@ -13,26 +13,20 @@ ~ this program. If not, see . --> - - - -

{{ 'name' | thingTranslate: item }}

-

- @for (author of item.authors; track author) { - {{ 'name' | thingTranslate: author }} - } - @if (item.authors && item.authors && item.firstPublished) { - ,  - } - @if (item.firstPublished && !item.lastPublished) { - {{ item.firstPublished }} - } @else { - @if (item.firstPublished && item.lastPublished) { - {{ [item.firstPublished, item.lastPublished] | join: ' - ' }} - } - } -

- {{ 'categories' | thingTranslate: item }} -
-
-
+{{ 'name' | thingTranslate: item }} +

+ @for (author of item.authors; track author) { + {{ 'name' | thingTranslate: author }} + } + @if (item.authors && item.authors && item.firstPublished) { + ,  + } + @if (item.firstPublished && !item.lastPublished) { + {{ item.firstPublished }} + } @else { + @if (item.firstPublished && item.lastPublished) { + {{ [item.firstPublished, item.lastPublished] | join: ' - ' }} + } + } +

+ {{ 'categories' | thingTranslate: item }} diff --git a/frontend/app/src/app/modules/data/types/book/book-list-item.scss b/frontend/app/src/app/modules/data/types/book/book-list-item.scss new file mode 100644 index 00000000..5c3cde6d --- /dev/null +++ b/frontend/app/src/app/modules/data/types/book/book-list-item.scss @@ -0,0 +1,3 @@ +p.title-sub { + white-space: unset; +} diff --git a/frontend/app/src/app/modules/data/types/periodical/periodical-list-item.component.ts b/frontend/app/src/app/modules/data/types/periodical/periodical-list-item.component.ts index 1dc81d6b..951ebe70 100644 --- a/frontend/app/src/app/modules/data/types/periodical/periodical-list-item.component.ts +++ b/frontend/app/src/app/modules/data/types/periodical/periodical-list-item.component.ts @@ -22,6 +22,7 @@ import {DataListItemComponent} from '../../list/data-list-item.component'; @Component({ selector: 'stapps-periodical-list-item', templateUrl: 'periodical-list-item.html', + styleUrl: 'periodical-list-item.scss', }) export class PeriodicalListItemComponent extends DataListItemComponent { /** diff --git a/frontend/app/src/app/modules/data/types/periodical/periodical-list-item.html b/frontend/app/src/app/modules/data/types/periodical/periodical-list-item.html index bf739672..f32c9065 100644 --- a/frontend/app/src/app/modules/data/types/periodical/periodical-list-item.html +++ b/frontend/app/src/app/modules/data/types/periodical/periodical-list-item.html @@ -13,26 +13,20 @@ ~ this program. If not, see . --> - - - -

{{ 'name' | thingTranslate: item }}

-

- @for (author of item.authors; track author) { - {{ 'name' | thingTranslate: author }} - } - @if (item.authors && item.authors && item.firstPublished) { - ,  - } - @if (item.firstPublished && !item.lastPublished) { - {{ item.firstPublished }} - } @else { - @if (item.firstPublished && item.lastPublished) { - {{ [item.firstPublished, item.lastPublished] | join: ' - ' }} - } - } -

- {{ 'categories' | thingTranslate: item }} -
-
-
+{{ 'name' | thingTranslate: item }} +

+ @for (author of item.authors; track author) { + {{ 'name' | thingTranslate: author }} + } + @if (item.authors && item.authors && item.firstPublished) { + ,  + } + @if (item.firstPublished && !item.lastPublished) { + {{ item.firstPublished }} + } @else { + @if (item.firstPublished && item.lastPublished) { + {{ [item.firstPublished, item.lastPublished] | join: ' - ' }} + } + } +

+ {{ 'categories' | thingTranslate: item }} diff --git a/frontend/app/src/app/modules/data/types/periodical/periodical-list-item.scss b/frontend/app/src/app/modules/data/types/periodical/periodical-list-item.scss new file mode 100644 index 00000000..5c3cde6d --- /dev/null +++ b/frontend/app/src/app/modules/data/types/periodical/periodical-list-item.scss @@ -0,0 +1,3 @@ +p.title-sub { + white-space: unset; +} diff --git a/frontend/app/src/app/modules/data/types/place/place-list-item.html b/frontend/app/src/app/modules/data/types/place/place-list-item.html index 5de725a6..7ac5bdf6 100644 --- a/frontend/app/src/app/modules/data/types/place/place-list-item.html +++ b/frontend/app/src/app/modules/data/types/place/place-list-item.html @@ -12,36 +12,29 @@ ~ You should have received a copy of the GNU General Public License along with ~ this program. If not, see . --> - - @if (distance | async; as distance) { - - - {{ distance | metersLocalized }} - - } - {{ 'name' | thingTranslate: _item }} @if (_item.type !== 'floor') { - - @if (_item.categories && _item.type !== 'building') { - +

+ + @if (_item.type !== 'building' && _item.inPlace) { + + {{ 'name' | thingTranslate: _item.inPlace }} + } +

+ + @if (_item.categories && _item.type !== 'building') { {{ 'categories' | thingTranslate: _item | join: ', ' | titlecase }} - - - } @else { - + } @else { {{ 'type' | thingTranslate: _item | titlecase }} - - - } + } + @if (distance | async; as distance) { + + + {{ distance | metersLocalized }} + + } +
} @if (_item.description) {

{{ 'description' | thingTranslate: _item }}

} -@if (_item.type !== 'building') { - @if (_item.inPlace) { - - {{ 'name' | thingTranslate: _item.inPlace }} - - } -} diff --git a/frontend/app/src/app/modules/data/types/place/place-list-item.scss b/frontend/app/src/app/modules/data/types/place/place-list-item.scss index 4667de0d..8b403098 100644 --- a/frontend/app/src/app/modules/data/types/place/place-list-item.scss +++ b/frontend/app/src/app/modules/data/types/place/place-list-item.scss @@ -15,6 +15,8 @@ ion-note { display: flex; + align-items: center; + justify-content: flex-start; > ion-label { display: inline-flex; @@ -23,15 +25,14 @@ ion-note { } } -ion-label + ion-label.distance::before { - content: '•'; - margin-inline: var(--spacing-xs); -} - -.in-place { +p.title-sub { display: flex; align-items: center; - justify-content: flex-end; +} + +ion-label + ion-label::before { + content: '•'; + margin-inline: var(--spacing-xs); } stapps-opening-hours ::ng-deep div { diff --git a/frontend/app/src/app/modules/hebis/hebis-data.provider.ts b/frontend/app/src/app/modules/hebis/hebis-data.provider.ts index d989190a..ea7f798e 100644 --- a/frontend/app/src/app/modules/hebis/hebis-data.provider.ts +++ b/frontend/app/src/app/modules/hebis/hebis-data.provider.ts @@ -21,6 +21,7 @@ import {StAppsWebHttpClient} from '../data/stapps-web-http-client.provider'; import {HttpClient} from '@angular/common/http'; import {DataProvider} from '../data/data.provider'; import {SCHebisSearchRoute} from './protocol/route'; +import {SCSearchRequest, SCSearchResponse} from '@openstapps/core'; const HEBIS_PREFIX = 'HEB'; @@ -46,12 +47,6 @@ export class HebisDataProvider extends DataProvider { */ private readonly hebisSearchRoute = new SCHebisSearchRoute(); - /** - * TODO - * @param stAppsWebHttpClient TODO - * @param storageProvider TODO - * @param httpClient TODO - */ constructor( stAppsWebHttpClient: StAppsWebHttpClient, storageProvider: StorageProvider, @@ -63,6 +58,23 @@ export class HebisDataProvider extends DataProvider { this.client = new Client(stAppsWebHttpClient, this.backendUrl, this.appVersion); } + override async search(query: SCSearchRequest): Promise { + const response = await this.hebisSearch({ + query: query.query ?? '', + page: query.from, + }); + console.log(response.pagination); + + return { + data: response.data, + facets: [], + pagination: response.pagination, + stats: { + time: Number.NaN, + }, + }; + } + /** * Send a search request to the backend * diff --git a/frontend/app/src/app/modules/hebis/list/hebis-search-page.component.ts b/frontend/app/src/app/modules/hebis/list/hebis-search-page.component.ts index fcdfd233..98ea723e 100644 --- a/frontend/app/src/app/modules/hebis/list/hebis-search-page.component.ts +++ b/frontend/app/src/app/modules/hebis/list/hebis-search-page.component.ts @@ -12,13 +12,12 @@ * You should have received a copy of the GNU General Public License along with * this program. If not, see . */ -import {Component, Input, OnInit} from '@angular/core'; -import {combineLatest} from 'rxjs'; -import {debounceTime, distinctUntilChanged, startWith} from 'rxjs/operators'; -import {SearchPageComponent} from '../../data/list/search-page.component'; +import {Component} from '@angular/core'; import {HebisDataProvider} from '../hebis-data.provider'; import {takeUntilDestroyed} from '@angular/core/rxjs-interop'; import {DataProvider} from '../../data/data.provider'; +import {DataRoutingService} from '../../data/data-routing.service'; +import {Router} from '@angular/router'; /** * HebisSearchPageComponent queries things and shows list of things as search results and filter as context menu @@ -29,111 +28,16 @@ import {DataProvider} from '../../data/data.provider'; styleUrls: ['../../data/list/search-page.scss'], providers: [{provide: DataProvider, useClass: HebisDataProvider}], }) -export class HebisSearchPageComponent extends SearchPageComponent implements OnInit { - /** - * If routing should be done if the user clicks on an item - */ - @Input() itemRouting? = true; - - /** - * Current page to start query - */ - page = 0; - - /** - * Fetches items with set query configuration - * @param append If true fetched data gets appended to existing, override otherwise (default false) - */ - protected async fetchAndUpdateItems(append = false): Promise { - // build query search options - const searchOptions: {page: number; query: string} = { - page: this.page, - query: '', - }; - - if (this.queryText && this.queryText.length > 0) { - // add query string - searchOptions.query = this.queryText; - } - - return (this.dataProvider as HebisDataProvider).hebisSearch(searchOptions).then( - async result => { - /*this.singleTypeResponse = - result.facets.find(facet => facet.field === 'type')?.buckets - .length === 1;*/ - if (append) { - let items = await this.items; - // append results - items = [...items, ...result.data]; - this.items = (async () => items)(); - } else { - // override items with results - this.items = (async () => { - return result.data; - })(); - } - }, - async error => { - const alert: HTMLIonAlertElement = await this.alertController.create({ - buttons: ['Dismiss'], - header: 'Error', - subHeader: error.message, - }); - - await alert.present(); - }, - ); - } - - /** - * Loads next page of things - */ - // eslint-disable-next-line @typescript-eslint/no-explicit-any - async loadMore(): Promise { - this.page += 1; - await this.fetchAndUpdateItems(true); - } - - ngOnInit() { - //this.fetchAndUpdateItems(); - this.initialize(); - - combineLatest([ - this.queryTextChanged.pipe( - debounceTime(this.searchQueryDueTime), - distinctUntilChanged(), - startWith(this.queryText), - ), - ]) - .pipe(takeUntilDestroyed(this.destroy$)) - .subscribe(async query => { - this.queryText = query[0]; - this.page = 0; - if (this.queryText?.length > 0 || this.showDefaultData) { - await this.fetchAndUpdateItems(); - this.queryChanged.next(); - } - }); - this.settingsProvider.settingsActionChanged$ - .pipe(takeUntilDestroyed(this.destroy$)) - .subscribe(({type, payload}) => { - if (type === 'stapps.settings.changed') { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - const {category, name, value} = payload!; - this.logger.log(`received event "settings.changed" with category: - ${category}, name: ${name}, value: ${JSON.stringify(value)}`); - } - }); - this.dataRoutingService +export class HebisSearchPageComponent { + constructor(dataRoutingService: DataRoutingService, router: Router) { + dataRoutingService .itemSelectListener() - .pipe(takeUntilDestroyed(this.destroy$)) + .pipe(takeUntilDestroyed()) .subscribe(async item => { - if (this.itemRouting) { - void this.router.navigate( - ['hebis-detail', (item.origin && 'originalId' in item.origin && item.origin['originalId']) || ''], - {state: {item}}, - ); - } + void router.navigate( + ['hebis-detail', (item.origin && 'originalId' in item.origin && item.origin['originalId']) || ''], + {state: {item}}, + ); }); } } diff --git a/frontend/app/src/app/modules/hebis/list/hebis-search-page.html b/frontend/app/src/app/modules/hebis/list/hebis-search-page.html index 2f63166c..616d18cc 100644 --- a/frontend/app/src/app/modules/hebis/list/hebis-search-page.html +++ b/frontend/app/src/app/modules/hebis/list/hebis-search-page.html @@ -13,52 +13,13 @@ ~ this program. If not, see . --> - - - - - - {{ 'hebisSearch.title' | translate }} - - - - - - - - {{ 'search.type' | translate }} - - {{ 'hebisSearch.type' | translate }} - - - - - -
- {{ 'hebisSearch.instruction' | translate }} -
- -
+ + diff --git a/frontend/app/src/app/modules/jobs/page/jobs-page.html b/frontend/app/src/app/modules/jobs/page/jobs-page.html index 80018d47..af61b81d 100644 --- a/frontend/app/src/app/modules/jobs/page/jobs-page.html +++ b/frontend/app/src/app/modules/jobs/page/jobs-page.html @@ -2,7 +2,7 @@ [title]="'jobs.title' | translate" [placeholder]="'jobs.placeholder' | translate" [showDefaultData]="true" - [showNavigation]="false" + [navigation]="[]" [forcedFilter]="forcedFilter" [backUrl]="'/'" > diff --git a/frontend/app/src/app/modules/schedule/page/choose-events-page.html b/frontend/app/src/app/modules/schedule/page/choose-events-page.html index 55cc1c78..fab2de77 100644 --- a/frontend/app/src/app/modules/schedule/page/choose-events-page.html +++ b/frontend/app/src/app/modules/schedule/page/choose-events-page.html @@ -13,7 +13,7 @@ ~ this program. If not, see . --> . */ +.can-go-back ion-header ion-back-button { + display: block; +} + app-root { .button { --padding-top: var(--spacing-sm);