inboxz лет назад: 4
Родитель
Сommit
cc753c9dd4

Разница между файлами не показана из-за своего большого размера
+ 467 - 901
package-lock.json


+ 16 - 4
package.json

26
     "@fortawesome/free-brands-svg-icons": "^5.15.4",
26
     "@fortawesome/free-brands-svg-icons": "^5.15.4",
27
     "@fortawesome/free-regular-svg-icons": "^5.15.4",
27
     "@fortawesome/free-regular-svg-icons": "^5.15.4",
28
     "@fortawesome/free-solid-svg-icons": "^5.15.4",
28
     "@fortawesome/free-solid-svg-icons": "^5.15.4",
29
+    "@ionic-native/geolocation": "^5.36.0",
29
     "@ionic-native/http": "^5.36.0",
30
     "@ionic-native/http": "^5.36.0",
31
+    "@ionic-native/native-geocoder": "^5.36.0",
30
     "@ionic/angular": "^5.5.2",
32
     "@ionic/angular": "^5.5.2",
31
-    "cordova-android": "9.1.0",
32
-    "cordova-ios": "6.2.0",
33
+    "cordova-android": "^4.1.1",
34
+    "cordova-ios": "^4.0.1",
33
     "rxjs": "~6.6.0",
35
     "rxjs": "~6.6.0",
34
     "tslib": "^2.2.0",
36
     "tslib": "^2.2.0",
35
     "zone.js": "~0.11.4"
37
     "zone.js": "~0.11.4"
50
     "@types/node": "^12.11.1",
52
     "@types/node": "^12.11.1",
51
     "@typescript-eslint/eslint-plugin": "4.16.1",
53
     "@typescript-eslint/eslint-plugin": "4.16.1",
52
     "@typescript-eslint/parser": "4.16.1",
54
     "@typescript-eslint/parser": "4.16.1",
55
+    "cordova-plugin-add-swift-support": "^1.7.2",
53
     "cordova-plugin-device": "2.0.2",
56
     "cordova-plugin-device": "2.0.2",
57
+    "cordova-plugin-geolocation": "^4.1.0",
58
+    "cordova-plugin-googlemaps": "^2.7.1",
54
     "cordova-plugin-ionic-keyboard": "^2.0.5",
59
     "cordova-plugin-ionic-keyboard": "^2.0.5",
55
     "cordova-plugin-ionic-webview": "^4.0.0",
60
     "cordova-plugin-ionic-webview": "^4.0.0",
61
+    "cordova-plugin-nativegeocoder": "^3.4.1",
56
     "cordova-plugin-splashscreen": "5.0.2",
62
     "cordova-plugin-splashscreen": "5.0.2",
57
     "cordova-plugin-statusbar": "2.4.2",
63
     "cordova-plugin-statusbar": "2.4.2",
58
     "cordova-plugin-whitelist": "^1.3.3",
64
     "cordova-plugin-whitelist": "^1.3.3",
80
       "cordova-plugin-device": {},
86
       "cordova-plugin-device": {},
81
       "cordova-plugin-splashscreen": {},
87
       "cordova-plugin-splashscreen": {},
82
       "cordova-plugin-ionic-webview": {},
88
       "cordova-plugin-ionic-webview": {},
83
-      "cordova-plugin-ionic-keyboard": {}
89
+      "cordova-plugin-ionic-keyboard": {},
90
+      "cordova-plugin-geolocation": {
91
+        "GPS_REQUIRED": "true"
92
+      },
93
+      "cordova-plugin-nativegeocoder": {
94
+        "LOCATION_WHEN_IN_USE_DESCRIPTION": "Use geocoder service"
95
+      }
84
     },
96
     },
85
     "platforms": [
97
     "platforms": [
86
       "ios",
98
       "ios",
87
       "android"
99
       "android"
88
     ]
100
     ]
89
   }
101
   }
90
-}
102
+}

+ 8 - 1
src/app/app.module.ts

16
 import { far } from '@fortawesome/free-regular-svg-icons';
16
 import { far } from '@fortawesome/free-regular-svg-icons';
17
 import { fab } from '@fortawesome/free-brands-svg-icons';
17
 import { fab } from '@fortawesome/free-brands-svg-icons';
18
 
18
 
19
+import { Geolocation } from '@ionic-native/geolocation/ngx';
20
+import { NativeGeocoder } from '@ionic-native/native-geocoder/ngx';
21
+
19
 // library.add(fas,far,fab);
