- {{'name' | thingTranslate: offer.inPlace}},
-
- {{offer.availabilityStarts | amDateFormat:'ll'}}
+ {{
+ 'name' | thingTranslate: offer.inPlace
+ }},
+
+
+ {{
+ (offer.availabilityRange.gt
+ ? offer.availabilityRange.gt
+ : offer.availabilityRange.gte
+ ) | amDateFormat: 'll'
+ }}
- {{group | titlecase}}
+ {{ group | titlecase }}
- {{offer.prices[group] | currency:'EUR':'symbol':undefined:'de'}}
+
+ {{
+ offer.prices[group] | currency: 'EUR':'symbol':undefined:'de'
+ }}
+
diff --git a/src/app/modules/data/elements/offers-in-list.component.ts b/src/app/modules/data/elements/offers-in-list.component.ts
index 38dbe4eb..da2ac50e 100644
--- a/src/app/modules/data/elements/offers-in-list.component.ts
+++ b/src/app/modules/data/elements/offers-in-list.component.ts
@@ -13,7 +13,10 @@
* this program. If not, see
.
*/
import {Component, Input} from '@angular/core';
-import {SCAcademicPriceGroup, SCThingThatCanBeOfferedOffer} from '@openstapps/core';
+import {
+ SCAcademicPriceGroup,
+ SCThingThatCanBeOfferedOffer,
+} from '@openstapps/core';
/**
* TODO
diff --git a/src/app/modules/data/elements/offers-in-list.html b/src/app/modules/data/elements/offers-in-list.html
index 0c5a0e9a..96c7e8f3 100644
--- a/src/app/modules/data/elements/offers-in-list.html
+++ b/src/app/modules/data/elements/offers-in-list.html
@@ -1,6 +1,9 @@
-
{{offers[0].prices.default | currency:'EUR':'symbol':undefined:'de'}}
+
+ {{ offers[0].prices.default | currency: 'EUR':'symbol':undefined:'de' }}
+
- {{offers[0].inPlace.name}} 1">...
+ {{ offers[0].inPlace.name
+ }} 1">...
diff --git a/src/app/modules/data/elements/origin-detail.html b/src/app/modules/data/elements/origin-detail.html
index 09d01f89..4c73e1e4 100644
--- a/src/app/modules/data/elements/origin-detail.html
+++ b/src/app/modules/data/elements/origin-detail.html
@@ -1,27 +1,61 @@
- {{'data.types.origin.TITLE' | translate | titlecase}}: {{'data.types.origin.USER' | translate | titlecase}}
+ {{ 'data.types.origin.TITLE' | translate | titlecase }}:
+ {{ 'data.types.origin.USER' | translate | titlecase }}
- {{'data.types.origin.detail.CREATED' | translate | titlecase}}: {{origin.created | amDateFormat:'ll'}}
- {{'data.types.origin.detail.UPDATED' | translate | titlecase}}: {{origin.updated | amDateFormat:'ll'}}
- {{'data.types.origin.detail.MODIFIED' | translate | titlecase}}: {{origin.modified | amDateFormat:'ll'}}
- {{'data.types.origin.detail.MAINTAINER' | translate }}: {{origin.name}}
+
+ {{ 'data.types.origin.detail.CREATED' | translate | titlecase }}:
+ {{ origin.created | amDateFormat: 'll' }}
+
+
+ {{ 'data.types.origin.detail.UPDATED' | translate | titlecase }}:
+ {{ origin.updated | amDateFormat: 'll' }}
+
+
+ {{ 'data.types.origin.detail.MODIFIED' | translate | titlecase }}:
+ {{ origin.modified | amDateFormat: 'll' }}
+
+
+ {{ 'data.types.origin.detail.MAINTAINER' | translate }}: {{ origin.name }}
+
- {{'data.types.origin.detail.MAINTAINER' | translate }}: {{origin.maintainer.name}}
+ {{ 'data.types.origin.detail.MAINTAINER' | translate }}:
+ {{
+ origin.maintainer.name
+ }}
- {{'data.types.origin.TITLE' | translate | titlecase}}: {{'data.types.origin.REMOTE' | translate | titlecase}}
+ {{ 'data.types.origin.TITLE' | translate | titlecase }}:
+ {{ 'data.types.origin.REMOTE' | translate | titlecase }}
- {{'data.types.origin.detail.INDEXED' | translate | titlecase}}: {{origin.indexed | amDateFormat:'ll'}}
- {{'data.types.origin.detail.MODIFIED' | translate | titlecase}}: {{origin.modified | amDateFormat:'ll'}}
- {{'data.types.origin.detail.MAINTAINER' | translate }}: {{origin.name}}
+
+ {{ 'data.types.origin.detail.INDEXED' | translate | titlecase }}:
+ {{ origin.indexed | amDateFormat: 'll' }}
+
+
+ {{ 'data.types.origin.detail.MODIFIED' | translate | titlecase }}:
+ {{ origin.modified | amDateFormat: 'll' }}
+
+
+ {{ 'data.types.origin.detail.MAINTAINER' | translate }}: {{ origin.name }}
+
- {{'data.types.origin.detail.MAINTAINER' | translate | titlecase}}: {{origin.maintainer.name}}
+ {{ 'data.types.origin.detail.MAINTAINER' | translate | titlecase }}:
+ {{
+ origin.maintainer.name
+ }}
- {{'data.types.origin.detail.RESPONSIBLE' | translate | titlecase}}: {{origin.responsibleEntity.name}}
+ {{ 'data.types.origin.detail.RESPONSIBLE' | translate | titlecase }}:
+ {{
+ origin.responsibleEntity.name
+ }}
diff --git a/src/app/modules/data/elements/origin-in-list.html b/src/app/modules/data/elements/origin-in-list.html
index 4dd7fc10..6c406b4d 100644
--- a/src/app/modules/data/elements/origin-in-list.html
+++ b/src/app/modules/data/elements/origin-in-list.html
@@ -1,7 +1,7 @@
-
{{origin.created | amDateFormat:'ll'}}
+
{{ origin.created | amDateFormat: 'll' }}
-
{{origin.indexed | amDateFormat:'ll'}}
+
{{ origin.indexed | amDateFormat: 'll' }}
diff --git a/src/app/modules/data/elements/simple-card.component.ts b/src/app/modules/data/elements/simple-card.component.ts
index 7cbd3056..57084006 100644
--- a/src/app/modules/data/elements/simple-card.component.ts
+++ b/src/app/modules/data/elements/simple-card.component.ts
@@ -27,29 +27,34 @@ export class SimpleCardComponent {
* TODO
*/
areThings = false;
+
/**
* TODO
*/
@Input() content: string | string[] | SCThing[];
+
/**
* TODO
*/
@Input() isMarkdown = false;
+
/**
* TODO
*/
@Input() title: string;
+
/**
* TODO
*/
- // tslint:disable-next-line:prefer-function-over-method
+ // eslint-disable-next-line class-methods-use-this
isString(data: unknown): data is string {
return typeof data === 'string';
}
+
/**
* TODO
*/
- // tslint:disable-next-line:prefer-function-over-method
+ // eslint-disable-next-line class-methods-use-this
isThing(something: unknown): something is SCThing {
return isThing(something);
}
diff --git a/src/app/modules/data/elements/simple-card.html b/src/app/modules/data/elements/simple-card.html
index 06e01fa8..49889ff6 100644
--- a/src/app/modules/data/elements/simple-card.html
+++ b/src/app/modules/data/elements/simple-card.html
@@ -1,26 +1,29 @@
- {{title}}
+ {{ title }}
-
+
- {{content}}
+ {{ content }}
-
+
-
- {{'name' | thingTranslate: thing}}
+
+ {{ 'name' | thingTranslate: thing }}
- {{text}}
+ {{ text }}
diff --git a/src/app/modules/data/elements/skeleton-list-item.component.ts b/src/app/modules/data/elements/skeleton-list-item.component.ts
index 8647283c..0fb5dbff 100644
--- a/src/app/modules/data/elements/skeleton-list-item.component.ts
+++ b/src/app/modules/data/elements/skeleton-list-item.component.ts
@@ -22,5 +22,4 @@ import {Component} from '@angular/core';
templateUrl: 'skeleton-list-item.html',
styleUrls: ['skeleton-list-item.scss'],
})
-export class SkeletonListItem {
-}
+export class SkeletonListItemComponent {}
diff --git a/src/app/modules/data/elements/skeleton-list-item.html b/src/app/modules/data/elements/skeleton-list-item.html
index 80593d77..a205b15d 100644
--- a/src/app/modules/data/elements/skeleton-list-item.html
+++ b/src/app/modules/data/elements/skeleton-list-item.html
@@ -1,18 +1,18 @@
-
+
-
-
+
+
-
+
-
+
diff --git a/src/app/modules/data/elements/skeleton-segment-button.component.ts b/src/app/modules/data/elements/skeleton-segment-button.component.ts
index dae4a0df..4d747806 100644
--- a/src/app/modules/data/elements/skeleton-segment-button.component.ts
+++ b/src/app/modules/data/elements/skeleton-segment-button.component.ts
@@ -21,5 +21,4 @@ import {Component} from '@angular/core';
selector: 'stapps-skeleton-segment-button',
templateUrl: 'skeleton-segment-button.html',
})
-export class SkeletonSegment {
-}
+export class SkeletonSegmentComponent {}
diff --git a/src/app/modules/data/elements/skeleton-segment-button.html b/src/app/modules/data/elements/skeleton-segment-button.html
index ad9cad92..edf95f6b 100644
--- a/src/app/modules/data/elements/skeleton-segment-button.html
+++ b/src/app/modules/data/elements/skeleton-segment-button.html
@@ -1,4 +1,3 @@
-
+
-
diff --git a/src/app/modules/data/elements/skeleton-simple-card.component.ts b/src/app/modules/data/elements/skeleton-simple-card.component.ts
index 71c0beb5..3c00da6a 100644
--- a/src/app/modules/data/elements/skeleton-simple-card.component.ts
+++ b/src/app/modules/data/elements/skeleton-simple-card.component.ts
@@ -21,5 +21,4 @@ import {Component} from '@angular/core';
selector: 'stapps-skeleton-simple-card',
templateUrl: 'skeleton-simple-card.html',
})
-export class SkeletonSimpleCard {
-}
+export class SkeletonSimpleCardComponent {}
diff --git a/src/app/modules/data/elements/skeleton-simple-card.html b/src/app/modules/data/elements/skeleton-simple-card.html
index a8f317c1..2e51180b 100644
--- a/src/app/modules/data/elements/skeleton-simple-card.html
+++ b/src/app/modules/data/elements/skeleton-simple-card.html
@@ -3,6 +3,6 @@
-
+
diff --git a/src/app/modules/data/list/data-list-item.component.ts b/src/app/modules/data/list/data-list-item.component.ts
index 9bcfa883..9966f69e 100644
--- a/src/app/modules/data/list/data-list-item.component.ts
+++ b/src/app/modules/data/list/data-list-item.component.ts
@@ -24,7 +24,7 @@ import {DataRoutingService} from '../data-routing.service';
styleUrls: ['data-list-item.scss'],
templateUrl: 'data-list-item.html',
})
-export class DataListItem {
+export class DataListItemComponent {
/**
* Whether or not the list item should show a thumbnail
*/
diff --git a/src/app/modules/data/list/data-list-item.html b/src/app/modules/data/list/data-list-item.html
index 19ad4088..1dae60a2 100644
--- a/src/app/modules/data/list/data-list-item.html
+++ b/src/app/modules/data/list/data-list-item.html
@@ -1,36 +1,90 @@
-
-
-
-
+
+
+
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
- {{'name' | thingTranslate: item}}
+ {{ 'name' | thingTranslate: item }}
-
-
+
+
-
+
diff --git a/src/app/modules/data/list/data-list.component.spec.ts b/src/app/modules/data/list/data-list.component.spec.ts
index 9f4ec078..db9f8b74 100644
--- a/src/app/modules/data/list/data-list.component.spec.ts
+++ b/src/app/modules/data/list/data-list.component.spec.ts
@@ -9,12 +9,9 @@ describe('DataListComponent', () => {
beforeEach(async(() => {
TestBed.configureTestingModule({
- declarations: [ DataListComponent ],
- imports: [
- TranslateModule.forRoot(),
- ]
- })
- .compileComponents();
+ declarations: [DataListComponent],
+ imports: [TranslateModule.forRoot()],
+ }).compileComponents();
}));
beforeEach(() => {
diff --git a/src/app/modules/data/list/data-list.component.ts b/src/app/modules/data/list/data-list.component.ts
index fdf3242a..9b7de7c5 100644
--- a/src/app/modules/data/list/data-list.component.ts
+++ b/src/app/modules/data/list/data-list.component.ts
@@ -19,6 +19,7 @@ import {
HostListener,
Input,
OnChanges,
+ OnDestroy,
OnInit,
Output,
SimpleChanges,
@@ -36,41 +37,48 @@ import {BehaviorSubject, Observable, Subscription} from 'rxjs';
templateUrl: 'data-list.html',
styleUrls: ['data-list.scss'],
})
-
-export class DataListComponent implements OnChanges, OnInit {
+export class DataListComponent implements OnChanges, OnInit, OnDestroy {
/**
* Amount of list items left to show (in percent) that should trigger a data reload
*/
private readonly reloadThreshold = 0.2;
+
/**
* All SCThings to display
*/
@Input() items?: SCThings[];
+
/**
* Stream of SCThings for virtual scroll to consume
*/
itemStream = new BehaviorSubject([]);
+
/**
* Output binding to trigger pagination fetch
*/
+ // eslint-disable-next-line @angular-eslint/no-output-rename
@Output('loadmore') loadMore = new EventEmitter();
+
/**
* Emits when scroll view should reset to top
*/
@Input() resetToTop?: Observable;
+
/**
* Indicates whether or not the list is to display SCThings of a single type
*/
@Input() singleType = false;
+
/**
* Items that display the skeleton list
*/
skeletonItems: number[];
+
/**
* Array of all subscriptions to Observables
*/
subscriptions: Subscription[] = [];
- // tslint:disable-next-line: completed-docs
+
@ViewChild(CdkVirtualScrollViewport) viewPort: CdkVirtualScrollViewport;
/**
@@ -79,38 +87,39 @@ export class DataListComponent implements OnChanges, OnInit {
@HostListener('window.resize', ['$event'])
calcSkeletonItems() {
const itemHeight = 122;
- this.skeletonItems = new Array(ceil(window.innerHeight / itemHeight));
+ this.skeletonItems = Array.from({
+ length: ceil(window.innerHeight / itemHeight),
+ });
}
/**
* Uniquely identifies item at a certain list index
*/
- // tslint:disable-next-line:prefer-function-over-method
+ // eslint-disable-next-line class-methods-use-this
identifyItem(_index: number, item: SCThings) {
return item.uid;
}
- // tslint:disable-next-line: completed-docs
ngOnChanges(changes: SimpleChanges): void {
if (Array.isArray(this.items) && typeof changes.items !== 'undefined') {
this.itemStream.next(this.items);
}
}
- // tslint:disable-next-line: completed-docs
ngOnDestroy(): void {
for (const subscription of this.subscriptions) {
subscription.unsubscribe();
}
}
- // tslint:disable-next-line: completed-docs
ngOnInit(): void {
this.calcSkeletonItems();
if (typeof this.resetToTop !== 'undefined') {
- this.subscriptions.push(this.resetToTop.subscribe(() => {
- this.viewPort.scrollToIndex(0);
- }));
+ this.subscriptions.push(
+ this.resetToTop.subscribe(() => {
+ this.viewPort.scrollToIndex(0);
+ }),
+ );
}
}
@@ -125,7 +134,10 @@ export class DataListComponent implements OnChanges, OnInit {
* Function to call whenever scroll view visible range changed
*/
scrolled(_index: number) {
- if ((this.items?.length ?? 0) - this.viewPort.getRenderedRange().end <= (this.items?.length ?? 0) * this.reloadThreshold) {
+ if (
+ (this.items?.length ?? 0) - this.viewPort.getRenderedRange().end <=
+ (this.items?.length ?? 0) * this.reloadThreshold
+ ) {
this.notifyLoadMore();
}
}
diff --git a/src/app/modules/data/list/data-list.html b/src/app/modules/data/list/data-list.html
index c949bee9..55510277 100644
--- a/src/app/modules/data/list/data-list.html
+++ b/src/app/modules/data/list/data-list.html
@@ -1,17 +1,27 @@
-
+
-
+
-
-
- {{'search.nothing_found' | translate | titlecase}}
+
+
+ {{ 'search.nothing_found' | translate | titlecase }}
-
-
+
+
diff --git a/src/app/modules/data/list/food-data-list.component.ts b/src/app/modules/data/list/food-data-list.component.ts
index 27cc3139..7b07dd94 100644
--- a/src/app/modules/data/list/food-data-list.component.ts
+++ b/src/app/modules/data/list/food-data-list.component.ts
@@ -37,11 +37,11 @@ export class FoodDataListComponent extends SearchPageComponent {
type: 'value',
},
{
- arguments: {
- field: 'categories',
- value: 'student canteen',
- },
- type: 'value',
+ arguments: {
+ field: 'categories',
+ value: 'student canteen',
+ },
+ type: 'value',
},
{
arguments: {
diff --git a/src/app/modules/data/list/search-page.component.ts b/src/app/modules/data/list/search-page.component.ts
index a43d3ff6..100bf20b 100644
--- a/src/app/modules/data/list/search-page.component.ts
+++ b/src/app/modules/data/list/search-page.component.ts
@@ -12,7 +12,7 @@
* 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 {Component, Input, OnDestroy, OnInit} from '@angular/core';
import {Router} from '@angular/router';
import {AlertController} from '@ionic/angular';
import {
@@ -38,51 +38,62 @@ import {DataProvider} from '../data.provider';
templateUrl: 'search-page.html',
providers: [ContextMenuService],
})
-export class SearchPageComponent implements OnInit {
+export class SearchPageComponent implements OnInit, OnDestroy {
/**
* Api query filter
*/
filterQuery: SCSearchFilter | undefined;
+
/**
* Filters the search should be initialized with
*/
@Input() forcedFilter?: SCSearchFilter;
+
/**
* Thing counter to start query the next page from
*/
from = 0;
+
/**
* Container for queried things
*/
items: Promise;
+
/**
* Page size of queries
*/
pageSize = 30;
+
/**
* Search value from search bar
*/
queryText: string;
+
/**
* Emits when there is a change in the query (search, sort or filter changed)
*/
queryChanged = new Subject();
+
/**
* Subject to handle search text changes
*/
queryTextChanged = new Subject();
+
/**
* Time to wait for search query if search text is changing
*/
searchQueryDueTime = 1000;
+
/**
* Search response only ever contains a single SCThingType
*/
singleTypeResponse = false;
+
/**
* Api query sorting
*/
sortQuery: SCSearchSort | undefined;
+
/**
* Array of all subscriptions to Observables
*/
@@ -110,21 +121,23 @@ export class SearchPageComponent implements OnInit {
) {
this.initialize();
- combineLatest(
- [this.queryTextChanged.pipe(debounceTime(this.searchQueryDueTime),
+ combineLatest([
+ this.queryTextChanged.pipe(
+ debounceTime(this.searchQueryDueTime),
distinctUntilChanged(),
startWith(this.queryText),
),
- this.contextMenuService.filterQueryChanged$.pipe(startWith(this.filterQuery)),
+ this.contextMenuService.filterQueryChanged$.pipe(
+ startWith(this.filterQuery),
+ ),
this.contextMenuService.sortQueryChanged$.pipe(startWith(this.sortQuery)),
- ])
- .subscribe(async (query) => {
- this.queryText = query[0];
- this.filterQuery = query[1];
- this.sortQuery = query[2];
- this.from = 0;
- await this.fetchAndUpdateItems();
- this.queryChanged.next();
+ ]).subscribe(async query => {
+ this.queryText = query[0];
+ this.filterQuery = query[1];
+ this.sortQuery = query[2];
+ this.from = 0;
+ await this.fetchAndUpdateItems();
+ this.queryChanged.next();
});
this.fetchAndUpdateItems();
@@ -132,19 +145,21 @@ export class SearchPageComponent implements OnInit {
/**
* Subscribe to 'settings.changed' events
*/
- this.subscriptions.push(this.settingsProvider.settingsActionChanged$.subscribe(({type, payload}) => {
- if (type === 'stapps.settings.changed') {
- const {category, name, value} = payload!;
- this.logger.log(`received event "settings.changed" with category:
+ this.subscriptions.push(
+ this.settingsProvider.settingsActionChanged$.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.subscriptions.push(this.dataRoutingService.itemSelectListener()
- .subscribe((item) => {
+ }
+ },
+ ),
+ this.dataRoutingService.itemSelectListener().subscribe(item => {
void this.router.navigate(['data-detail', item.uid]);
- }));
+ }),
+ );
}
/**
@@ -185,13 +200,15 @@ export class SearchPageComponent implements OnInit {
};
}
- return this.dataProvider.search(searchOptions)
- .then(async (result) => {
- this.singleTypeResponse = result.facets.find(facet => facet.field === 'type')?.buckets.length === 1;
+ return this.dataProvider.search(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.concat(result.data);
+ items = [...items, ...result.data];
this.items = (async () => items)();
} else {
// override items with results
@@ -201,21 +218,23 @@ export class SearchPageComponent implements OnInit {
return result.data;
})();
}
- }, async (err) => {
+ },
+ async error => {
const alert: HTMLIonAlertElement = await this.alertController.create({
buttons: ['Dismiss'],
header: 'Error',
- subHeader: err.message,
+ subHeader: error.message,
});
await alert.present();
- });
+ },
+ );
}
/**
* Set starting values (e.g. forced filter, which can be set in components inheriting this one)
*/
- // tslint:disable-next-line:prefer-function-over-method
+ // eslint-disable-next-line class-methods-use-this
initialize() {
// nothing to do here
}
@@ -223,7 +242,7 @@ export class SearchPageComponent implements OnInit {
/**
* Loads next page of things
*/
- // tslint:disable-next-line:no-any
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
async loadMore(): Promise {
this.from += this.pageSize;
await this.fetchAndUpdateItems(true);
diff --git a/src/app/modules/data/list/search-page.html b/src/app/modules/data/list/search-page.html
index e82978ea..d83c8653 100644
--- a/src/app/modules/data/list/search-page.html
+++ b/src/app/modules/data/list/search-page.html
@@ -10,10 +10,19 @@
-
+
-
+
diff --git a/src/app/modules/data/stapps-web-http-client.provider.ts b/src/app/modules/data/stapps-web-http-client.provider.ts
index 932f52b2..14907733 100644
--- a/src/app/modules/data/stapps-web-http-client.provider.ts
+++ b/src/app/modules/data/stapps-web-http-client.provider.ts
@@ -14,7 +14,10 @@
*/
import {HttpClient, HttpResponse} from '@angular/common/http';
import {Injectable} from '@angular/core';
-import {HttpClientInterface, HttpClientRequest} from '@openstapps/api/lib/http-client-interface';
+import {
+ HttpClientInterface,
+ HttpClientRequest,
+} from '@openstapps/api/lib/http-client-interface';
/**
* HttpClient that is based on the Angular HttpClient (@TODO: move it to provider or independent package)
@@ -25,11 +28,11 @@ export class StAppsWebHttpClient implements HttpClientInterface {
*
* @param http TODO
*/
- constructor(private readonly http: HttpClient) {
- }
+ constructor(private readonly http: HttpClient) {}
/**
* Make a request
+ *
* @param requestConfig Configuration of the request
*/
async request(
@@ -59,14 +62,21 @@ export class StAppsWebHttpClient implements HttpClientInterface {
}
try {
- const response: HttpResponse = await this.http.request(
- requestConfig.method || 'GET', requestConfig.url.toString(), options)
+ const response: HttpResponse = await this.http
+ .request(
+ requestConfig.method || 'GET',
+ requestConfig.url.toString(),
+ options,
+ )
.toPromise();
- // tslint:disable-next-line:prefer-object-spread
- return Object.assign(response, {statusCode: response.status, body: response.body || {}});
- } catch (err) {
- throw Error(err);
+ // eslint-disable-next-line prefer-object-spread
+ return Object.assign(response, {
+ statusCode: response.status,
+ body: response.body || {},
+ });
+ } catch (error) {
+ throw new Error(error);
}
}
}
diff --git a/src/app/modules/data/types/article/article-detail-content.html b/src/app/modules/data/types/article/article-detail-content.html
index a3a14308..a8284829 100644
--- a/src/app/modules/data/types/article/article-detail-content.html
+++ b/src/app/modules/data/types/article/article-detail-content.html
@@ -1,6 +1,16 @@
-
+
-
-
+
+
diff --git a/src/app/modules/data/types/article/article-list-item.component.ts b/src/app/modules/data/types/article/article-list-item.component.ts
index 20f2629a..96474731 100644
--- a/src/app/modules/data/types/article/article-list-item.component.ts
+++ b/src/app/modules/data/types/article/article-list-item.component.ts
@@ -14,7 +14,7 @@
*/
import {Component, Input} from '@angular/core';
import {SCArticle} from '@openstapps/core';
-import {DataListItem} from '../../list/data-list-item.component';
+import {DataListItemComponent} from '../../list/data-list-item.component';
/**
* TODO
@@ -23,18 +23,9 @@ import {DataListItem} from '../../list/data-list-item.component';
selector: 'stapps-article-list-item',
templateUrl: 'article-list-item.html',
})
-
-export class ArticleListItem extends DataListItem {
+export class ArticleListItemComponent extends DataListItemComponent {
/**
* TODO
*/
@Input() item: SCArticle;
-
- /**
- * TODO
- */
- // tslint:disable-next-line:prefer-function-over-method
- ngOnInit() {
- // TODO: translation
- }
}
diff --git a/src/app/modules/data/types/article/article-list-item.html b/src/app/modules/data/types/article/article-list-item.html
index 4b9ec7bb..180d8694 100644
--- a/src/app/modules/data/types/article/article-list-item.html
+++ b/src/app/modules/data/types/article/article-list-item.html
@@ -1,12 +1,15 @@
- {{'name' | thingTranslate: item}}
+ {{ 'name' | thingTranslate: item }}
-
+
- {{'type' | thingTranslate: item}}
+ {{ 'type' | thingTranslate: item }}
diff --git a/src/app/modules/data/types/catalog/catalog-detail-content.html b/src/app/modules/data/types/catalog/catalog-detail-content.html
index ce0708a5..4d96e06b 100644
--- a/src/app/modules/data/types/catalog/catalog-detail-content.html
+++ b/src/app/modules/data/types/catalog/catalog-detail-content.html
@@ -1,2 +1,5 @@
-
+
diff --git a/src/app/modules/data/types/catalog/catalog-list-item.component.ts b/src/app/modules/data/types/catalog/catalog-list-item.component.ts
index 90dc552a..1c132666 100644
--- a/src/app/modules/data/types/catalog/catalog-list-item.component.ts
+++ b/src/app/modules/data/types/catalog/catalog-list-item.component.ts
@@ -14,7 +14,7 @@
*/
import {Component, Input} from '@angular/core';
import {SCCatalog} from '@openstapps/core';
-import {DataListItem} from '../../list/data-list-item.component';
+import {DataListItemComponent} from '../../list/data-list-item.component';
/**
* TODO
@@ -23,18 +23,9 @@ import {DataListItem} from '../../list/data-list-item.component';
selector: 'stapps-catalog-list-item',
templateUrl: 'catalog-list-item.html',
})
-
-export class CatalogListItem extends DataListItem {
+export class CatalogListItemComponent extends DataListItemComponent {
/**
* TODO
*/
@Input() item: SCCatalog;
-
- /**
- * TODO
- */
- // tslint:disable-next-line:prefer-function-over-method
- ngOnInit() {
- // TODO: translation
- }
}
diff --git a/src/app/modules/data/types/catalog/catalog-list-item.html b/src/app/modules/data/types/catalog/catalog-list-item.html
index 80bd340a..299ba58b 100644
--- a/src/app/modules/data/types/catalog/catalog-list-item.html
+++ b/src/app/modules/data/types/catalog/catalog-list-item.html
@@ -2,11 +2,14 @@
-
{{'name' | thingTranslate: item}}
+
{{ 'name' | thingTranslate: item }}
-
+
-
{{item.academicTerm.name}}
+
{{ item.academicTerm.name }}
diff --git a/src/app/modules/data/types/date-series/date-series-detail-content.html b/src/app/modules/data/types/date-series/date-series-detail-content.html
index 9238af14..68025af5 100644
--- a/src/app/modules/data/types/date-series/date-series-detail-content.html
+++ b/src/app/modules/data/types/date-series/date-series-detail-content.html
@@ -1,12 +1,28 @@
- {{'inPlace' | propertyNameTranslate: item | titlecase}}
+ {{ 'inPlace' | propertyNameTranslate: item | titlecase }}
- {{'name' | thingTranslate: item.inPlace}}
-
+
+ {{
+ 'name' | thingTranslate: item.inPlace
+ }}
+
-
-
-
+
+
+
diff --git a/src/app/modules/data/types/date-series/date-series-list-item.component.ts b/src/app/modules/data/types/date-series/date-series-list-item.component.ts
index d5a6beb1..6daf2bfa 100644
--- a/src/app/modules/data/types/date-series/date-series-list-item.component.ts
+++ b/src/app/modules/data/types/date-series/date-series-list-item.component.ts
@@ -14,7 +14,7 @@
*/
import {Component, Input} from '@angular/core';
import {SCDateSeries} from '@openstapps/core';
-import {DataListItem} from '../../list/data-list-item.component';
+import {DataListItemComponent} from '../../list/data-list-item.component';
/**
* TODO
@@ -23,18 +23,9 @@ import {DataListItem} from '../../list/data-list-item.component';
selector: 'stapps-date-series-list-item',
templateUrl: 'date-series-list-item.html',
})
-
-export class DateSeriesListItem extends DataListItem {
+export class DateSeriesListItemComponent extends DataListItemComponent {
/**
* TODO
*/
@Input() item: SCDateSeries;
-
- /**
- * TODO
- */
- // tslint:disable-next-line:prefer-function-over-method
- ngOnInit() {
- // TODO: translation
- }
}
diff --git a/src/app/modules/data/types/date-series/date-series-list-item.html b/src/app/modules/data/types/date-series/date-series-list-item.html
index e598c8da..c0417ec6 100644
--- a/src/app/modules/data/types/date-series/date-series-list-item.html
+++ b/src/app/modules/data/types/date-series/date-series-list-item.html
@@ -2,19 +2,29 @@
-
{{'name' | thingTranslate: item}}
+
{{ 'name' | thingTranslate: item }}
- {{item.frequency}}, {{item.dates[0] | amDateFormat:'dddd'}}
- ({{item.dates[0] | amDateFormat:'ll'}} - {{item.dates[item.dates.length - 1] | amDateFormat:'ll'}})
-
+ {{ item.frequency }}, {{ item.dates[0] | amDateFormat: 'dddd' }}
+ ({{ item.dates[0] | amDateFormat: 'll' }} -
+ {{
+ item.dates[item.dates.length - 1] | amDateFormat: 'll'
+ }})
+
-
{{'categories' | thingTranslate: item.event | join: ', '}}
+
{{
+ 'categories' | thingTranslate: item.event | join: ', '
+ }}
-
+
diff --git a/src/app/modules/data/types/dish/dish-detail-content.html b/src/app/modules/data/types/dish/dish-detail-content.html
index c7c5487d..ecf057fb 100644
--- a/src/app/modules/data/types/dish/dish-detail-content.html
+++ b/src/app/modules/data/types/dish/dish-detail-content.html
@@ -1,51 +1,79 @@
-
+
- {{ 'characteristics' | propertyNameTranslate: item | titlecase }}
-
+ {{
+ 'characteristics' | propertyNameTranslate: item | titlecase
+ }}
+
-
{{characteristic.name}}
+
{{ characteristic.name }}
-
-
+
+
- {{'data.types.dish.detail.AVG_NUTRITION_INFO' | translate }}
+ {{
+ 'data.types.dish.detail.AVG_NUTRITION_INFO' | translate
+ }}
- {{'data.types.dish.detail.CALORIES' | translate }}:
+ {{ 'data.types.dish.detail.CALORIES' | translate }}:
- {{item.nutrition.calories | numberLocalized}} kcal
+ {{ item.nutrition.calories | numberLocalized }} kcal
- {{'data.types.dish.detail.FAT_TOTAL' | translate }}:
+ {{ 'data.types.dish.detail.FAT_TOTAL' | translate }}:
- {{item.nutrition.fatContent | numberLocalized}} g ({{'data.types.dish.detail.FAT_SATURATED' | translate }}:
- {{item.nutrition.saturatedFatContent | numberLocalized}} g)
+ {{ item.nutrition.fatContent | numberLocalized }} g
+ ({{ 'data.types.dish.detail.FAT_SATURATED' | translate }}:
+ {{ item.nutrition.saturatedFatContent | numberLocalized }} g)
- {{'data.types.dish.detail.CARBOHYDRATE' | translate }}:
+ {{ 'data.types.dish.detail.CARBOHYDRATE' | translate }}:
- {{item.nutrition.carbohydrateContent | numberLocalized}} g ({{'data.types.dish.detail.SUGAR' | translate }}:
- {{item.nutrition.sugarContent | numberLocalized}} g)
+ {{ item.nutrition.carbohydrateContent | numberLocalized }} g
+ ({{ 'data.types.dish.detail.SUGAR' | translate }}:
+ {{ item.nutrition.sugarContent | numberLocalized }} g)
- {{'data.types.dish.detail.SALT' | translate }}:
+ {{ 'data.types.dish.detail.SALT' | translate }}:
- {{item.nutrition.saltContent | numberLocalized}} g
+ {{ item.nutrition.saltContent | numberLocalized }} g
- {{'data.types.dish.detail.PROTEIN' | translate }}:
+ {{ 'data.types.dish.detail.PROTEIN' | translate }}:
- {{item.nutrition.proteinContent | numberLocalized}} g
+ {{ item.nutrition.proteinContent | numberLocalized }} g
diff --git a/src/app/modules/data/types/dish/dish-list-item.component.ts b/src/app/modules/data/types/dish/dish-list-item.component.ts
index 01933847..dd7650e4 100644
--- a/src/app/modules/data/types/dish/dish-list-item.component.ts
+++ b/src/app/modules/data/types/dish/dish-list-item.component.ts
@@ -14,8 +14,7 @@
*/
import {Component, Input} from '@angular/core';
import {SCDish} from '@openstapps/core';
-// import {SettingsProvider} from '../../../settings/settings.provider';
-import {DataListItem} from '../../list/data-list-item.component';
+import {DataListItemComponent} from '../../list/data-list-item.component';
/**
* TODO
@@ -24,15 +23,9 @@ import {DataListItem} from '../../list/data-list-item.component';
selector: 'stapps-dish-list-item',
templateUrl: 'dish-list-item.html',
})
-
-export class DishListItem extends DataListItem {
+export class DishListItemComponent extends DataListItemComponent {
/**
* TODO
*/
@Input() item: SCDish;
-
- // tslint:disable-next-line: completed-docs prefer-function-over-method
- ngOnInit() {
- // custom init
- }
}
diff --git a/src/app/modules/data/types/dish/dish-list-item.html b/src/app/modules/data/types/dish/dish-list-item.html
index e836f056..32512ed3 100644
--- a/src/app/modules/data/types/dish/dish-list-item.html
+++ b/src/app/modules/data/types/dish/dish-list-item.html
@@ -2,14 +2,17 @@
-
{{'name' | thingTranslate: item}}
-
{{'description' | thingTranslate: item}}
-
{{'categories' | thingTranslate: item | join: ', '}}
+
{{ 'name' | thingTranslate: item }}
+
{{ 'description' | thingTranslate: item }}
+
{{ 'categories' | thingTranslate: item | join: ', ' }}
-
+
diff --git a/src/app/modules/data/types/event/event-detail-content.component.ts b/src/app/modules/data/types/event/event-detail-content.component.ts
index b6c3c012..ac6c1243 100644
--- a/src/app/modules/data/types/event/event-detail-content.component.ts
+++ b/src/app/modules/data/types/event/event-detail-content.component.ts
@@ -13,7 +13,12 @@
* this program. If not, see .
*/
import {Component, Input} from '@angular/core';
-import {SCAcademicEvent, SCSportCourse, SCThing, SCTranslations} from '@openstapps/core';
+import {
+ SCAcademicEvent,
+ SCSportCourse,
+ SCThing,
+ SCTranslations,
+} from '@openstapps/core';
import {SCThingTranslator} from '@openstapps/core';
/**
@@ -28,18 +33,22 @@ export class EventDetailContentComponent {
* TODO
*/
@Input() item: SCAcademicEvent | SCSportCourse;
+
/**
* TODO
*/
@Input() language: keyof SCTranslations;
+
/**
* TODO
*/
objectKeys = Object.keys;
+
/**
* TODO
*/
translator: SCThingTranslator;
+
/**
* TODO
*/
diff --git a/src/app/modules/data/types/event/event-detail-content.html b/src/app/modules/data/types/event/event-detail-content.html
index 99fe4972..a1234846 100644
--- a/src/app/modules/data/types/event/event-detail-content.html
+++ b/src/app/modules/data/types/event/event-detail-content.html
@@ -1,14 +1,46 @@
-
+
-
-
-
-
+
+
+
+
-
-
-
+
+
+
diff --git a/src/app/modules/data/types/event/event-list-item.component.ts b/src/app/modules/data/types/event/event-list-item.component.ts
index d301402b..77b7a8aa 100644
--- a/src/app/modules/data/types/event/event-list-item.component.ts
+++ b/src/app/modules/data/types/event/event-list-item.component.ts
@@ -14,7 +14,7 @@
*/
import {Component, Input} from '@angular/core';
import {SCAcademicEvent, SCSportCourse} from '@openstapps/core';
-import {DataListItem} from '../../list/data-list-item.component';
+import {DataListItemComponent} from '../../list/data-list-item.component';
/**
* TODO
@@ -23,17 +23,9 @@ import {DataListItem} from '../../list/data-list-item.component';
selector: 'stapps-event-list-item',
templateUrl: 'event-list-item.html',
})
-export class EventListItemComponent extends DataListItem {
+export class EventListItemComponent extends DataListItemComponent {
/**
* TODO
*/
@Input() item: SCAcademicEvent | SCSportCourse;
-
- /**
- * TODO
- */
- // tslint:disable-next-line:prefer-function-over-method
- ngOnInit() {
- // TODO: translation
- }
}
diff --git a/src/app/modules/data/types/event/event-list-item.html b/src/app/modules/data/types/event/event-list-item.html
index d2005f52..30b02e82 100644
--- a/src/app/modules/data/types/event/event-list-item.html
+++ b/src/app/modules/data/types/event/event-list-item.html
@@ -2,19 +2,19 @@
-
{{item.name}}
-
{{item.description}}
-
{{item.academicTerms[0].name}}
-
{{item.type}} ({{item.categories.join(', ')}})
+
{{ item.name }}
+
{{ item.description }}
+
{{ item.academicTerms[0].name }}
+
{{ item.type }} ({{ item.categories.join(', ') }})
- {{item.name}}
- {{item.description}}
- {{item.academicTerms[0].name}}
- {{item.type}}
+ {{ item.name }}
+ {{ item.description }}
+ {{ item.academicTerms[0].name }}
+ {{ item.type }}
diff --git a/src/app/modules/data/types/favorite/favorite-list-item.component.ts b/src/app/modules/data/types/favorite/favorite-list-item.component.ts
index 923d047b..defae2bc 100644
--- a/src/app/modules/data/types/favorite/favorite-list-item.component.ts
+++ b/src/app/modules/data/types/favorite/favorite-list-item.component.ts
@@ -14,7 +14,7 @@
*/
import {Component, Input} from '@angular/core';
import {SCFavorite} from '@openstapps/core';
-import {DataListItem} from '../../list/data-list-item.component';
+import {DataListItemComponent} from '../../list/data-list-item.component';
/**
* TODO
@@ -23,18 +23,9 @@ import {DataListItem} from '../../list/data-list-item.component';
selector: 'stapps-favorite-list-item',
templateUrl: 'favorite-list-item.html',
})
-
-export class FavoriteListItem extends DataListItem {
+export class FavoriteListItemComponent extends DataListItemComponent {
/**
* TODO
*/
@Input() item: SCFavorite;
-
- /**
- * TODO
- */
- // tslint:disable-next-line:prefer-function-over-method
- ngOnInit() {
- // TODO: translation
- }
}
diff --git a/src/app/modules/data/types/favorite/favorite-list-item.html b/src/app/modules/data/types/favorite/favorite-list-item.html
index 389f0640..9e4f76bb 100644
--- a/src/app/modules/data/types/favorite/favorite-list-item.html
+++ b/src/app/modules/data/types/favorite/favorite-list-item.html
@@ -2,11 +2,21 @@
-
{{'name' | thingTranslate: item}}: {{'name' | thingTranslate: item.data}}
+
+ {{ 'name' | thingTranslate: item }}:
+ {{ 'name' | thingTranslate: item.data }}
+
-
+
-
{{'type' | thingTranslate: item}} ({{'type' | thingTranslate: item.data}})
+
{{ 'type' | thingTranslate: item }} ({{
+ 'type' | thingTranslate: item.data
+ }})
diff --git a/src/app/modules/data/types/message/message-detail-content.html b/src/app/modules/data/types/message/message-detail-content.html
index cc2cb40f..aff45627 100644
--- a/src/app/modules/data/types/message/message-detail-content.html
+++ b/src/app/modules/data/types/message/message-detail-content.html
@@ -1,5 +1,23 @@
-
-
-
-
-
+
+
+
+
+
diff --git a/src/app/modules/data/types/message/message-list-item.component.ts b/src/app/modules/data/types/message/message-list-item.component.ts
index 6228885b..108c442b 100644
--- a/src/app/modules/data/types/message/message-list-item.component.ts
+++ b/src/app/modules/data/types/message/message-list-item.component.ts
@@ -14,7 +14,7 @@
*/
import {Component, Input} from '@angular/core';
import {SCMessage} from '@openstapps/core';
-import {DataListItem} from '../../list/data-list-item.component';
+import {DataListItemComponent} from '../../list/data-list-item.component';
/**
* TODO
@@ -23,18 +23,9 @@ import {DataListItem} from '../../list/data-list-item.component';
selector: 'stapps-message-list-item',
templateUrl: 'message-list-item.html',
})
-
-export class MessageListItem extends DataListItem {
+export class MessageListItemComponent extends DataListItemComponent {
/**
* TODO
*/
@Input() item: SCMessage;
-
- /**
- * TODO
- */
- // tslint:disable-next-line:prefer-function-over-method
- ngOnInit() {
- // TODO: translation
- }
}
diff --git a/src/app/modules/data/types/message/message-list-item.html b/src/app/modules/data/types/message/message-list-item.html
index 792cd253..0132c6f1 100644
--- a/src/app/modules/data/types/message/message-list-item.html
+++ b/src/app/modules/data/types/message/message-list-item.html
@@ -2,11 +2,14 @@
-
{{'name' | thingTranslate: item}}
+
{{ 'name' | thingTranslate: item }}
-
+
-
{{'type' | thingTranslate: item}}
+
{{ 'type' | thingTranslate: item }}
diff --git a/src/app/modules/data/types/organization/organization-detail-content.html b/src/app/modules/data/types/organization/organization-detail-content.html
index 0ab5e40d..0f8609c9 100644
--- a/src/app/modules/data/types/organization/organization-detail-content.html
+++ b/src/app/modules/data/types/organization/organization-detail-content.html
@@ -1,9 +1,15 @@
- {{'inPlace' | propertyNameTranslate: item | titlecase}}
+ {{ 'inPlace' | propertyNameTranslate: item | titlecase }}
- {{'name' | thingTranslate: item.inPlace}}
-
+
+ {{
+ 'name' | thingTranslate: item.inPlace
+ }}
+
diff --git a/src/app/modules/data/types/organization/organization-list-item.component.ts b/src/app/modules/data/types/organization/organization-list-item.component.ts
index 7753c234..fdb35156 100644
--- a/src/app/modules/data/types/organization/organization-list-item.component.ts
+++ b/src/app/modules/data/types/organization/organization-list-item.component.ts
@@ -14,7 +14,7 @@
*/
import {Component, Input} from '@angular/core';
import {SCOrganization} from '@openstapps/core';
-import {DataListItem} from '../../list/data-list-item.component';
+import {DataListItemComponent} from '../../list/data-list-item.component';
/**
* TODO
@@ -23,18 +23,9 @@ import {DataListItem} from '../../list/data-list-item.component';
selector: 'stapps-organization-list-item',
templateUrl: 'organization-list-item.html',
})
-
-export class OrganizationListItem extends DataListItem {
+export class OrganizationListItemComponent extends DataListItemComponent {
/**
* TODO
*/
@Input() item: SCOrganization;
-
- /**
- * TODO
- */
- // tslint:disable-next-line:prefer-function-over-method
- ngOnInit() {
- // TODO: translation
- }
}
diff --git a/src/app/modules/data/types/organization/organization-list-item.html b/src/app/modules/data/types/organization/organization-list-item.html
index eb52e942..3d93f4be 100644
--- a/src/app/modules/data/types/organization/organization-list-item.html
+++ b/src/app/modules/data/types/organization/organization-list-item.html
@@ -2,14 +2,17 @@
-
{{'name' | thingTranslate: item}}
-
{{'description' | thingTranslate: item}}
-
{{'type' | thingTranslate: item}}
+
{{ 'name' | thingTranslate: item }}
+
+ {{ 'description' | thingTranslate: item }}
+
+
{{ 'type' | thingTranslate: item }}
- {{'name' | thingTranslate: item.inPlace}}
+
+ {{ 'name' | thingTranslate: item.inPlace }}
diff --git a/src/app/modules/data/types/person/person-detail-content.html b/src/app/modules/data/types/person/person-detail-content.html
index 424a2710..ecf5cc16 100644
--- a/src/app/modules/data/types/person/person-detail-content.html
+++ b/src/app/modules/data/types/person/person-detail-content.html
@@ -1,33 +1,88 @@
- {{'type' | thingTranslate: item.workLocations[0] | titlecase}}
+ {{ 'type' | thingTranslate: item.workLocations[0] | titlecase }}
- {{'telephone' | propertyNameTranslate: item.workLocations[0] | titlecase}}: {{item.workLocations[0].telephone}}
+
+ {{
+ 'telephone'
+ | propertyNameTranslate: item.workLocations[0]
+ | titlecase
+ }}:
+ {{
+ item.workLocations[0].telephone
+ }}
- {{'email' | propertyNameTranslate: item.workLocations[0] | titlecase}}: {{item.workLocations[0].email}}
- {{'faxNumber' | propertyNameTranslate: item.workLocations[0] | titlecase}}: {{item.workLocations[0].faxNumber}}
- {{'url' | propertyNameTranslate: item.workLocations[0] | titlecase}}: {{item.workLocations[0].url}}
+
+ {{
+ 'email' | propertyNameTranslate: item.workLocations[0] | titlecase
+ }}:
+ {{
+ item.workLocations[0].email
+ }}
- {{'areaServed' | propertyNameTranslate: item.workLocations[0] | titlecase}}: {{item.workLocations[0].areaServed.name}}
+
+ {{
+ 'faxNumber'
+ | propertyNameTranslate: item.workLocations[0]
+ | titlecase
+ }}: {{ item.workLocations[0].faxNumber }}
+
+
+ {{ 'url' | propertyNameTranslate: item.workLocations[0] | titlecase }}:
+ {{
+ item.workLocations[0].url
+ }}
+
+
+ {{
+ 'areaServed'
+ | propertyNameTranslate: item.workLocations[0]
+ | titlecase
+ }}:
+ {{ item.workLocations[0].areaServed.name }}
- 1" pager="true" class="work-locations">
+ 1"
+ pager="true"
+ class="work-locations"
+ >
- {{'telephone' | propertyNameTranslate: item.workLocation | titlecase}}: {{workLocation.telephone}}
+
+ {{
+ 'telephone' | propertyNameTranslate: item.workLocation | titlecase
+ }}:
+ {{
+ workLocation.telephone
+ }}
- {{'email' | propertyNameTranslate: item.workLocation | titlecase}}: {{workLocation.email}}
+
+ {{ 'email' | propertyNameTranslate: item.workLocation | titlecase }}:
+ {{
+ workLocation.email
+ }}
- {{'faxNumber' | propertyNameTranslate: item.workLocation | titlecase}}: {{workLocation.faxNumber}}
- {{'url' | propertyNameTranslate: item.workLocation | titlecase}}: {{workLocation.url}}
- {{'areaServed' | propertyNameTranslate: item.workLocation | titlecase}}: {{workLocation.areaServed.name}}
+
+ {{
+ 'faxNumber' | propertyNameTranslate: item.workLocation | titlecase
+ }}: {{ workLocation.faxNumber }}
+
+
+ {{ 'url' | propertyNameTranslate: item.workLocation | titlecase }}:
+ {{ workLocation.url }}
+
+
+ {{
+ 'areaServed' | propertyNameTranslate: item.workLocation | titlecase
+ }}:
+ {{
+ workLocation.areaServed.name
+ }}
@@ -35,4 +90,8 @@
-
+
diff --git a/src/app/modules/data/types/person/person-list-item.component.ts b/src/app/modules/data/types/person/person-list-item.component.ts
index ce08f258..f6d42fb1 100644
--- a/src/app/modules/data/types/person/person-list-item.component.ts
+++ b/src/app/modules/data/types/person/person-list-item.component.ts
@@ -14,7 +14,7 @@
*/
import {Component, Input} from '@angular/core';
import {SCPerson} from '@openstapps/core';
-import {DataListItem} from '../../list/data-list-item.component';
+import {DataListItemComponent} from '../../list/data-list-item.component';
/**
* TODO
@@ -23,18 +23,9 @@ import {DataListItem} from '../../list/data-list-item.component';
selector: 'stapps-person-list-item',
templateUrl: 'person-list-item.html',
})
-
-export class PersonListItem extends DataListItem {
+export class PersonListItemComponent extends DataListItemComponent {
/**
* TODO
*/
@Input() item: SCPerson;
-
- /**
- * TODO
- */
- // tslint:disable-next-line:prefer-function-over-method
- ngOnInit() {
- // TODO: translation
- }
}
diff --git a/src/app/modules/data/types/person/person-list-item.html b/src/app/modules/data/types/person/person-list-item.html
index 86c3ae0a..55c4934f 100644
--- a/src/app/modules/data/types/person/person-list-item.html
+++ b/src/app/modules/data/types/person/person-list-item.html
@@ -2,13 +2,23 @@
-
{{'name' | thingTranslate: item}} , {{item.honorificPrefix}}
-
- {{item.telephone}}
-
- {{item.email}}
-
-
{{item.jobTitles.join(', ') | slice:0:50}} 51">...
+
+ {{ 'name' | thingTranslate: item }}
+ , {{ item.honorificPrefix }}
+
+
+
+ {{
+ item.telephone
+ }}
+ {{ item.email }}
+
+
+
+ {{ item.jobTitles.join(', ') | slice: 0:50
+ }} 51">...
+
diff --git a/src/app/modules/data/types/place/place-detail-content.component.ts b/src/app/modules/data/types/place/place-detail-content.component.ts
index 78e58aac..9eb993d2 100644
--- a/src/app/modules/data/types/place/place-detail-content.component.ts
+++ b/src/app/modules/data/types/place/place-detail-content.component.ts
@@ -13,14 +13,20 @@
* this program. If not, see .
*/
import {Component, Input} from '@angular/core';
-import {SCBuilding, SCFloor, SCPointOfInterest, SCRoom, SCThings} from '@openstapps/core';
+import {
+ SCBuilding,
+ SCFloor,
+ SCPointOfInterest,
+ SCRoom,
+ SCThings,
+} from '@openstapps/core';
import {DataProvider} from '../../data.provider';
/**
* TODO
*/
@Component({
- providers: [ DataProvider ],
+ providers: [DataProvider],
selector: 'stapps-place-detail-content',
templateUrl: 'place-detail-content.html',
})
@@ -35,10 +41,8 @@ export class PlaceDetailContentComponent {
*
* @param item TODO
*/
- // tslint:disable-next-line:completed-docs prefer-function-over-method
- hasCategories(item: SCThings): item is SCThings & { categories: string[]; } {
- // tslint:disable-next-line:completed-docs
- return typeof (item as { categories: string[]; }).categories !== 'undefined';
+ hasCategories(item: SCThings): item is SCThings & {categories: string[]} {
+ return typeof (item as {categories: string[]}).categories !== 'undefined';
}
/**
@@ -46,9 +50,13 @@ export class PlaceDetailContentComponent {
*
* @param item TODO
*/
- isMensaThing(item: SCThings): boolean {
- return this.hasCategories(item) &&
- ((item.categories as string[]).includes('canteen') || (item.categories as string[]).includes('cafe')
- || (item.categories as string[]).includes('student canteen') || (item.categories as string[]).includes('restaurant'));
+ isMensaThing(item: SCThings): boolean {
+ return (
+ this.hasCategories(item) &&
+ ((item.categories as string[]).includes('canteen') ||
+ (item.categories as string[]).includes('cafe') ||
+ (item.categories as string[]).includes('student canteen') ||
+ (item.categories as string[]).includes('restaurant'))
+ );
}
}
diff --git a/src/app/modules/data/types/place/place-detail-content.html b/src/app/modules/data/types/place/place-detail-content.html
index 688f27f8..9c2e22fb 100644
--- a/src/app/modules/data/types/place/place-detail-content.html
+++ b/src/app/modules/data/types/place/place-detail-content.html
@@ -1,16 +1,33 @@
-
+
-
-
+
+
-
+
- {{'inPlace' | propertyNameTranslate: item | titlecase}}
+ {{ 'inPlace' | propertyNameTranslate: item | titlecase }}
- {{'name' | thingTranslate: item.inPlace}}
+
+ {{
+ 'name' | thingTranslate: item.inPlace
+ }}
-
+
diff --git a/src/app/modules/data/types/place/place-list-item.component.ts b/src/app/modules/data/types/place/place-list-item.component.ts
index 813c0d1e..1ad87fca 100644
--- a/src/app/modules/data/types/place/place-list-item.component.ts
+++ b/src/app/modules/data/types/place/place-list-item.component.ts
@@ -14,7 +14,7 @@
*/
import {Component, Input} from '@angular/core';
import {SCBuilding, SCFloor, SCPointOfInterest, SCRoom} from '@openstapps/core';
-import {DataListItem} from '../../list/data-list-item.component';
+import {DataListItemComponent} from '../../list/data-list-item.component';
/**
* TODO
@@ -23,18 +23,9 @@ import {DataListItem} from '../../list/data-list-item.component';
selector: 'stapps-place-list-item',
templateUrl: 'place-list-item.html',
})
-
-export class PlaceListItem extends DataListItem {
+export class PlaceListItemComponent extends DataListItemComponent {
/**
* TODO
*/
@Input() item: SCBuilding | SCRoom | SCPointOfInterest | SCFloor;
-
- /**
- * TODO
- */
- // tslint:disable-next-line:prefer-function-over-method
- ngOnInit() {
- // TODO: translation
- }
}
diff --git a/src/app/modules/data/types/place/place-list-item.html b/src/app/modules/data/types/place/place-list-item.html
index f7d6730d..17c91308 100644
--- a/src/app/modules/data/types/place/place-list-item.html
+++ b/src/app/modules/data/types/place/place-list-item.html
@@ -2,14 +2,17 @@
-
{{'name' | thingTranslate: item}}
-
{{'description' | thingTranslate: item}}
-
{{'type' | thingTranslate: item}}
+
{{ 'name' | thingTranslate: item }}
+
+ {{ 'description' | thingTranslate: item }}
+
+
{{ 'type' | thingTranslate: item }}
- {{'name' | thingTranslate: item.inPlace}}
+ {{ 'name' | thingTranslate: item.inPlace }}
diff --git a/src/app/modules/data/types/place/special/mensa/place-mensa-detail.component.ts b/src/app/modules/data/types/place/special/mensa/place-mensa-detail.component.ts
index fe6f42ac..241dbf0f 100644
--- a/src/app/modules/data/types/place/special/mensa/place-mensa-detail.component.ts
+++ b/src/app/modules/data/types/place/special/mensa/place-mensa-detail.component.ts
@@ -29,10 +29,10 @@ import {PlaceMensaService} from './place-mensa-service';
templateUrl: 'place-mensa.html',
})
export class PlaceMensaDetailComponent implements AfterViewInit {
-
/**
* Map of dishes for each day
*/
+ // eslint-disable-next-line unicorn/no-null
dishes: Promise> | null = null;
/**
@@ -67,6 +67,6 @@ export class PlaceMensaDetailComponent implements AfterViewInit {
*/
ngAfterViewInit() {
this.dishes = this.mensaService.getAllDishes(this.item, this.displayRange);
- this.dishes.then((result) => this.selectedDay = keys(result)[0]);
+ this.dishes.then(result => (this.selectedDay = keys(result)[0]));
}
}
diff --git a/src/app/modules/data/types/place/special/mensa/place-mensa-service.ts b/src/app/modules/data/types/place/special/mensa/place-mensa-service.ts
index e12440b9..552d0272 100644
--- a/src/app/modules/data/types/place/special/mensa/place-mensa-service.ts
+++ b/src/app/modules/data/types/place/special/mensa/place-mensa-service.ts
@@ -14,7 +14,13 @@
*/
import {Injectable} from '@angular/core';
-import {SCDish, SCISO8601Date, SCMultiSearchRequest, SCPlace, SCThingType} from '@openstapps/core';
+import {
+ SCDish,
+ SCISO8601Date,
+ SCMultiSearchRequest,
+ SCPlace,
+ SCThingType,
+} from '@openstapps/core';
import {keyBy, mapValues, range} from 'lodash-es';
import moment from 'moment';
import {DataProvider} from '../../../../data.provider';
@@ -26,21 +32,20 @@ import {DataProvider} from '../../../../data.provider';
providedIn: 'root',
})
export class PlaceMensaService {
- constructor(private dataProvider: DataProvider) {
- }
+ constructor(private dataProvider: DataProvider) {}
/**
* Fetches all dishes for this building
*
* Splits dishes as such that each list contains all dishes that are available at that day.
*/
- async getAllDishes(place: SCPlace, days: number): Promise> {
+ async getAllDishes(
+ place: SCPlace,
+ days: number,
+ ): Promise> {
const request: SCMultiSearchRequest = mapValues(
- keyBy(range(days)
- .map((i) => moment()
- .add(i, 'days')
- .toISOString()),
- ), (date: SCISO8601Date) => ({
+ keyBy(range(days).map(i => moment().add(i, 'days').toISOString())),
+ (date: SCISO8601Date) => ({
filter: {
arguments: {
filters: [
@@ -72,8 +77,12 @@ export class PlaceMensaService {
type: 'boolean',
},
size: 1000,
- }));
+ }),
+ );
- return mapValues(await this.dataProvider.multiSearch(request), 'data') as Record;
+ return mapValues(
+ await this.dataProvider.multiSearch(request),
+ 'data',
+ ) as Record;
}
}
diff --git a/src/app/modules/data/types/place/special/mensa/place-mensa.html b/src/app/modules/data/types/place/special/mensa/place-mensa.html
index e2eec16d..01f3e9c1 100644
--- a/src/app/modules/data/types/place/special/mensa/place-mensa.html
+++ b/src/app/modules/data/types/place/special/mensa/place-mensa.html
@@ -1,24 +1,34 @@
-
- {{date.key | amDateFormat:'dddd, L'}}
+
+ {{ date.key | amDateFormat: 'dddd, L' }}
-
+
-
+
diff --git a/src/app/modules/data/types/semester/semester-detail-content.html b/src/app/modules/data/types/semester/semester-detail-content.html
index 4fdc5ed8..9b7af549 100644
--- a/src/app/modules/data/types/semester/semester-detail-content.html
+++ b/src/app/modules/data/types/semester/semester-detail-content.html
@@ -1,3 +1,13 @@
-
+
diff --git a/src/app/modules/data/types/semester/semester-list-item.component.ts b/src/app/modules/data/types/semester/semester-list-item.component.ts
index 86634cd3..8b5905ac 100644
--- a/src/app/modules/data/types/semester/semester-list-item.component.ts
+++ b/src/app/modules/data/types/semester/semester-list-item.component.ts
@@ -14,7 +14,7 @@
*/
import {Component, Input} from '@angular/core';
import {SCSemester} from '@openstapps/core';
-import {DataListItem} from '../../list/data-list-item.component';
+import {DataListItemComponent} from '../../list/data-list-item.component';
/**
* TODO
@@ -23,17 +23,9 @@ import {DataListItem} from '../../list/data-list-item.component';
selector: 'stapps-semester-list-item',
templateUrl: 'semester-list-item.html',
})
-export class SemesterListItem extends DataListItem {
+export class SemesterListItemComponent extends DataListItemComponent {
/**
* TODO
*/
@Input() item: SCSemester;
-
- /**
- * TODO
- */
- // tslint:disable-next-line:prefer-function-over-method
- ngOnInit() {
- // TODO: translation
- }
}
diff --git a/src/app/modules/data/types/semester/semester-list-item.html b/src/app/modules/data/types/semester/semester-list-item.html
index 308bedd5..eb2c0d52 100644
--- a/src/app/modules/data/types/semester/semester-list-item.html
+++ b/src/app/modules/data/types/semester/semester-list-item.html
@@ -2,12 +2,15 @@
-
{{'name' | thingTranslate: item}}
+
{{ 'name' | thingTranslate: item }}
- {{item.startDate | amDateFormat: 'll'}} - {{item.endDate | amDateFormat:'ll'}}
+ {{ item.startDate | amDateFormat: 'll' }} -
+ {{ item.endDate | amDateFormat: 'll' }}
-
{{'type' | thingTranslate: item}}
+
{{ 'type' | thingTranslate: item }}
diff --git a/src/app/modules/data/types/video/video-detail-content.html b/src/app/modules/data/types/video/video-detail-content.html
index 1e19edc4..1255dab8 100644
--- a/src/app/modules/data/types/video/video-detail-content.html
+++ b/src/app/modules/data/types/video/video-detail-content.html
@@ -1,6 +1,20 @@
-
-
-
+
+
+
-
+
diff --git a/src/app/modules/data/types/video/video-list-item.component.ts b/src/app/modules/data/types/video/video-list-item.component.ts
index 270bfbe9..f0fe349e 100644
--- a/src/app/modules/data/types/video/video-list-item.component.ts
+++ b/src/app/modules/data/types/video/video-list-item.component.ts
@@ -14,7 +14,7 @@
*/
import {Component, Input} from '@angular/core';
import {SCVideo} from '@openstapps/core';
-import {DataListItem} from '../../list/data-list-item.component';
+import {DataListItemComponent} from '../../list/data-list-item.component';
/**
* TODO
@@ -23,17 +23,9 @@ import {DataListItem} from '../../list/data-list-item.component';
selector: 'stapps-video-list-item',
templateUrl: 'video-list-item.html',
})
-export class VideoListItem extends DataListItem {
+export class VideoListItemComponent extends DataListItemComponent {
/**
* TODO
*/
@Input() item: SCVideo;
-
- /**
- * TODO
- */
- // tslint:disable-next-line:prefer-function-over-method
- ngOnInit() {
- // TODO: translation
- }
}
diff --git a/src/app/modules/data/types/video/video-list-item.html b/src/app/modules/data/types/video/video-list-item.html
index 714ce432..863a039c 100644
--- a/src/app/modules/data/types/video/video-list-item.html
+++ b/src/app/modules/data/types/video/video-list-item.html
@@ -2,10 +2,18 @@
-
{{'name' | thingTranslate: item}}
-
-
{{'duration' | propertyNameTranslate: item | titlecase}}: {{item.duration | amDuration:'seconds'}}
-
{{'type' | thingTranslate: item}}
+
{{ 'name' | thingTranslate: item }}
+
+
+
+
+ {{ 'duration' | propertyNameTranslate: item | titlecase }}:
+ {{ item.duration | amDuration: 'seconds' }}
+
+
{{ 'type' | thingTranslate: item }}
diff --git a/src/app/modules/menu/context/context-menu.component.spec.ts b/src/app/modules/menu/context/context-menu.component.spec.ts
index b4a102ff..5b2ee714 100644
--- a/src/app/modules/menu/context/context-menu.component.spec.ts
+++ b/src/app/modules/menu/context/context-menu.component.spec.ts
@@ -1,3 +1,4 @@
+/* eslint-disable @typescript-eslint/no-non-null-assertion,@typescript-eslint/ban-ts-comment */
/*
* Copyright (C) 2020 StApps
* This program is free software: you can redistribute it and/or modify it
@@ -12,16 +13,26 @@
* You should have received a copy of the GNU General Public License along with
* this program. If not, see .
*/
-import {APP_BASE_HREF, CommonModule, Location, LocationStrategy, PathLocationStrategy} from '@angular/common';
+import {
+ APP_BASE_HREF,
+ CommonModule,
+ Location,
+ LocationStrategy,
+ PathLocationStrategy,
+} from '@angular/common';
import {ComponentFixture, TestBed} from '@angular/core/testing';
import {FormsModule} from '@angular/forms';
-import {ChildrenOutletContexts, RouterModule, UrlSerializer} from '@angular/router';
+import {
+ ChildrenOutletContexts,
+ RouterModule,
+ UrlSerializer,
+} from '@angular/router';
import {IonicModule} from '@ionic/angular';
-import {TranslateModule,} from '@ngx-translate/core';
+import {TranslateModule} from '@ngx-translate/core';
import {SCFacet, SCThingType} from '@openstapps/core';
import {ContextMenuComponent} from './context-menu.component';
import {SettingsModule} from '../../settings/settings.module';
-import {ContextMenuService} from '../context/context-menu.service';
+import {ContextMenuService} from './context-menu.service';
import {FilterContext, SortContext} from './context-type';
describe('ContextMenuComponent', async () => {
@@ -29,7 +40,6 @@ describe('ContextMenuComponent', async () => {
let instance: ContextMenuComponent;
beforeEach(() => {
-
TestBed.configureTestingModule({
declarations: [ContextMenuComponent],
providers: [
@@ -40,7 +50,6 @@ describe('ContextMenuComponent', async () => {
{provide: LocationStrategy, useClass: PathLocationStrategy},
{provide: APP_BASE_HREF, useValue: '/'},
],
- // tslint:disable-next-line:object-literal-sort-keys
imports: [
FormsModule,
IonicModule.forRoot(),
@@ -58,23 +67,30 @@ describe('ContextMenuComponent', async () => {
it('should show items in sort context', () => {
instance.sortOption = getSortContextType();
fixture.detectChanges();
- const sort: HTMLElement = fixture.debugElement.nativeElement.querySelector('.context-sort');
+ const sort: HTMLElement =
+ fixture.debugElement.nativeElement.querySelector('.context-sort');
const sortItem = sort.querySelector('.sort-item');
- expect(sortItem!.querySelector('ion-label')!.textContent).toContain('relevance');
+ expect(sortItem!.querySelector('ion-label')?.textContent).toContain(
+ 'relevance',
+ );
});
it('should show items in filter context', () => {
instance.filterOption = getFilterContextType();
fixture.detectChanges();
- const filter: HTMLElement = fixture.debugElement.nativeElement.querySelector('.context-filter');
+ const filter: HTMLElement =
+ fixture.debugElement.nativeElement.querySelector('.context-filter');
const filterItem = filter.querySelector('.filter-group');
- expect(filterItem!.querySelector('ion-list-header')!.textContent).toContain('Type');
+ expect(filterItem!.querySelector('ion-list-header')!.textContent).toContain(
+ 'Type',
+ );
});
it('should set sort context value and reverse on click', () => {
instance.sortOption = getSortContextType();
fixture.detectChanges();
- const sort: HTMLElement = fixture.debugElement.nativeElement.querySelector('.context-sort');
+ const sort: HTMLElement =
+ fixture.debugElement.nativeElement.querySelector('.context-sort');
// @ts-ignore
const sortItem: HTMLElement = sort.querySelectorAll('.sort-item')[1];
sortItem!.click();
@@ -93,18 +109,26 @@ describe('ContextMenuComponent', async () => {
instance.filterOption = getFilterContextType();
fixture.detectChanges();
// get filter context div
- const filter: HTMLElement = fixture.debugElement.nativeElement.querySelector('.context-filter');
+ const filter: HTMLElement =
+ fixture.debugElement.nativeElement.querySelector('.context-filter');
// get all filter groups that represent a facet
const filterGroups = filter.querySelectorAll('.filter-group');
expect(filterGroups.length).toEqual(facets.length);
for (const facet of facets) {
- let filterGroup = undefined;
+ let filterGroup;
// get filter option for facets field
- filterGroups.forEach((element) => {
- if (element.querySelector('ion-list-header')!.textContent!.toString().toLowerCase().indexOf(facet.field) > -1) {
+ // eslint-disable-next-line unicorn/no-array-for-each
+ filterGroups.forEach(element => {
+ if (
+ element
+ .querySelector('ion-list-header')!
+ .textContent!.toString()
+ .toLowerCase()
+ .includes(facet.field)
+ ) {
filterGroup = element;
return;
}
@@ -125,9 +149,13 @@ describe('ContextMenuComponent', async () => {
let filterItem;
for (let i = 0; i < filterItems.length; i++) {
- if (filterItems.item(i)
- .textContent!.toString().toLowerCase()
- .indexOf(bucket.key.toLowerCase()) > 0) {
+ if (
+ filterItems
+ .item(i)
+ .textContent!.toString()
+ .toLowerCase()
+ .indexOf(bucket.key.toLowerCase()) > 0
+ ) {
filterItem = filterItems.item(i);
break;
}
@@ -139,23 +167,27 @@ describe('ContextMenuComponent', async () => {
it('should reset filter', () => {
instance.filterOption = getFilterContextType();
- instance.filterOption.options = [{
- field: 'type',
- buckets: [
- {count: 10, key: 'date series', checked: true}
- ]
- }];
+ instance.filterOption.options = [
+ {
+ field: 'type',
+ buckets: [{count: 10, key: 'date series', checked: true}],
+ },
+ ];
fixture.detectChanges();
// click reset button
- const resetButton: HTMLElement = fixture.debugElement.nativeElement.querySelector('.resetFilterButton');
+ const resetButton: HTMLElement =
+ fixture.debugElement.nativeElement.querySelector('.resetFilterButton');
resetButton.click();
expect(instance.filterOption.options[0].buckets[0].checked).toEqual(false);
});
});
+/**
+ *
+ */
function getSortContextType(): SortContext {
return {
name: 'sort',
@@ -178,97 +210,102 @@ function getSortContextType(): SortContext {
reversible: true,
value: 'type',
},
- ]
- }
+ ],
+ };
}
+/**
+ *
+ */
function getFilterContextType(): FilterContext {
return {
name: 'filter',
compact: false,
- options: facetsMock.filter((facet) => facet.buckets.length > 0).map((facet) => {
- return {
- buckets: facet.buckets.map((bucket) => {
- return {
- count: bucket.count,
- key: bucket.key,
- checked: false,
- }
- }),
- compact: false,
- field: facet.field,
- onlyOnType: facet.onlyOnType
- }
- })
- }
+ options: facetsMock
+ .filter(facet => facet.buckets.length > 0)
+ .map(facet => {
+ return {
+ buckets: facet.buckets.map(bucket => {
+ return {
+ count: bucket.count,
+ key: bucket.key,
+ checked: false,
+ };
+ }),
+ compact: false,
+ field: facet.field,
+ onlyOnType: facet.onlyOnType,
+ };
+ }),
+ };
}
const facetsMock: SCFacet[] = [
{
- 'buckets': [
+ buckets: [
{
- 'count': 60,
- 'key': 'academic event',
+ count: 60,
+ key: 'academic event',
},
{
- 'count': 160,
- 'key': 'message',
+ count: 160,
+ key: 'message',
},
{
- 'count': 151,
- 'key': 'date series',
+ count: 151,
+ key: 'date series',
},
{
- 'count': 106,
- 'key': 'dish',
+ count: 106,
+ key: 'dish',
},
{
- 'count': 20,
- 'key': 'building',
+ count: 20,
+ key: 'building',
},
],
- 'field': 'type',
+ field: 'type',
},
{
- 'buckets': [
+ buckets: [
{
- 'count': 12,
- 'key': 'Max Mustermann',
+ count: 12,
+ key: 'Max Mustermann',
},
{
- 'count': 2,
- 'key': 'Foo Bar',
+ count: 2,
+ key: 'Foo Bar',
},
],
- 'field': 'performers',
- 'onlyOnType': SCThingType.AcademicEvent,
+ field: 'performers',
+ onlyOnType: SCThingType.AcademicEvent,
},
{
- 'buckets': [
+ buckets: [
{
- 'count': 5,
- 'key': 'colloquium',
+ count: 5,
+ key: 'colloquium',
},
{
- 'count': 15,
- 'key': 'course',
+ count: 15,
+ key: 'course',
},
],
- 'field': 'categories',
- 'onlyOnType': SCThingType.AcademicEvent,
+ field: 'categories',
+ onlyOnType: SCThingType.AcademicEvent,
},
{
- 'buckets': [
+ buckets: [
{
- 'count': 5,
- 'key': 'employees',
+ count: 5,
+ key: 'employees',
},
{
- 'count': 15,
- 'key': 'students',
+ count: 15,
+ key: 'students',
},
],
- 'field': 'audiences',
- 'onlyOnType': SCThingType.Message,
+ field: 'audiences',
+ onlyOnType: SCThingType.Message,
},
];
diff --git a/src/app/modules/menu/context/context-menu.component.ts b/src/app/modules/menu/context/context-menu.component.ts
index 4e75a877..c66066d5 100644
--- a/src/app/modules/menu/context/context-menu.component.ts
+++ b/src/app/modules/menu/context/context-menu.component.ts
@@ -12,7 +12,7 @@
* You should have received a copy of the GNU General Public License along with
* this program. If not, see .
*/
-import {Component} from '@angular/core';
+import {Component, OnDestroy} from '@angular/core';
import {LangChangeEvent, TranslateService} from '@ngx-translate/core';
import {
SCLanguage,
@@ -37,8 +37,7 @@ import {FilterContext, SortContext, SortContextOption} from './context-type';
selector: 'stapps-context',
templateUrl: 'context-menu.html',
})
-export class ContextMenuComponent {
-
+export class ContextMenuComponent implements OnDestroy {
/**
* Amount of filter options shown on compact view
*/
@@ -74,24 +73,26 @@ export class ContextMenuComponent {
*/
translator: SCThingTranslator;
-
- constructor(private translateService: TranslateService,
- private readonly contextMenuService: ContextMenuService) {
- this.language = this.translateService.currentLang as keyof SCTranslations;
+ constructor(
+ private translateService: TranslateService,
+ private readonly contextMenuService: ContextMenuService,
+ ) {
+ this.language = this.translateService
+ .currentLang as keyof SCTranslations;
this.translator = new SCThingTranslator(this.language);
- this.subscriptions.push(this.translateService.onLangChange.subscribe((event: LangChangeEvent) => {
- this.language = event.lang as keyof SCTranslations;
- this.translator = new SCThingTranslator(this.language);
- }));
-
- this.subscriptions.push(this.contextMenuService.filterContextChanged$.subscribe((filterContext) => {
- this.filterOption = filterContext;
- }));
-
- this.subscriptions.push(this.contextMenuService.sortOptions.subscribe((sortContext) => {
- this.sortOption = sortContext;
- }));
+ this.subscriptions.push(
+ this.translateService.onLangChange.subscribe((event: LangChangeEvent) => {
+ this.language = event.lang as keyof SCTranslations;
+ this.translator = new SCThingTranslator(this.language);
+ }),
+ this.contextMenuService.filterContextChanged$.subscribe(filterContext => {
+ this.filterOption = filterContext;
+ }),
+ this.contextMenuService.sortOptions.subscribe(sortContext => {
+ this.sortOption = sortContext;
+ }),
+ );
}
/**
@@ -99,21 +100,31 @@ export class ContextMenuComponent {
*/
filterChanged = () => {
this.contextMenuService.contextFilterChanged(this.filterOption);
- }
+ };
/**
* Returns translated property name
*/
- getTranslatedPropertyName(property: string, onlyForType?: SCThingType): string {
- return (this.translator
- // tslint:disable-next-line:no-any
- .translatedPropertyNames(onlyForType ?? SCThingType.AcademicEvent) as any)[property];
+ getTranslatedPropertyName(
+ property: string,
+ onlyForType?: SCThingType,
+ ): string {
+ return (
+ this.translator.translatedPropertyNames(
+ onlyForType ?? SCThingType.AcademicEvent,
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ ) as any
+ )[property];
}
/**
* Returns translated property value
*/
- getTranslatedPropertyValue(onlyForType: SCThingType, field: string, key?: string): string | undefined {
+ getTranslatedPropertyValue(
+ onlyForType: SCThingType,
+ field: string,
+ key?: string,
+ ): string | undefined {
return this.translator.translatedPropertyValue(onlyForType, field, key);
}
@@ -130,11 +141,13 @@ export class ContextMenuComponent {
* Resets filter options
*/
resetFilter = (option: FilterContext) => {
- option.options.forEach((filterFacet) => filterFacet.buckets.forEach((filterBucket) => {
- filterBucket.checked = false;
- }));
+ for (const filterFacet of option.options)
+ for (const filterBucket of filterFacet.buckets) {
+ filterBucket.checked = false;
+ }
+
this.contextMenuService.contextFilterChanged(this.filterOption);
- }
+ };
/**
* Updates selected sort option and updates listener
@@ -151,5 +164,5 @@ export class ContextMenuComponent {
}
}
this.contextMenuService.contextSortChanged(option);
- }
+ };
}
diff --git a/src/app/modules/menu/context/context-menu.html b/src/app/modules/menu/context/context-menu.html
index 99cc52a2..c01545bf 100644
--- a/src/app/modules/menu/context/context-menu.html
+++ b/src/app/modules/menu/context/context-menu.html
@@ -1,28 +1,38 @@
- {{'menu.context.title' | translate | titlecase}}
+ {{ 'menu.context.title' | translate | titlecase }}
-
+
- {{'menu.context.sort.title' | translate | titlecase}}
+ {{
+ 'menu.context.sort.title' | translate | titlecase
+ }}
-
- {{'menu.context.sort.' + value.value | translate | titlecase}}
+
+ {{ 'menu.context.sort.' + value.value | translate | titlecase }}
-
-
+
+
-
-
+
@@ -30,48 +40,99 @@
- {{'menu.context.filter.title' | translate | titlecase}}
-
+ {{
+ 'menu.context.filter.title' | translate | titlecase
+ }}
+
-
-
+
+
- {{(facet.onlyOnType ? getTranslatedPropertyName(facet.field, facet.onlyOnType) : (getTranslatedPropertyName(facet.field))) | titlecase}}
- {{facet.onlyOnType ? ' | ' + (getTranslatedPropertyValue(facet.onlyOnType, 'type') | titlecase) : ''}}
+ {{
+ (facet.onlyOnType
+ ? getTranslatedPropertyName(facet.field, facet.onlyOnType)
+ : getTranslatedPropertyName(facet.field)
+ ) | titlecase
+ }}
+ {{
+ facet.onlyOnType
+ ? ' | ' +
+ (getTranslatedPropertyValue(facet.onlyOnType, 'type')
+ | titlecase)
+ : ''
+ }}
0">
+ *ngFor="
+ let bucket of !facet.compact
+ ? facet.buckets.slice(0, compactFilterOptionCount)
+ : facet.buckets
+ "
+ >
- ({{bucket.count}}) {{facet.field === 'type' ? (getTranslatedPropertyValue($any(bucket.key), 'type') | titlecase) :
- getTranslatedPropertyValue(facet.onlyOnType, facet.field, bucket.key) | titlecase}}
+ ({{ bucket.count }})
+ {{
+ facet.field === 'type'
+ ? (getTranslatedPropertyValue($any(bucket.key), 'type')
+ | titlecase)
+ : (getTranslatedPropertyValue(
+ facet.onlyOnType,
+ facet.field,
+ bucket.key
+ ) | titlecase)
+ }}
+ [(ngModel)]="bucket.checked"
+ (ngModelChange)="filterChanged()"
+ [value]="{
+ field: facet.field,
+ value: bucket.key,
+ onlyOnType: facet.onlyOnType
+ }"
+ >
- compactFilterOptionCount"
- (click)="facet.compact = true">
- {{'menu.context.filter.showAll' | translate}}
+ compactFilterOptionCount
+ "
+ (click)="facet.compact = true"
+ >
+ {{ 'menu.context.filter.showAll' | translate }}
-
compactFilterOptionCount"
- (click)="filterOption.compact = true">
- {{'menu.context.filter.showAll' | translate}}
+ compactFilterOptionCount
+ "
+ (click)="filterOption.compact = true"
+ >
+ {{ 'menu.context.filter.showAll' | translate }}
diff --git a/src/app/modules/menu/context/context-menu.service.spec.ts b/src/app/modules/menu/context/context-menu.service.spec.ts
index d8a3c067..a1f50124 100644
--- a/src/app/modules/menu/context/context-menu.service.spec.ts
+++ b/src/app/modules/menu/context/context-menu.service.spec.ts
@@ -9,7 +9,7 @@ describe('ContextMenuService', () => {
beforeEach(() => {
TestBed.configureTestingModule({
- providers: [ContextMenuService]
+ providers: [ContextMenuService],
});
service = TestBed.get(ContextMenuService);
});
@@ -18,38 +18,38 @@ describe('ContextMenuService', () => {
expect(service).toBeTruthy();
});
- it('should update filterOptions', (done) => {
- service.filterContextChanged$.subscribe((result) => {
+ it('should update filterOptions', done => {
+ service.filterContextChanged$.subscribe(result => {
expect(result).toBeDefined();
done();
});
service.updateContextFilter(facetsMock);
});
- it('should update filterQuery', (done) => {
+ it('should update filterQuery', done => {
service.filterContextChanged$.subscribe(() => {
service.contextFilterChanged(filterContext);
});
- service.filterQueryChanged$.subscribe((result) => {
+ service.filterQueryChanged$.subscribe(result => {
expect(result).toBeDefined();
done();
});
service.updateContextFilter(facetsMock);
});
- it('should update sortOptions', (done) => {
- service.sortContextChanged$.subscribe((result) => {
+ it('should update sortOptions', done => {
+ service.sortContextChanged$.subscribe(result => {
expect(result).toBeDefined();
done();
});
service.setContextSort(sortContext);
});
- it('should update sortQuery', (done) => {
+ it('should update sortQuery', done => {
service.sortContextChanged$.subscribe(() => {
service.contextSortChanged(sortContext);
});
- service.sortQueryChanged$.subscribe((result) => {
+ service.sortQueryChanged$.subscribe(result => {
expect(result).toBeDefined();
done();
});
@@ -57,37 +57,37 @@ describe('ContextMenuService', () => {
});
});
-
-const facetsMock: SCFacet[] =
- [{
- 'buckets': [
+const facetsMock: SCFacet[] = [
+ {
+ buckets: [
{
- 'count': 60,
- 'key': 'academic event',
+ count: 60,
+ key: 'academic event',
},
{
- 'count': 160,
- 'key': 'message',
+ count: 160,
+ key: 'message',
},
{
- 'count': 151,
- 'key': 'date series',
+ count: 151,
+ key: 'date series',
},
{
- 'count': 106,
- 'key': 'dish',
+ count: 106,
+ key: 'dish',
},
{
- 'count': 20,
- 'key': 'building',
+ count: 20,
+ key: 'building',
},
{
- 'count': 20,
- 'key': 'semester',
+ count: 20,
+ key: 'semester',
},
],
- 'field': 'type',
- }];
+ field: 'type',
+ },
+];
const filterContext: FilterContext = {
name: 'filter',
@@ -97,8 +97,9 @@ const filterContext: FilterContext = {
{
checked: true,
count: 60,
- key: 'academic event'
- }, {
+ key: 'academic event',
+ },
+ {
checked: false,
count: 160,
key: 'message',
@@ -106,26 +107,28 @@ const filterContext: FilterContext = {
{
checked: false,
count: 151,
- key: 'date series'
- }, {
+ key: 'date series',
+ },
+ {
checked: false,
count: 106,
- key: 'dish'
+ key: 'dish',
},
{
checked: false,
count: 20,
- key: 'building'
+ key: 'building',
},
{
checked: false,
count: 20,
- key: 'semester'
- }
+ key: 'semester',
+ },
],
- field: 'type'
- }]
-}
+ field: 'type',
+ },
+ ],
+};
const sortContext: SortContext = {
name: 'sort',
@@ -145,4 +148,4 @@ const sortContext: SortContext = {
value: 'type',
},
],
-}
+};
diff --git a/src/app/modules/menu/context/context-menu.service.ts b/src/app/modules/menu/context/context-menu.service.ts
index cb2add3b..08f00a82 100644
--- a/src/app/modules/menu/context/context-menu.service.ts
+++ b/src/app/modules/menu/context/context-menu.service.ts
@@ -13,16 +13,20 @@
* this program. If not, see .
*/
import {Injectable} from '@angular/core';
-import {SCFacet, SCFacetBucket, SCSearchFilter, SCSearchSort} from '@openstapps/core';
+import {SCFacet, SCSearchFilter, SCSearchSort} from '@openstapps/core';
import {Subject} from 'rxjs';
-import {FilterBucket, FilterContext, FilterFacet, SortContext} from './context-type';
+import {
+ FilterBucket,
+ FilterContext,
+ FilterFacet,
+ SortContext,
+} from './context-type';
/**
* ContextMenuService provides bidirectional communication of context menu options and search queries
*/
@Injectable()
export class ContextMenuService {
-
/**
* Local filter context object
*/
@@ -31,13 +35,13 @@ export class ContextMenuService {
/**
* Container for the filter context
*/
- // tslint:disable-next-line:member-ordering
+ // eslint-disable-next-line @typescript-eslint/member-ordering
filterOptions = new Subject();
/**
* Observable filterContext streams
*/
- // tslint:disable-next-line:member-ordering
+ // eslint-disable-next-line @typescript-eslint/member-ordering
filterContextChanged$ = this.filterOptions.asObservable();
/**
@@ -48,19 +52,19 @@ export class ContextMenuService {
/**
* Observable filterContext streams
*/
- // tslint:disable-next-line:member-ordering
+ // eslint-disable-next-line @typescript-eslint/member-ordering
filterQueryChanged$ = this.filterQuery.asObservable();
/**
* Container for the sort context
*/
- // tslint:disable-next-line:member-ordering
+ // eslint-disable-next-line @typescript-eslint/member-ordering
sortOptions = new Subject();
/**
* Observable SortContext streams
*/
- // tslint:disable-next-line:member-ordering
+ // eslint-disable-next-line @typescript-eslint/member-ordering
sortContextChanged$ = this.sortOptions.asObservable();
/**
@@ -71,30 +75,32 @@ export class ContextMenuService {
/**
* Observable SortContext streams
*/
- // tslint:disable-next-line:member-ordering
+ // eslint-disable-next-line @typescript-eslint/member-ordering
sortQueryChanged$ = this.sortQuery.asObservable();
/**
* Returns SCSearchFilter if filterContext value is set, undefined otherwise
+ *
* @param filterContext FilterContext to build SCSearchFilter from
*/
- buildFilterQuery = (filterContext: FilterContext): SCSearchFilter | undefined => {
+ buildFilterQuery = (
+ filterContext: FilterContext,
+ ): SCSearchFilter | undefined => {
const filters: SCSearchFilter[] = [];
- filterContext.options.forEach((filterFacet) => {
+ for (const filterFacet of filterContext.options) {
const optionFilters: SCSearchFilter[] = [];
- filterFacet.buckets.forEach((filterBucket) => {
+ for (const filterBucket of filterFacet.buckets) {
if (filterBucket.checked) {
- optionFilters.push(
- {
- arguments: {
- field: filterFacet.field,
- value: filterBucket.key,
- },
- type: 'value',
- });
+ optionFilters.push({
+ arguments: {
+ field: filterFacet.field,
+ value: filterBucket.key,
+ },
+ type: 'value',
+ });
}
- });
+ }
if (optionFilters.length > 0) {
filters.push({
arguments: {
@@ -104,7 +110,7 @@ export class ContextMenuService {
type: 'boolean',
});
}
- });
+ }
if (filters.length > 0) {
return {
@@ -117,28 +123,31 @@ export class ContextMenuService {
}
return;
- }
+ };
/**
* Returns SCSearchSort if sorting value is set, undefined otherwise
+ *
* @param sortContext SortContext to build SCSearchSort from
*/
buildSortQuery = (sortContext: SortContext): SCSearchSort | undefined => {
- if (sortContext.value && sortContext.value.length > 0) {
- if (sortContext.value === 'name' || sortContext.value === 'type') {
- return {
- arguments: {
- field: sortContext.value,
- position: 0,
- },
- order: sortContext.reversed ? 'desc' : 'asc',
- type: 'ducet',
- };
- }
+ if (
+ sortContext.value &&
+ sortContext.value.length > 0 &&
+ (sortContext.value === 'name' || sortContext.value === 'type')
+ ) {
+ return {
+ arguments: {
+ field: sortContext.value,
+ position: 0,
+ },
+ order: sortContext.reversed ? 'desc' : 'asc',
+ type: 'ducet',
+ };
}
return;
- }
+ };
/**
* Updates filter query from filterContext
@@ -192,7 +201,10 @@ export class ContextMenuService {
* Updates context filter with new facets.
* It preserves the checked status of existing filter options
*/
- updateContextFilterOptions = (contextFilter: FilterContext, facets: SCFacet[]) => {
+ updateContextFilterOptions = (
+ contextFilter: FilterContext,
+ facets: SCFacet[],
+ ) => {
const newFilterOptions: FilterFacet[] = [];
// iterate new facets
@@ -206,19 +218,28 @@ export class ContextMenuService {
newFilterOptions.push(newFilterFacet);
// search existing filterOption
- const filterOption = contextFilter.options.find((contextFacet: FilterFacet) =>
- contextFacet.field === facet.field && contextFacet.onlyOnType === facet.onlyOnType);
- facet.buckets.forEach((bucket: SCFacetBucket) => {
+ const filterOption = contextFilter.options.find(
+ (contextFacet: FilterFacet) =>
+ contextFacet.field === facet.field &&
+ contextFacet.onlyOnType === facet.onlyOnType,
+ );
+ for (const bucket of facet.buckets) {
// search existing bucket to preserve checked status
- const existingFilterBucket = filterOption ? filterOption.buckets
- .find((contextBucket: FilterBucket) => contextBucket.key === bucket.key) : undefined;
+ const existingFilterBucket = filterOption
+ ? filterOption.buckets.find(
+ (contextBucket: FilterBucket) =>
+ contextBucket.key === bucket.key,
+ )
+ : undefined;
const filterBucket: FilterBucket = {
- checked: existingFilterBucket ? existingFilterBucket.checked : false,
+ checked: existingFilterBucket
+ ? existingFilterBucket.checked
+ : false,
count: bucket.count,
key: bucket.key,
};
newFilterFacet.buckets.push(filterBucket);
- });
+ }
}
}
@@ -227,5 +248,5 @@ export class ContextMenuService {
this.contextFilter = contextFilter;
this.filterOptions.next(contextFilter);
- }
+ };
}
diff --git a/src/app/modules/menu/context/context-type.ts b/src/app/modules/menu/context/context-type.ts
index 2abe8021..9acfbcf2 100644
--- a/src/app/modules/menu/context/context-type.ts
+++ b/src/app/modules/menu/context/context-type.ts
@@ -14,8 +14,6 @@
*/
import {SCFacet, SCFacetBucket} from '@openstapps/core';
-export type ContextType = FilterContext | SortContext;
-
/**
* A sort context
*/
diff --git a/src/app/modules/menu/menu.module.ts b/src/app/modules/menu/menu.module.ts
index 1d7ebbea..1118c4f9 100644
--- a/src/app/modules/menu/menu.module.ts
+++ b/src/app/modules/menu/menu.module.ts
@@ -27,24 +27,16 @@ import {NavigationComponent} from './navigation/navigation.component';
* Menu module
*/
@NgModule({
- declarations: [
- NavigationComponent,
- ContextMenuComponent,
- ],
- exports: [
- NavigationComponent,
- ContextMenuComponent,
- ],
+ declarations: [NavigationComponent, ContextMenuComponent],
+ exports: [NavigationComponent, ContextMenuComponent],
imports: [
+ CommonModule,
FormsModule,
IonicModule.forRoot(),
- TranslateModule.forChild(),
- CommonModule,
RouterModule,
SettingsModule,
+ TranslateModule.forChild(),
],
- providers: [
- ContextMenuService,
- ],
+ providers: [ContextMenuService],
})
export class MenuModule {}
diff --git a/src/app/modules/menu/navigation/navigation.component.ts b/src/app/modules/menu/navigation/navigation.component.ts
index 0a84fc82..f68df701 100644
--- a/src/app/modules/menu/navigation/navigation.component.ts
+++ b/src/app/modules/menu/navigation/navigation.component.ts
@@ -14,7 +14,12 @@
*/
import {Component} from '@angular/core';
import {LangChangeEvent, TranslateService} from '@ngx-translate/core';
-import {SCAppConfigurationMenuCategory, SCLanguage, SCThingTranslator, SCTranslations} from '@openstapps/core';
+import {
+ SCAppConfigurationMenuCategory,
+ SCLanguage,
+ SCThingTranslator,
+ SCTranslations,
+} from '@openstapps/core';
import {NGXLogger} from 'ngx-logger';
import {ConfigProvider} from '../../config/config.provider';
@@ -30,7 +35,6 @@ import {ConfigProvider} from '../../config/config.provider';
templateUrl: 'navigation.html',
})
export class NavigationComponent {
-
/**
* Possible languages to be used for translation
*/
@@ -46,10 +50,12 @@ export class NavigationComponent {
*/
translator: SCThingTranslator;
- constructor(private readonly configProvider: ConfigProvider,
- public translateService: TranslateService,
- private readonly logger: NGXLogger) {
- this.loadMenuEntries();
+ constructor(
+ private readonly configProvider: ConfigProvider,
+ public translateService: TranslateService,
+ private readonly logger: NGXLogger,
+ ) {
+ void this.loadMenuEntries();
translateService.onLangChange.subscribe((event: LangChangeEvent) => {
this.language = event.lang as keyof SCTranslations;
this.translator = new SCThingTranslator(this.language);
@@ -62,11 +68,12 @@ export class NavigationComponent {
*/
async loadMenuEntries() {
try {
- this.menu = await this.configProvider.getValue('menus') as SCAppConfigurationMenuCategory[];
+ this.menu = (await this.configProvider.getValue(
+ 'menus',
+ )) as SCAppConfigurationMenuCategory[];
} catch (error) {
this.logger.error(`error from loading menu entries: ${error}`);
}
-
}
// openPage(page) {
diff --git a/src/app/modules/menu/navigation/navigation.html b/src/app/modules/menu/navigation/navigation.html
index 0aa10636..01a2986d 100644
--- a/src/app/modules/menu/navigation/navigation.html
+++ b/src/app/modules/menu/navigation/navigation.html
@@ -6,24 +6,23 @@
-
+
StApps
-
+
- {{category.translations[language].name | titlecase}}
+ {{ category.translations[language].name | titlecase }}
- {{item.translations[language].title | titlecase}}
+ {{ item.translations[language].title | titlecase }}
diff --git a/src/app/modules/news/news.module.ts b/src/app/modules/news/news.module.ts
index 62066ee3..ecfed80f 100644
--- a/src/app/modules/news/news.module.ts
+++ b/src/app/modules/news/news.module.ts
@@ -22,31 +22,27 @@ import {DataModule} from '../data/data.module';
import {SettingsProvider} from '../settings/settings.provider';
import {NewsItemComponent} from './page/news-item.component';
import {NewsPageComponent} from './page/news-page.component';
-import {SkeletonNewsItem} from './page/skeleton-news-item.component';
+import {SkeletonNewsItemComponent} from './page/skeleton-news-item.component';
-const newsRoutes: Routes = [
- {path: 'news', component: NewsPageComponent},
-];
+const newsRoutes: Routes = [{path: 'news', component: NewsPageComponent}];
/**
* News Module
*/
@NgModule({
declarations: [
- NewsPageComponent,
- SkeletonNewsItem,
NewsItemComponent,
+ NewsPageComponent,
+ SkeletonNewsItemComponent,
],
imports: [
- IonicModule.forRoot(),
- TranslateModule.forChild(),
- RouterModule.forChild(newsRoutes),
CommonModule,
- MomentModule,
DataModule,
+ IonicModule.forRoot(),
+ MomentModule,
+ RouterModule.forChild(newsRoutes),
+ TranslateModule.forChild(),
],
- providers: [
- SettingsProvider,
- ],
+ providers: [SettingsProvider],
})
export class NewsModule {}
diff --git a/src/app/modules/news/news.provider.ts b/src/app/modules/news/news.provider.ts
index 1c4caa35..5f3fa0d1 100644
--- a/src/app/modules/news/news.provider.ts
+++ b/src/app/modules/news/news.provider.ts
@@ -15,6 +15,7 @@
import {Injectable} from '@angular/core';
import {SCMessage} from '@openstapps/core';
import {DataProvider} from '../data/data.provider';
+
/**
* Service for providing news messages
*/
@@ -22,12 +23,12 @@ import {DataProvider} from '../data/data.provider';
providedIn: 'root',
})
export class NewsProvider {
- constructor(private dataProvider: DataProvider) {
- }
+ constructor(private dataProvider: DataProvider) {}
/**
* Get news messages
* TODO: make dates sortable on the backend side and then adjust this method
+ *
* @param size How many messages/news to fetch
* @param sort If sort by date needs to be performed
*/
@@ -47,8 +48,15 @@ export class NewsProvider {
if (sort) {
news.sort((a, b) => {
- if (typeof a.datePublished !== 'undefined' && typeof b.datePublished !== 'undefined') {
- return (a.datePublished > b.datePublished) ? -1 : ((a.datePublished < b.datePublished) ? 1 : 0);
+ if (
+ typeof a.datePublished !== 'undefined' &&
+ typeof b.datePublished !== 'undefined'
+ ) {
+ return a.datePublished > b.datePublished
+ ? -1
+ : a.datePublished < b.datePublished
+ ? 1
+ : 0;
}
return 0;
diff --git a/src/app/modules/news/page/news-item.component.ts b/src/app/modules/news/page/news-item.component.ts
index 432a6e09..90010b75 100644
--- a/src/app/modules/news/page/news-item.component.ts
+++ b/src/app/modules/news/page/news-item.component.ts
@@ -27,5 +27,4 @@ export class NewsItemComponent {
* News (message) to show
*/
@Input() item: SCMessage;
-
}
diff --git a/src/app/modules/news/page/news-item.html b/src/app/modules/news/page/news-item.html
index 078abcbc..dcb2de4d 100644
--- a/src/app/modules/news/page/news-item.html
+++ b/src/app/modules/news/page/news-item.html
@@ -1,25 +1,41 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
+
- {{item.datePublished | amDateFormat:'LLL'}}
+ {{
+ item.datePublished | amDateFormat: 'LLL'
+ }}
- {{item.name}}
- {{item.name}}
+ {{ item.name }}
+ {{ item.name }}
- {{item.messageBody}}
+ {{ item.messageBody }}
diff --git a/src/app/modules/news/page/news-page.component.ts b/src/app/modules/news/page/news-page.component.ts
index 6edcb9c7..cad46950 100644
--- a/src/app/modules/news/page/news-page.component.ts
+++ b/src/app/modules/news/page/news-page.component.ts
@@ -12,7 +12,7 @@
* You should have received a copy of the GNU General Public License along with
* this program. If not, see .
*/
-import {Component} from '@angular/core';
+import {Component, OnInit} from '@angular/core';
import {IonRefresher} from '@ionic/angular';
import {SCMessage} from '@openstapps/core';
import {NewsProvider} from '../news.provider';
@@ -23,20 +23,19 @@ import {NewsProvider} from '../news.provider';
selector: 'stapps-news-page',
templateUrl: 'news-page.html',
})
-export class NewsPageComponent {
+export class NewsPageComponent implements OnInit {
/**
* News (messages) to show
*/
news: SCMessage[] = [];
- constructor(private newsProvider: NewsProvider) {
- }
+ constructor(private newsProvider: NewsProvider) {}
/**
* Fetch news from the backend
*/
async fetchNews() {
- /* tslint:disable:no-magic-numbers */
+ /* eslint-disable no-magic-numbers */
this.news = await this.newsProvider.getList(30, true);
}
@@ -55,7 +54,7 @@ export class NewsPageComponent {
async refresh(refresher: IonRefresher) {
try {
await this.fetchNews();
- } catch (e) {
+ } catch {
this.news = [];
} finally {
await refresher.complete();
diff --git a/src/app/modules/news/page/news-page.html b/src/app/modules/news/page/news-page.html
index 38f71463..e92a79e0 100644
--- a/src/app/modules/news/page/news-page.html
+++ b/src/app/modules/news/page/news-page.html
@@ -5,14 +5,17 @@
- {{'news.title' | translate}}
+ {{ 'news.title' | translate }}
-
+
diff --git a/src/app/modules/news/page/skeleton-news-item.component.ts b/src/app/modules/news/page/skeleton-news-item.component.ts
index 9e325cbb..3f168138 100644
--- a/src/app/modules/news/page/skeleton-news-item.component.ts
+++ b/src/app/modules/news/page/skeleton-news-item.component.ts
@@ -21,5 +21,4 @@ import {Component} from '@angular/core';
selector: 'stapps-skeleton-news-item',
templateUrl: 'skeleton-news-item.html',
})
-export class SkeletonNewsItem {
-}
+export class SkeletonNewsItemComponent {}
diff --git a/src/app/modules/news/page/skeleton-news-item.html b/src/app/modules/news/page/skeleton-news-item.html
index fa2ad103..d3413067 100644
--- a/src/app/modules/news/page/skeleton-news-item.html
+++ b/src/app/modules/news/page/skeleton-news-item.html
@@ -1,12 +1,18 @@
-
-
-
+
+
+
-
-
-
+
+
+
diff --git a/src/app/modules/settings/item/settings-item.component.ts b/src/app/modules/settings/item/settings-item.component.ts
index 00863f12..4fc14d3b 100644
--- a/src/app/modules/settings/item/settings-item.component.ts
+++ b/src/app/modules/settings/item/settings-item.component.ts
@@ -31,7 +31,6 @@ import {SettingsProvider} from '../settings.provider';
templateUrl: 'settings-item.html',
})
export class SettingsItemComponent {
-
/**
* If set the setting will be shown as compact view
*/
@@ -41,6 +40,7 @@ export class SettingsItemComponent {
* Flag for workaround for selected 'select option' not updating translation
*/
isVisible = true;
+
/**
* The setting to handle
*/
@@ -52,13 +52,15 @@ export class SettingsItemComponent {
* @param translateService TranslateService
* @param settingsProvider SettingProvider
*/
- constructor(private readonly alertCtrl: AlertController,
- private readonly translateService: TranslateService,
- private readonly settingsProvider: SettingsProvider) {
+ constructor(
+ private readonly alertCtrl: AlertController,
+ private readonly translateService: TranslateService,
+ private readonly settingsProvider: SettingsProvider,
+ ) {
translateService.onLangChange.subscribe((_event: LangChangeEvent) => {
this.isVisible = false;
// TODO: Issue #53 check workaround for selected 'select option' not updating translation
- setTimeout(() => this.isVisible = true);
+ setTimeout(() => (this.isVisible = true));
});
}
@@ -81,8 +83,10 @@ export class SettingsItemComponent {
* Handles value changes of the setting
*/
async settingChanged(): Promise {
- if (typeof this.setting.value !== 'undefined'
- && SettingsProvider.validateValue(this.setting, this.setting.value)) {
+ if (
+ typeof this.setting.value !== 'undefined' &&
+ SettingsProvider.validateValue(this.setting, this.setting.value)
+ ) {
// handle general settings, with special actions
switch (this.setting.name) {
case 'language':
@@ -90,23 +94,25 @@ export class SettingsItemComponent {
break;
default:
}
- await this.settingsProvider
- .setSettingValue(this.setting.categories[0],
- this.setting.name,
- this.setting.value);
+ await this.settingsProvider.setSettingValue(
+ this.setting.categories[0],
+ this.setting.name,
+ this.setting.value,
+ );
} else {
// reset setting
- this.setting.value =
- await this.settingsProvider
- .getValue(this.setting.categories[0], this.setting.name) as (SCSettingValue | SCSettingValues);
+ this.setting.value = (await this.settingsProvider.getValue(
+ this.setting.categories[0],
+ this.setting.name,
+ )) as SCSettingValue | SCSettingValues;
}
}
/**
* Mapping of typeOf for Html usage
*/
- // tslint:disable-next-line:prefer-function-over-method
- typeOf(val: unknown) {
- return typeof (val);
+ // eslint-disable-next-line class-methods-use-this
+ typeOf(value: unknown) {
+ return typeof value;
}
}
diff --git a/src/app/modules/settings/item/settings-item.html b/src/app/modules/settings/item/settings-item.html
index afba4e7d..1bb980b3 100644
--- a/src/app/modules/settings/item/settings-item.html
+++ b/src/app/modules/settings/item/settings-item.html
@@ -1,37 +1,80 @@
-
+
{{ vals.name }}
-
+
- {{ 'description' | thingTranslate: setting | titlecase }}
+ {{
+ 'description' | thingTranslate: setting | titlecase
+ }}
-
+
-
+
-
+
-
+
-
+
-
-
- {{ ('values' | thingTranslate: setting)[i] | titlecase }}
+
+
+
+ {{ ('values' | thingTranslate: setting)[i] | titlecase }}
+
{{ val }}
@@ -39,9 +82,18 @@
-
-
- {{ ('values' | thingTranslate: setting)[i] | titlecase }}
+
+
+
+ {{ ('values' | thingTranslate: setting)[i] | titlecase }}
+
{{ val }}
diff --git a/src/app/modules/settings/page/settings-page.component.ts b/src/app/modules/settings/page/settings-page.component.ts
index e66128df..754c69c6 100644
--- a/src/app/modules/settings/page/settings-page.component.ts
+++ b/src/app/modules/settings/page/settings-page.component.ts
@@ -12,31 +12,35 @@
* You should have received a copy of the GNU General Public License along with
* this program. If not, see .
*/
-import {ChangeDetectorRef, Component} from '@angular/core';
+import {ChangeDetectorRef, Component, OnInit} from '@angular/core';
import {AlertController, ToastController} from '@ionic/angular';
import {TranslateService} from '@ngx-translate/core';
import {SCSettingMeta} from '@openstapps/core';
import {SettingsCache, SettingsProvider} from '../settings.provider';
- /**
- * Settings page component
- */
+
+/**
+ * Settings page component
+ */
@Component({
selector: 'stapps-settings-page',
templateUrl: 'settings-page.html',
})
-export class SettingsPageComponent {
+export class SettingsPageComponent implements OnInit {
/**
* Order of the categories
*/
categoriesOrder: string[];
+
/**
* Meta information about settings
*/
meta = SCSettingMeta;
+
/**
* Mapping of Object.keys for Html usage
*/
objectKeys = Object.keys;
+
/**
* Container to cache settings from provider
*/
@@ -50,11 +54,13 @@ export class SettingsPageComponent {
* @param translateService TranslateService
* @param changeDetectorRef ChangeDetectorRef
*/
- constructor(private readonly alertController: AlertController,
- private readonly settingsProvider: SettingsProvider,
- private readonly toastController: ToastController,
- private readonly translateService: TranslateService,
- private readonly changeDetectorRef: ChangeDetectorRef) {
+ constructor(
+ private readonly alertController: AlertController,
+ private readonly settingsProvider: SettingsProvider,
+ private readonly toastController: ToastController,
+ private readonly translateService: TranslateService,
+ private readonly changeDetectorRef: ChangeDetectorRef,
+ ) {
this.settingsCache = {};
}
@@ -92,13 +98,17 @@ export class SettingsPageComponent {
* Presents an alert to the user to reset settings to default values
*/
async presentResetAlert() {
- const cancelText = await this.translateService.get('settings.resetAlert.buttonCancel')
+ const cancelText = await this.translateService
+ .get('settings.resetAlert.buttonCancel')
.toPromise();
- const yesText = await this.translateService.get('settings.resetAlert.buttonYes')
+ const yesText = await this.translateService
+ .get('settings.resetAlert.buttonYes')
.toPromise();
- const title = await this.translateService.get('settings.resetAlert.title')
+ const title = await this.translateService
+ .get('settings.resetAlert.title')
.toPromise();
- const message = await this.translateService.get('settings.resetAlert.message')
+ const message = await this.translateService
+ .get('settings.resetAlert.message')
.toPromise();
const alert = await this.alertController.create({
@@ -117,7 +127,7 @@ export class SettingsPageComponent {
header: title,
message: message,
});
- alert.present();
+ await alert.present();
}
/**
@@ -129,15 +139,17 @@ export class SettingsPageComponent {
await this.presentSettingsResetToast();
}
- /**
- * Shows alert to reset settings
- */
+ /**
+ * Shows alert to reset settings
+ */
async showResetAlert() {
const alert = await this.alertController.create({
buttons: [
{
role: 'cancel',
- text: this.translateService.instant('settings.resetAlert.buttonCancel'),
+ text: this.translateService.instant(
+ 'settings.resetAlert.buttonCancel',
+ ),
},
{
handler: async () => {
@@ -150,6 +162,6 @@ export class SettingsPageComponent {
message: this.translateService.instant('settings.resetAlert.message'),
});
- alert.present();
+ await alert.present();
}
}
diff --git a/src/app/modules/settings/page/settings-page.html b/src/app/modules/settings/page/settings-page.html
index c7b8ac04..e2f10366 100644
--- a/src/app/modules/settings/page/settings-page.html
+++ b/src/app/modules/settings/page/settings-page.html
@@ -4,21 +4,40 @@
- {{'settings.title' | translate | titlecase}}
+ {{ 'settings.title' | translate | titlecase }}
-
+
- {{ 'categories[0]' | thingTranslate: settingsCache[categoryKey]?.settings[objectKeys(settingsCache[categoryKey]?.settings)[0]] | titlecase }}
+
+ {{
+ 'categories[0]'
+ | thingTranslate
+ : settingsCache[categoryKey]?.settings[
+ objectKeys(settingsCache[categoryKey]?.settings)[0]
+ ]
+ | titlecase
+ }}
+
-
+
-
- {{'settings.resetSettings' | translate}}
+
+ {{ 'settings.resetSettings' | translate }}
diff --git a/src/app/modules/settings/settings.module.ts b/src/app/modules/settings/settings.module.ts
index e4397af2..3f955911 100644
--- a/src/app/modules/settings/settings.module.ts
+++ b/src/app/modules/settings/settings.module.ts
@@ -33,24 +33,16 @@ const settingsRoutes: Routes = [
* Settings Module
*/
@NgModule({
- declarations: [
- SettingsPageComponent,
- SettingsItemComponent,
- ],
- exports: [
- SettingsItemComponent,
- ],
+ declarations: [SettingsPageComponent, SettingsItemComponent],
+ exports: [SettingsItemComponent],
imports: [
CommonModule,
FormsModule,
IonicModule.forRoot(),
- TranslateModule.forChild(),
- ThingTranslateModule.forChild(),
RouterModule.forChild(settingsRoutes),
+ ThingTranslateModule.forChild(),
+ TranslateModule.forChild(),
],
- providers: [
- ConfigProvider,
- SettingsProvider,
- ],
+ providers: [ConfigProvider, SettingsProvider],
})
export class SettingsModule {}
diff --git a/src/app/modules/settings/settings.provider.spec.ts b/src/app/modules/settings/settings.provider.spec.ts
index 3fe1af8e..d7b391a1 100644
--- a/src/app/modules/settings/settings.provider.spec.ts
+++ b/src/app/modules/settings/settings.provider.spec.ts
@@ -13,10 +13,19 @@
* this program. If not, see .
*/
import {TestBed} from '@angular/core/testing';
-import {SCSetting, SCThingOriginType, SCThingType, SCSettingInputType} from '@openstapps/core';
+import {
+ SCSetting,
+ SCThingOriginType,
+ SCThingType,
+ SCSettingInputType,
+} from '@openstapps/core';
import {ConfigProvider} from '../config/config.provider';
import {StorageProvider} from '../storage/storage.provider';
-import {SettingsProvider, SettingValuesContainer, STORAGE_KEY_SETTING_VALUES} from './settings.provider';
+import {
+ SettingsProvider,
+ SettingValuesContainer,
+ STORAGE_KEY_SETTING_VALUES,
+} from './settings.provider';
describe('SettingsProvider', () => {
let configProviderSpy: jasmine.SpyObj;
@@ -24,50 +33,73 @@ describe('SettingsProvider', () => {
let storageProviderSpy: jasmine.SpyObj;
beforeEach(async () => {
- const storageProviderMethodSpy = jasmine.createSpyObj('StorageProvider', ['init', 'get', 'has', 'put']);
- const configProviderMethodSpy = jasmine.createSpyObj('ConfigProvider', ['getValue']);
+ const storageProviderMethodSpy = jasmine.createSpyObj('StorageProvider', [
+ 'init',
+ 'get',
+ 'has',
+ 'put',
+ ]);
+ const configProviderMethodSpy = jasmine.createSpyObj('ConfigProvider', [
+ 'getValue',
+ ]);
TestBed.configureTestingModule({
imports: [],
providers: [
SettingsProvider,
{
- provide: StorageProvider, useValue: storageProviderMethodSpy,
+ provide: StorageProvider,
+ useValue: storageProviderMethodSpy,
},
{
- provide: ConfigProvider, useValue: configProviderMethodSpy,
+ provide: ConfigProvider,
+ useValue: configProviderMethodSpy,
},
],
});
configProviderSpy = TestBed.get(ConfigProvider);
// set settings returned from config
- configProviderSpy.getValue.and.returnValue(Promise.resolve(CONFIG_SETTINGS_MOCK));
+ configProviderSpy.getValue.and.returnValue(
+ Promise.resolve(CONFIG_SETTINGS_MOCK),
+ );
settingsProvider = TestBed.get(SettingsProvider);
storageProviderSpy = TestBed.get(StorageProvider);
storageProviderMethodSpy.has.and.returnValue(false);
});
it('should provide and get setting', async () => {
- await settingsProvider.provideSetting(JSON.parse(JSON.stringify(CONFIG_SETTINGS_MOCK[0])));
- const setting: SCSetting = await settingsProvider
- .getSetting(CONFIG_SETTINGS_MOCK[0].categories[0], CONFIG_SETTINGS_MOCK[0].name);
+ await settingsProvider.provideSetting(
+ JSON.parse(JSON.stringify(CONFIG_SETTINGS_MOCK[0])),
+ );
+ const setting: SCSetting = await settingsProvider.getSetting(
+ CONFIG_SETTINGS_MOCK[0].categories[0],
+ CONFIG_SETTINGS_MOCK[0].name,
+ );
await expect(setting.value).toBeDefined();
});
it('should provide and get settings value', async () => {
- await settingsProvider.provideSetting(JSON.parse(JSON.stringify(CONFIG_SETTINGS_MOCK[0])));
- const value = await settingsProvider
- .getValue(CONFIG_SETTINGS_MOCK[0].categories[0], CONFIG_SETTINGS_MOCK[0].name);
+ await settingsProvider.provideSetting(
+ JSON.parse(JSON.stringify(CONFIG_SETTINGS_MOCK[0])),
+ );
+ const value = await settingsProvider.getValue(
+ CONFIG_SETTINGS_MOCK[0].categories[0],
+ CONFIG_SETTINGS_MOCK[0].name,
+ );
await expect(value).toEqual(CONFIG_SETTINGS_MOCK[0].defaultValue);
});
it('should get persisted setting value', async () => {
// set return values of storage
storageProviderSpy.has.and.returnValue(Promise.resolve(true));
- storageProviderSpy.get.and.returnValue(Promise.resolve(SETTING_VALUES_MOCK));
+ storageProviderSpy.get.and.returnValue(
+ Promise.resolve(SETTING_VALUES_MOCK),
+ );
- const value = await settingsProvider
- .getValue(CONFIG_SETTINGS_MOCK[3].categories[0], CONFIG_SETTINGS_MOCK[3].name);
+ const value = await settingsProvider.getValue(
+ CONFIG_SETTINGS_MOCK[3].categories[0],
+ CONFIG_SETTINGS_MOCK[3].name,
+ );
await expect(value).toEqual(SETTING_VALUES_MOCK.profile.group);
});
@@ -75,74 +107,100 @@ describe('SettingsProvider', () => {
// set return values of spy objects
storageProviderSpy.has.and.returnValue(Promise.resolve(true));
storageProviderSpy.get.and.returnValue(Promise.resolve([]));
- const value = await settingsProvider
- .getValue(CONFIG_SETTINGS_MOCK[3].categories[0], CONFIG_SETTINGS_MOCK[3].name);
+ const value = await settingsProvider.getValue(
+ CONFIG_SETTINGS_MOCK[3].categories[0],
+ CONFIG_SETTINGS_MOCK[3].name,
+ );
await expect(value).toEqual(CONFIG_SETTINGS_MOCK[3].defaultValue);
});
it('should keep persisted setting values from settings that are not contained in loaded config', async () => {
- const settings = [
- CONFIG_SETTINGS_MOCK[4],
- CONFIG_SETTINGS_MOCK[5],
- ];
+ const settings = [CONFIG_SETTINGS_MOCK[4], CONFIG_SETTINGS_MOCK[5]];
configProviderSpy.getValue.and.returnValue(Promise.resolve(settings));
storageProviderSpy.has.and.returnValue(Promise.resolve(true));
- storageProviderSpy.get.and.returnValue(Promise.resolve(SETTING_VALUES_MOCK));
+ storageProviderSpy.get.and.returnValue(
+ Promise.resolve(SETTING_VALUES_MOCK),
+ );
await settingsProvider.init();
- await expect(storageProviderSpy.put).toHaveBeenCalledWith(STORAGE_KEY_SETTING_VALUES, SETTING_VALUES_MOCK);
+ await expect(storageProviderSpy.put).toHaveBeenCalledWith(
+ STORAGE_KEY_SETTING_VALUES,
+ SETTING_VALUES_MOCK,
+ );
});
it('should set value of a provided setting', async () => {
- await settingsProvider.provideSetting(JSON.parse(JSON.stringify(CONFIG_SETTINGS_MOCK[1])));
- await settingsProvider
- .setSettingValue(CONFIG_SETTINGS_MOCK[1].categories[0], CONFIG_SETTINGS_MOCK[1].name, 'updated');
- const value = await settingsProvider
- .getValue(CONFIG_SETTINGS_MOCK[1].categories[0], CONFIG_SETTINGS_MOCK[1].name);
+ await settingsProvider.provideSetting(
+ JSON.parse(JSON.stringify(CONFIG_SETTINGS_MOCK[1])),
+ );
+ await settingsProvider.setSettingValue(
+ CONFIG_SETTINGS_MOCK[1].categories[0],
+ CONFIG_SETTINGS_MOCK[1].name,
+ 'updated',
+ );
+ const value = await settingsProvider.getValue(
+ CONFIG_SETTINGS_MOCK[1].categories[0],
+ CONFIG_SETTINGS_MOCK[1].name,
+ );
await expect(value).toEqual('updated');
});
it('should return copy of settingsCache', async () => {
const category = CONFIG_SETTINGS_MOCK[0].categories[0];
const name = CONFIG_SETTINGS_MOCK[0].name;
- await settingsProvider.provideSetting(JSON.parse(JSON.stringify(CONFIG_SETTINGS_MOCK[0])));
+ await settingsProvider.provideSetting(
+ JSON.parse(JSON.stringify(CONFIG_SETTINGS_MOCK[0])),
+ );
const settings = await settingsProvider.getCache();
settings[category].settings[name].value = 'testValue';
// cached setting value should still be defaultValue
- await expect((await settingsProvider.getValue(category, name)))
- .toEqual(CONFIG_SETTINGS_MOCK[0].defaultValue);
+ await expect(await settingsProvider.getValue(category, name)).toEqual(
+ CONFIG_SETTINGS_MOCK[0].defaultValue,
+ );
});
it('should call storage put on setSettingValue', async () => {
- await settingsProvider.provideSetting(JSON.parse(JSON.stringify(CONFIG_SETTINGS_MOCK[0])));
- await settingsProvider
- .setSettingValue(CONFIG_SETTINGS_MOCK[0].categories[0], CONFIG_SETTINGS_MOCK[0].name, '');
+ await settingsProvider.provideSetting(
+ JSON.parse(JSON.stringify(CONFIG_SETTINGS_MOCK[0])),
+ );
+ await settingsProvider.setSettingValue(
+ CONFIG_SETTINGS_MOCK[0].categories[0],
+ CONFIG_SETTINGS_MOCK[0].name,
+ '',
+ );
await expect(storageProviderSpy.put).toHaveBeenCalled();
});
it('should clear settings', async () => {
await settingsProvider.reset();
- await expect(storageProviderSpy.put).toHaveBeenCalledWith(STORAGE_KEY_SETTING_VALUES, {});
+ await expect(storageProviderSpy.put).toHaveBeenCalledWith(
+ STORAGE_KEY_SETTING_VALUES,
+ {},
+ );
});
it('should reset settings', async () => {
const category = CONFIG_SETTINGS_MOCK[0].categories[0];
const name = CONFIG_SETTINGS_MOCK[0].name;
- await settingsProvider.provideSetting(JSON.parse(JSON.stringify(CONFIG_SETTINGS_MOCK[0])));
+ await settingsProvider.provideSetting(
+ JSON.parse(JSON.stringify(CONFIG_SETTINGS_MOCK[0])),
+ );
await settingsProvider.setSettingValue(category, name, 'guest');
await settingsProvider.resetDefault();
- const value = await settingsProvider
- .getValue(CONFIG_SETTINGS_MOCK[0].categories[0], CONFIG_SETTINGS_MOCK[0].name);
+ const value = await settingsProvider.getValue(
+ CONFIG_SETTINGS_MOCK[0].categories[0],
+ CONFIG_SETTINGS_MOCK[0].name,
+ );
await expect(value).toEqual(CONFIG_SETTINGS_MOCK[0].defaultValue);
});
it('should validate wrong values for inputType text', async () => {
- await testValue(CONFIG_SETTINGS_MOCK[0], 123456789);
+ await testValue(CONFIG_SETTINGS_MOCK[0], 123_456_789);
await testValue(CONFIG_SETTINGS_MOCK[0], false);
await testValue(CONFIG_SETTINGS_MOCK[0], []);
});
it('should validate wrong values for inputType password', async () => {
- await testValue(CONFIG_SETTINGS_MOCK[0], 123456789);
+ await testValue(CONFIG_SETTINGS_MOCK[0], 123_456_789);
await testValue(CONFIG_SETTINGS_MOCK[0], false);
await testValue(CONFIG_SETTINGS_MOCK[0], []);
});
@@ -155,34 +213,43 @@ describe('SettingsProvider', () => {
it('should validate wrong values for inputType singleChoice text', async () => {
await testValue(CONFIG_SETTINGS_MOCK[3], '');
- await testValue(CONFIG_SETTINGS_MOCK[3], 123456);
+ await testValue(CONFIG_SETTINGS_MOCK[3], 123_456);
await testValue(CONFIG_SETTINGS_MOCK[3], false);
await testValue(CONFIG_SETTINGS_MOCK[3], []);
});
it('should validate wrong values for inputType singleChoice boolean', async () => {
await testValue(CONFIG_SETTINGS_MOCK[5], '');
- await testValue(CONFIG_SETTINGS_MOCK[5], 123456);
+ await testValue(CONFIG_SETTINGS_MOCK[5], 123_456);
await testValue(CONFIG_SETTINGS_MOCK[5], []);
});
it('should validate wrong values for inputType multipleChoice', async () => {
await testValue(CONFIG_SETTINGS_MOCK[6], '');
- await testValue(CONFIG_SETTINGS_MOCK[6], 123456);
+ await testValue(CONFIG_SETTINGS_MOCK[6], 123_456);
await testValue(CONFIG_SETTINGS_MOCK[6], false);
await testValue(CONFIG_SETTINGS_MOCK[6], [1, 9]);
});
- async function testValue(setting: SCSetting, value: any) {
+ /**
+ * TODO
+ */
+ async function testValue(setting: SCSetting, value: unknown) {
let error: Error;
await settingsProvider.provideSetting(JSON.parse(JSON.stringify(setting)));
try {
- await settingsProvider.setSettingValue(setting.categories[0], setting.name, value);
- } catch (err) {
- error = err;
+ await settingsProvider.setSettingValue(
+ setting.categories[0],
+ setting.name,
+ value as never,
+ );
+ } catch (error_) {
+ error = error_;
}
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
await expect(error).toBeDefined();
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
await expect(error.message).toMatch(/is not valid/);
}
@@ -270,13 +337,15 @@ describe('SettingsProvider', () => {
},
translations: {
de: {
- description: 'Mit welcher Benutzergruppe soll die App verwendet werden?'
- + ' Die Einstellung wird beispielsweise für die Vorauswahl der Preiskategorie der Mensa verwendet.',
+ description:
+ 'Mit welcher Benutzergruppe soll die App verwendet werden?' +
+ ' Die Einstellung wird beispielsweise für die Vorauswahl der Preiskategorie der Mensa verwendet.',
name: 'Gruppe',
},
en: {
- description: 'The user group the app is going to be used.'
- + 'This settings for example is getting used for the predefined price category of mensa meals.',
+ description:
+ 'The user group the app is going to be used.' +
+ 'This settings for example is getting used for the predefined price category of mensa meals.',
name: 'Group',
},
},
diff --git a/src/app/modules/settings/settings.provider.ts b/src/app/modules/settings/settings.provider.ts
index 21960759..7696bac1 100644
--- a/src/app/modules/settings/settings.provider.ts
+++ b/src/app/modules/settings/settings.provider.ts
@@ -13,11 +13,7 @@
* this program. If not, see .
*/
import {Injectable} from '@angular/core';
-import {
- SCSetting,
- SCSettingValue,
- SCSettingValues,
-} from '@openstapps/core';
+import {SCSetting, SCSettingValue, SCSettingValues} from '@openstapps/core';
import deepMerge from 'deepmerge';
import {Subject} from 'rxjs';
import {ConfigProvider} from '../config/config.provider';
@@ -38,7 +34,7 @@ export interface CategoryWithSettings {
/**
* Settings that belong in this category
*/
- settings: { [key: string]: SCSetting; };
+ settings: {[key: string]: SCSetting};
}
/**
@@ -99,14 +95,17 @@ export class SettingsProvider {
* Source of settings actions
*/
private settingsActionSource = new Subject();
+
/**
* Order of the setting categories
*/
categoriesOrder: string[];
+
/**
* Settings actions observable
*/
settingsActionChanged$ = this.settingsActionSource.asObservable();
+
/**
* Cache for the imported settings
*/
@@ -114,6 +113,7 @@ export class SettingsProvider {
/**
* Return true if all given values are valid to possible values in given settingInput
+ *
* @param possibleValues Possible values
* @param enteredValues Entered value
*/
@@ -121,7 +121,7 @@ export class SettingsProvider {
possibleValues: SCSettingValues | undefined,
enteredValues: SCSettingValues,
): boolean {
- if ( typeof possibleValues === 'undefined' ) {
+ if (typeof possibleValues === 'undefined') {
return false;
}
@@ -136,6 +136,7 @@ export class SettingsProvider {
/**
* Returns true if given value is valid to possible values in given settingInput
+ *
* @param possibleValues Possible values
* @param enteredValue Entered value
*/
@@ -143,21 +144,27 @@ export class SettingsProvider {
possibleValues: SCSettingValues | undefined,
enteredValue: SCSettingValue,
): boolean {
- if ( typeof possibleValues === 'undefined' ) {
+ if (typeof possibleValues === 'undefined') {
return false;
}
- return possibleValues !== undefined
- && (Array.isArray(possibleValues)
- && possibleValues.includes(enteredValue));
+ return (
+ possibleValues !== undefined &&
+ Array.isArray(possibleValues) &&
+ possibleValues.includes(enteredValue)
+ );
}
/**
* Validates value for given settings inputType. Returns true if value is valid.
+ *
* @param setting setting to check value against
* @param value value to validate
*/
- public static validateValue(setting: SCSetting, value: SCSettingValue | SCSettingValues): boolean {
+ public static validateValue(
+ setting: SCSetting,
+ value: SCSettingValue | SCSettingValues,
+ ): boolean {
let isValueValid = false;
switch (setting.inputType) {
case 'number':
@@ -166,11 +173,9 @@ export class SettingsProvider {
}
break;
case 'multiple choice':
- if (!Array.isArray(value)) {
- isValueValid = false;
- } else {
- isValueValid = SettingsProvider.checkMultipleChoiceValue(setting.values, value);
- }
+ isValueValid = !Array.isArray(value)
+ ? false
+ : SettingsProvider.checkMultipleChoiceValue(setting.values, value);
break;
case 'password':
case 'text':
@@ -179,11 +184,9 @@ export class SettingsProvider {
}
break;
case 'single choice':
- if (Array.isArray(value)) {
- isValueValid = false;
- } else {
- isValueValid = SettingsProvider.checkSingleChoiceValue(setting.values, value);
- }
+ isValueValid = Array.isArray(value)
+ ? false
+ : SettingsProvider.checkSingleChoiceValue(setting.values, value);
break;
default:
}
@@ -196,14 +199,17 @@ export class SettingsProvider {
* @param storage TODO
* @param configProvider TODO
*/
- constructor(private readonly storage: StorageProvider,
- private readonly configProvider: ConfigProvider) {
+ constructor(
+ private readonly storage: StorageProvider,
+ private readonly configProvider: ConfigProvider,
+ ) {
this.categoriesOrder = [];
this.settingsCache = {};
}
/**
* Add an Setting to the Cache if not exist and set undefined value to defaultValue
+ *
* @param setting Setting with categories, defaultValue, name, input type and valid values
*/
private addSetting(setting: SCSetting): void {
@@ -214,7 +220,8 @@ export class SettingsProvider {
if (setting.value === undefined) {
setting.value = setting.defaultValue;
}
- this.settingsCache[setting.categories[0]].settings[setting.name] = setting;
+ this.settingsCache[setting.categories[0]].settings[setting.name] =
+ setting;
}
}
@@ -226,7 +233,9 @@ export class SettingsProvider {
// iterate through keys of categories
for (const categoryKey of Object.keys(this.settingsCache)) {
// iterate through keys of settingValueContainer
- for (const settingKey of Object.keys(this.settingsCache[categoryKey].settings)) {
+ for (const settingKey of Object.keys(
+ this.settingsCache[categoryKey].settings,
+ )) {
if (typeof settingValuesContainer[categoryKey] === 'undefined') {
settingValuesContainer[categoryKey] = {};
}
@@ -240,6 +249,7 @@ export class SettingsProvider {
/**
* Add category if not exists
+ *
* @param category the category to provide
*/
private provideCategory(category: string): void {
@@ -256,6 +266,7 @@ export class SettingsProvider {
/**
* Returns true if category exists
+ *
* @param category Category key name
*/
public categoryExists(category: string): boolean {
@@ -280,32 +291,39 @@ export class SettingsProvider {
/**
* Returns copy of a setting if exist
+ *
* @param category the category of requested setting
* @param name the name of requested setting
- *
* @throws Exception if setting is not provided
*/
public async getSetting(category: string, name: string): Promise {
await this.init();
if (this.settingExists(category, name)) {
// return a copy of the settings
- return JSON.parse(JSON.stringify(this.settingsCache[category].settings[name]));
+ return JSON.parse(
+ JSON.stringify(this.settingsCache[category].settings[name]),
+ );
}
throw new Error(`Setting "${name}" not provided`);
}
/**
* Returns copy of a settings value if exist
+ *
* @param category the category of requested setting
* @param name the name of requested setting
- *
* @throws Exception if setting is not provided
*/
- public async getValue(category: string, name: string): Promise {
+ public async getValue(
+ category: string,
+ name: string,
+ ): Promise {
await this.init();
if (this.settingExists(category, name)) {
// return a copy of the settings value
- return JSON.parse(JSON.stringify(this.settingsCache[category].settings[name].value));
+ return JSON.parse(
+ JSON.stringify(this.settingsCache[category].settings[name].value),
+ );
}
throw new Error(`Setting "${name}" not provided`);
}
@@ -313,31 +331,39 @@ export class SettingsProvider {
/**
* Initializes settings from config and stored values if exist
*/
- public async init(): Promise {
+ public async init(): Promise {
try {
- const settings: SCSetting[] = (await this.configProvider.getValue('settings')) as SCSetting[];
- settings.forEach((setting) => this.addSetting(setting));
+ const settings: SCSetting[] = (await this.configProvider.getValue(
+ 'settings',
+ )) as SCSetting[];
+ for (const setting of settings) this.addSetting(setting);
for (const category of Object.keys(this.settingsCache)) {
if (!this.categoriesOrder.includes(category)) {
this.categoriesOrder.push(category);
}
}
- } catch (error) {
+ } catch {
this.settingsCache = {};
}
if (await this.storage.has(STORAGE_KEY_SETTING_VALUES)) {
// get setting values from StorageProvider into settingsCache
const valuesContainer: SettingValuesContainer =
- await this.storage.get(STORAGE_KEY_SETTING_VALUES);
+ await this.storage.get(
+ STORAGE_KEY_SETTING_VALUES,
+ );
// iterate through keys of categories
for (const categoryKey of Object.keys(this.settingsCache)) {
// iterate through setting keys of category
- for (const settingKey of Object.keys(this.settingsCache[categoryKey].settings)) {
+ for (const settingKey of Object.keys(
+ this.settingsCache[categoryKey].settings,
+ )) {
// if saved setting value exists set it, otherwise set to default value
- if (typeof valuesContainer[categoryKey] !== 'undefined'
- && typeof valuesContainer[categoryKey][settingKey] !== 'undefined') {
+ if (
+ typeof valuesContainer[categoryKey] !== 'undefined' &&
+ typeof valuesContainer[categoryKey][settingKey] !== 'undefined'
+ ) {
this.settingsCache[categoryKey].settings[settingKey].value =
valuesContainer[categoryKey][settingKey];
} else {
@@ -352,6 +378,7 @@ export class SettingsProvider {
/**
* Adds given setting and its category if not exist
+ *
* @param setting the setting to add
*/
public provideSetting(setting: SCSetting): void {
@@ -371,7 +398,9 @@ export class SettingsProvider {
*/
async resetDefault(): Promise {
for (const catKey of Object.keys(this.settingsCache)) {
- for (const settingKey of Object.keys(this.settingsCache[catKey].settings)) {
+ for (const settingKey of Object.keys(
+ this.settingsCache[catKey].settings,
+ )) {
const settingInput = this.settingsCache[catKey].settings[settingKey];
settingInput.value = settingInput.defaultValue;
}
@@ -385,18 +414,29 @@ export class SettingsProvider {
public async saveSettingValues(): Promise {
if (await this.storage.has(STORAGE_KEY_SETTING_VALUES)) {
const savedSettingsValues: SettingValuesContainer =
- await this.storage.get(STORAGE_KEY_SETTING_VALUES);
+ await this.storage.get(
+ STORAGE_KEY_SETTING_VALUES,
+ );
const cacheSettingsValues = this.getSettingValuesFromCache();
- const mergedSettingValues = deepMerge(savedSettingsValues, cacheSettingsValues);
- await this.storage
- .put(STORAGE_KEY_SETTING_VALUES, mergedSettingValues);
+ const mergedSettingValues = deepMerge(
+ savedSettingsValues,
+ cacheSettingsValues,
+ );
+ await this.storage.put(
+ STORAGE_KEY_SETTING_VALUES,
+ mergedSettingValues,
+ );
} else {
- await this.storage.put(STORAGE_KEY_SETTING_VALUES, this.getSettingValuesFromCache());
+ await this.storage.put(
+ STORAGE_KEY_SETTING_VALUES,
+ this.getSettingValuesFromCache(),
+ );
}
}
/**
* Sets the order the given categories show up in the settings page
+ *
* @param categoryNames the order of the categories
*/
public setCategoriesOrder(categoryNames: string[]) {
@@ -409,11 +449,13 @@ export class SettingsProvider {
* @param category Category key name
* @param name Setting key name
* @param value Value to be set
- *
* @throws Exception if setting is not provided or value not valid to the settings inputType
*/
- public async setSettingValue(category: string, name: string,
- value: SCSettingValue | SCSettingValues): Promise {
+ public async setSettingValue(
+ category: string,
+ name: string,
+ value: SCSettingValue | SCSettingValues,
+ ): Promise {
await this.init();
if (this.settingExists(category, name)) {
const setting: SCSetting = this.settingsCache[category].settings[name];
@@ -423,7 +465,10 @@ export class SettingsProvider {
this.settingsCache[category].settings[name].value = value;
await this.saveSettingValues();
// publish setting changes
- this.settingsActionSource.next({type: 'stapps.settings.changed', payload: {category, name, value}});
+ this.settingsActionSource.next({
+ type: 'stapps.settings.changed',
+ payload: {category, name, value},
+ });
} else {
throw new Error(`Value "${value}" of type
${typeof value} is not valid for ${setting.inputType}`);
@@ -435,10 +480,14 @@ export class SettingsProvider {
/**
* Returns true if setting in category exists
+ *
* @param category Category key name
* @param setting Setting key name
*/
public settingExists(category: string, setting: string): boolean {
- return this.categoryExists(category) && this.settingsCache[category].settings[setting] !== undefined;
+ return (
+ this.categoryExists(category) &&
+ this.settingsCache[category].settings[setting] !== undefined
+ );
}
}
diff --git a/src/app/modules/storage/storage.module.ts b/src/app/modules/storage/storage.module.ts
index ccf6ce40..732b1fb3 100644
--- a/src/app/modules/storage/storage.module.ts
+++ b/src/app/modules/storage/storage.module.ts
@@ -20,11 +20,7 @@ import {StorageProvider} from './storage.provider';
* Angular storage provider module
*/
@NgModule({
- imports: [
- IonicStorageModule.forRoot(),
- ],
- providers: [
- StorageProvider,
- ],
+ imports: [IonicStorageModule.forRoot()],
+ providers: [StorageProvider],
})
export class StorageModule {}
diff --git a/src/app/modules/storage/storage.provider.spec.ts b/src/app/modules/storage/storage.provider.spec.ts
index 1c888c4d..98d1fa15 100644
--- a/src/app/modules/storage/storage.provider.spec.ts
+++ b/src/app/modules/storage/storage.provider.spec.ts
@@ -1,3 +1,4 @@
+/* eslint-disable @typescript-eslint/no-explicit-any */
/*
* Copyright (C) 2018, 2019 StApps
* This program is free software: you can redistribute it and/or modify it
@@ -61,17 +62,23 @@ describe('StorageProvider', () => {
it('should properly put and get a value', async () => {
await storageProvider.init();
await storageProvider.put('some-uid', {some: 'thing'});
- const result: Map = await storageProvider.get