Commit e9b87aad by Nabil Sadki

Merge branch 'v1.1.4.0' into v1.1.5.0

# Conflicts:
#	config.xml
#	package.json
#	src/app/app-routing.module.ts
#	src/app/app.component.ts
#	src/app/app.module.ts
#	src/app/app.scss
#	src/app/pages/menu/menu.page.html
#	src/app/pages/menu/menu.page.ts
#	src/app/pages/offres/offres-carte/offres-carte.page.ts
parents 0740749b 3c3e8f68
v1.1.4.0
- Add wishlist
v1.1.0.0
- Add login form
- Optimise launch time
......
<?xml version='1.0' encoding='utf-8'?>
<widget android-versionCode="11500" id="com.allotesteurs.app" version="1.1.5.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<widget android-versionCode="11500" id="com.allotesteurs.app" version="1.1.5.0" xmlns="http://www.w3.org/ns/widgets" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name>Allo Testeurs</name>
<description>Découvrir les bon plans à Kénitra et ailleurs!</description>
<author email="contact@allo-testeurs.com" href="https://www.allo-testeurs.com">Allo Testeurs Agency</author>
<content src="index.html" />
<access origin="*" />
<edit-config file="app/src/main/AndroidManifest.xml" mode="merge" target="/manifest/application">
<application android:usesCleartextTraffic="true" />
</edit-config>
<allow-navigation href="*" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-navigation href="http://*/*" />
......@@ -14,24 +18,6 @@
<allow-intent href="geo:*" />
<platform name="android">
<allow-intent href="market:*" />
<icon density="ldpi" src="src\assets\img\ionic3-ico.png" />
<icon density="mdpi" src="src\assets\img\ionic3-ico.png" />
<icon density="hdpi" src="src\assets\img\ionic3-ico.png" />
<icon density="xhdpi" src="src\assets\img\ionic3-ico.png" />
<icon density="xxhdpi" src="src\assets\img\ionic3-ico.png" />
<icon density="xxxhdpi" src="src\assets\img\ionic3-ico.png" />
<splash density="land-ldpi" src="resources\splash.png" />
<splash density="land-mdpi" src="resources\splash.png" />
<splash density="land-hdpi" src="resources\splash.png" />
<splash density="land-xhdpi" src="resources\splash.png" />
<splash density="land-xxhdpi" src="resources\splash.png" />
<splash density="land-xxxhdpi" src="resources\splash.png" />
<splash density="port-ldpi" src="resources\splash.png" />
<splash density="port-mdpi" src="resources\splash.png" />
<splash density="port-hdpi" src="resources\splash.png" />
<splash density="port-xhdpi" src="resources\splash.png" />
<splash density="port-xxhdpi" src="resources\splash.png" />
<splash density="port-xxxhdpi" src="resources\splash.png" />
<icon density="ldpi" src="resources/android/icon/drawable-ldpi-icon.png" />
<icon density="mdpi" src="resources/android/icon/drawable-mdpi-icon.png" />
<icon density="hdpi" src="resources/android/icon/drawable-hdpi-icon.png" />
......@@ -86,6 +72,19 @@
<splash height="480" src="resources/ios/splash/Default~iphone.png" width="320" />
<icon height="1024" src="resources/ios/icon/icon-1024.png" width="1024" />
<splash height="2732" src="resources/ios/splash/Default@2x~universal~anyany.png" width="2732" />
<icon height="20" src="resources/ios/icon/icon-20.png" width="20" />
<icon height="40" src="resources/ios/icon/icon-20@2x.png" width="40" />
<icon height="60" src="resources/ios/icon/icon-20@3x.png" width="60" />
<icon height="29" src="resources/ios/icon/icon-29.png" width="29" />
<icon height="58" src="resources/ios/icon/icon-29@2x.png" width="58" />
<icon height="87" src="resources/ios/icon/icon-29@3x.png" width="87" />
<icon height="48" src="resources/ios/icon/icon-24@2x.png" width="48" />
<icon height="55" src="resources/ios/icon/icon-27.5@2x.png" width="55" />
<icon height="88" src="resources/ios/icon/icon-44@2x.png" width="88" />
<icon height="172" src="resources/ios/icon/icon-86@2x.png" width="172" />
<icon height="196" src="resources/ios/icon/icon-98@2x.png" width="196" />
<splash height="2436" src="resources/ios/splash/Default-2436h.png" width="1125" />
<splash height="1125" src="resources/ios/splash/Default-Landscape-2436h.png" width="2436" />
</platform>
<preference name="orientation" value="portrait" />
<preference name="webviewbounce" value="false" />
......
{
"name": "atapp",
"version": "1.0.0",
"description": "",
"main": "index.js",
"version": "1.1.5.0",
"author": "Allo Testeurs",
"homepage": "http://www.allo-testeurs.com/",
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e"
},
"private": true,
"dependencies": {
"cordova-android": "^8.0.0",
"@angular/common": "^7.2.2",
"@angular/core": "^7.2.2",
"@angular/fire": "^5.2.1",
"@angular/forms": "^7.2.2",
"@angular/http": "^7.2.2",
"@angular/platform-browser": "^7.2.2",
"@angular/platform-browser-dynamic": "^7.2.2",
"@angular/router": "^7.2.2",
"@ionic-native/app-version": "^5.11.0",
"@ionic-native/background-geolocation": "^5.8.0",
"@ionic-native/background-mode": "^5.11.0",
"@ionic-native/core": "^5.0.0",
"@ionic-native/diagnostic": "^5.8.0",
"@ionic-native/google-plus": "^5.0.0",
"@ionic-native/http": "^5.8.0",
"@ionic-native/local-notifications": "^5.11.0",
"@ionic-native/location-accuracy": "^5.8.0",
"@ionic-native/splash-screen": "^5.0.0",
"@ionic-native/status-bar": "^5.0.0",
"@ionic/angular": "^4.1.0",
"@ionic/storage": "^2.2.0",
"cordova-android": "^8.1.0",
"cordova-plugin-advanced-http": "^2.1.1",
"cordova-plugin-app-version": "^0.1.9",
"cordova-plugin-background-mode": "^0.7.2",
"cordova-plugin-camera": "^4.1.0",
"cordova-plugin-file": "^6.0.1",
"cordova-plugin-background-mode": "git+https://github.com/sercatven/cordova-plugin-background-mode.git",
"cordova-plugin-badge": "^0.8.8",
"cordova-plugin-filepath": "^1.5.6",
"cordova-plugin-file": "^6.0.1",
"cordova-plugin-googleplus": "^8.0.0",
"cordova-plugin-local-notification": "^0.9.0-beta.2",
"cordova-plugin-play-games-services": "^1.1.2",
"cordova-plugin-qrscanner": "^3.0.1",
"cordova-plugin-request-location-accuracy": "^2.3.0",
"cordova-sqlite-storage": "^3.2.0",
"cordova.plugins.diagnostic": "^5.0.0",
"core-js": "^2.5.4",
"firebase": "^6.6.1",
"ionic-image-loader": "^6.3.3",
"leaflet.markercluster": "^1.4.1",
"leaflet": "^1.5.1",
"path": "^0.12.7"
"leaflet.markercluster": "^1.4.1",
"path": "^0.12.7",
"rxjs": "~6.5.1",
"sweetalert": "^2.1.2",
"tslib": "^1.9.0",
"zone.js": "~0.8.29"
},
"devDependencies": {},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
"devDependencies": {
"@angular-devkit/architect": "~0.13.8",
"@angular-devkit/build-angular": "~0.13.8",
"@angular-devkit/core": "~7.3.8",
"@angular-devkit/schematics": "~7.3.8",
"@angular/cli": "~7.3.8",
"@angular/compiler": "~7.2.2",
"@angular/compiler-cli": "~7.2.2",
"@angular/language-service": "~7.2.2",
"@ionic/angular-toolkit": "~1.5.1",
"@ionic/lab": "2.0.4",
"@types/jasmine": "~2.8.8",
"@types/jasminewd2": "~2.0.3",
"@types/node": "~12.0.0",
"codelyzer": "~4.5.0",
"jasmine-core": "~2.99.1",
"jasmine-spec-reporter": "~4.2.1",
"karma": "~4.1.0",
"karma-chrome-launcher": "~2.2.0",
"karma-coverage-istanbul-reporter": "~2.0.1",
"karma-jasmine": "~1.1.2",
"karma-jasmine-html-reporter": "^0.2.2",
"protractor": "~5.4.0",
"ts-node": "~8.3.0",
"tslint": "~5.17.0",
"typescript": "~3.1.6",
"cordova-plugin-whitelist": "1.3.3",
"cordova-plugin-statusbar": "2.4.2",
"cordova-plugin-device": "2.0.2",
"cordova-plugin-splashscreen": "5.0.2",
"cordova-plugin-ionic-webview": "^4.0.0",
"cordova-plugin-ionic-keyboard": "^2.0.5"
},
"repository": {
"type": "git",
"url": "git@versions.feeling-group.com:nabil.sadki/allo-app.git"
"browser": {
"crypto": false,
"fs": false,
"module": false
},
"author": "",
"license": "ISC"
}
"description": "An Ionic project",
"cordova": {
"plugins": {
"cordova-sqlite-storage": {},
"cordova-plugin-advanced-http": {},
"cordova.plugins.diagnostic": {
"ANDROID_SUPPORT_VERSION": "28.+"
},
"cordova-plugin-request-location-accuracy": {},
"cordova-plugin-local-notification": {},
"cordova-plugin-whitelist": {},
"cordova-plugin-statusbar": {},
"cordova-plugin-device": {},
"cordova-plugin-splashscreen": {},
"cordova-plugin-ionic-webview": {},
"cordova-plugin-ionic-keyboard": {},
"cordova-plugin-background-mode": {},
"cordova-plugin-app-version": {},
"cordova-plugin-file": {},
"cordova-plugin-googleplus": {
"PLAY_SERVICES_VERSION": "11.8.0"
}
},
"platforms": [
"android"
]
}
}
\ No newline at end of file
resources/ios/icon/icon-1024.png