22
 // library.add(fas,far,fab);
20
 
23
 
21
 @NgModule({
24
 @NgModule({
22
   declarations: [AppComponent],
25
   declarations: [AppComponent],
23
   entryComponents: [],
26
   entryComponents: [],
24
   imports: [HttpClientModule, BrowserModule, IonicModule.forRoot(), AppRoutingModule, FontAwesomeModule],
27
   imports: [HttpClientModule, BrowserModule, IonicModule.forRoot(), AppRoutingModule, FontAwesomeModule],
25
-  providers: [{ provide: RouteReuseStrategy, useClass: IonicRouteStrategy }],
28
+  providers: [
29
+    Geolocation,
30
+    NativeGeocoder,
31
+    { provide: RouteReuseStrategy, useClass: IonicRouteStrategy }
32
+  ],
26
   bootstrap: [AppComponent],
33
   bootstrap: [AppComponent],
27
 })
34
 })
28
 export class AppModule {
35
 export class AppModule {

+ 5 - 0
src/app/home/home.page.html

84
       </ion-col>
84
       </ion-col>
85
     </ion-row>
85
     </ion-row>
86
   </ion-grid>
86
   </ion-grid>
87
+  <ion-fab vertical="bottom" horizontal="center" slot="fixed">
88
+    <ion-fab-button>
89
+      <ion-icon :icon="camera"></ion-icon>
90
+    </ion-fab-button>
91
+  </ion-fab>
87
 </ion-content>
92
 </ion-content>

+ 3 - 0
src/app/place/place.page.html

1
 <ion-header>
1
 <ion-header>
2
   <ion-toolbar class="new-background-color">
2
   <ion-toolbar class="new-background-color">
3
+    <ion-buttons slot="start" color="light">
4
+      <ion-back-button></ion-back-button>
5
+    </ion-buttons>
3
     <ion-title>Wellness Route</ion-title>
6
     <ion-title>Wellness Route</ion-title>
4
   </ion-toolbar>
7
   </ion-toolbar>
5
 </ion-header>
8
 </ion-header>

+ 22 - 7
src/app/placedetail/placedetail.page.html

8
 </ion-header>
8
 </ion-header>
9
 
9
 
10
 <ion-content>
10
 <ion-content>
11
-  <div *ngIf="placelist?.better_featured_image != null" >
11
+  <div *ngIf="placelist?.better_featured_image != null">
12
     <img src="{{placelist?.better_featured_image.source_url}}">
12
     <img src="{{placelist?.better_featured_image.source_url}}">
13
   </div>
13
   </div>
14
   <div *ngIf="placelist?.better_featured_image == null" class="asd">
14
   <div *ngIf="placelist?.better_featured_image == null" class="asd">
25
         <div>{{ placelist?.acf.openclose }}</div>
25
         <div>{{ placelist?.acf.openclose }}</div>
26
       </ion-col>
26
       </ion-col>
27
       <ion-col size="12">
27
       <ion-col size="12">
28
+        {{ placelist?.acf.gmap.address }}
29
+        {{ placelist?.acf.gmap.lat }}
30
+        {{ placelist?.acf.gmap.lng }}
28
         <img src="/assets/images/map-temp.jpg" alt="">
31
         <img src="/assets/images/map-temp.jpg" alt="">
29
       </ion-col>
32
       </ion-col>
30
-      <ion-col size="12">        
33
+      <ion-col size="12">
31
         <ion-row>
34
         <ion-row>
32
           <ion-col size="4" class="ion-text-center">
35
           <ion-col size="4" class="ion-text-center">
33
             <!-- <div [innerHTML]="placelist?.acf.phone"></div>                         -->
36
             <!-- <div [innerHTML]="placelist?.acf.phone"></div>                         -->
34
-            <fa-icon [icon]="['fas', 'phone-square-alt']" size="2x"></fa-icon>              
37
+            <fa-icon [icon]="['fas', 'phone-square-alt']" size="2x"></fa-icon>
35
           </ion-col>
38
           </ion-col>
36
           <ion-col size="4" class="ion-text-center">
39
           <ion-col size="4" class="ion-text-center">
37
             <!-- <div [innerHTML]="placelist?.acf.phone"></div>                         -->
40
             <!-- <div [innerHTML]="placelist?.acf.phone"></div>                         -->
38
-            <fa-icon [icon]="['fas', 'map-marked-alt']" size="2x"></fa-icon> 
41
+            <fa-icon [icon]="['fas', 'map-marked-alt']" size="2x"></fa-icon>
39
           </ion-col>
42
           </ion-col>
40
           <ion-col size="4" class="ion-text-center">
43
           <ion-col size="4" class="ion-text-center">
41
             <!-- <div [innerHTML]="placelist?.acf.email"></div>             -->
44
             <!-- <div [innerHTML]="placelist?.acf.email"></div>             -->
42
-            <fa-icon [icon]="['fas', 'envelope']" size="2x"></fa-icon>              
45
+            <fa-icon [icon]="['fas', 'envelope']" size="2x"></fa-icon>
43
           </ion-col>
46
           </ion-col>
44
         </ion-row>
47
         </ion-row>
45
       </ion-col>
48
       </ion-col>
48
         <div [innerHTML]="placelist?.acf.address"></div>
51
         <div [innerHTML]="placelist?.acf.address"></div>
49
       </ion-col>
52
       </ion-col>
50
       <ion-col size="12">
53
       <ion-col size="12">
51
-        <div class="txt-lead">รายละเอียด</div>
52
-        <div [innerHTML]="placelist?.content.rendered"></div>
54
+        <!-- <div class="txt-lead">รายละเอียด</div>
55
+        <div [innerHTML]="placelist?.content.rendered"></div> -->
53
         <!-- <div>{{placelist?.content.rendered}}</div> -->
56
         <!-- <div>{{placelist?.content.rendered}}</div> -->
57
+        <!-- <ion-button (click)="loadMap()" shape="round" color="dark">
58
+          <ion-icon slot="start" name="locate"></ion-icon>
59
+          Where I Am
60
+        </ion-button> -->
61
+        <div class="map-wrapper">
62
+          <div id="map_center">
63
+            <img src="assets/icon/location-marker.png" />
64
+          </div>
65
+          <div #map id="map"></div>
66
+        </div>
67
+        
54
       </ion-col>
68
       </ion-col>
55
     </ion-row>
69
     </ion-row>
70
+
56
   </ion-grid>
71
   </ion-grid>
57
 </ion-content>
72
 </ion-content>

+ 52 - 22
src/app/placedetail/placedetail.page.scss

11
 //     position: absolute;
11
 //     position: absolute;
12
 // }
12
 // }
13
 
13
 
14
-  
15
-.bg{
14
+.bg {
15
+  position: absolute;
16
+  left: 0px;
17
+  top: 0px;
18
+  width: 100vw;
19
+  height: 60vh;
20
+  .holidaycard {
16
     position: absolute;
21
     position: absolute;
17
     left: 0px;
22
     left: 0px;
18
-    top: 0px;
19
-    width: 100vw;
20
-    height: 60vh;
21
-    .holidaycard {
22
-        position: absolute;
23
-        left: 0px;
24
-        bottom: 0px;
25
-        min-height: 60%;
26
-        width: 100%;
27
-        padding: 10px;
28
-        border-radius: 25px ;
29
-        background: white;
30
-        --background: white;
31
-    }
23
+    bottom: 0px;
24
+    min-height: 60%;
25
+    width: 100%;
26
+    padding: 10px;
27
+    border-radius: 25px;
28
+    background: white;
29
+    --background: white;
30
+  }
32
 }
31
 }
33
 
32
 
34
 .asd {
33
 .asd {
34
+}
35
+
36
+.asd .country {
37
+  position: absolute;
38
+  top: 50px;
39
+  width: 140px;
40
+  padding-left: 10px !important;
41
+  padding-right: 10px !important;
42
+  color: white;
43
+}
44
+
45
+#map_canvas {
46
+  width: 90%;
47
+  height: 80%;
48
+  border: 1px solid red;
49
+}
50
+
51
+#address {
52
+  padding: 10px;
53
+  font-size: 18px;
54
+  font-weight: bold;
55
+}
35
 
56
 
57
+#map {
58
+  width: 100%;
59
+  height: 20vh;
36
 }
