- {{ translatedSetting.description() }}
+ {{ translatedSetting.description() }}
diff --git a/src/app/modules/settings/page/settings-page.component.ts b/src/app/modules/settings/page/settings-page.component.ts
index 526e554b..3bf484b6 100644
--- a/src/app/modules/settings/page/settings-page.component.ts
+++ b/src/app/modules/settings/page/settings-page.component.ts
@@ -12,12 +12,11 @@
* 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 {ChangeDetectorRef, Component} from '@angular/core';
import {AlertController, ToastController} from '@ionic/angular';
import {LangChangeEvent, TranslateService} from '@ngx-translate/core';
import {SCLanguage, SCSettingMeta, SCThingTranslator, SCTranslations} from '@openstapps/core';
import {SettingsCache, SettingsProvider} from '../settings.provider';
-
/**
* Settings page component
*/
@@ -59,11 +58,13 @@ export class SettingsPageComponent {
* @param settingsProvider SettingsProvider
* @param toastController ToastController
* @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 translateService: TranslateService,
+ private readonly changeDetectorRef: ChangeDetectorRef) {
this.language = translateService.currentLang as keyof SCTranslations;
this.translator = new SCThingTranslator(this.language);
@@ -72,8 +73,6 @@ export class SettingsPageComponent {
this.translator = new SCThingTranslator(this.language);
});
this.settingsCache = {};
- this.categoriesOrder = settingsProvider.getCategoriesOrder();
-
}
/**
@@ -93,6 +92,9 @@ export class SettingsPageComponent {
*/
async loadSettings(): Promise {
this.settingsCache = await this.settingsProvider.getCache();
+ // categoriesOrder triggers updating the View, because it is used in the ngFor loop
+ this.categoriesOrder = this.settingsProvider.getCategoriesOrder();
+ this.changeDetectorRef.detectChanges();
}
/**
diff --git a/src/app/modules/settings/settings.module.ts b/src/app/modules/settings/settings.module.ts
index 771cd19e..96d8848c 100644
--- a/src/app/modules/settings/settings.module.ts
+++ b/src/app/modules/settings/settings.module.ts
@@ -17,7 +17,7 @@ import {NgModule} from '@angular/core';
import {FormsModule} from '@angular/forms';
import {RouterModule, Routes} from '@angular/router';
import {Geolocation} from '@ionic-native/geolocation/ngx';
-import {IonicModule} from '@ionic/angular';
+import {Events, IonicModule} from '@ionic/angular';
import {TranslateModule} from '@ngx-translate/core';
import {ConfigProvider} from '../config/config.provider';
@@ -37,6 +37,9 @@ const settingsRoutes: Routes = [
SettingsPageComponent,
SettingsItemComponent,
],
+ exports: [
+ SettingsItemComponent,
+ ],
imports: [
CommonModule,
FormsModule,
@@ -46,6 +49,7 @@ const settingsRoutes: Routes = [
],
providers: [
ConfigProvider,
+ Events,
Geolocation,
SettingsProvider,
],
diff --git a/src/app/modules/settings/settings.provider.ts b/src/app/modules/settings/settings.provider.ts
index 34da2d2b..f4631a2a 100644
--- a/src/app/modules/settings/settings.provider.ts
+++ b/src/app/modules/settings/settings.provider.ts
@@ -14,12 +14,13 @@
*/
import {Injectable} from '@angular/core';
import {Geolocation} from '@ionic-native/geolocation/ngx';
+import {Events} from '@ionic/angular';
import {
SCSetting,
SCSettingValue,
SCSettingValues,
} from '@openstapps/core';
-import deepmerge from 'deepmerge';
+import deepMerge from 'deepmerge';
import {ConfigProvider} from '../config/config.provider';
import {StorageProvider} from '../storage/storage.provider';
@@ -164,10 +165,12 @@ export class SettingsProvider {
* @param storage TODO
* @param configProvider TODO
* @param geoLocation TODO
+ * @param events TODO
*/
constructor(private readonly storage: StorageProvider,
private readonly configProvider: ConfigProvider,
- private readonly geoLocation: Geolocation) {
+ private readonly geoLocation: Geolocation,
+ private readonly events: Events) {
this.categoriesOrder = [];
this.settingsCache = {};
}
@@ -246,8 +249,9 @@ export class SettingsProvider {
}
await this.saveSettingValues();
}
-
this.initialized = true;
+ // publish provider initialised
+ this.events.publish('stapps.settings.initialised');
}
/**
@@ -339,7 +343,7 @@ export class SettingsProvider {
*
* @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
@@ -395,7 +399,7 @@ export class SettingsProvider {
const savedSettingsValues: SettingValuesContainer =
await this.storage.get(STORAGE_KEY_SETTING_VALUES);
const cacheSettingsValues = this.getSettingValuesFromCache();
- const mergedSettingValues = deepmerge(savedSettingsValues, cacheSettingsValues);
+ const mergedSettingValues = deepMerge(savedSettingsValues, cacheSettingsValues);
await this.storage
.put(STORAGE_KEY_SETTING_VALUES, mergedSettingValues);
} else {
@@ -412,7 +416,8 @@ export class SettingsProvider {
}
/**
- * Sets a valid value of a setting and persists changes in storage
+ * Sets a valid value of a setting and persists changes in storage. Also the changes get published bey Events
+ *
* @param category Category key name
* @param name Setting key name
* @param value Value to be set
@@ -426,8 +431,11 @@ export class SettingsProvider {
const setting: SCSetting = this.settingsCache[category].settings[name];
const isValueValid = SettingsProvider.validateValue(setting, value);
if (isValueValid) {
+ // set and persist new value
this.settingsCache[category].settings[name].value = value;
await this.saveSettingValues();
+ // publish setting changes
+ this.events.publish('stapps.settings.changed', category, name, value);
} else {
throw new Error(`Value "${value}" of type
${typeof value} is not valid for ${setting.inputType}`);
diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json
index a663ab3d..f3940e22 100644
--- a/src/assets/i18n/de.json
+++ b/src/assets/i18n/de.json
@@ -18,8 +18,19 @@
"menu": {
"context": {
"title": "Kontext Menü",
- "sort": "Sortierung",
- "filter": "Filter"
+ "sort": {
+ "title": "Sortierung",
+ "relevance": "Relevanz",
+ "name": "Name",
+ "date": "Datum",
+ "type": "Typ"
+ },
+ "filter": {
+ "title": "Filter",
+ "options": "Optionen",
+ "showAll": "alle anzeigen"
+ },
+ "settings": "Einstellungen"
}
},
"settings": {
diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json
index 0827c9e2..47cc1222 100644
--- a/src/assets/i18n/en.json
+++ b/src/assets/i18n/en.json
@@ -17,16 +17,27 @@
},
"menu": {
"context": {
- "title": "Context Menu",
- "sort": "Sort",
- "filter": "Filter"
+ "title": "context menu",
+ "sort": {
+ "title": "sort",
+ "relevance": "relevance",
+ "name": "name",
+ "date": "date",
+ "type": "type"
+ },
+ "filter": {
+ "title": "filter",
+ "options": "options",
+ "showAll": "show all"
+ },
+ "settings": "settings"
}
},
"settings": {
"resetAlert.title": "Reset all settings?",
"resetAlert.message": "Are you shure to reset all settings to defaults values?",
- "resetAlert.buttonYes": "Yes",
- "resetAlert.buttonCancel": "Cancel",
+ "resetAlert.buttonYes": "yes",
+ "resetAlert.buttonCancel": "cancel",
"resetToast.message": "Settings reset",
"title": "Settings",
"geoLocation": {
diff --git a/src/environments/environment.web.ts b/src/environments/environment.web.ts
index da306246..4d819c6c 100644
--- a/src/environments/environment.web.ts
+++ b/src/environments/environment.web.ts
@@ -16,5 +16,5 @@ export const environment = {
backend_url: 'http://localhost:3000',
backend_version: '1.0.0',
use_fake_backend: true,
- production: true,
+ production: false,
};