59.4 KB | W: | H:

resources/ios/icon/icon-1024.png

47.6 KB | W: | H:

resources/ios/icon/icon-1024.png
resources/ios/icon/icon-1024.png
resources/ios/icon/icon-1024.png
resources/ios/icon/icon-1024.png
  • 2-up
  • Swipe
  • Onion skin
resources/ios/icon/icon-40.png

1.22 KB | W: | H:

resources/ios/icon/icon-40.png

2.32 KB | W: | H:

resources/ios/icon/icon-40.png
resources/ios/icon/icon-40.png
resources/ios/icon/icon-40.png
resources/ios/icon/icon-40.png
  • 2-up
  • Swipe
  • Onion skin
resources/ios/icon/icon-40@2x.png

3.48 KB | W: | H:

resources/ios/icon/icon-40@2x.png

5.03 KB | W: | H:

resources/ios/icon/icon-40@2x.png
resources/ios/icon/icon-40@2x.png
resources/ios/icon/icon-40@2x.png
resources/ios/icon/icon-40@2x.png
  • 2-up
  • Swipe
  • Onion skin
resources/ios/icon/icon-40@3x.png

10.5 KB | W: | H:

resources/ios/icon/icon-40@3x.png

7.8 KB | W: | H:

resources/ios/icon/icon-40@3x.png
resources/ios/icon/icon-40@3x.png
resources/ios/icon/icon-40@3x.png
resources/ios/icon/icon-40@3x.png
  • 2-up
  • Swipe
  • Onion skin
resources/ios/icon/icon-50.png

1.86 KB | W: | H:

resources/ios/icon/icon-50.png

3.04 KB | W: | H:

resources/ios/icon/icon-50.png
resources/ios/icon/icon-50.png
resources/ios/icon/icon-50.png
resources/ios/icon/icon-50.png
  • 2-up
  • Swipe
  • Onion skin
resources/ios/icon/icon-50@2x.png

4.58 KB | W: | H:

resources/ios/icon/icon-50@2x.png

6.37 KB | W: | H:

resources/ios/icon/icon-50@2x.png
resources/ios/icon/icon-50@2x.png
resources/ios/icon/icon-50@2x.png
resources/ios/icon/icon-50@2x.png
  • 2-up
  • Swipe
  • Onion skin
resources/ios/icon/icon-60.png

2.39 KB | W: | H:

resources/ios/icon/icon-60.png

3.75 KB | W: | H:

resources/ios/icon/icon-60.png
resources/ios/icon/icon-60.png
resources/ios/icon/icon-60.png
resources/ios/icon/icon-60.png
  • 2-up
  • Swipe
  • Onion skin
resources/ios/icon/icon-60@2x.png

5.9 KB | W: | H:

resources/ios/icon/icon-60@2x.png

7.8 KB | W: | H:

resources/ios/icon/icon-60@2x.png
resources/ios/icon/icon-60@2x.png
resources/ios/icon/icon-60@2x.png
resources/ios/icon/icon-60@2x.png
  • 2-up
  • Swipe
  • Onion skin
resources/ios/icon/icon-60@3x.png

10.6 KB | W: | H:

resources/ios/icon/icon-60@3x.png

11.6 KB | W: | H:

resources/ios/icon/icon-60@3x.png
resources/ios/icon/icon-60@3x.png
resources/ios/icon/icon-60@3x.png
resources/ios/icon/icon-60@3x.png
  • 2-up
  • Swipe
  • Onion skin
resources/ios/icon/icon-72.png

2.8 KB | W: | H:

resources/ios/icon/icon-72.png

4.58 KB | W: | H:

resources/ios/icon/icon-72.png
resources/ios/icon/icon-72.png
resources/ios/icon/icon-72.png
resources/ios/icon/icon-72.png
  • 2-up
  • Swipe
  • Onion skin
resources/ios/icon/icon-72@2x.png

7.61 KB | W: | H:

resources/ios/icon/icon-72@2x.png

9.3 KB | W: | H:

resources/ios/icon/icon-72@2x.png
resources/ios/icon/icon-72@2x.png
resources/ios/icon/icon-72@2x.png
resources/ios/icon/icon-72@2x.png
  • 2-up
  • Swipe
  • Onion skin
resources/ios/icon/icon-76.png

3.24 KB | W: | H:

resources/ios/icon/icon-76.png

4.82 KB | W: | H:

resources/ios/icon/icon-76.png
resources/ios/icon/icon-76.png
resources/ios/icon/icon-76.png
resources/ios/icon/icon-76.png
  • 2-up
  • Swipe
  • Onion skin
resources/ios/icon/icon-76@2x.png

8.11 KB | W: | H:

resources/ios/icon/icon-76@2x.png

9.87 KB | W: | H:

resources/ios/icon/icon-76@2x.png
resources/ios/icon/icon-76@2x.png
resources/ios/icon/icon-76@2x.png
resources/ios/icon/icon-76@2x.png
  • 2-up
  • Swipe
  • Onion skin