60
 }
37
 
61
 
38
-.asd .country{
62
+.map-wrapper {
63
+  position: relative;
64
+
65
+  #map_center {
39
     position: absolute;
66
     position: absolute;
40
-    top: 50px;
41
-    width: 140px;
42
-    padding-left: 10px !important;
43
-    padding-right: 10px !important;
44
-    color: white;
67
+    z-index: 99;
68
+    height: 40px;
69
+    width: 40px;
70
+    top: 50%;
71
+    left: 50%;
72
+    margin-left: -21px;
73
+    margin-top: -41px;
74
+  }
45
 }
75
 }

+ 105 - 7
src/app/placedetail/placedetail.page.ts

1
-import { Component, OnInit, Input } from '@angular/core';
1
+import { Component, OnInit, Input, ViewChild, ElementRef } from '@angular/core';
2
 import { ActivatedRoute, Router } from '@angular/router';
2
 import { ActivatedRoute, Router } from '@angular/router';
3
 import { WpServiceService } from '../wp-service.service';
3
 import { WpServiceService } from '../wp-service.service';
4
 
4
 
5
+import { Geolocation } from '@ionic-native/geolocation/ngx';
6
+import { NativeGeocoder, NativeGeocoderResult, NativeGeocoderOptions } from '@ionic-native/native-geocoder/ngx';
7
+
8
+declare var google;
9
+
5
 @Component({
10
 @Component({
6
   selector: 'app-placedetail',
11
   selector: 'app-placedetail',
7
   templateUrl: './placedetail.page.html',
12
   templateUrl: './placedetail.page.html',
12
   data: any;
17
   data: any;
13
   placelist: any;
18
   placelist: any;
14
 
19
 
15
-  constructor(private wpservice: WpServiceService, private route: ActivatedRoute, private router: Router) { }
20
+  @ViewChild('map', { static: false }) mapElement: ElementRef;
21
+  map: any;
22
+  address: string;
23
+  latitude: number;
24
+  longitude: number;
25
+  latdynamic: any;
26
+  londynamic: any;
27
+  
28
+
29
+  constructor(private wpservice: WpServiceService, private route: ActivatedRoute, private router: Router, private geolocation: Geolocation, private nativeGeocoder: NativeGeocoder) { }
16
   @Input() id: string;
30
   @Input() id: string;
17
   showDiss = false;
31
   showDiss = false;
18
 
32
 
21
     if (this.id != undefined) {
35
     if (this.id != undefined) {
22
       this.showDiss = true;
36
       this.showDiss = true;
23
     }
37
     }
38
+    this.loadMap();
24
     // console.log("showDiss ", this.showDiss);
39
     // console.log("showDiss ", this.showDiss);
25
     // let id = this.route.snapshot.paramMap.get('id') || this.id;
40
     // let id = this.route.snapshot.paramMap.get('id') || this.id;
26
     // console.log("fetching ...");
41
     // console.log("fetching ...");
27
     // this.wpservice.getPlaceDetail(id).subscribe(data => {
42
     // this.wpservice.getPlaceDetail(id).subscribe(data => {
28
-      // let post = JSON.parse(data.data);
29
-      // console.log(" get data ", post);
30
-      // post['media_url'] = post['_embedded']['wp:featuredmedia'][0]['media_details'].sizes['medium'].source_url;
31
-      // this.data = post;
43
+    // let post = JSON.parse(data.data);
44
+    // console.log(" get data ", post);
45
+    // post['media_url'] = post['_embedded']['wp:featuredmedia'][0]['media_details'].sizes['medium'].source_url;
46
+    // this.data = post;
32
     let id = this.route.snapshot.paramMap.get('id') || this.id;
47
     let id = this.route.snapshot.paramMap.get('id') || this.id;
33
     console.log("fetching ...");
48
     console.log("fetching ...");
34
     this.wpservice.getPlaceDetail(id).subscribe((data) => {
49
     this.wpservice.getPlaceDetail(id).subscribe((data) => {
35
-      this.placelist = data;      
50
+      this.placelist = data;
51
+      this.latdynamic = data['acf']['gmap']['lat'];
52
+      this.londynamic = data['acf']['gmap']['lng'];
36
       console.log("load Place Detail ...");
53
       console.log("load Place Detail ...");
54
+      console.log(this.latdynamic);
55
+      console.log("load Lati ...");
56
+      console.log(this.londynamic);
57
+      console.log("load Lon ...");
37
       console.log(data);
58
       console.log(data);
38
     }, error => {
59
     }, error => {
39
       console.log("errror ", error);
60
       console.log("errror ", error);
40
     });
61
     });
41
   }
62
   }
42
 
63
 
64
+  loadMap() {
65
+    this.geolocation.getCurrentPosition().then((resp) => {
66
+
67
+      this.latitude = resp.coords.latitude;
68
+      this.longitude = resp.coords.longitude;
69
+      // this.latdynamic = resp.coords.latitude;
70
+      // this.londynamic = resp.coords.longitude;
71
+
72
+      let latLng = new google.maps.LatLng(resp.coords.latitude, resp.coords.longitude);
73
+      let mapOptions = {
74
+        center: latLng,
75
+        zoom: 15,
76
+        mapTypeId: google.maps.MapTypeId.ROADMAP
77
+      }
78
+
79
+      this.getAddressFromCoords(resp.coords.latitude, resp.coords.longitude);
80
+
81
+      this.map = new google.maps.Map(this.mapElement.nativeElement, mapOptions);
82
+
83
+      this.map.addListener('dragend', () => {
84
+
85
+        this.latitude = this.map.center.lat();
86
+        this.longitude = this.map.center.lng();
87
+
88
+        this.getAddressFromCoords(this.map.center.lat(), this.map.center.lng())
89
+      });
90
+
91
+    }).catch((error) => {
92
+      console.log('Error getting location', error);
93
+    });
94
+  }
95
+
96
+  getAddressFromCoords(lattitude, longitude) {
97
+    console.log("getAddressFromCoords " + lattitude + " " + longitude);
98
+    let options: NativeGeocoderOptions = {
99
+      useLocale: true,
100
+      maxResults: 5
101
+    };
102
+
103
+    this.nativeGeocoder.reverseGeocode(lattitude, longitude, options)
104
+      .then((result: NativeGeocoderResult[]) => {
105
+        this.address = "";
106
+        let responseAddress = [];
107
+        for (let [key, value] of Object.entries(result[0])) {
108
+          if (value.length > 0)
109
+            responseAddress.push(value);
110
+
111
+        }
112
+        responseAddress.reverse();
113
+        for (let value of responseAddress) {
114
+          this.address += value + ", ";
115
+        }
116
+        this.address = this.address.slice(0, -2);
117
+      })
118
+      .catch((error: any) => {
119
+        this.address = "Address Not Available!";
120
+      });
121
+
122
+  }
123
+
124
+  // getAddressFromCoords2(lattitude, longitude) {
125
+  //   console.log("getAddressFromCoords2 " + lattitude + " " + longitude);
126
+  //   let options: NativeGeocoderOptions = {
127
+  //     useLocale: true,
128
+  //     maxResults: 5
129
+  //   };
130
+  // }
131
+
132
+  // getGeoencoder(latitude, longitude) {
133
+  //   this.nativeGeocoder.reverseGeocode(latitude, longitude, this.geoencoderOptions)
134
+  //     .then((result: NativeGeocoderResult[]) => {
135
+  //       this.address = this.generateAddress(result[0]);
136
+  //     })
137
+  //     .catch((error: any) => {
138
+  //       alert('Error getting location' + JSON.stringify(error));
139
+  //     });
140
+  // }
43
 }
141
 }

