|
|
@@ -1,103 +1,51 @@
|
|
|
<template>
|
|
|
<div
|
|
|
v-loading="isLoading"
|
|
|
- class="maps-container">
|
|
|
+ :class='provider ? "maps-components" : "maps-container"'>
|
|
|
+
|
|
|
+ <div class="filter-container">
|
|
|
+ <el-form class="filter-view">
|
|
|
+ <el-form-item
|
|
|
+ class="flex1" style="min-width: 200px; max-width: 320px;">
|
|
|
+ <el-input
|
|
|
+ placeholder="Search using keywords"
|
|
|
+ v-model="criteria"/>
|
|
|
+ </el-form-item>
|
|
|
+ <div>
|
|
|
+ <el-button
|
|
|
+ type="primary"
|
|
|
+ icon="el-icon-search"
|
|
|
+ @click="handleFilter">
|
|
|
+ Search
|
|
|
+ </el-button>
|
|
|
+ </div>
|
|
|
+ </el-form>
|
|
|
+ </div>
|
|
|
<div class="card-group">
|
|
|
<div class="maps-card-view">
|
|
|
- <div class="card-view-content">
|
|
|
- <div class="card-title">
|
|
|
- In Use
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div class="card-value-container">
|
|
|
- <div class="in-user-card-value">
|
|
|
- {{ statistics.inUse }}
|
|
|
- </div>
|
|
|
- <div class="in-user-card-flag"/>
|
|
|
- </div>
|
|
|
+ <div class="card-title">Available</div>
|
|
|
+ <div class="avaliable-card-value">{{ statistics.available || 0 }}</div>
|
|
|
</div>
|
|
|
<div class="maps-card-view">
|
|
|
- <div class="card-view-content">
|
|
|
- <div class="card-title">
|
|
|
- Reserved
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div class="card-value-container">
|
|
|
- <div class="reserved-card-value">
|
|
|
- {{ statistics.reserved }}
|
|
|
- </div>
|
|
|
- <div class="reserved-card-flag"/>
|
|
|
- </div>
|
|
|
+ <div class="card-title">In Use</div>
|
|
|
+ <div class="in-user-card-value">{{ statistics.inUse || 0}}</div>
|
|
|
</div>
|
|
|
<div class="maps-card-view">
|
|
|
- <div class="card-view-content">
|
|
|
- <div class="card-title">
|
|
|
- Faulted
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div class="card-value-container">
|
|
|
- <div class="faulted-card-value">
|
|
|
- {{ statistics.faulted }}
|
|
|
- </div>
|
|
|
- <div class="faulted-card-flag"/>
|
|
|
- </div>
|
|
|
+ <div class="card-title">Reserved</div>
|
|
|
+ <div class="reserved-card-value">{{ statistics.reserved || 0}}</div>
|
|
|
</div>
|
|
|
<div class="maps-card-view">
|
|
|
- <div class="card-view-content">
|
|
|
- <div class="card-title">
|
|
|
- Available
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div class="card-value-container">
|
|
|
- <div class="avaliable-card-value">
|
|
|
- {{ statistics.available }}
|
|
|
- </div>
|
|
|
- <div class="avaliable-card-flag"/>
|
|
|
- </div>
|
|
|
+ <div class="card-title">Faulted</div>
|
|
|
+ <div class="faulted-card-value">{{ statistics.faulted || 0 }}</div>
|
|
|
</div>
|
|
|
<div class="maps-card-view">
|
|
|
- <div class="card-view-content">
|
|
|
- <div class="card-title">
|
|
|
- Unavailable
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div class="card-value-container">
|
|
|
- <div class="unavaliable-card-value">
|
|
|
- {{ statistics.unavailable }}
|
|
|
- </div>
|
|
|
- <div class="unavaliable-card-flag"/>
|
|
|
- </div>
|
|
|
+ <div class="card-title">Unavailable</div>
|
|
|
+ <div class="unavaliable-card-value">{{ statistics.unavailable }}</div>
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
- <div class="filter-container">
|
|
|
- <el-row :gutter="36">
|
|
|
- <el-form>
|
|
|
- <el-col :span="7">
|
|
|
- <el-form-item>
|
|
|
- <el-input
|
|
|
- placeholder="Search using keywords"
|
|
|
- v-model="criteria"
|
|
|
- >
|
|
|
- </el-input>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="2">
|
|
|
- <el-button
|
|
|
- type="primary"
|
|
|
- icon="el-icon-search"
|
|
|
- @click="handleFilter">
|
|
|
- Search
|
|
|
- </el-button>
|
|
|
- </el-col>
|
|
|
- </el-form>
|
|
|
- </el-row>
|
|
|
- </div>
|
|
|
-
|
|
|
<div class="google-map-container">
|
|
|
- <div
|
|
|
- class="google-map"
|
|
|
- ref="googleMap"></div>
|
|
|
+ <div class="google-map" ref="googleMap"></div>
|
|
|
</div>
|
|
|
</div>
|
|
|
</template>
|
|
|
@@ -106,14 +54,15 @@
|
|
|
|
|
|
import { Loader } from "@googlemaps/js-api-loader"
|
|
|
import MarkerClusterer from '@googlemaps/markerclustererplus';
|
|
|
-import MapModule from '../../http/api/map'
|
|
|
-
|
|
|
-const {
|
|
|
- getConnectorStatusCount,
|
|
|
- getSiteInfoList,
|
|
|
-} = MapModule
|
|
|
+import api from '@/http/api/map'
|
|
|
|
|
|
export default {
|
|
|
+ props: {
|
|
|
+ provider: {
|
|
|
+ type: String|Number,
|
|
|
+ default: ""
|
|
|
+ }
|
|
|
+ },
|
|
|
data() {
|
|
|
return {
|
|
|
isLoading: false,
|
|
|
@@ -137,11 +86,9 @@ export default {
|
|
|
},
|
|
|
async mounted() {
|
|
|
this.getConnectorStatusCount()
|
|
|
- await this.initializeMap()
|
|
|
+ this.initializeMap()
|
|
|
this.getCurrentLocation()
|
|
|
- this.getSiteInfoList().then(() => {
|
|
|
- this.refreshMap()
|
|
|
- })
|
|
|
+ this.getSiteInfoList()
|
|
|
},
|
|
|
methods: {
|
|
|
getMarkerImageSize() {
|
|
|
@@ -150,7 +97,7 @@ export default {
|
|
|
},
|
|
|
getMarkerImage() {
|
|
|
const size = this.getMarkerImageSize()
|
|
|
- const markerImageUrl = require('../../assets/ic_marker.png')
|
|
|
+ const markerImageUrl = require('@/assets/ic_marker.png')
|
|
|
const markerImage = {
|
|
|
url: markerImageUrl,
|
|
|
size,
|
|
|
@@ -160,7 +107,7 @@ export default {
|
|
|
},
|
|
|
getUnavailableMarkerImage() {
|
|
|
const size = this.getMarkerImageSize()
|
|
|
- const unavailableMarkerImageUrl = require('../../assets/ic_marker_un.png')
|
|
|
+ const unavailableMarkerImageUrl = require('@/assets/ic_marker_un.png')
|
|
|
const unavailableMarkerImage = {
|
|
|
url: unavailableMarkerImageUrl,
|
|
|
size,
|
|
|
@@ -217,8 +164,8 @@ export default {
|
|
|
})
|
|
|
return {
|
|
|
url: hasAvailableSite
|
|
|
- ? require("../../assets/ic_cluster.png")
|
|
|
- : require("../../assets/ic_cluster_un.png"),
|
|
|
+ ? require("@/assets/ic_cluster.png")
|
|
|
+ : require("@/assets/ic_cluster_un.png"),
|
|
|
text: markers.length,
|
|
|
index: markers.length < 10 ? hasAvailableSite ? 3 : 4 : hasAvailableSite ? 1 : 2
|
|
|
}
|
|
|
@@ -266,33 +213,28 @@ export default {
|
|
|
}
|
|
|
)
|
|
|
},
|
|
|
- async getSiteInfoList() {
|
|
|
- return getSiteInfoList(this.criteria)
|
|
|
- .then(({ data }) => {
|
|
|
- this.siteInfoList = data
|
|
|
- }).catch(() => {
|
|
|
+ getSiteInfoList() {
|
|
|
+ api.getSiteInfoList(this.criteria).then(res => {
|
|
|
+ if (res.data) {
|
|
|
+ this.siteInfoList = res.data
|
|
|
+ } else {
|
|
|
+ this.siteInfoList = []
|
|
|
+ }
|
|
|
+ this.refreshMap()
|
|
|
+ }).catch(err => {
|
|
|
|
|
|
- })
|
|
|
+ })
|
|
|
},
|
|
|
getConnectorStatusCount() {
|
|
|
- getConnectorStatusCount().then(({data}) => {
|
|
|
- const {
|
|
|
- inUse,
|
|
|
- reserved,
|
|
|
- faulted,
|
|
|
- available,
|
|
|
- unavailable
|
|
|
- } = data
|
|
|
- this.statistics.inUse = inUse
|
|
|
- this.statistics.reserved = reserved
|
|
|
- this.statistics.faulted = faulted
|
|
|
- this.statistics.available = available
|
|
|
- this.statistics.unavailable = unavailable
|
|
|
+ api.getConnectorStatusCount().then(res => {
|
|
|
+ if (res.data) {
|
|
|
+ this.statistics = res.data
|
|
|
+ }
|
|
|
}).catch(() => {
|
|
|
|
|
|
})
|
|
|
},
|
|
|
- async initializeMap() {
|
|
|
+ initializeMap() {
|
|
|
const mapContainer = this.$refs.googleMap
|
|
|
const loader = new Loader({
|
|
|
apiKey: this.apiKey,
|
|
|
@@ -333,38 +275,46 @@ export default {
|
|
|
</script>
|
|
|
|
|
|
<style lang="scss" scoped="scoped">
|
|
|
- @import '../../styles/variables.scss';
|
|
|
+ @import '../../../styles/variables.scss';
|
|
|
|
|
|
.maps-container {
|
|
|
width: 100%;
|
|
|
+ padding: 20px;
|
|
|
min-height: $mainAppMinHeight;
|
|
|
background-color: #F0F5FC;
|
|
|
}
|
|
|
-
|
|
|
- .filter-container {
|
|
|
- padding: 0px 30px;
|
|
|
+
|
|
|
+ .maps-components {
|
|
|
+ margin: 0px;
|
|
|
}
|
|
|
|
|
|
.card-group {
|
|
|
+ padding: 0 5px;
|
|
|
display: flex;
|
|
|
flex-wrap: wrap;
|
|
|
flex-flow: wrap;
|
|
|
align-items: flex-start;
|
|
|
- padding-top: 10px;
|
|
|
- padding-left: 30px;
|
|
|
}
|
|
|
|
|
|
.maps-card-view {
|
|
|
+ flex: 1;
|
|
|
display: flex;
|
|
|
- flex: auto;
|
|
|
+ min-width: 200px;
|
|
|
+ max-width: 320px;
|
|
|
+ flex-direction: column;
|
|
|
background-color: white;
|
|
|
justify-content: center;
|
|
|
align-items: center;
|
|
|
- margin-bottom: 20px;
|
|
|
- margin-right: 30px;
|
|
|
+ padding: 10px 10px;
|
|
|
+ margin-right: 10px;
|
|
|
+ margin-bottom: 10px;
|
|
|
border-radius: 6px;
|
|
|
}
|
|
|
|
|
|
+ .maps-card-view:last-child {
|
|
|
+ margin-right: 0px;
|
|
|
+ }
|
|
|
+
|
|
|
.card-view-content {
|
|
|
display: inline;
|
|
|
}
|
|
|
@@ -372,11 +322,10 @@ export default {
|
|
|
.card-title {
|
|
|
font-family: sans-serif;
|
|
|
font-style: normal;
|
|
|
- font-weight: 500;
|
|
|
+ font-weight: bold;
|
|
|
font-size: 16px;
|
|
|
line-height: 24px;
|
|
|
color: #333333;
|
|
|
- margin: 20px;
|
|
|
}
|
|
|
|
|
|
.card-value-container {
|
|
|
@@ -387,13 +336,11 @@ export default {
|
|
|
}
|
|
|
|
|
|
%card-value {
|
|
|
- display: inline;
|
|
|
font-family: sans-serif;
|
|
|
font-style: normal;
|
|
|
font-weight: 500;
|
|
|
font-size: 42px;
|
|
|
line-height: 63px;
|
|
|
- letter-spacing: -0.03em;
|
|
|
}
|
|
|
|
|
|
.in-user-card-value {
|
|
|
@@ -413,7 +360,7 @@ export default {
|
|
|
|
|
|
.avaliable-card-value {
|
|
|
@extend %card-value;
|
|
|
- color: #82CF08;
|
|
|
+ color: #1ABD00;
|
|
|
}
|
|
|
|
|
|
.unavaliable-card-value {
|
|
|
@@ -456,7 +403,9 @@ export default {
|
|
|
}
|
|
|
|
|
|
.google-map-container {
|
|
|
- padding: 0px 30px 30px;
|
|
|
+ margin: 0 5px;
|
|
|
+ padding: 0px;
|
|
|
+ background-color: white;
|
|
|
}
|
|
|
|
|
|
.google-map {
|
|
|
@@ -492,12 +441,4 @@ export default {
|
|
|
|
|
|
}
|
|
|
|
|
|
- @media screen and (min-width: 1185px) {
|
|
|
-
|
|
|
- .maps-card-view {
|
|
|
- flex: initial;
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
</style>
|