resources/ios/icon/icon-83.5@2x.png

16 KB | W: | H:

resources/ios/icon/icon-83.5@2x.png

10.7 KB | W: | H:

resources/ios/icon/icon-83.5@2x.png
resources/ios/icon/icon-83.5@2x.png
resources/ios/icon/icon-83.5@2x.png
resources/ios/icon/icon-83.5@2x.png
  • 2-up
  • Swipe
  • Onion skin
resources/ios/icon/icon-small.png

818 Bytes | W: | H:

resources/ios/icon/icon-small.png

1.56 KB | W: | H:

resources/ios/icon/icon-small.png
resources/ios/icon/icon-small.png
resources/ios/icon/icon-small.png
resources/ios/icon/icon-small.png
  • 2-up
  • Swipe
  • Onion skin
resources/ios/icon/icon-small@2x.png

2.23 KB | W: | H:

resources/ios/icon/icon-small@2x.png

3.58 KB | W: | H:

resources/ios/icon/icon-small@2x.png
resources/ios/icon/icon-small@2x.png
resources/ios/icon/icon-small@2x.png
resources/ios/icon/icon-small@2x.png
  • 2-up
  • Swipe
  • Onion skin
resources/ios/icon/icon-small@3x.png

3.77 KB | W: | H:

resources/ios/icon/icon-small@3x.png

5.53 KB | W: | H:

resources/ios/icon/icon-small@3x.png
resources/ios/icon/icon-small@3x.png
resources/ios/icon/icon-small@3x.png
resources/ios/icon/icon-small@3x.png
  • 2-up
  • Swipe
  • Onion skin
resources/ios/icon/icon.png

2.06 KB | W: | H:

resources/ios/icon/icon.png

3.53 KB | W: | H:

resources/ios/icon/icon.png
resources/ios/icon/icon.png
resources/ios/icon/icon.png
resources/ios/icon/icon.png
  • 2-up
  • Swipe
  • Onion skin
resources/ios/icon/icon@2x.png

5.58 KB | W: | H:

resources/ios/icon/icon@2x.png

7.36 KB | W: | H:

resources/ios/icon/icon@2x.png
resources/ios/icon/icon@2x.png
resources/ios/icon/icon@2x.png
resources/ios/icon/icon@2x.png
  • 2-up
  • Swipe
  • Onion skin
resources/ios/splash/Default-667h.png

39.5 KB | W: | H:

resources/ios/splash/Default-667h.png

204 KB | W: | H:

resources/ios/splash/Default-667h.png
resources/ios/splash/Default-667h.png
resources/ios/splash/Default-667h.png
resources/ios/splash/Default-667h.png
  • 2-up
  • Swipe
  • Onion skin
resources/ios/splash/Default~iphone.png

7.04 KB | W: | H:

resources/ios/splash/Default~iphone.png

23.1 KB | W: | H:

resources/ios/splash/Default~iphone.png
resources/ios/splash/Default~iphone.png
resources/ios/splash/Default~iphone.png
resources/ios/splash/Default~iphone.png
  • 2-up
  • Swipe
  • Onion skin