+ 1 - 18
src/app/province/province.page.scss

1
-// .bg {
2
-//   position: absolute;
3
-//   left: 0px;
4
-//   top: 0px;
5
-//   width: 100vw;
6
-//   height: 100vh;
7
-//   .holidaycard {
8
-//     position: absolute;
9
-//     left: 0px;
10
-//     bottom: 0px;
11
-//     min-height: 60%;
12
-//     width: 100%;
13
-//     padding: 10px;
14
-//     border-radius: 25px;
15
-//     background: white;
16
-//     --background: white;
17
-//   }
18
-// }
1
+
19
 .holidaycard {
2
 .holidaycard {
20
   position: absolute;
3
   position: absolute;
21
   left: 0px;
4
   left: 0px;

BIN
src/assets/icon/location-marker.png


+ 2 - 0
src/index.html

17
   <!-- add to homescreen for ios -->
17
   <!-- add to homescreen for ios -->
18
   <meta name="apple-mobile-web-app-capable" content="yes" />
18
   <meta name="apple-mobile-web-app-capable" content="yes" />
19
   <meta name="apple-mobile-web-app-status-bar-style" content="black" />
19
   <meta name="apple-mobile-web-app-status-bar-style" content="black" />
20
+
21
+  <script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDHSbJHYItlRqJeZ737ju4weBHlarJIPGE"></script>
20
 </head>
22
 </head>
21
 
23
 
22
 <body>
24
 <body>