import { NgModule } from '@angular/core';
import { PreloadAllModules, RouterModule, Routes } from '@angular/router';
import { AuthGuardService } from './services/auth-guard.service';
const routes: Routes = [
{ path: '', redirectTo: 'mainslider', pathMatch: 'full' },
{ path: '', redirectTo: 'start', pathMatch: 'full' },
{ path: 'start', loadChildren: './pages/start/start.module#StartPageModule' },
{ path: 'login', loadChildren: './pages/compte/login/login.module#LoginPageModule' },
{ path: 'mainslider', loadChildren: './pages/mainslider/mainslider.module#MainsliderPageModule' },
{ path: 'app', loadChildren: './pages/menu/menu.module#MenuPageModule' },
{ path: 'offre-details', loadChildren: './pages/offres/offre-details/offre-details.module#OffreDetailsPageModule' },
{
path: 'app',
loadChildren: './pages/menu/menu.module#MenuPageModule',
canActivate: [AuthGuardService]
},
{
path: 'offre-details',
loadChildren: './pages/offres/offre-details/offre-details.module#OffreDetailsPageModule',
canActivate: [AuthGuardService]
},
{ path: 'login-help', loadChildren: './modals/login-help/login-help.module#LoginHelpPageModule' },
];
......
......@@ -7,6 +7,10 @@ import { SplashScreen } from '@ionic-native/splash-screen/ngx';
import { StatusBar } from '@ionic-native/status-bar/ngx';
import { LocalNotifications } from '@ionic-native/local-notifications/ngx';
import { TripService } from './services/trip-service';
import { AuthService } from './services/auth.service';
// import { LocationService } from './services/location-service';
@Component({
selector: 'app-root',
templateUrl: 'app.component.html'
......@@ -21,7 +25,8 @@ export class AppComponent {
private splashScreen: SplashScreen,
private statusBar: StatusBar,
private router: Router,
private _STOR: Storage
private _STOR: Storage,
private _AUTH: AuthService
// private _LOCAT: LocationService
) {
this.initializeApp();
......@@ -39,6 +44,27 @@ export class AppComponent {
// Set locator
// this.setLocator();
this._AUTH.authState.subscribe(state => {
if (state) {
this._STOR.get('APP_PARAMS').then(appParams => {
if (appParams.PARAM_mainslider) {
this.router.navigate(['app/dashboard']);
} else {
this.router.navigate(['mainslider']);
}
});
} else {
this.router.navigate(['login']);
}
});
// this._STOR.get('wpUser').then((wpUser) => {
// if (wpUser) {
// this.router.navigateByUrl('/app/dashboard', { replaceUrl: true });
// // this._AUTH.validateAuthToken(wpUser.token);
// } else {
// this.router.navigateByUrl('/login', { replaceUrl: true });
// }
// });
// this._STOR.get('PARAM_mainslider').then((prmMainslider) => {
// if (prmMainslider) {
// this._STOR.get('isLoggedIn').then((isLoggedIn) => {
......@@ -57,34 +83,22 @@ export class AppComponent {
}
setDefaultParams() {
this._STOR.get('PARAM_geolocate').then((val) => {
if (val === null) {
this._STOR.set('PARAM_geolocate', true);
}
});
this._STOR.get('PARAM_geoarea').then((val) => {
if (val === null) {
this._STOR.set('PARAM_geoarea', 1000);
}
});
this._STOR.get('PARAM_notiftime').then((val) => {
if (val === null) {
this._STOR.set('PARAM_notiftime', 2880);
}
});
this._STOR.get('PARAM_trackdelay').then((val) => {
if (val === null) {
this._STOR.set('PARAM_trackdelay', 60000);
}
});
this._STOR.get('PARAM_notifnbr').then((val) => {
this._STOR.get('APP_PARAMS').then((val) => {
if (val === null) {
this._STOR.set('PARAM_notifnbr', 'all');
this._STOR.set('APP_PARAMS', {
PARAM_mainslider: false,
PARAM_geolocate: true,
PARAM_geoarea: 1000,
PARAM_notiftime: 2880,
PARAM_trackdelay: 60000,
PARAM_notifnbr: 'all',
NOTIF_shownpartners: [],
});
}
});
this._STOR.get('NOTIF_shownpartners').then((val) => {
this._STOR.get('WISHLIST').then((val) => {
if (val === null) {
this._STOR.set('NOTIF_shownpartners', []);
this._STOR.set('WISHLIST', []);
}
});
}
......
......@@ -25,6 +25,15 @@ import { File } from '@ionic-native/File/ngx';
import { WebView } from '@ionic-native/ionic-webview/ngx';
import { FilePath } from '@ionic-native/file-path/ngx';
import { QRScanner, QRScannerStatus } from '@ionic-native/qr-scanner/ngx';
import { environment } from 'src/environments/environment';
import { AuthService } from './services/auth.service';
import { AuthGuardService } from './services/auth-guard.service';
import { LoginHelpPageModule } from './modals/login-help/login-help.module';
// import { AngularFireAuthModule } from '@angular/fire/auth';
// import * as firebase from 'firebase';
// firebase.initializeApp(environment.firebase);
@NgModule({
declarations: [AppComponent],
......@@ -37,7 +46,8 @@ import { QRScanner, QRScannerStatus } from '@ionic-native/qr-scanner/ngx';
name: '__allo_testeurs_app',
driverOrder: ['websql', 'sqlite', 'indexeddb']
}),
HttpClientModule
HttpClientModule,
LoginHelpPageModule
],
providers: [
StatusBar,
......@@ -55,7 +65,9 @@ import { QRScanner, QRScannerStatus } from '@ionic-native/qr-scanner/ngx';
File,
WebView,
FilePath,
QRScanner
QRScanner,
AuthService,
AuthGuardService
],
bootstrap: [AppComponent]
})
......
......@@ -59,4 +59,14 @@ ion-modal.modal-filters .modal-wrapper {
}
ion-select.wide-select {
max-width: 65% !important;
}
.swiper-pagination {
.swiper-pagination-bullet {
opacity: 1 !important;
}
}
ion-modal .modal-wrapper {
width: 90vw !important;
max-height: 90vh !important;
border-radius: 10px !important;
}
\ No newline at end of file
export const WORDPRESS_URL = 'http://www.allo-testeurs.com/';
export const WORDPRESS_REST_API_URL = WORDPRESS_URL + 'wp-json/wp/v2/';
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { Routes, RouterModule } from '@angular/router';
import { IonicModule } from '@ionic/angular';
import { LoginHelpPage } from './login-help.page';
const routes: Routes = [
{
path: '',
component: LoginHelpPage
}
];
@NgModule({
imports: [
CommonModule,
FormsModule,
IonicModule,
RouterModule.forChild(routes)
],
declarations: [LoginHelpPage]
})
export class LoginHelpPageModule {}
<ion-header>
<ion-toolbar color="primary">
<ion-title>Informations</ion-title>
<ion-button fill="outline" size="small" color="light" slot="end" (click)="dismissHelpModal()">
X
</ion-button>
</ion-toolbar>
</ion-header>
<ion-content padding>
<ion-list>
<ion-list-header>
Avec le mode <strong>anonyme</strong>, vous pouvez :
</ion-list-header>
<ion-item>
<ion-icon name="arrow-dropright-circle" slot="start"></ion-icon>
<ion-label class="ion-text-wrap" padding-left>Parcourir les offres de nos partenaires</ion-label>
</ion-item>
<ion-item lines="none">
<ion-icon name="arrow-dropright-circle" slot="start"></ion-icon>
<ion-label class="ion-text-wrap">Voir la liste des partenaires et les localiser sur la carte</ion-label>
</ion-item>
<ion-list-header margin-top>
En plus, si vous êtes connecté(e), vous pouvez :
</ion-list-header>
<ion-item>
<ion-icon name="arrow-dropright-circle" slot="start"></ion-icon>
<ion-label class="ion-text-wrap" padding-left>Sauvegarder vos offres préférées</ion-label>
</ion-item>
<ion-item>
<ion-icon name="arrow-dropright-circle" slot="start"></ion-icon>
<ion-label class="ion-text-wrap" padding-left>Noter des offres</ion-label>
</ion-item>
<ion-item>
<ion-icon name="arrow-dropright-circle" slot="start"></ion-icon>
<ion-label class="ion-text-wrap" padding-left>Commenter des offres</ion-label>
</ion-item>
<ion-item>
<ion-icon name="arrow-dropright-circle" slot="start"></ion-icon>
<ion-label class="ion-text-wrap" padding-left>Réclamer des points mérites et gagner des supers lots! (prochainement)</ion-label>
</ion-item>
<ion-item>
<ion-icon name="arrow-dropright-circle" slot="start"></ion-icon>
<ion-label class="ion-text-wrap" padding-left>Réclamer des points dexpériences et monter dans le tableau des meilleur(e)s testeur(se)s! (prochainement)</ion-label>
</ion-item>
<ion-item lines="none">
<ion-icon name="arrow-dropright-circle" slot="start"></ion-icon>
<ion-label class="ion-text-wrap" padding-left>Et beaucoup d'autres surprises bientôt!!!</ion-label>
</ion-item>
</ion-list>
</ion-content>
\ No newline at end of file
ion-label {
font-size: 13px !important;
}
ion-icon {
width: 0.7em;
height: 0.7em;
}
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { LoginHelpPage } from './login-help.page';
describe('LoginHelpPage', () => {
let component: LoginHelpPage;
let fixture: ComponentFixture<LoginHelpPage>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ LoginHelpPage ],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(LoginHelpPage);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
import { ModalController } from '@ionic/angular';
@Component({
selector: 'app-login-help',
templateUrl: './login-help.page.html',
styleUrls: ['./login-help.page.scss'],
})
export class LoginHelpPage implements OnInit {
constructor(
public modalController: ModalController
) { }
ngOnInit() {
}
dismissHelpModal() {
// using the injected ModalController this page
// can "dismiss" itself and optionally pass back data
this.modalController.dismiss();
}
}
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { Routes, RouterModule } from '@angular/router';
import { IonicModule } from '@ionic/angular';
import { FavorisPage } from './favoris.page';
const routes: Routes = [
{
path: '',
component: FavorisPage
}
];
@NgModule({
imports: [
CommonModule,
FormsModule,
IonicModule,
RouterModule.forChild(routes)
],
declarations: [FavorisPage]
})
export class FavorisPageModule {}
<ion-header>
<ion-toolbar color="primary">
<ion-buttons slot="start">
<ion-menu-button> </ion-menu-button>
</ion-buttons>
<ion-title>Favoris </ion-title>
</ion-toolbar>
</ion-header>
<ion-content>
<ion-card [hidden]="_TRIP.wishedProducts.length" padding>
<h1 class="ion-text-center">
<ion-icon name="heart-half" color="danger"></ion-icon>
</h1>
<ion-text>
<h3 class="ion-text-center">Votre liste de favoris est vide.</h3>
</ion-text>
</ion-card>
<ion-list>
<ion-item-sliding *ngFor="let offer of _TRIP.wishedProducts">
<ion-item>
<ion-thumbnail slot="start">
<ion-img [src]="offer.thumb"></ion-img>
</ion-thumbnail>
<ion-label>
<h2>{{offer.name}}</h2>
<ion-text color="primary">
<h3>
<ion-icon name="pin"></ion-icon>
{{offer.location}}
</h3>
</ion-text>
<p>{{offer.description}}</p>
</ion-label>
</ion-item>
<ion-item-options side="end">
<ion-item-option color="success" (click)="_TRIP.viewDetail(offer.id)">
<ion-icon name="eye"></ion-icon>
Voir
</ion-item-option>
<ion-item-option (click)="_TRIP.wishList(offer, 'remove')">
<ion-icon name="trash"></ion-icon>
Supprimer
</ion-item-option>
<!-- <ion-item-option color="danger" (click)="share(item)">Share</ion-item-option> -->
</ion-item-options>
</ion-item-sliding>
</ion-list>
</ion-content>
\ No newline at end of file
h1 {
ion-icon {
font-size: 40vw !important;
}
}
\ No newline at end of file
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { FavorisPage } from './favoris.page';
describe('FavorisPage', () => {
let component: FavorisPage;
let fixture: ComponentFixture<FavorisPage>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ FavorisPage ],
schemas: [CUSTOM_ELEMENTS_SCHEMA],
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(FavorisPage);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
import { Component, OnInit } from '@angular/core';
import { TripService } from '../../../services/trip-service';
@Component({
selector: 'app-favoris',
templateUrl: './favoris.page.html',
styleUrls: ['./favoris.page.scss'],
})
export class FavorisPage implements OnInit {
constructor(
public _TRIP: TripService
) { console.log(this._TRIP.wishedProducts) }
ngOnInit() {
}
}
......@@ -24,4 +24,4 @@ const routes: Routes = [
],
declarations: [LoginPage]
})
export class LoginPageModule {}
export class LoginPageModule { }
<ion-header>
<ion-toolbar color="primary">
<ion-toolbar color="primary" padding-right>
<ion-title>Connexion</ion-title>
<ion-button size="small" fill="solid" color="light" slot="end" (click)="presentHelpModal()">
<ion-icon name="information"></ion-icon>
</ion-button>
</ion-toolbar>
</ion-header>
<ion-content text-center color="primary" padding>
<!-- <img src="../../../assets/logo-full-white.png" /> -->
<ion-icon name="unlock" class="key-logo"></ion-icon>
<!-- <ion-card>
<form #form="ngForm" (ngSubmit)="login(form)">
<ion-grid>
<ion-row justify-content-center>
<ion-col align-self-center size-md="6" size-lg="5" size-xs="12">
<div text-center>
<h3>Login</h3>
</div>
<div padding>
<ion-item>
<ion-input name="email" type="email" placeholder="your@email.com" ngModel required></ion-input>
</ion-item>
<ion-item>
<ion-input name="password" type="password" placeholder="Password" ngModel required></ion-input>
</ion-item>
</div>
<div padding>
<ion-button size="large" type="submit" [disabled]="form.invalid" expand="block">Login</ion-button>
</div>
</ion-col>
</ion-row>
</ion-grid>
</form>
</ion-card> -->
<form [formGroup]="validationsForm" (ngSubmit)="onSubmit(validationsForm.value)">
<ion-card color="light" no-padding no-margin>
<ion-card-content no-padding>
......@@ -59,28 +38,36 @@
</div>
</ion-card-content>
</ion-card>
<a href="javascript:;">
<!-- <a href="javascript:;">
<ion-text color="light">
Mot de passe oublié?
</ion-text>
</a>
</a> -->
<ion-item-divider color="primary"> </ion-item-divider>
<ion-button color="dark" expand="block" type="submit" [disabled]="validationsForm.invalid" no-margin>Connexion</ion-button>
<ion-button color="dark" expand="block" type="submit" [disabled]="validationsForm.invalid" no-margin>
<ion-icon name="log-in"></ion-icon>
Connexion
</ion-button>
</form>
<ion-item-divider color="primary" lines="none"> </ion-item-divider>
<ion-item-divider color="primary" justify-content-center>
<!-- <ion-item-divider color="primary" lines="none"> </ion-item-divider> -->
<!-- <ion-item-divider color="primary" justify-content-center>
Se connecter avec Facebook ou Google
</ion-item-divider>
<ion-grid>
</ion-item-divider> -->
<div class="separator">
<span>Autres options :</span>
</div>
<ion-grid no-padding margin-top>
<ion-row>
<!-- <ion-col>
<ion-button expand="block" class="btn-fb" no-margin>
<ion-icon name="logo-facebook"></ion-icon>
<ion-col class="ion-no-padding ion-text-start">
<ion-button color="dark" class="btn-g" (click)="doAnonymousLogIn()" no-margin>
<ion-icon name="walk"></ion-icon>
Anonyme
</ion-button>
</ion-col> -->
<ion-col>
<ion-button color="light" expand="block" class="btn-g" (click)="doGoogleLogin()" no-margin>
<ion-icon name="logo-google"></ion-icon>
</ion-col>
<ion-col class="ion-no-padding">
<ion-button color="light" class="btn-g ion-no-margin">
<ion-icon name="person-add"></ion-icon>
Créer un compte
</ion-button>
</ion-col>
</ion-row>
......
......@@ -19,4 +19,16 @@ ion-icon.key-logo {
.error-message {
color: var(--ion-color-danger);
font-size: 12px;
}
div.separator {
border-bottom: 1px solid;
position: relative;
margin-top: 30px;
span {
position: absolute;
top: -12px;
background: var(--ion-color-primary, #cc3333);
left: 10px;
padding: 0 5px;
}
}
\ No newline at end of file
import { Component, OnInit } from '@angular/core';
import { Validators, FormBuilder, FormGroup, FormControl } from '@angular/forms';
import { AlloService } from '../../../services/allo-service';
import { ModalController } from '@ionic/angular';
import { Storage } from '@ionic/storage';
import { Router } from '@angular/router';
import { GooglePlus } from '@ionic-native/google-plus/ngx';
import { AlloService } from '../../../services/allo-service';
import { AuthService } from '../../../services/auth.service';
import { LoginHelpPage } from '../../../modals/login-help/login-help.page';
// import swal from 'sweetalert';
@Component({
selector: 'app-login',
......@@ -31,11 +35,19 @@ export class LoginPage implements OnInit {
public formBuilder: FormBuilder,
public storage: Storage,
public router: Router,
public modalController: ModalController,
private googlePlus: GooglePlus,
public _ALLO: AlloService
public _ALLO: AlloService,
public _AUTH: AuthService
) { }
ngOnInit() {
this._AUTH.getAuthState().subscribe(state => {
if (state) {
let name = this._AUTH.infoNicename === 'anonymous' ? 'Anonyme' : this._AUTH.infoFullname;
this._ALLO.presentToast('Connexion', 'Bienvenue ' + name, 'top');
}
});
this.validationsForm = this.formBuilder.group({
email: new FormControl('', Validators.compose([
Validators.required,
......@@ -45,8 +57,66 @@ export class LoginPage implements OnInit {
});
}
async presentHelpModal() {
const modal = await this.modalController.create({
component: LoginHelpPage
});
return await modal.present();
}
doAnonymousLogIn() {
const wpUser = {
token: null,
user_nicename: 'anonymous',
user_display_name: 'Mode anonyme',
user_email: 'nomail',
};
this.storage.set('wpUser', wpUser).then(() => {
this._AUTH.setUser(wpUser);
// this.storage.get('APP_PARAMS').then(appParams => {
// if (appParams.PARAM_mainslider) {
// this.router.navigate(['app/dashboard']);
// } else {
// this.router.navigate(['mainslider']);
// }
// });
});
}
onSubmit(values) {
console.log(values);
this._ALLO.presentLoading();
this._AUTH.doLogin(values)
.then(
res => {
this._ALLO.dismissLoading();
console.log('User exist', res);
this.storage.get('APP_PARAMS').then(appParams => {
if (appParams.PARAM_mainslider) {
this.router.navigate(['app/dashboard']);
} else {
this.router.navigate(['mainslider']);
}
});
},
err => {
this._ALLO.dismissLoading();
// swal('Connexion', 'Email ou Mot de passe incorrects. Veuillez réessayer.', 'error');
// this._ALLO.presentAlert('Connexion', 'Email ou Mot de passe incorrects.<br>Veuillez réessayer.');
this._ALLO.presentToast('', 'Email ou Mot de passe incorrects.<br>Veuillez réessayer.', 'top');
console.log('Auth error', err);
});
// this._ALLO.presentLoading();
// this._AUTH.firebaseRegister(values)
// .then(res => {
// this._ALLO.dismissLoading();
// console.log('User exist', res);
// // this.errorMessage = "";
// // this.navCtrl.navigateForward('/dashboard');
// }, err => {
// this._ALLO.dismissLoading();
// // this.errorMessage = err.message;
// console.log('Auth error', err);
// });
}
async doGoogleLogin() {
......
<ion-content color="primary">
<ion-slides #mainSlider [options]="slideOpts" pager="true" [hidden]="hideSlider">
<ion-slides #mainSlider [options]="slideOpts" pager="true" [hidden]="hideSlider">
<ion-slide padding>
<ion-item lines="none" color="primary" class="skip">
<ion-button fill="outline" color="light" (click)="skipPresentation($event)">
......@@ -197,12 +197,8 @@
<ion-text color="light">
<p class="text-1x">
Pour une expérience très riche, il est très souhaitable d'activer le GPS de votre
mobile,
afin de vous
envoyer des notifications sur les promos de nos partenaires, une fois vous vous
approchez de
leurs
locaux !
mobile, afin de vous envoyer des notifications sur les promos de nos partenaires à
proximité !
</p>
</ion-text>
</ion-col>
......@@ -212,14 +208,13 @@
<ion-grid no-margin no-padding>
<ion-row>
<ion-col>
<ion-button class="round" color="light" margin-top full tappable
routerLink="/app/dashboard"
routerDirection="root" routerLinkActive="active">
<ion-button class="round" size="small" color="light" margin-top full tappable
(click)="goToDashboard()" routerDirection="forward" routerLinkActive="active">
Continuer sans &nbsp;<ion-icon name="arrow-dropright-circle"></ion-icon>
</ion-button>
</ion-col>
<ion-col>
<ion-button ion-button class="round" color="warning" margin-top full tappable
<ion-button class="round" size="small" color="warning" margin-top full tappable
(click)="getGps()">
Activer le GPS &nbsp;<ion-icon name="locate"></ion-icon>
</ion-button>
......
......@@ -20,5 +20,5 @@ ion-slides {
}
--bullet-background: #ffffff !important;
--bullet-background-active: var(--ion-color-secondary, #ffffff) !important;
--bullet-background-active: var(--ion-color-dark, #000000) !important;
}
\ No newline at end of file
......@@ -81,11 +81,13 @@ export class MainsliderPage implements OnInit {
getGps() {
if (this.platform.is('cordova')) {
console.log('cord');
this._PERM.checkGps();
this._LOCATE.initLocator();
}
this._STOR.set('PARAM_geolocate', true);
this._STOR.get('APP_PARAMS').then(appParams => {
appParams.PARAM_mainslider = true;
this._STOR.set('APP_PARAMS', appParams);
});
this.goToDashboard();
}
......@@ -95,7 +97,11 @@ export class MainsliderPage implements OnInit {
}
goToDashboard() {
this.router.navigateByUrl('/app/dashboard');
this._STOR.get('APP_PARAMS').then(appParams => {
appParams.PARAM_mainslider = true;
this._STOR.set('APP_PARAMS', appParams);
});
this.router.navigate(['app/dashboard']);
}
ionViewDidEnter() {
......
......@@ -81,6 +81,10 @@ const routes: Routes = [
path: 'lots-a-gagner',
loadChildren: '../lots/lots-a-gagner/lots-a-gagner.module#LotsAGagnerPageModule'
},
{
path: 'favoris',
loadChildren: '../compte/favoris/favoris.module#FavorisPageModule'
},
]
}
];
......
<ion-menu contentId="content">
<ion-header>
<ion-toolbar color="primary">
<div class="anonymous ion-text-center" *ngIf="_AUTH.infoNicename === 'anonymous'" padding>
<p no-margin>
<img src="../../../../assets/img/ionic3-ico.png" />
</p>
<ion-chip color="" outline="true">
Mode anonyme
</ion-chip>
<p no-margin>
<ion-button size="small" color="dark" (click)="logout()">
<ion-icon name="log-out"></ion-icon>
Déconnexion
</ion-button>
</p>
</div>
<div class="connected" *ngIf="_AUTH.infoNicename !== 'anonymous'">
<ion-grid>
<ion-row>
<ion-col size="4">
......@@ -10,7 +25,7 @@
</ion-col>
<ion-col size="8">
<ion-text>
<h4>Nabil Sadki</h4>
<h4>{{ _AUTH.infoFullname }}</h4>
</ion-text>
<ion-chip color="light" outline="true">
<ion-icon name="star"></ion-icon>
......@@ -52,8 +67,8 @@
</ion-button>
</ion-menu-toggle>
</ion-col>
<ion-col no-padding class="ion-text-end">
<ion-button size="small" color="dark" href="/login">
<ion-col no-padding class="column">
<ion-button size="small" color="dark" (click)="logout()">
<ion-icon name="log-out"></ion-icon>
Déconnexion
</ion-button>
......@@ -62,6 +77,7 @@
</ion-grid>
</ion-card>
</div>
</ion-toolbar>
</ion-header>
<ion-content>
......
......@@ -5,4 +5,9 @@ ion-avatar {
ion-progress-bar {
height: 10px;
border-radius: 5px;
}
.anonymous {
img {
width: 50vw;
}
}
\ No newline at end of file
import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { AuthService } from '../../services/auth.service';
@Component({
selector: 'app-menu',
......@@ -19,6 +21,11 @@ export class MenuPage implements OnInit {
icon: 'contacts'
},
{
title: 'Favoris',
url: '/app/favoris',
icon: 'bookmark'
},
{
title: 'Mes mérites',
url: '/app/mes-merites',
icon: 'ribbon'
......@@ -45,7 +52,15 @@ export class MenuPage implements OnInit {
}
];
constructor() { }
constructor(
public router: Router,
public _AUTH: AuthService
) { }
logout() {
this._AUTH.logOut();
this.router.navigateByUrl('/login', { replaceUrl: true });
}
ngOnInit() {
// this._ALLO.presentLoading();
......
......@@ -51,47 +51,56 @@
</ion-card-content>
</ion-card>
</div>
<ion-card *ngFor="let trip of _TRIP.offersCardList" (click)="viewDetail(trip.id)" tappable no-margin margin-bottom>
<div class="img-spinner-wrap ion-text-center">
<ion-spinner name="dots" *ngIf="trip.hidden"></ion-spinner>
</div>
<ion-img [src]="trip.thumb" [class.no-visibility]="trip.hidden" (ionImgDidLoad)="setImgVisible(trip)"></ion-img>
<ion-card-header>
<ion-card-subtitle color="primary">
<ion-icon name="pin"></ion-icon>
<ion-label>{{ trip.location }}</ion-label>
<ion-badge fill="outline" *ngIf="trip.price_adult" color="warning">
-{{ ((trip.price_adult_before - trip.price_adult) * 100) / trip.price_adult_before | number:'1.0-0' }}%
</ion-badge>
</ion-card-subtitle>
<ion-card-title>
{{ trip.name | slice:0:100 }}
</ion-card-title>
</ion-card-header>
<div class="card-wrapper" *ngFor="let trip of _TRIP.offersCardList">
<ion-button color="light" fill="solid" class="bookmark" (click)="_TRIP.wishList(trip, 'add')"
*ngIf="!trip.bookmarked" no-padding>
<ion-icon name="heart-empty"></ion-icon>
</ion-button>
<ion-button color="light" fill="solid" class="bookmark" (click)="_TRIP.wishList(trip, 'remove')"
*ngIf="trip.bookmarked" no-padding>
<ion-icon name="heart" color="danger"></ion-icon>
</ion-button>
<ion-card (click)="viewDetail(trip.id)" tappable no-margin margin-bottom>
<div class="img-spinner-wrap ion-text-center">
<ion-spinner name="dots" *ngIf="trip.hidden"></ion-spinner>
</div>
<ion-img [src]="trip.thumb" [class.no-visibility]="trip.hidden" (ionImgDidLoad)="setImgVisible(trip)"></ion-img>
<ion-card-header>
<ion-card-subtitle color="primary">
<ion-icon name="pin"></ion-icon>
<ion-label>{{ trip.location }}</ion-label>
<ion-badge fill="outline" *ngIf="trip.price_adult" color="warning">
-{{ ((trip.price_adult_before - trip.price_adult) * 100) / trip.price_adult_before | number:'1.0-0' }}%
</ion-badge>
</ion-card-subtitle>
<ion-card-title>
{{ trip.name | slice:0:100 }}
</ion-card-title>
</ion-card-header>
<!-- <ion-item>
<!-- <ion-item>
<ion-icon name="pin" slot="start"></ion-icon>
<ion-label>{{ trip.location }}</ion-label>
<ion-button fill="outline" slot="end">View</ion-button>
</ion-item> -->
<ion-card-content no-padding padding-horizontal padding-bottom>
{{ trip.description | slice:0:130 }}...
</ion-card-content>
<ion-item *ngIf="trip.price_adult" color="primary" lines="none">
<ion-icon name="cash" slot="start"></ion-icon>
<ion-button slot="end" class="before">
<ion-text color="light">
({{ trip.price_adult_before }} Dh)
</ion-text>
</ion-button>
<ion-button slot="end" color="light">
<ion-text color="primary">
{{ trip.price_adult }} Dh
</ion-text>
</ion-button>
</ion-item>
</ion-card>
<ion-card-content no-padding padding-horizontal padding-bottom>
{{ trip.description | slice:0:130 }}...
</ion-card-content>
<ion-item *ngIf="trip.price_adult" color="primary" lines="none">
<ion-icon name="cash" slot="start"></ion-icon>
<ion-button slot="end" class="before">
<ion-text color="light">
({{ trip.price_adult_before }} Dh)
</ion-text>
</ion-button>
<ion-button slot="end" color="light">
<ion-text color="primary">
{{ trip.price_adult }} Dh
</ion-text>
</ion-button>
</ion-item>
</ion-card>
</div>
<ion-infinite-scroll threshold="100px" (ionInfinite)="loadData($event)">
<ion-infinite-scroll-content loadingSpinner="bubbles" loadingText="Chargement...">
</ion-infinite-scroll-content>
......
......@@ -115,3 +115,25 @@ ul {
background: #fff;
border-radius: 8px;
}
.card-wrapper {
position: relative;
.bookmark {
// background: var(--ion-color-light, #fff);
// border: 1px dotted var(--ion-color-dark, #000);
position: absolute;
right: 10px;
top: 10px;
--border-radius: 30px;
z-index: 9;
// width: 46px;
// height: 44px;
// padding: 10px;
ion-icon {
font-size: 24px;
margin: 6px;
&.ios{
margin: 6px 11px !important;
}
}
}
}
......@@ -69,4 +69,10 @@ export class OffresCartePage implements OnInit {
this.router.navigateByUrl('/app/details-offre/' + id);
}
wishList(offer, action) {
this._TRIP.wishList(offer, action).then(result => {
offer = result;
});
}
}
<ion-content>
<ion-list-header>Meilleures deals</ion-list-header>
<ion-content padding>
<!-- <ion-card color="light" margin-bottom> -->
<ion-text>
<p class="ion-text-center">
<img class="soon" src="../../../../assets/img/soon.png">
</p>
</ion-text>
<!-- </ion-card> -->
<ion-text class="ion-text-justify">
<p>
Que vous soyez détenteur(se) ou non de la Carte Testeur, cette section est ouverte à tout le monde, et permettra
dans un future proche de bénéficier des offres de nos partenaires.
</p>
<p>
Les plus fidéles seront <strong color="primary">trop bien</strong> récompensés!!
</p>
<p>
Restez à l'écoute!
</p>
</ion-text>
<!-- <ion-list-header>Meilleures deals</ion-list-header>
<div class="app">
<ul class="hs">
<li class="item">test</li>
......@@ -14,5 +33,5 @@
<ion-item>
Offre
</ion-item>
</ion-list>
</ion-list> -->
</ion-content>
\ No newline at end of file
......@@ -57,3 +57,9 @@ ul {
background: #fff;
border-radius: 8px;
}
img.soon {
height: 30vh !important;
width: auto !important;
margin: 0 auto;
}
\ No newline at end of file
......@@ -13,64 +13,40 @@
<form class="list-form">
<!-- <ion-item>
<ion-label color="dark" class="text-1x">Cacher l'écran d'accueil</ion-label>
<ion-toggle checked color="primary" [(ngModel)]="prm_mainslider" [ngModelOptions]="{standalone: true}"
<ion-toggle checked color="primary" [(ngModel)]="prmMainslider" [ngModelOptions]="{standalone: true}"
(ionChange)="setParam('mainslider')"></ion-toggle>
</ion-item> -->
<ion-item>
<ion-label color="dark" class="text-1x">Géo-notifications</ion-label>
<ion-toggle checked color="primary" [(ngModel)]="prm_geolocate" [ngModelOptions]="{standalone: true}"
<ion-toggle color="primary" [(ngModel)]="prmGeolocate" [ngModelOptions]="{standalone: true}"
(ionChange)="setParam('geolocate')"></ion-toggle>
</ion-item>
<ion-item>
<ion-label color="dark" class="text-1x">Rayon de détection</ion-label>
<ion-select class="text-primary" [(ngModel)]="prm_geoarea" [ngModelOptions]="{standalone: true}"
<ion-select class="text-primary" [(ngModel)]="prmGeoarea" [ngModelOptions]="{standalone: true}"
(ionChange)="setParam('geoarea')">
<ion-select-option value="400">400m</ion-select-option>
<ion-select-option value="800">800m</ion-select-option>
<ion-select-option value="1200">1,2Km</ion-select-option>
<ion-select-option value="1600">1,6Km</ion-select-option>
<ion-select-option value="2000">2Km</ion-select-option>
<ion-select-option *ngFor="let gOpt of geoAreaOptions | keyvalue" [value]="gOpt.key">{{ gOpt.value }}</ion-select-option>
</ion-select>
</ion-item>
<ion-item>
<ion-label color="dark" class="text-1x">Raffraichir la position GPS chaque</ion-label>
<ion-select class="text-primary" [(ngModel)]="prm_trackdelay" [ngModelOptions]="{standalone: true}"
<ion-select class="text-primary" [(ngModel)]="prmTrackdelay" [ngModelOptions]="{standalone: true}"
(ionChange)="setParam('trackdelay')">
<ion-select-option value="60000">minute</ion-select-option>
<ion-select-option value="120000">2 minutes</ion-select-option>
<ion-select-option value="180000">3 minutes</ion-select-option>
<ion-select-option value="240000">4 minutes</ion-select-option>
<ion-select-option value="300000">5 minutes</ion-select-option>
<ion-select-option value="360000">6 minutes</ion-select-option>
<ion-select-option value="420000">7 minutes</ion-select-option>
<ion-select-option value="480000">8 minutes</ion-select-option>
<ion-select-option value="540000">9 minutes</ion-select-option>
<ion-select-option value="600000">10 minutes</ion-select-option>
<ion-select-option *ngFor="let tdOpt of trackDelayOptions | keyvalue" [value]="tdOpt.key">{{ tdOpt.value }}</ion-select-option>
</ion-select>
</ion-item>
<ion-item>
<ion-label color="dark" class="text-1x">Réaffichage des notifications</ion-label>
<ion-select class="text-primary" [(ngModel)]="prm_notiftime" [ngModelOptions]="{standalone: true}"
<ion-select class="text-primary" [(ngModel)]="prmNotiftime" [ngModelOptions]="{standalone: true}"
(ionChange)="setParam('notiftime')">
<ion-select-option value="5">5 min</ion-select-option>
<ion-select-option value="15">15 min</ion-select-option>
<ion-select-option value="30">30 min</ion-select-option>
<ion-select-option value="45">45 min</ion-select-option>
<ion-select-option value="60">1 h</ion-select-option>
<ion-select-option value="120">2 h</ion-select-option>
<ion-select-option value="480">4 h</ion-select-option>
<ion-select-option value="960">8 h</ion-select-option>
<ion-select-option value="2880">1 j</ion-select-option>
<ion-select-option *ngFor="let ntOpt of notifTimeOptions | keyvalue" [value]="ntOpt.key">{{ ntOpt.value }}</ion-select-option>
</ion-select>
</ion-item>
<ion-item>
<ion-label color="dark" class="text-1x">Notifications par rafraîchissement</ion-label>
<ion-select class="text-primary" [(ngModel)]="prm_notifnbr" [ngModelOptions]="{standalone: true}"
<ion-select class="text-primary" [(ngModel)]="prmNotifnbr" [ngModelOptions]="{standalone: true}"
(ionChange)="setParam('notifnbr')">
<ion-select-option value="2">Pas plus de 2 à la fois</ion-select-option>
<ion-select-option value="4">Pas plus de 4 à la fois</ion-select-option>
<ion-select-option value="6">Pas plus de 6 à la fois</ion-select-option>
<ion-select-option value="all">Afficher toutes les notifications</ion-select-option>
<ion-select-option *ngFor="let nnOpt of notifNbrOptions | keyvalue" [value]="nnOpt.key">{{ nnOpt.value }}</ion-select-option>
</ion-select>
</ion-item>
</form>
......
......@@ -11,12 +11,49 @@ import { AlloService } from '../../services/allo-service';
})
export class ParamsPage implements OnInit {
public prm_mainslider = true;
public prm_geolocate = false;
public prm_geoarea: any = 400;
public prm_notiftime = 15;
public prm_trackdelay = 60000;
public prm_notifnbr: any = 'all';
public prmMainslider = true;
public prmGeolocate = false;
public prmGeoarea: any = 400;
public prmNotiftime = 15;
public prmTrackdelay = 60000;
public prmNotifnbr: any = 'all';
public geoAreaOptions = {
400: '400m',
800: '800m',
1200: '1,2Km',
1600: '1,6m',
2000: '2Km',
};
public trackDelayOptions = {
60000: '1 minute',
120000: '2 minutes',
180000: '3 minutes',
240000: '4 minutes',
300000: '5 minutes',
360000: '6 minutes',
420000: '7 minutes',
480000: '8 minutes',
540000: '9 minutes',
600000: '10 minutes',
};
public notifTimeOptions = {
5: '5 minutes',
15: '15 minutes',
30: '30 minutes',
45: '45 minutes',
60: '1 heure',
120: '2 heure',
480: '4 heure',
960: '8 heure',
2880: '1 jour',
};
public notifNbrOptions = {
2: 'Pas plus de 2 à la fois',
4: 'Pas plus de 4 à la fois',
6: 'Pas plus de 6 à la fois',
all: 'Afficher toutes les notifications',
};
constructor(
private _STOR: Storage,
......@@ -24,66 +61,50 @@ export class ParamsPage implements OnInit {
private _LOCAT: LocationService,
private _ALLO: AlloService
) {
this._STOR.get('PARAM_mainslider').then((val) => {
if (val !== null) {
this.prm_mainslider = val;
}
});
this._STOR.get('PARAM_geolocate').then((val) => {
if (val !== null) {
this.prm_geolocate = val;
}
});
this._STOR.get('PARAM_geoarea').then((val) => {
if (val !== null) {
this.prm_geoarea = val;
}
});
this._STOR.get('PARAM_notiftime').then((val) => {
if (val !== null) {
this.prm_notiftime = val;
}
});
this._STOR.get('PARAM_trackdelay').then((val) => {
if (val !== null) {
this.prm_trackdelay = val;
}
});
this._STOR.get('PARAM_notifnbr').then((val) => {
if (val !== null) {
this.prm_notifnbr = val;
this._STOR.get('APP_PARAMS').then((appParams) => {
if (appParams !== null) {
this.prmGeolocate = appParams.PARAM_geolocate;
this.prmGeoarea = appParams.PARAM_geoarea;
this.prmNotiftime = appParams.PARAM_notiftime;
this.prmTrackdelay = appParams.PARAM_trackdelay;
this.prmNotifnbr = appParams.PARAM_notifnbr;
}
});
}
setParam(name) {
switch (name) {
case 'mainslider':
this._ALLO.setParam('mainslider', this.prm_mainslider);
break;
case 'geolocate':
this._ALLO.setParam('geolocate', this.prm_geolocate);
if (this.prm_geolocate) {
this._PERM.checkGps();
this._LOCAT.initLocator();
} else {
this._LOCAT.stopLocator();
this._STOR.get('APP_PARAMS').then((appParams) => {
if (appParams !== null) {
switch (name) {
// case 'mainslider':
// this._ALLO.setParam('mainslider', this.prm_mainslider);
// break;
case 'geolocate':
appParams.PARAM_geolocate = this.prmGeolocate;
if (this.prmGeolocate) {
this._PERM.checkGps();
this._LOCAT.initLocator();
} else {
this._LOCAT.stopLocator();
}
break;
case 'geoarea':
appParams.PARAM_geoarea = +this.prmGeoarea;
break;
case 'notiftime':
appParams.PARAM_notiftime = +this.prmNotiftime;
break;
case 'notifnbr':
appParams.PARAM_notifnbr = +this.prmNotifnbr;
break;
case 'trackdelay':
appParams.PARAM_trackdelay = +this.prmTrackdelay;
this._LOCAT.restartTracking();
break;
}
break;
case 'geoarea':
this._ALLO.setParam('geoarea', +this.prm_geoarea);
break;
case 'notiftime':
this._ALLO.setParam('notiftime', +this.prm_notiftime);
break;
case 'notifnbr':
this._ALLO.setParam('notifnbr', +this.prm_notifnbr);
break;
case 'trackdelay':
this._ALLO.setParam('trackdelay', +this.prm_trackdelay);
this._LOCAT.restartTracking();
break;
}
this._STOR.set('APP_PARAMS', appParams);
}
});
}
ngOnInit() {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment