Преглед на файлове

George - Merge fixes

master
George Williams преди 5 години
родител
ревизия
427a288cda

+ 54
- 0
README.md Целия файл

@@ -1,2 +1,56 @@
1 1
 # UnivateProperties
2 2
 
3
+## Project setup
4
+
5
+```
6
+npm install
7
+```
8
+
9
+### Compiles and hot-reloads for development
10
+
11
+```
12
+npm run serve
13
+```
14
+
15
+### Compiles and minifies for production
16
+
17
+```
18
+npm run build
19
+```
20
+
21
+### Run your tests
22
+
23
+```
24
+npm run test
25
+```
26
+
27
+### Lints and fixes files
28
+
29
+```
30
+npm run lint
31
+```
32
+
33
+### Customize configuration
34
+
35
+See [Configuration Reference](https://cli.vuejs.org/config/).
36
+
37
+### Structure
38
+
39
+├── index.html
40
+├── main.js
41
+├── assets
42
+│ └── staticData
43
+│ ├── alertTypes.js
44
+│ ├── itemsPerPage.js
45
+│ ├── maritalStatus.js
46
+│  
47
+├── components
48
+│ ├── App.vue
49
+│ └── ...
50
+└── store
51
+├── index.js # where we assemble modules and export the store
52
+├── actions.js # root actions
53
+├── mutations.js # root mutations
54
+└── modules
55
+├── cart.js # cart module
56
+└── products.js # products module

+ 6
- 0
package-lock.json Целия файл

@@ -817,6 +817,12 @@
817 817
         "to-fast-properties": "^2.0.0"
818 818
       }
819 819
     },
820
+    "@fortawesome/fontawesome-free": {
821
+      "version": "5.11.2",
822
+      "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.11.2.tgz",
823
+      "integrity": "sha512-XiUPoS79r1G7PcpnNtq85TJ7inJWe0v+b5oZJZKb0pGHNIV6+UiNeQWiFGmuQ0aj7GEhnD/v9iqxIsjuRKtEnQ==",
824
+      "dev": true
825
+    },
820 826
     "@hapi/address": {
821 827
       "version": "2.0.0",
822 828
       "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.0.0.tgz",

+ 1
- 0
package.json Целия файл

@@ -33,6 +33,7 @@
33 33
     "vuex": "^3.1.1"
34 34
   },
35 35
   "devDependencies": {
36
+    "@fortawesome/fontawesome-free": "^5.11.2",
36 37
     "@vue/cli-plugin-babel": "^3.8.0",
37 38
     "@vue/cli-plugin-eslint": "^3.8.0",
38 39
     "@vue/cli-service": "^3.8.0",

+ 14
- 0
src/App.vue Целия файл

@@ -33,8 +33,22 @@ export default {
33 33
 </script>
34 34
 
35 35
 <style>
36
+hr {
37
+  background-color: #60cbeb;
38
+}
39
+.title-img {
40
+  width: 800px;
41
+  height: 400px;
42
+  border-radius: 10px;
43
+}
44
+.title-title {
45
+  opacity: 0.7;
46
+  border: white solid 3px;
47
+  border-radius: 15px;
48
+}
36 49
 .myFill {
37 50
   fill: #60cbeb;
51
+  color: #60cbeb;
38 52
 }
39 53
 a {
40 54
   cursor: pointer;

+ 47
- 2
src/assets/Log.js Целия файл

@@ -1,9 +1,54 @@
1 1
 const items = {
2
+  setValues(item) {
3
+    localStorage.setItem('user', JSON.stringify(item.user));
4
+    localStorage.setItem('token', JSON.stringify(item.token));
5
+    localStorage.setItem('person', JSON.stringify(item.person));
6
+    localStorage.setItem('agency', JSON.stringify(item.agency));
7
+  },
8
+  tokenExpired() {
9
+    const item = this.getJSONObject('token');
10
+    if (!item && !item.expires && item.expires !== null) {
11
+      const today = new Date();
12
+      const date = `${today.getFullYear()}-${today.getMonth() + 1}-${today.getDate()}`;
13
+      const time = `${today.getHours()}:${today.getMinutes()}:${today.getSeconds()}`;
14
+      const dateTime = `${date} ${time}`;
15
+      return item.expires > dateTime;
16
+    }
17
+    return true;
18
+  },
19
+  updateTokenExpiry() {
20
+    const item = this.getJSONObject('token');
21
+    if (!item && !item.expires) {
22
+      item.expires = this.addMinutes();
23
+      localStorage.removeItem('token');
24
+      localStorage.setItem('token', JSON.stringify(item));
25
+    }
26
+  },
27
+  getJSONObject(itemString) {
28
+    const item = localStorage.getItem(itemString);
29
+    if (!item) {
30
+      return JSON.parse(item);
31
+    }
32
+    return item;
33
+  },
34
+  addMinutes() {
35
+    const today = new Date();
36
+    const date = `${today.getFullYear()}-${today.getMonth() + 1}-${today.getDate()}`;
37
+    const time = `${today.getHours()}:${today.getMinutes()}:${today.getSeconds()}`;
38
+    const dateTime = `${date} ${time}`;
39
+    return new Date(dateTime + 15 * 60000);
40
+  },
41
+  clearValues() {
42
+    localStorage.removeItem('user');
43
+    localStorage.removeItem('token');
44
+    localStorage.removeItem('person');
45
+    localStorage.removeItem('agency');
46
+  },
2 47
   isLoggedIn() {
3
-    return localStorage.getItem('token') !== undefined;
48
+    return localStorage.getItem('token') !== undefined && localStorage.getItem('token') !== null;
4 49
   },
5 50
   getUser() {
6
-    return localStorage.getItem('User');
51
+    return localStorage.getItem('user');
7 52
   },
8 53
 };
9 54
 export default items;

+ 3
- 8
src/components/about/aboutTimeshare.vue Целия файл

@@ -5,14 +5,9 @@
5 5
       <div class="row">
6 6
         <div class="col-sm-12">
7 7
           <div class="about-img-box">
8
-            <img
9
-              src="img/timeshare2.jpg"
10
-              alt="About Timeshare"
11
-              class="img-fluid"
12
-              style="width:800px;height:400px; border-radius:10px"
13
-            />
8
+            <img src="img/timeshare2.jpg" alt="About Timeshare" class="img-fluid title-img" />
14 9
           </div>
15
-          <div class="sinse-box" style="opacity:0.7; border: white solid 3px; border-radius: 15px">
10
+          <div class="sinse-box title-title">
16 11
             <h3 class="sinse-title">Timeshare Resales</h3>
17 12
           </div>
18 13
         </div>
@@ -25,7 +20,7 @@
25 20
             </div>
26 21
             <div class="col-md-6 col-lg-5 section-md-t3">
27 22
               <p class="color-text-a font-weight-bold" style="text-align:left;">
28
-                found that there was a desperate need for a reputable source for buyers and
23
+                Uni-Vate Properties found that there was a desperate need for a reputable source for buyers and
29 24
                 sellers to turn to with their timeshare needs in South Africa. Over the
30 25
                 years, Uni-Vate has developed a treasure of networking alliances of professional
31 26
                 acquaintances and that has made timeshare resales a pleasure for both buyers and

+ 2
- 7
src/components/about/aboutUsPage.vue Целия файл

@@ -5,14 +5,9 @@
5 5
       <div class="row">
6 6
         <div class="col-sm-12">
7 7
           <div class="about-img-box">
8
-            <img
9
-              src="img/slide-about-1.jpg"
10
-              alt
11
-              class="img-fluid"
12
-              style="width:800px;height:400px; border-radius:10px"
13
-            />
8
+            <img src="img/slide-about-1.jpg" alt class="img-fluid title-img" />
14 9
           </div>
15
-          <div class="sinse-box" style="opacity:0.7; border: white solid 3px; border-radius: 15px">
10
+          <div class="sinse-box title-title">
16 11
             <h3 class="sinse-title">About Us</h3>
17 12
           </div>
18 13
         </div>

+ 2
- 3
src/components/misc/contactUs.vue Целия файл

@@ -7,11 +7,10 @@
7 7
           <img
8 8
             src="img/Contact-us2.jpg"
9 9
             alt="Frequently Asked Questions"
10
-            class="img-fluid"
11
-            style="width:800px;height:400px; border-radius:10px"
10
+            class="img-fluid title-img"
12 11
           />
13 12
         </div>
14
-        <div class="sinse-box" style="opacity:0.7; border: white solid 3px; border-radius: 15px">
13
+        <div class="sinse-box title-title">
15 14
           <h3 class="sinse-title">Contact Us</h3>
16 15
         </div>
17 16
       </div>

+ 2
- 7
src/components/misc/privacyPolicyPage.vue Целия файл

@@ -4,14 +4,9 @@
4 4
     <div class="row">
5 5
       <div class="col-sm-12">
6 6
         <div class="about-img-box">
7
-          <img
8
-            src="img/privacy.jpg"
9
-            alt="Privacy Policy"
10
-            class="img-fluid"
11
-            style="width:800px;height:400px; border-radius:10px"
12
-          />
7
+          <img src="img/privacy.jpg" alt="Privacy Policy" class="img-fluid title-img" />
13 8
         </div>
14
-        <div class="sinse-box" style="opacity:0.7; border: white solid 3px; border-radius: 15px">
9
+        <div class="sinse-box title-title">
15 10
           <h5 class="sinse-title">Privacy Policy</h5>
16 11
         </div>
17 12
       </div>

+ 5
- 33
src/components/property/propertySearchFields.vue Целия файл

@@ -11,7 +11,6 @@
11 11
           </div>
12 12
           <select
13 13
             class="form-control"
14
-            id="forSelector"
15 14
             v-model="propertySearch.salesType"
16 15
             @change="salesTypeSelected"
17 16
           >
@@ -28,12 +27,7 @@
28 27
               <b>T</b>
29 28
             </span>
30 29
           </div>
31
-          <select
32
-            class="form-control"
33
-            id="forSelector"
34
-            v-model="resType"
35
-            @change="PropertyTypeSelected"
36
-          >
30
+          <select class="form-control" v-model="resType" @change="PropertyTypeSelected">
37 31
             <option>All</option>
38 32
             <option
39 33
               v-for="(propertyType, i) in propertyTypesRes"
@@ -55,12 +49,7 @@
55 49
               <b>T</b>
56 50
             </span>
57 51
           </div>
58
-          <select
59
-            class="form-control"
60
-            id="forSelector"
61
-            v-model="comType"
62
-            @change="PropertyTypeSelected"
63
-          >
52
+          <select class="form-control" v-model="comType" @change="PropertyTypeSelected">
64 53
             <option>All</option>
65 54
             <option
66 55
               v-for="(propertyType, i) in propertyTypesCom"
@@ -82,12 +71,7 @@
82 71
               <b>P</b>
83 72
             </span>
84 73
           </div>
85
-          <select
86
-            class="form-control"
87
-            id="provinceselector"
88
-            @change="ProvinceSelected"
89
-            v-model="propertySearch.province"
90
-          >
74
+          <select class="form-control" @change="ProvinceSelected" v-model="propertySearch.province">
91 75
             <option>All</option>
92 76
             <option v-for="(province, i) in provinces" :key="i">{{ province.description }}</option>
93 77
           </select>
@@ -108,12 +92,7 @@
108 92
               <b>C</b>
109 93
             </span>
110 94
           </div>
111
-          <select
112
-            class="form-control"
113
-            id="cityselector"
114
-            @change="CitySelected"
115
-            v-model="propertySearch.city"
116
-          >
95
+          <select class="form-control" @change="CitySelected" v-model="propertySearch.city">
117 96
             <option>All</option>
118 97
             <option v-for="(city, i) in cities" :key="i">{{ city.description }}</option>
119 98
           </select>
@@ -134,12 +113,7 @@
134 113
               <b>S</b>
135 114
             </span>
136 115
           </div>
137
-          <select
138
-            class="form-control"
139
-            id="suburbselector"
140
-            v-model="propertySearch.suburb"
141
-            @change="SuburbSeleted"
142
-          >
116
+          <select class="form-control" v-model="propertySearch.suburb" @change="SuburbSeleted">
143 117
             <option>All</option>
144 118
             <option v-for="(suburb, i) in suburbs" :key="i">{{ suburb.description }}</option>
145 119
           </select>
@@ -166,7 +140,6 @@
166 140
                 class="form-control"
167 141
                 type="number"
168 142
                 step="any"
169
-                id="minPrice"
170 143
                 name="minPrice"
171 144
                 v-model="propertySearch.minPrice"
172 145
               />
@@ -189,7 +162,6 @@
189 162
                 class="form-control"
190 163
                 type="number"
191 164
                 step="any"
192
-                id="maxPrice"
193 165
                 name="maxPrice"
194 166
                 v-model="propertySearch.maxPrice"
195 167
               />

+ 0
- 1
src/components/shared/footerSection.vue Целия файл

@@ -45,7 +45,6 @@
45 45
                       <eva-icon name="slash-outline" class="myFill"></eva-icon>
46 46
                       <router-link to="/privacypolicy">Privacy Policy</router-link>
47 47
                     </li>
48
-                    <br />
49 48
                     <li class="list-inline-item">
50 49
                       <a href="https://www.facebook.com/univateproperties/">
51 50
                         <eva-icon name="facebook-outline" class="myFill"></eva-icon>Facebook

+ 41
- 31
src/components/shared/navBar.vue Целия файл

@@ -17,7 +17,7 @@
17 17
           <span></span>
18 18
           <span></span>
19 19
         </button>
20
-        <a class="navbar-brand text-brand" @click="routerGoTo('/')">
20
+        <div class="navbar-brand text-brand" style="cursor: pointer;" @click="routerGoTo('/')">
21 21
           <img
22 22
             class="img-fluid"
23 23
             src="/img/logos/UVProp.png"
@@ -26,7 +26,7 @@
26 26
           />
27 27
           Uni-Vate
28 28
           <span class="color-b">Properties</span>
29
-        </a>
29
+        </div>
30 30
         <button
31 31
           type="button"
32 32
           class="btn btn-link nav-search navbar-toggle-box-collapse d-md-none"
@@ -41,9 +41,6 @@
41 41
       <div class="col-md-8">
42 42
         <div class="navbar-collapse collapse justify-content-center" id="navbarDefault">
43 43
           <ul class="navbar-nav">
44
-            <!-- <li class="nav-item">
45
-            <a class="nav-link active" @click="routerGoTo('/')">Home</a>
46
-            </li>-->
47 44
             <li class="nav-item dropdown">
48 45
               <a
49 46
                 class="nav-link dropdown-toggle"
@@ -60,12 +57,15 @@
60 57
                   class="dropdown-item cursor-pointer"
61 58
                   @click="routerGoTo('/timeshare/sell')"
62 59
                 >To Sell</a>
63
-                <a
64
-                  v-if="showLogout"
65
-                  class="dropdown-item cursor-pointer"
66
-                  @click="routerGoTo('/timeshare/sell')"
67
-                >My Timeshare Weeks</a>
68 60
                 <a class="dropdown-item cursor-pointer" @click="routerGoTo('/timeshare/faq')">FAQ</a>
61
+                <div v-if="isLoggedIn">
62
+                  <hr />
63
+                  <a
64
+                    v-if="isLoggedIn"
65
+                    class="dropdown-item cursor-pointer"
66
+                    @click="routerGoTo('/timeshare/sell')"
67
+                  >My Timeshare Weeks</a>
68
+                </div>
69 69
               </div>
70 70
             </li>
71 71
             <li class="nav-item dropdown">
@@ -93,7 +93,7 @@
93 93
                 >To Rent</a>
94 94
                 <hr v-if="showLogout" />
95 95
                 <a
96
-                  v-if="showLogout"
96
+                  v-if="isLoggedIn"
97 97
                   class="dropdown-item cursor-pointer"
98 98
                   @click="routerGoTo('/property/admin/list/my')"
99 99
                 >My Properties</a>
@@ -119,7 +119,7 @@
119 119
               </div>
120 120
             </li>
121 121
 
122
-            <li v-if="showLogout" class="nav-item dropdown">
122
+            <li v-if="isLoggedIn" class="nav-item dropdown">
123 123
               <a
124 124
                 class="nav-link dropdown-toggle"
125 125
                 href="#"
@@ -166,7 +166,7 @@
166 166
                 <a class="dropdown-item cursor-pointer" @click="routerGoTo('/Offers')">Offers</a>
167 167
               </div>
168 168
             </li>
169
-            <li class="nav-item dropdown" v-if="hideLogin">
169
+            <li class="nav-item dropdown" v-if="!isLoggedIn">
170 170
               <a
171 171
                 class="nav-link"
172 172
                 @click="routerGoTo('/user/login')"
@@ -177,18 +177,18 @@
177 177
                 aria-expanded="false"
178 178
               >Login</a>
179 179
             </li>
180
-            <li class="nav-item dropdown" v-if="showLogout">
180
+            <li class="nav-item dropdown" v-if="isLoggedIn">
181 181
               <span>
182 182
                 <a class="nav-link" @click="logout(routerGoTo('/user/login'))">Logout</a>
183 183
               </span>
184 184
               <!-- <span v-else></span> -->
185 185
             </li>
186 186
             <li>
187
-              <span v-if="showLogout">
187
+              <span v-if="isLoggedIn">
188 188
                 <a>
189 189
                   Welcome!
190 190
                   <br />
191
-                  {{ username }}
191
+                  {{ NAME }}
192 192
                 </a>
193 193
               </span>
194 194
               <span v-else></span>
@@ -212,31 +212,29 @@
212 212
 </template>
213 213
 
214 214
 <script>
215
-import { mapGetters, mapActions } from 'vuex';
215
+import { mapState, mapActions } from 'vuex';
216 216
 
217 217
 export default {
218
-  data() {
219
-    return {
220
-      username: sessionStorage.getItem('name'),
221
-    };
222
-  },
223 218
   computed: {
224
-    showLogout() {
225
-      // eslint-disable-next-line vue/no-side-effects-in-computed-properties
226
-      this.username = sessionStorage.getItem('name');
227
-      return this.$store.state.authentication.status === 'success';
219
+    ...mapState('authentication', [
220
+      'user',
221
+      'flag',
222
+      'status',
223
+      'person',
224
+      'token',
225
+    ]),
226
+    NAME() {
227
+      return this.person.fullName;
228 228
     },
229
-    hideLogin() {
230
-      return this.$store.state.authentication.status !== 'success';
229
+    isLoggedIn() {
230
+      return this.token !== null && this.token !== undefined;
231 231
     },
232 232
     // eslint-disable-next-line vue/return-in-computed-property
233 233
     Logout() {
234
-      return this.$store.state.authentication.methods.logout;
234
+      return this.logout();
235 235
     },
236 236
   },
237
-
238 237
   methods: {
239
-    ...mapGetters('authentication', ['isLoggedIn']),
240 238
     ...mapActions('authentication', ['logout']),
241 239
 
242 240
     routerGoTo(goTo) {
@@ -245,3 +243,15 @@ export default {
245 243
   },
246 244
 };
247 245
 </script>
246
+<style scoped>
247
+a {
248
+  border: transparent thin solid;
249
+  padding: 5px 12px;
250
+  font-size: 110%;
251
+}
252
+a:hover {
253
+  background-color: rgba(169, 224, 255, 0.75);
254
+  border-radius: 5px;
255
+  border: silver thin solid;
256
+}
257
+</style>

+ 15
- 7
src/components/shared/searchTab.vue Целия файл

@@ -11,12 +11,19 @@
11 11
           <div class="col-md-12">
12 12
             <div class="form-group" style="text-align:left">
13 13
               <label for="Type">Keyword</label>
14
-              <input
15
-                type="text"
16
-                class="form-control"
17
-                placeholder="Keyword"
18
-                v-model="propertySearch.keyword"
19
-              />
14
+              <div class="input-group mb-3">
15
+                <div class="input-group-prepend">
16
+                  <span class="input-group-text myFill" style="font-size:75%;">
17
+                    <i class="fa fa-search"></i>
18
+                  </span>
19
+                </div>
20
+                <input type="text" class="form-control" placeholder="Keyword" v-model="keyword" />
21
+                <div class="input-group-append" @click="clearFilter('resort')">
22
+                  <span class="input-group-text cursor-pointer myFill">
23
+                    <b>X</b>
24
+                  </span>
25
+                </div>
26
+              </div>
20 27
             </div>
21 28
           </div>
22 29
           <div class="col-md-12">
@@ -65,7 +72,7 @@
65 72
                 role="tabpanel"
66 73
                 aria-labelledby="pills-video-tab"
67 74
               >
68
-                <timeshareSearch />
75
+                <timeshareSearch :keyword="keyword" />
69 76
               </div>
70 77
               <div
71 78
                 class="tab-pane fade"
@@ -107,6 +114,7 @@ export default {
107 114
   data() {
108 115
     return {
109 116
       selectedPropertyType: 'timeshare',
117
+      keyword: '',
110 118
       propertySearch: {
111 119
         keyword: '',
112 120
         userName: '',

+ 55
- 43
src/components/timeshare/buy/buyPage.vue Целия файл

@@ -5,20 +5,14 @@
5 5
       <div class="row">
6 6
         <div class="col-sm-12">
7 7
           <div class="tobuy-img-box">
8
-            <img
9
-              src="img/buy2.jpg"
10
-              alt="Timeshare To Buy"
11
-              class="img-fluid"
12
-              style="width:800px;height:400px; border-radius:10px"
13
-            />
8
+            <img src="img/buy2.jpg" alt="Timeshare To Buy" class="img-fluid title-img" />
14 9
           </div>
15
-          <div class="sinse-box" style="opacity:0.7; border: white solid 3px; border-radius: 15px">
10
+          <div class="sinse-box title-title">
16 11
             <h3 class="sinse-title">Timeshare To Buy</h3>
17 12
           </div>
18 13
         </div>
19
-
20 14
         <div class="container col-md-10">
21
-          <br />
15
+          <hr />
22 16
           <div class="row">
23 17
             <div class="col-md-12 text-left">
24 18
               <p>
@@ -39,41 +33,47 @@
39 33
               </p>
40 34
             </div>
41 35
           </div>
42
-          <br />
36
+          <hr />
43 37
           <div class="row mb-4">
44 38
             <div class="container col-md-4">
45 39
               <div class="accordion" id="accordionExample">
46
-                <div class="card" v-for="(region, r) in regions" :key="r">
40
+                <div class="card" v-for="(region, r) in availRegion" :key="r">
47 41
                   <a
48 42
                     class="mb-0 color-text-a"
49 43
                     data-toggle="collapse"
50
-                    :data-target="'#collapse' + region.id"
44
+                    :data-target="'#collapse' + region.regionCode"
51 45
                     aria-expanded="false"
52
-                    :aria-controls="'collapse' + region.id"
46
+                    :aria-controls="'collapse' + region.regionCode"
47
+                    @mouseover="updateMapProvince(region.regionName)"
53 48
                   >
54
-                    <div :id="'header' + region.id">
49
+                    <div :id="'header' + region.regionCode">
55 50
                       <h5
56 51
                         class="btn btn-link font-weight-bold color-b"
57
-                        @mouseover="updateMapProvince(region.regionName)"
58
-                      >{{ region.regionName }}</h5>
52
+                      >{{ region.regionName + ' (' + region.available + ')' }}</h5>
59 53
                     </div>
60 54
                   </a>
61 55
                   <div
62
-                    :id="'collapse' + region.id"
63
-                    class="collapse"
64
-                    :aria-labelledby="'header' + region.id"
56
+                    :id="'collapse' + region.regionCode"
57
+                    class="collapse secondary"
58
+                    :aria-labelledby="'header' + region.regionCode"
65 59
                     data-parent="#accordionExample"
60
+                    style="background-color:#E3E3E3"
66 61
                   >
67 62
                     <div class="card-body">
68
-                      <p class="mb-0" v-for="(resort, i) in region.resorts" :key="i">
69
-                        <a
70
-                          class="cursor-pointer"
71
-                          href="#"
72
-                          @click="routerGoTo('/resort/' + resort.resortCode)"
73
-                          @mouseover="updateMap(resort.resortCode)"
74
-                        >{{resort.resortName}}</a>
75
-                        <br />
76
-                      </p>
63
+                      <div
64
+                        v-for="(resort, i) in region.resorts"
65
+                        :key="i"
66
+                        @click="routerGoTo('/resort/' + resort.resortCode)"
67
+                        @mouseover="updateMap(resort)"
68
+                      >
69
+                        <p class="mb-0 card-item">
70
+                          <a
71
+                            class="cursor-pointer"
72
+                            href="#"
73
+                          >{{resort.resortName + ' (' + resort.available + ')'}}</a>
74
+                          <br />
75
+                        </p>
76
+                      </div>
77 77
                     </div>
78 78
                   </div>
79 79
                 </div>
@@ -96,13 +96,8 @@
96 96
                     allowfullscreen
97 97
                   ></iframe>
98 98
                   <br />
99
-
100 99
                   <small>
101
-                    <a
102
-                      :href="mapUrl"
103
-                      style="color:#60CBEB;text-align:left"
104
-                      target="_blank"
105
-                    >See map bigger</a>
100
+                    <a :href="mapUrl" class="map-url" target="_blank">See map bigger</a>
106 101
                   </small>
107 102
                 </div>
108 103
               </div>
@@ -125,12 +120,12 @@ export default {
125 120
     };
126 121
   },
127 122
   mounted() {
128
-    this.getRegions();
123
+    console.log(4);
124
+    this.init();
129 125
   },
130 126
   computed: {
131
-    ...mapState('timeshareBuy', ['detailedRegion', 'resort']),
127
+    ...mapState('timeshareBuy', ['detailedRegion', 'resort', 'availRegion']),
132 128
     mapUrl() {
133
-      // return 'http://maps.google.com/maps/place/Gauteng/';
134 129
       return `http://maps.google.com/maps?q=${this.myMap}&z=${this.myZoom}&output=embed`;
135 130
     },
136 131
     regions() {
@@ -138,15 +133,18 @@ export default {
138 133
     },
139 134
   },
140 135
   methods: {
141
-    ...mapActions('timeshareBuy', ['getRegions', 'getResort']),
136
+    ...mapActions('timeshareBuy', [
137
+      'init',
138
+      'getAvail',
139
+      'getRegions',
140
+      'getResort',
141
+    ]),
142 142
     routerGoTo(goTo) {
143 143
       this.$router.push(goTo);
144 144
     },
145
-    updateMap(resortCode) {
146
-      this.myMap = 'SouthAfrice';
147
-      this.getResort(resortCode);
148
-      // `http://maps.google.com/maps?q=${this.resort.prLatitude},${this.resort.prLongitude}&z=7&output=embed`;
149
-      this.myMap = `${this.resort.prLatitude},${this.resort.prLongitude}`;
145
+    updateMap(resort) {
146
+      this.myMap = 'SouthAfrica';
147
+      this.myMap = `${resort.lat},${resort.long}`;
150 148
       this.myZoom = 10;
151 149
     },
152 150
     updateMapProvince(province) {
@@ -156,3 +154,17 @@ export default {
156 154
   },
157 155
 };
158 156
 </script>
157
+<style scoped>
158
+.map-url {
159
+  color: #60cbeb;
160
+  text-align: left;
161
+}
162
+.card-item {
163
+  font-size: 100%;
164
+}
165
+.card-item:hover {
166
+  background-color: rgba(255, 255, 255, 0.75);
167
+  border-radius: 5px;
168
+  cursor: pointer;
169
+}
170
+</style>

+ 16
- 6
src/components/timeshare/faqPage.vue Целия файл

@@ -8,20 +8,17 @@
8 8
             <img
9 9
               src="img/questions.jpg"
10 10
               alt="Frequently Asked Questions"
11
-              class="img-fluid"
12
-              style="width:800px;height:400px; border-radius:10px"
11
+              class="img-fluid title-img"
13 12
             />
14 13
           </div>
15
-          <div class="sinse-box" style="opacity:0.7; border: white solid 3px; border-radius: 15px">
14
+          <div class="sinse-box title-title">
16 15
             <h3 class="sinse-title">Frequently Asked Questions</h3>
17 16
           </div>
18 17
         </div>
19 18
         <div class="container col-md-10">
20 19
           <br />
21 20
           <div id="accordion">
22
-            <!-- <div class="card"> -->
23 21
             <div class="card" id="heading1">
24
-              <!-- <h5 class="mb-0 color-text-a"> -->
25 22
               <button
26 23
                 class="btn btn-link font-weight-bold color-b text-left"
27 24
                 data-toggle="collapse"
@@ -29,13 +26,13 @@
29 26
                 aria-expanded="true"
30 27
                 aria-controls="collapse1"
31 28
               >What is timeshare vacation ownership?</button>
32
-              <!-- </h5> -->
33 29
             </div>
34 30
             <div
35 31
               id="collapse1"
36 32
               class="collapse show color-text-a"
37 33
               aria-labelledby="heading1"
38 34
               data-parent="#accordion"
35
+              style="background-color:#E3E3E3"
39 36
             >
40 37
               <div class="card-body" style="text-align:left">
41 38
                 Owning a timeshare means you own a portion of time in a specific unit in a resort. Most commonly the
@@ -61,6 +58,7 @@
61 58
               class="collapse"
62 59
               aria-labelledby="heading2"
63 60
               data-parent="#accordion"
61
+              style="background-color:#E3E3E3"
64 62
             >
65 63
               <div class="card-body" style="text-align:left">
66 64
                 Most timeshare resorts are self-catering which means you have a ‘home away from home” holiday. You will
@@ -85,6 +83,7 @@
85 83
               class="collapse"
86 84
               aria-labelledby="heading3"
87 85
               data-parent="#accordion"
86
+              style="background-color:#E3E3E3"
88 87
             >
89 88
               <div class="card-body" style="text-align:left">
90 89
                 Should the needs or lifestyle change for the timeshare owner, he may decide to sell his week. As a proud
@@ -108,6 +107,7 @@
108 107
               class="collapse"
109 108
               aria-labelledby="heading4"
110 109
               data-parent="#accordion"
110
+              style="background-color:#E3E3E3"
111 111
             >
112 112
               <div class="card-body" style="text-align:left">
113 113
                 Uni-Vate Properties specialise in fixed weeks or flexi week timeshare but are qualified to sell and/or
@@ -130,6 +130,7 @@
130 130
               class="collapse"
131 131
               aria-labelledby="heading5"
132 132
               data-parent="#accordion"
133
+              style="background-color:#E3E3E3"
133 134
             >
134 135
               <div class="card-body" style="text-align:left">
135 136
                 You can complete the on-line details which you will find under the “To Sell” tab. There will be a listing
@@ -153,6 +154,7 @@
153 154
               class="collapse"
154 155
               aria-labelledby="heading6"
155 156
               data-parent="#accordion"
157
+              style="background-color:#E3E3E3"
156 158
             >
157 159
               <div class="card-body" style="text-align:left">
158 160
                 Timeshare is not an appreciating property investment but it is an investment into your vacation lifestyle.
@@ -177,6 +179,7 @@
177 179
               class="collapse"
178 180
               aria-labelledby="heading7"
179 181
               data-parent="#accordion"
182
+              style="background-color:#E3E3E3"
180 183
             >
181 184
               <div class="card-body" style="text-align:left">
182 185
                 Through Uni-Vate Properties your week will be marketed extensively to all of their available channels.
@@ -199,6 +202,7 @@
199 202
               class="collapse"
200 203
               aria-labelledby="heading8"
201 204
               data-parent="#accordion"
205
+              style="background-color:#E3E3E3"
202 206
             >
203 207
               <div class="card-body" style="text-align:left">
204 208
                 All available and verified weeks will be listed on the website for prospective buyers. Once you identify a
@@ -222,6 +226,7 @@
222 226
               class="collapse"
223 227
               aria-labelledby="heading9"
224 228
               data-parent="#accordion"
229
+              style="background-color:#E3E3E3"
225 230
             >
226 231
               <div class="card-body" style="text-align:left">
227 232
                 By law, your money will be held in a trust account while the transfer is being processed. This trust
@@ -244,6 +249,7 @@
244 249
               class="collapse"
245 250
               aria-labelledby="heading10"
246 251
               data-parent="#accordion"
252
+              style="background-color:#E3E3E3"
247 253
             >
248 254
               <div class="card-body" style="text-align:left">
249 255
                 Most definitely! Once the week has been transferred to you, you have a choice of membership with RCI
@@ -268,6 +274,7 @@
268 274
               class="collapse"
269 275
               aria-labelledby="heading"
270 276
               data-parent="#accordion"
277
+              style="background-color:#E3E3E3"
271 278
             >
272 279
               <div class="card-body" style="text-align:left">
273 280
                 Uni-Vate Properties (Pty) Ltd is affiliated to the Estate Agents Board (EAAB) as well as the Institute of
@@ -297,6 +304,7 @@
297 304
               class="collapse"
298 305
               aria-labelledby="heading12"
299 306
               data-parent="#accordion"
307
+              style="background-color:#E3E3E3"
300 308
             >
301 309
               <div class="card-body" style="text-align:left">
302 310
                 Both are equally viable. The difference is either the seller is the developer of a resort marketing
@@ -324,6 +332,7 @@
324 332
               class="collapse"
325 333
               aria-labelledby="heading13"
326 334
               data-parent="#accordion"
335
+              style="background-color:#E3E3E3"
327 336
             >
328 337
               <div class="card-body" style="text-align:left">
329 338
                 The selling price is always market related determined by five factors. Resort quality, season, sleeper
@@ -348,6 +357,7 @@
348 357
               class="collapse"
349 358
               aria-labelledby="heading14"
350 359
               data-parent="#accordion"
360
+              style="background-color:#E3E3E3"
351 361
             >
352 362
               <div class="card-body" style="text-align:left">
353 363
                 Levies are determined by the share block Board of Directors who are accountable to the shareholders. The

+ 28
- 0
src/components/timeshare/myWeeksPage.vue Целия файл

@@ -0,0 +1,28 @@
1
+<template>
2
+  <div>
3
+    <br />
4
+    <br />
5
+    <br />
6
+    <br />
7
+    <img
8
+      src="http://www.provision-sa.com:3000/Provision/UnivateProperties/src/branch/master/public/img/logos/UVProp.png"
9
+      height="200"
10
+      width="200"
11
+    />
12
+    {{getUser}}
13
+    <br />
14
+  </div>
15
+</template>
16
+<script>
17
+import { mapState } from 'vuex';
18
+import log from '../../assets/Log';
19
+
20
+export default {
21
+  computed: {
22
+    ...mapState('myWeeks', ['test']),
23
+    getUser() {
24
+      return log.getUser();
25
+    },
26
+  },
27
+};
28
+</script>

+ 76
- 0
src/components/timeshare/resort/resortImage.vue Целия файл

@@ -0,0 +1,76 @@
1
+<template>
2
+  <div class="outer">
3
+    <div id="mainImage">
4
+      <img class="img-fluid main-image" :src="imageX" alt="Resort Image" />
5
+    </div>
6
+    <div class="list-images">
7
+      <div class="scrolling-wrapper-flexbox row inner">
8
+        <div v-for="(image, i) in images" :key="i" :class="myClass">
9
+          <a @click="changeImage(i)">
10
+            <img class="small-image" :src="image" alt="Resort Image" />
11
+          </a>
12
+        </div>
13
+      </div>
14
+    </div>
15
+  </div>
16
+</template>
17
+
18
+<script>
19
+import { mapState } from 'vuex';
20
+
21
+export default {
22
+  props: {
23
+    images: [],
24
+  },
25
+  data() {
26
+    return {
27
+      largeImg: 0,
28
+    };
29
+  },
30
+  computed: {
31
+    myClass() {
32
+      if (this.images && this.images.length === 3) {
33
+        return 'col-md-4';
34
+      }
35
+      return 'col-md-3 nopadding';
36
+    },
37
+    imageX() {
38
+      return this.images[this.largeImg];
39
+    },
40
+    ...mapState('resort', ['resort', 'description', 'images', 'layout']),
41
+  },
42
+  methods: {
43
+    changeImage(number) {
44
+      this.largeImg = number;
45
+    },
46
+  },
47
+};
48
+</script>
49
+<style scoped>
50
+.outer {
51
+  background-color: #efefef;
52
+  padding: 10px;
53
+}
54
+.inner {
55
+  padding-left: 15px;
56
+  padding-right: 15px;
57
+}
58
+.main-image {
59
+  max-width: 80%;
60
+  max-height: 412px;
61
+}
62
+.list-images {
63
+  padding: 5px;
64
+  float: left;
65
+  border-top: 1px solid #dedede;
66
+  border-right: 1px solid #dedede;
67
+  border-bottom: 1px solid #dedede;
68
+  background-color: white;
69
+  width: 100%;
70
+  text-align: center;
71
+}
72
+.small-image {
73
+  width: 100%;
74
+  height: 125px;
75
+}
76
+</style>

+ 93
- 89
src/components/timeshare/resort/resortPage.vue Целия файл

@@ -1,38 +1,86 @@
1 1
 <template>
2 2
   <!-- eslint-disable max-len -->
3
-  <section>
4
-    <div class="container">
5
-      <br />
6
-      <br />
7
-      <br />
8
-      <br />
3
+  <section class="my-top">
4
+    <div class="my-container">
9 5
       <div class="row">
10 6
         <div class="col-md-12 col-lg-8">
11 7
           <div class="title-box-d">
12
-            <h1 class="title-d" style="text-align:left; font-size: 250%">{{resort.prName}}</h1>
8
+            <h1 class="title-d my-title">{{resort.prName}}</h1>
13 9
           </div>
14 10
           <br />
15 11
         </div>
16
-        <div class="row mb-4">
17
-          <div class="col-md-4">
18
-            <img class="img-fluid" :src="image1" alt="Resort Image" style="border-radius:10px" />
19
-          </div>
20
-          <div class="col-md-4">
21
-            <img class="img-fluid" :src="image2" alt="Resort Image" style="border-radius:10px" />
22
-          </div>
23
-          <div class="col-md-4">
24
-            <img class="img-fluid" :src="image3" alt="Resort Image" style="border-radius:10px" />
12
+        <div class="col-md-6 col-lg-6">
13
+          <ResortImages :images="images" />
14
+        </div>
15
+        <div class="col-md-6">
16
+          <ul class="nav nav-tabs" id="myTab" role="tablist">
17
+            <li class="nav-item">
18
+              <a
19
+                class="nav-link active"
20
+                id="directions-tab"
21
+                data-toggle="tab"
22
+                href="#directions"
23
+                role="tab"
24
+                aria-controls="directions"
25
+                aria-selected="false"
26
+              >Directions</a>
27
+            </li>
28
+            <li class="nav-item">
29
+              <a
30
+                class="nav-link"
31
+                id="resort-layout-tab"
32
+                data-toggle="tab"
33
+                href="#resort-layout"
34
+                role="tab"
35
+                aria-controls="resort-layout"
36
+                aria-selected="true"
37
+              >Resort Layout</a>
38
+            </li>
39
+          </ul>
40
+          <div class="tab-content" id="myTabContent">
41
+            <div
42
+              class="tab-pane fade show active"
43
+              id="directions"
44
+              role="tabpanel"
45
+              aria-labelledby="directions-tab"
46
+            >
47
+              <iframe
48
+                :src="mapUrl"
49
+                width="100%"
50
+                height="300"
51
+                frameborder="0"
52
+                style="border:0"
53
+                allowfullscreen
54
+              ></iframe>
55
+              <br />
56
+              <small>
57
+                <a
58
+                  :href="mapUrl"
59
+                  style="color:#60CBEB;text-align:left"
60
+                  target="_blank"
61
+                >See map bigger</a>
62
+              </small>
63
+            </div>
64
+            <div
65
+              class="tab-pane fade"
66
+              id="resort-layout"
67
+              role="tabpanel"
68
+              aria-labelledby="resort-layout-tab"
69
+            >
70
+              <img class="img-fluid" :src="layout" alt="Resort Layout" />
71
+            </div>
25 72
           </div>
26 73
         </div>
27 74
       </div>
28 75
     </div>
76
+    <hr />
29 77
     <div class="myMargin">
30 78
       <div class="row">
31
-        <div class="col-md-3">
79
+        <div class="col-md-4">
32 80
           <h4>Filter Resort</h4>
33 81
           <FilterComponent :hideTop="true" />
34 82
         </div>
35
-        <div class="col-md-9">
83
+        <div class="col-md-8">
36 84
           <WeekList :resortCode="resortCode" />
37 85
           <div>
38 86
             <div class="btn btn-b-n" @click="routerGoTo('/timeshare/buy')">Back to Region</div>
@@ -40,68 +88,6 @@
40 88
           </div>
41 89
           {{description}}
42 90
           <hr />
43
-          <div class="row">
44
-            <div class="col-md-10 mb-4">
45
-              <ul class="nav nav-tabs" id="myTab" role="tablist">
46
-                <li class="nav-item">
47
-                  <a
48
-                    class="nav-link active"
49
-                    id="directions-tab"
50
-                    data-toggle="tab"
51
-                    href="#directions"
52
-                    role="tab"
53
-                    aria-controls="directions"
54
-                    aria-selected="false"
55
-                  >Directions</a>
56
-                </li>
57
-                <li class="nav-item">
58
-                  <a
59
-                    class="nav-link"
60
-                    id="resort-layout-tab"
61
-                    data-toggle="tab"
62
-                    href="#resort-layout"
63
-                    role="tab"
64
-                    aria-controls="resort-layout"
65
-                    aria-selected="true"
66
-                  >Resort Layout</a>
67
-                </li>
68
-              </ul>
69
-              <div class="tab-content" id="myTabContent">
70
-                <div
71
-                  class="tab-pane fade show active"
72
-                  id="directions"
73
-                  role="tabpanel"
74
-                  aria-labelledby="directions-tab"
75
-                >
76
-                  <iframe
77
-                    :src="mapUrl"
78
-                    width="100%"
79
-                    height="450"
80
-                    frameborder="0"
81
-                    style="border:0"
82
-                    allowfullscreen
83
-                  ></iframe>
84
-                  <br />
85
-
86
-                  <small>
87
-                    <a
88
-                      :href="mapUrl"
89
-                      style="color:#60CBEB;text-align:left"
90
-                      target="_blank"
91
-                    >See map bigger</a>
92
-                  </small>
93
-                </div>
94
-                <div
95
-                  class="tab-pane fade"
96
-                  id="resort-layout"
97
-                  role="tabpanel"
98
-                  aria-labelledby="resort-layout-tab"
99
-                >
100
-                  <img class="img-fluid" :src="layout" alt="Resort Layout" />
101
-                </div>
102
-              </div>
103
-            </div>
104
-          </div>
105 91
         </div>
106 92
       </div>
107 93
     </div>
@@ -111,6 +97,7 @@
111 97
 import { mapState, mapActions } from 'vuex';
112 98
 import WeekList from '../buy/weekListComponent.vue';
113 99
 import FilterComponent from '../searchTimeshare.vue';
100
+import ResortImages from './resortImage.vue';
114 101
 
115 102
 export default {
116 103
   props: {
@@ -119,19 +106,13 @@ export default {
119 106
   components: {
120 107
     WeekList,
121 108
     FilterComponent,
109
+    ResortImages,
122 110
   },
123 111
   mounted() {
124 112
     this.initResort(this.resortCode);
125 113
   },
126 114
   computed: {
127
-    ...mapState('resort', [
128
-      'resort',
129
-      'description',
130
-      'image1',
131
-      'image2',
132
-      'image3',
133
-      'layout',
134
-    ]),
115
+    ...mapState('resort', ['resort', 'description', 'images', 'layout']),
135 116
     mapUrl() {
136 117
       return this.resort
137 118
         ? `http://maps.google.com/maps?q=${this.resort.prLatitude},${this.resort.prLongitude}&z=15&output=embed`
@@ -146,7 +127,30 @@ export default {
146 127
   },
147 128
 };
148 129
 </script>
149
-<style>
130
+<style scoped>
131
+.my-top {
132
+  padding-top: 25px;
133
+}
134
+.my-container {
135
+  padding-left: 200px;
136
+  padding-right: 200px;
137
+}
138
+.my-title {
139
+  text-align: left;
140
+  font-size: 250%;
141
+}
142
+.scrolling-wrapper-flexbox {
143
+  display: flex;
144
+  flex-wrap: nowrap;
145
+  overflow-x: auto;
146
+}
147
+.scrolling-wrapper-flexbox .card {
148
+  flex: 0 0 auto;
149
+}
150
+.nopadding {
151
+  padding: 1px !important;
152
+  margin: 0 !important;
153
+}
150 154
 .myMargin {
151 155
   margin-left: 2%;
152 156
   margin-right: 2%;

+ 151
- 146
src/components/timeshare/resort/unitPage.vue Целия файл

@@ -1,167 +1,156 @@
1 1
 <template>
2 2
   <!-- eslint-disable max-len -->
3
-  <div class="container">
3
+  <div class="my-container my-top">
4 4
     <div class="row">
5 5
       <div class="col-md-12 col-lg-8">
6 6
         <div class="title-box-d">
7
-          <h1
8
-            class="title-d"
9
-            style="text-align:left; font-size: 250%"
10
-          >{{week ? week.resortName : ''}}</h1>
7
+          <h1 class="title-d my-title">{{week ? week.resortName : ''}}</h1>
11 8
         </div>
12 9
         <br />
13 10
       </div>
14 11
       <div class="row mb-4">
15
-        <div class="col-md-4">
16
-          <img class="img-fluid" :src="image1" alt="Resort Image" style="border-radius:10px" />
17
-        </div>
18
-        <div class="col-md-4">
19
-          <img class="img-fluid" :src="image2" alt="Resort Image" style="border-radius:10px" />
20
-        </div>
21
-        <div class="col-md-4">
22
-          <img class="img-fluid" :src="image3" alt="Resort Image" style="border-radius:10px" />
23
-        </div>
24
-      </div>
25
-    </div>
26
-    <br />
27
-    <div class="container col-md-12" style="text-align:left;">
28
-      <div class="row">
29 12
         <div class="col-md-6">
30
-          <div class="title-box-d">
31
-            <h3 class="title-d">Property Description</h3>
32
-          </div>
33
-          <p>{{description}}</p>
34
-          <div>
35
-            <div class="title-box-d">
36
-              <h3 class="title-d">Facilities</h3>
37
-            </div>
38
-            <div class="row" v-if="resort.prUnitFacilities">
39
-              <div
40
-                class="col-md-4"
41
-                v-for="(item, i) in resort.prUnitFacilities.split('\n')"
42
-                :key="i"
43
-              >{{item}}</div>
44
-            </div>
45
-          </div>
13
+          <ResortImages :images="images" />
46 14
         </div>
47
-        <div class="col-md-6" v-if="week">
48
-          <form
49
-            id="mainForm"
50
-            method="POST"
51
-            action="/interested-timeshare/"
52
-            accept-charset="UTF-8"
53
-            enctype="multipart/form-data"
54
-          >
55
-            <div class="title-box-d">
56
-              <h3 class="title-d">Summary</h3>
57
-            </div>
58
-            <div class="form-row">
59
-              <div class="col-md-6">
60
-                <label for="resortunit">Unit</label>
61
-                <div class="input-group mb-3">
62
-                  <div class="input-group-prepend">
63
-                    <span class="input-group-text" style="color: #60CBEB">
64
-                      <b>U#</b>
65
-                    </span>
15
+        <div class="col-md-6">
16
+          <hr />
17
+          <div v-if="week">
18
+            <form
19
+              id="mainForm"
20
+              method="POST"
21
+              action="/interested-timeshare/"
22
+              accept-charset="UTF-8"
23
+              enctype="multipart/form-data"
24
+            >
25
+              <div class="title-box-d">
26
+                <h3 class="title-d">Summary</h3>
27
+              </div>
28
+              <div class="form-row">
29
+                <div class="col-md-6">
30
+                  <label for="resortunit">Unit</label>
31
+                  <div class="input-group mb-3">
32
+                    <div class="input-group-prepend">
33
+                      <span class="input-group-text" style="color: #60CBEB">
34
+                        <b>U#</b>
35
+                      </span>
36
+                    </div>
37
+                    <input
38
+                      class="form-control"
39
+                      type="text"
40
+                      id="resort"
41
+                      name="resortunit"
42
+                      :value="week ? week.unitNumber : ''"
43
+                      disabled
44
+                    />
66 45
                   </div>
67
-                  <input
68
-                    class="form-control"
69
-                    type="text"
70
-                    id="resort"
71
-                    name="resortunit"
72
-                    :value="week ? week.unitNumber : ''"
73
-                    disabled
74
-                  />
75 46
                 </div>
76
-              </div>
77
-              <div class="col-md-6">
78
-                <label for="resortWeek">Module / Week Number</label>
79
-                <div class="input-group mb-3">
80
-                  <div class="input-group-prepend">
81
-                    <span class="input-group-text" style="color: #60CBEB">
82
-                      <b>M</b>
83
-                    </span>
47
+                <div class="col-md-6">
48
+                  <label for="resortWeek">Module / Week Number</label>
49
+                  <div class="input-group mb-3">
50
+                    <div class="input-group-prepend">
51
+                      <span class="input-group-text" style="color: #60CBEB">
52
+                        <b>M</b>
53
+                      </span>
54
+                    </div>
55
+                    <input
56
+                      class="form-control"
57
+                      type="text"
58
+                      id="week"
59
+                      name="resortWeek"
60
+                      :value="week ? week.weekNumber : ''"
61
+                      disabled
62
+                    />
84 63
                   </div>
85
-                  <input
86
-                    class="form-control"
87
-                    type="text"
88
-                    id="week"
89
-                    name="resortWeek"
90
-                    :value="week ? week.weekNumber : ''"
91
-                    disabled
92
-                  />
93 64
                 </div>
94
-              </div>
95 65
 
96
-              <div class="col-md-6">
97
-                <label for="resortModule">Current Year Levy</label>
98
-                <div class="input-group mb-3">
99
-                  <div class="input-group-prepend">
100
-                    <span class="input-group-text" style="color: #60CBEB">
101
-                      <b>R</b>
102
-                    </span>
66
+                <div class="col-md-6">
67
+                  <label for="resortModule">Current Year Levy</label>
68
+                  <div class="input-group mb-3">
69
+                    <div class="input-group-prepend">
70
+                      <span class="input-group-text" style="color: #60CBEB">
71
+                        <b>R</b>
72
+                      </span>
73
+                    </div>
74
+                    <input
75
+                      class="form-control"
76
+                      type="text"
77
+                      id="levy"
78
+                      name="levy"
79
+                      :value="formatPrice(week ? week.levyAmount : 0)"
80
+                      disabled
81
+                    />
103 82
                   </div>
104
-                  <input
105
-                    class="form-control"
106
-                    type="text"
107
-                    id="levy"
108
-                    name="levy"
109
-                    :value="formatPrice(week ? week.levyAmount : 0)"
110
-                    disabled
111
-                  />
112 83
                 </div>
113
-              </div>
114
-              <div class="col-md-6">
115
-                <label for="price">Price</label>
116
-                <div class="property-price d-flex">
117
-                  <!-- <div class="card-header-c d-flex"> -->
118
-                  <div style="width: 260px; height: 70px; border-style: solid; color: #60CBEB;">
119
-                    <!-- <div class="card-title-c align-self-center"> -->
120
-                    <a class="justify-content-center" style="color: black; font-size: 250%">
121
-                      <b>R{{ formatPrice(week ? week.sellPrice : 0) }}</b>
122
-                    </a>
123
-                    <!-- </div> -->
84
+                <div class="col-md-6">
85
+                  <label for="price">Price</label>
86
+                  <div class="property-price d-flex">
87
+                    <div class="price-border">
88
+                      <div class="price-label">
89
+                        <b>R {{ formatPrice(week ? week.sellPrice : 0) }}</b>
90
+                      </div>
91
+                    </div>
124 92
                   </div>
125
-                  <!-- </div> -->
126 93
                 </div>
127 94
               </div>
128
-            </div>
129
-            <br />
130
-          </form>
131
-          <br />
132
-
133
-          <!-- <a
134
-              class="btn btn-b-n even-width mr-auto"
135
-              href="/share-transfer-initiation-for-purchaser/"
136
-          >Make an Offer</a>-->
137
-          <button
138
-            type="button"
139
-            class="btn btn-b-n even-width mr-auto"
140
-            data-toggle="modal"
141
-            data-target="#myModal"
142
-          >Make an Offer</button>
143
-          <div class="col-md-12">
144
-            <div id="myModal" class="modal fade" role="dialog">
145
-              <div class="modal-dialog modal-lg">
146
-                <!-- Modal content-->
147
-                <div class="modal-content">
148
-                  <div class="modal-header">
149
-                    <button type="button" class="close" data-dismiss="modal">&times;</button>
150
-                  </div>
151
-                  <div padding-left="20px">
152
-                    <makeOffer
153
-                      name="MakeOffer"
154
-                      :isMakeOffer="true"
155
-                      :isProperty="false"
156
-                      :item="week"
157
-                    />
95
+            </form>
96
+            <hr />
97
+            <div class="d-flex justify-content-between">
98
+              <div class="p-1">
99
+                <a class="btn btn-b-c even-width mr-auto" href="javascript:history.back()">Back</a>
100
+              </div>
101
+              <div class="p-1">
102
+                <button
103
+                  type="button"
104
+                  class="btn btn-lg btn-b-n even-width mr-auto"
105
+                  data-toggle="modal"
106
+                  data-target="#myModal"
107
+                >Make an Offer</button>
108
+                <div class="col-md-12">
109
+                  <div id="myModal" class="modal fade" role="dialog">
110
+                    <div class="modal-dialog modal-lg">
111
+                      <!-- Modal content-->
112
+                      <div class="modal-content">
113
+                        <div class="modal-header">
114
+                          <button type="button" class="close" data-dismiss="modal">&times;</button>
115
+                        </div>
116
+                        <div padding-left="20px">
117
+                          <makeOffer
118
+                            name="MakeOffer"
119
+                            :isMakeOffer="true"
120
+                            :isProperty="false"
121
+                            :item="week"
122
+                          />
123
+                        </div>
124
+                      </div>
125
+                    </div>
158 126
                   </div>
159 127
                 </div>
160 128
               </div>
161 129
             </div>
130
+            <hr />
162 131
           </div>
163
-
164
-          <a class="btn btn-b-c even-width mr-auto" href="javascript:history.back()">Back</a>
132
+        </div>
133
+        <hr />
134
+        <div class="col-md-12">
135
+          <hr />
136
+        </div>
137
+        <div class="col-md-6">
138
+          <div class="title-box-d">
139
+            <h3 class="title-d">Facilities</h3>
140
+          </div>
141
+          <div class="row" v-if="resort.prUnitFacilities">
142
+            <div
143
+              class="col-md-4"
144
+              v-for="(item, i) in resort.prUnitFacilities.split('\n')"
145
+              :key="i"
146
+            >{{item}}</div>
147
+          </div>
148
+        </div>
149
+        <div class="col-md-6">
150
+          <div class="title-box-d">
151
+            <h3 class="title-d">Property Description</h3>
152
+          </div>
153
+          <p>{{description}}</p>
165 154
         </div>
166 155
       </div>
167 156
     </div>
@@ -171,11 +160,13 @@
171 160
 <script>
172 161
 import { mapState, mapActions } from 'vuex';
173 162
 import makeOffer from '../../processFlow/makeOffer.vue';
163
+import ResortImages from './resortImage.vue';
174 164
 
175 165
 export default {
176 166
   name: 'unit',
177 167
   components: {
178 168
     makeOffer,
169
+    ResortImages,
179 170
   },
180 171
   props: {
181 172
     resortCode: {},
@@ -186,13 +177,7 @@ export default {
186 177
     this.initWeek(this.weekId);
187 178
   },
188 179
   computed: {
189
-    ...mapState('resort', [
190
-      'resort',
191
-      'description',
192
-      'image1',
193
-      'image2',
194
-      'image3',
195
-    ]),
180
+    ...mapState('resort', ['resort', 'description', 'images']),
196 181
     ...mapState('week', ['week']),
197 182
   },
198 183
   methods: {
@@ -209,14 +194,34 @@ export default {
209 194
 };
210 195
 </script>
211 196
 <style scoped>
197
+.my-top {
198
+  padding-top: 25px;
199
+}
200
+.my-container {
201
+  padding-left: 15%;
202
+  padding-right: 15%;
203
+}
204
+.my-title {
205
+  text-align: left;
206
+  font-size: 250%;
207
+}
212 208
 .btn.btn-b-c {
213 209
   background-color: #ffffff;
214 210
   color: #60cbeb;
215 211
   border-radius: 0;
216 212
 }
217
-
218 213
 .btn.btn-b-c:hover {
219 214
   background-color: #089bf0;
220 215
   color: #ffffff;
221 216
 }
217
+.price-border {
218
+  background-color: #a9e0ff;
219
+  width: 100%;
220
+  border: solid #60cbeb medium;
221
+  padding: 0px 20px;
222
+}
223
+.price-label {
224
+  color: black;
225
+  font-size: 225%;
226
+}
222 227
 </style>

+ 16
- 17
src/components/timeshare/searchTimeshare.vue Целия файл

@@ -11,15 +11,15 @@
11 11
         <label>Province</label>
12 12
         <div class="input-group mb-3">
13 13
           <div class="input-group-prepend">
14
-            <span class="input-group-text" style="color: #60CBEB">
15
-              <b>P</b>
14
+            <span class="input-group-text myFill">
15
+              <i class="fa fa-map"></i>
16 16
             </span>
17 17
           </div>
18 18
           <select class="form-control" name="region" id="region" v-model="filter.region">
19 19
             <option v-for="(item, i) in regions" :key="i" :value="item">{{item.regionName}}</option>
20 20
           </select>
21 21
           <div class="input-group-append" @click="clearFilter('region')">
22
-            <span class="input-group-text cursor-pointer" style="color: #60CBEB">
22
+            <span class="input-group-text cursor-pointer myFill">
23 23
               <b>X</b>
24 24
             </span>
25 25
           </div>
@@ -29,7 +29,7 @@
29 29
         <label>Resort Name</label>
30 30
         <div class="input-group mb-3">
31 31
           <div class="input-group-prepend">
32
-            <span class="input-group-text" style="color: #60CBEB">
32
+            <span class="input-group-text myFill" style="font-size:75%;">
33 33
               <b>RN</b>
34 34
             </span>
35 35
           </div>
@@ -37,7 +37,7 @@
37 37
             <option v-for="(item, i) in filteredResorts" :key="i" :value="item">{{item.resortName}}</option>
38 38
           </select>
39 39
           <div class="input-group-append" @click="clearFilter('resort')">
40
-            <span class="input-group-text cursor-pointer" style="color: #60CBEB">
40
+            <span class="input-group-text cursor-pointer myFill">
41 41
               <b>X</b>
42 42
             </span>
43 43
           </div>
@@ -47,45 +47,43 @@
47 47
         <label>Bedrooms</label>
48 48
         <div class="input-group mb-3">
49 49
           <div class="input-group-prepend">
50
-            <span class="input-group-text" style="color: #60CBEB">
51
-              <b>Bed</b>
50
+            <span class="input-group-text myFill">
51
+              <i class="fa fa-bed"></i>
52 52
             </span>
53 53
           </div>
54 54
           <select class="form-control" name="bedrooms" v-model="filter.bedrooms">
55 55
             <option v-for="(item, i) in resortBedrooms" :key="i">{{item}}</option>
56 56
           </select>
57 57
           <div class="input-group-append" @click="clearFilter('bedrooms')">
58
-            <span class="input-group-text cursor-pointer" style="color: #60CBEB">
58
+            <span class="input-group-text cursor-pointer myFill">
59 59
               <b>X</b>
60 60
             </span>
61 61
           </div>
62 62
         </div>
63 63
       </div>
64
-      <hr />
65 64
       <div class="form-group text-left">
66 65
         <label>Date</label>
67 66
         <div class="input-group mb-3">
68 67
           <div class="input-group-prepend">
69
-            <span class="input-group-text" style="color: #60CBEB">
70
-              <b>D</b>
68
+            <span class="input-group-text myFill">
69
+              <i class="fa fa-calendar"></i>
71 70
             </span>
72 71
           </div>
73 72
           <input type="date" class="form-control" name="arrivaldate" v-model="filter.date" />
74 73
           <div class="input-group-append" @click="clearFilter('date')">
75
-            <span class="input-group-text cursor-pointer" style="color: #60CBEB">
74
+            <span class="input-group-text cursor-pointer myFill">
76 75
               <b>X</b>
77 76
             </span>
78 77
           </div>
79 78
         </div>
80 79
       </div>
81
-      <hr />
82 80
       <div class="form-group">
83 81
         <div class="row">
84 82
           <div class="col-md-6 text-left">
85 83
             <label>Minimum Price</label>
86 84
             <div class="input-group mb-3">
87 85
               <div class="input-group-prepend">
88
-                <span class="input-group-text" style="color: #60CBEB">
86
+                <span class="input-group-text myFill">
89 87
                   <b>R</b>
90 88
                 </span>
91 89
               </div>
@@ -95,11 +93,11 @@
95 93
                 step="any"
96 94
                 id="minPrice"
97 95
                 name="minPrice"
98
-                placeholder="Minimum Price"
96
+                placeholder="Min"
99 97
                 v-model="filter.minPrice"
100 98
               />
101 99
               <div class="input-group-append" @click="clearFilter('minPrice')">
102
-                <span class="input-group-text cursor-pointer" style="color: #60CBEB">
100
+                <span class="input-group-text cursor-pointer myFill">
103 101
                   <b>X</b>
104 102
                 </span>
105 103
               </div>
@@ -119,7 +117,7 @@
119 117
                 step="any"
120 118
                 id="maxPrice"
121 119
                 name="maxPrice"
122
-                placeholder="Maximum Price"
120
+                placeholder="Max"
123 121
                 v-model="filter.maxPrice"
124 122
               />
125 123
               <div class="input-group-append" @click="clearFilter('maxPrice')">
@@ -142,6 +140,7 @@ import _ from 'lodash';
142 140
 export default {
143 141
   props: {
144 142
     hideTop: undefined,
143
+    keyword: undefined,
145 144
   },
146 145
   created() {
147 146
     this.initTimeshare();

+ 9
- 9
src/components/timeshare/sell/sellPage.vue Целия файл

@@ -5,14 +5,9 @@
5 5
       <div class="col-md-12">
6 6
         <div class="col-sm-12">
7 7
           <div class="about-img-box">
8
-            <img
9
-              src="img/sell3.jpg"
10
-              alt="Timeshare To Sell"
11
-              class="img-fluid"
12
-              style="width:800px;height:400px; border-radius:10px"
13
-            />
8
+            <img src="img/sell3.jpg" alt="Timeshare To Sell" class="img-fluid title-img" />
14 9
           </div>
15
-          <div class="sinse-box" style="opacity:0.7; border: white solid 3px; border-radius: 15px">
10
+          <div class="sinse-box title-title">
16 11
             <h3 class="sinse-title">Timeshare To Sell</h3>
17 12
           </div>
18 13
         </div>
@@ -494,8 +489,13 @@
494 489
           <br />
495 490
           <br />
496 491
           <p style="text-align:center;">
497
-            To rent your week out
498
-            <a href="https://www.tradeunipoint.com/" target="_blank">click here</a>
492
+            <strong>
493
+              To rent your week out
494
+              <a
495
+                href="https://www.tradeunipoint.com/"
496
+                target="_blank"
497
+              >click here</a>
498
+            </strong>
499 499
           </p>
500 500
         </form>
501 501
       </div>

+ 43
- 44
src/components/user/loginPage.vue Целия файл

@@ -3,18 +3,28 @@
3 3
     <!-- eslint-disable max-len -->
4 4
     <div class="login-page">
5 5
       <form id="signIn">
6
-        <div class="form">
6
+        <div class="form col-md-12">
7 7
           <div>
8 8
             <h4>Login</h4>
9
-            <br />
10 9
           </div>
11
-          <!--<alert :text="'Login successful'" :type="'SUCCESS'" />
12
-          <alert :text="'User does not exist, please register'" :type="'ERROR'" />
13
-          <alert :text="'Username is incorrect'" :type="'WARNING'" />
14
-          <alert :text="'Password is incorrect'" :type="'WARNING'" />
15
-          <alert :text="'Caps Lock is on'" :type="'INFO'" />-->
10
+          <button
11
+            @click="routerGoTo('/user/register')"
12
+            class="btn"
13
+            style="margin:2px; color: #60CBEB"
14
+          >Register</button>
15
+          <button
16
+            @click="routerGoTo('/user/registeragency')"
17
+            class="btn"
18
+            style="margin:2px; color: #60CBEB"
19
+          >Agency Registration</button>
20
+          <div v-if="this.$store.state.authentication.status === 'error'">
21
+            <alert
22
+              :text="'User doesn\'t exist or Username and Password is incorrect'"
23
+              :type="'ERROR'"
24
+            />
25
+          </div>
16 26
           <div class="row">
17
-            <div class="col-md-11" style="margin-bottom: 1em">
27
+            <div class="col-md-12" style="margin-bottom: 1em">
18 28
               <div class="input-group mb-3">
19 29
                 <div class="input-group-prepend">
20 30
                   <span class="input-group-text">
@@ -59,29 +69,16 @@
59 69
               </div>
60 70
             </div>
61 71
           </div>
62
-          <div class="form-group row"></div>
63 72
           <button @click="Login()" class="btn btn-b-n" type="submit">Sign In</button>
64
-          <p v-if="user !== null">{{ user }}</p>
65 73
           <hr />
66
-          <button
67
-            @click="routerGoTo('/user/register')"
68
-            class="btn"
69
-            style="margin:2px"
70
-            type="button"
71
-          >Registration</button>
72
-          <button
73
-            @click="routerGoTo('/user/registeragency')"
74
-            class="btn"
75
-            style="margin:2px"
76
-          >Agency Registration</button>
77
-        </div>
78
-      </form>
79
-
80
-      <form id="forgot">
81
-        <div class="form">
82
-          <h5>Trouble signing in?</h5>
83
-          <div>
84
-            <!--<alert :text="'Username & password request email sent'" :type="'SUCCESS'" />-->
74
+          <div
75
+            @click="ToggleTrouble()"
76
+            class="btn cursor: pointer;"
77
+            style="margin:2px; color: #60CBEB; font-size:110%;"
78
+          >Trouble signing in?</div>
79
+          <br />
80
+          <div v-if="troubleToggle">
81
+            <!-- <alert :text="'Username & password request email sent'" :type="'SUCCESS'" /> -->
85 82
             <div class="row">
86 83
               <div class="input-group-prepend">
87 84
                 <span class="input-group-text">
@@ -90,10 +87,8 @@
90 87
                 <input class="form-control" placeholder="Your Email" type="text" name="email" value />
91 88
               </div>
92 89
             </div>
93
-          </div>
94
-          <div class="form-group row"></div>
95
-          <div class="offset-md-3 col-md-5">
96
-            <button @click="SendMail()" class="btn btn-b-n" type="submit">Get Help</button>
90
+            <br />
91
+            <button @click="SendMail()" class="btn btn-b-n" type="submit">Submit</button>
97 92
           </div>
98 93
         </div>
99 94
       </form>
@@ -103,17 +98,15 @@
103 98
 
104 99
 <script>
105 100
 import { mapActions, mapState } from 'vuex';
106
-// import alert from '../shared/alert.vue';
101
+import alert from '../shared/alert.vue';
107 102
 
108 103
 export default {
109 104
   name: 'Login',
110 105
   components: {
111
-    // alert,
106
+    alert,
112 107
   },
113 108
   data() {
114 109
     return {
115
-      username: '',
116
-      user: null,
117 110
       isPasswordShown: 'password',
118 111
       selectItems: [{ text: 'password', value: 0 }],
119 112
       selectErrors: 'Some error with the field',
@@ -121,20 +114,26 @@ export default {
121 114
       textErrors: 'Some error with the field',
122 115
       text: '',
123 116
       showPassword: false,
124
-      password: '',
125 117
       email: '',
118
+      troubleToggle: false,
126 119
     };
127 120
   },
128 121
   computed: {
129
-    ...mapState('authentication', ['token', 'status']),
122
+    ...mapState('authentication', ['token', 'status', 'username', 'password']),
130 123
   },
131 124
   methods: {
132
-    ...mapActions('authentication', ['login']),
125
+    ...mapActions('authentication', ['login', 'init']),
126
+    ToggleTrouble() {
127
+      if (this.troubleToggle) {
128
+        this.troubleToggle = false;
129
+      } else this.troubleToggle = true;
130
+    },
133 131
     Login() {
134
-      this.login({ username: this.username, password: this.password })
135
-        .then(() => this.router.push('/'))
136
-        .catch(err => console.log(err));
137
-      this.$router.push('/about/us');
132
+      this.login().then(() => {
133
+        if (this.$store.state.authentication.status === 'error') {
134
+          this.$router.push('/user/login');
135
+        }
136
+      });
138 137
     },
139 138
     togglePassword() {
140 139
       this.showPassword = true;

+ 6
- 0
src/router/index.js Целия файл

@@ -8,6 +8,7 @@ import TimeshareBuy from '../components/timeshare/buy/buyPage.vue';
8 8
 import TimeshareSell from '../components/timeshare/sell/sellPage.vue';
9 9
 import TimeshareFAQ from '../components/timeshare/faqPage.vue';
10 10
 import TimeshareSearch from '../components/timeshare/buy/weekListPage.vue';
11
+import MyWeeksPage from '../components/timeshare/myWeeksPage.vue';
11 12
 
12 13
 import Login from '../components/user/loginPage.vue';
13 14
 import PrivateIndividual from '../components/user/registerPage.vue';
@@ -83,6 +84,11 @@ export default new Router({
83 84
       name: 'TimeshareFAQ',
84 85
       component: TimeshareFAQ,
85 86
     },
87
+    {
88
+      path: '/timeshare/myWeeks',
89
+      name: 'MyWeeks',
90
+      component: MyWeeksPage,
91
+    },
86 92
     {
87 93
       path: '/user/login',
88 94
       name: 'Login',

+ 2
- 0
src/store/index.js Целия файл

@@ -15,6 +15,7 @@ import PropertyList from './modules/property/propertyLists';
15 15
 import PropertyTypes from './modules/property/propertyTypes';
16 16
 import Register from './modules/user/register';
17 17
 import WeekList from './modules/timeshare/weekList';
18
+import MyWeeks from './modules/timeshare/myWeeks';
18 19
 import Bid from './modules/processFlow/bid';
19 20
 import Authentication from './modules/user/authentication';
20 21
 import PropertySearch from './modules/property/propertySearch';
@@ -24,6 +25,7 @@ Vue.use(Vuex);
24 25
 /* eslint no-param-reassign: ["error", { "props": false }] */
25 26
 export default new Vuex.Store({
26 27
   modules: {
28
+    myWeeks: MyWeeks,
27 29
     timeshare: TimeshareModule,
28 30
     users: UsersModule,
29 31
     status: StatusModule,

+ 55
- 0
src/store/modules/timeshare/buyPage.js Целия файл

@@ -9,9 +9,16 @@ export default {
9 9
   state: {
10 10
     regions: [],
11 11
     detailedRegion: [],
12
+    availRegion: [],
12 13
     resort: {},
13 14
   },
14 15
   mutations: {
16
+    clearAvail(state, avail) {
17
+      state.availRegion = [];
18
+    },
19
+    addAvail(state, avail) {
20
+      state.availRegion.push(avail);
21
+    },
15 22
     setRegions(state, regions) {
16 23
       state.regions = regions;
17 24
     },
@@ -27,6 +34,54 @@ export default {
27 34
   },
28 35
   getters: {},
29 36
   actions: {
37
+    init({
38
+      commit,
39
+      dispatch,
40
+    }) {
41
+      commit('clearAvail');
42
+      dispatch('getAvail');
43
+      dispatch('getRegions');
44
+    },
45
+    getAvail({
46
+      commit,
47
+    }) {
48
+      axios.get('/api/timeshareweek/getAvailResort').then((r) => {
49
+        for (const reg in r.data) {
50
+          const newRegion = {};
51
+          newRegion.regionCode = r.data[reg].regionCode;
52
+          newRegion.regionName = r.data[reg].regionName;
53
+          newRegion.available = r.data[reg].available;
54
+          newRegion.resorts = [];
55
+          for (const res in r.data[reg].resorts) {
56
+            const newResort = {
57
+              resortCode: '',
58
+              resortName: '',
59
+              lat: 0,
60
+              long: 0,
61
+            };
62
+            newResort.resortCode = r.data[reg].resorts[res].resortCode;
63
+            newResort.resortName = r.data[reg].resorts[res].resortName;
64
+            newResort.available = r.data[reg].resorts[res].available;
65
+            if (r.data[reg].resorts[res]) {
66
+              axios.get(
67
+                `https://www.tradeunipoint.com/unibackend/seam/resource/rest/products/TRESORT/${
68
+                  r.data[reg].resorts[res].resortCode}`,
69
+              )
70
+                .then((result) => {
71
+                  newResort.lat = result.data.prLatitude;
72
+                  newResort.long = result.data.prLongitude;
73
+                })
74
+                .catch(console.error);
75
+            }
76
+            newRegion.resorts.push(newResort);
77
+          }
78
+          commit('addAvail', newRegion);
79
+        }
80
+      }).catch(
81
+        console
82
+          .error,
83
+      );
84
+    },
30 85
     getRegions({
31 86
       commit,
32 87
       dispatch,

+ 10
- 0
src/store/modules/timeshare/myWeeks.js Целия файл

@@ -0,0 +1,10 @@
1
+export default {
2
+  namespaced: true,
3
+  state: {
4
+    test: 'kobus',
5
+    items: [],
6
+  },
7
+  mutations: {},
8
+  getters: {},
9
+  actions: {},
10
+};

+ 47
- 33
src/store/modules/timeshare/resort.js Целия файл

@@ -6,9 +6,7 @@ export default {
6 6
   namespaced: true,
7 7
   state: {
8 8
     resort: {},
9
-    image1: '',
10
-    image2: '',
11
-    image3: '',
9
+    images: [],
12 10
     layout: '',
13 11
     description: '',
14 12
   },
@@ -19,22 +17,14 @@ export default {
19 17
     setDescription(state, description) {
20 18
       state.description = description;
21 19
     },
20
+    addImage(state, image) {
21
+      state.images.push(`data:image/jpeg;base64,${image}`);
22
+    },
22 23
     clear(state) {
23 24
       state.resort = {};
24
-      state.image1 = '';
25
-      state.image2 = '';
26
-      state.image3 = '';
25
+      state.images = [];
27 26
       state.layout = '';
28 27
     },
29
-    setImage1(state, image) {
30
-      state.image1 = `data:image/jpeg;base64,${image}`;
31
-    },
32
-    setImage2(state, image) {
33
-      state.image2 = `data:image/jpeg;base64,${image}`;
34
-    },
35
-    setImage3(state, image) {
36
-      state.image3 = `data:image/jpeg;base64,${image}`;
37
-    },
38 28
     setLayout(state, image) {
39 29
       state.layout = `data:image/jpeg;base64,${image}`;
40 30
     },
@@ -51,14 +41,16 @@ export default {
51 41
       dispatch('getImage1', resortCode);
52 42
       dispatch('getImage2', resortCode);
53 43
       dispatch('getImage3', resortCode);
44
+      dispatch('getImage4', resortCode);
54 45
       dispatch('getLayout', resortCode);
55 46
     },
56 47
     getDescription({
57 48
       commit,
58 49
     }, resortCode) {
59
-      axios.get(
60
-        `https://www.tradeunipoint.com/unibackend/seam/resource/rest/products/${resortCode}/dsc`,
61
-      )
50
+      axios
51
+        .get(
52
+          `https://www.tradeunipoint.com/unibackend/seam/resource/rest/products/${resortCode}/dsc`,
53
+        )
62 54
         .then((result) => {
63 55
           commit('setDescription', result.data);
64 56
         })
@@ -67,10 +59,10 @@ export default {
67 59
     getResort({
68 60
       commit,
69 61
     }, resortCode) {
70
-      axios.get(
71
-        `https://www.tradeunipoint.com/unibackend/seam/resource/rest/products/TRESORT/${
72
-          resortCode}`,
73
-      )
62
+      axios
63
+        .get(
64
+          `https://www.tradeunipoint.com/unibackend/seam/resource/rest/products/TRESORT/${resortCode}`,
65
+        )
74 66
         .then((result) => {
75 67
           commit('setResort', result.data);
76 68
         })
@@ -79,32 +71,54 @@ export default {
79 71
     getImage1({
80 72
       commit,
81 73
     }, resortCode) {
82
-      axios.get(`https://www.tradeunipoint.com/unibackend/seam/resource/rest/products/${
83
-        resortCode}/image/1`)
84
-        .then(result => commit('setImage1', result.data))
74
+      axios
75
+        .get(
76
+          `https://www.tradeunipoint.com/unibackend/seam/resource/rest/products/${resortCode}/image/1`,
77
+        )
78
+        .then(result => commit('addImage', result.data))
85 79
         .catch(console.error);
86 80
     },
87 81
     getImage2({
88 82
       commit,
89 83
     }, resortCode) {
90
-      axios.get(`https://www.tradeunipoint.com/unibackend/seam/resource/rest/products/${
91
-        resortCode}/image/2`)
92
-        .then(result => commit('setImage2', result.data))
84
+      axios
85
+        .get(
86
+          `https://www.tradeunipoint.com/unibackend/seam/resource/rest/products/${resortCode}/image/2`,
87
+        )
88
+        .then(result => commit('addImage', result.data))
93 89
         .catch(console.error);
94 90
     },
95 91
     getImage3({
96 92
       commit,
97 93
     }, resortCode) {
98
-      axios.get(`https://www.tradeunipoint.com/unibackend/seam/resource/rest/products/${
99
-        resortCode}/image/3`)
100
-        .then(result => commit('setImage3', result.data))
94
+      axios
95
+        .get(
96
+          `https://www.tradeunipoint.com/unibackend/seam/resource/rest/products/${resortCode}/image/3`,
97
+        )
98
+        .then(result => commit('addImage', result.data))
99
+        .catch(console.error);
100
+    },
101
+    getImage4({
102
+      commit,
103
+    }, resortCode) {
104
+      axios
105
+        .get(
106
+          `https://www.tradeunipoint.com/unibackend/seam/resource/rest/products/${resortCode}/image/4`,
107
+        )
108
+        .then((result) => {
109
+          if (result.data && result.data.length > 0) {
110
+            commit('addImage', result.data);
111
+          }
112
+        })
101 113
         .catch(console.error);
102 114
     },
103 115
     getLayout({
104 116
       commit,
105 117
     }, resortCode) {
106
-      axios.get(`https://www.tradeunipoint.com/unibackend/seam/resource/rest/products/${
107
-        resortCode}/layout`)
118
+      axios
119
+        .get(
120
+          `https://www.tradeunipoint.com/unibackend/seam/resource/rest/products/${resortCode}/layout`,
121
+        )
108 122
         .then(result => commit('setLayout', result.data))
109 123
         .catch(console.error);
110 124
     },

+ 4
- 30
src/store/modules/timeshare/weekList.js Целия файл

@@ -15,8 +15,10 @@ export default {
15 15
       date: undefined,
16 16
       minPrice: undefined,
17 17
       maxPrice: undefined,
18
-      keyword: null,
18
+      keyword: undefined,
19 19
     },
20
+    prevFilter: undefined,
21
+    difFilter: undefined,
20 22
   },
21 23
   mutations: {
22 24
     onClearFilter(state, filter) {
@@ -34,6 +36,7 @@ export default {
34 36
   },
35 37
   getters: {
36 38
     filteredWeeks: (state) => {
39
+      console.log(JSON.stringify(state.filter));
37 40
       let weekList = state.weeks;
38 41
       const {
39 42
         filter,
@@ -109,34 +112,5 @@ export default {
109 112
     }, filter) {
110 113
       commit('onClearFilter', filter);
111 114
     },
112
-    addDummyWeek({
113
-      commit,
114
-    }) {
115
-      commit('addWeek', {
116
-        id: 1,
117
-        unit: '359',
118
-        week: 'N18',
119
-        module: '359/N18 River View',
120
-        sellingPrice: 85000,
121
-        currentLevy: 5455,
122
-        arrivalDate: '2019/09/09',
123
-        departureDate: '2019/09/16',
124
-        region: {
125
-          regionCode: 'EC',
126
-          regionName: 'Eastern Cape',
127
-          id: 1,
128
-        },
129
-        resort: {
130
-          resortName: 'Ekuthuleni Hoedspruit',
131
-          resortCode: 'EKU',
132
-          town: 'Hoedspruit',
133
-          city: 'Hoedspruit',
134
-          id: 17,
135
-        },
136
-        bedrooms: '2',
137
-        unitNumber: '18',
138
-        weekNumber: '25',
139
-      });
140
-    },
141 115
   },
142 116
 };

+ 60
- 23
src/store/modules/user/authentication.js Целия файл

@@ -1,68 +1,105 @@
1 1
 import Vue from 'vue';
2 2
 import Vuex from 'vuex';
3 3
 import axios from 'axios';
4
+import log from '../../../assets/Log';
4 5
 
5 6
 Vue.use(Vuex);
6 7
 export default {
7 8
   namespaced: true,
8 9
   state: {
9
-    status: '',
10
-    token: sessionStorage.getItem('token') || '',
11
-    user: {},
12
-    individual: {},
10
+    username: 'UniVate2018',
11
+    password: 'UniVate2018',
12
+    isLoggedIn: log.isLoggedIn(),
13
+    flag: false,
14
+    status: undefined,
15
+    token: undefined,
16
+    user: undefined,
17
+    person: undefined,
18
+    agency: undefined,
13 19
   },
14 20
   mutations: {
15 21
     auth_request(state) {
16 22
       state.status = 'loading';
17 23
     },
18
-    auth_success(state, token, user) {
24
+    auth_success(state, user) {
19 25
       state.status = 'success';
20
-      state.token = token;
21
-      state.user = user;
26
+      state.token = user.token;
27
+      state.user = user.user;
28
+      state.person = user.person;
29
+      state.agency = user.agency;
22 30
     },
23 31
     auth_error(state) {
24 32
       state.status = 'error';
25 33
     },
26 34
     logout(state) {
27
-      state.status = '';
28
-      state.token = '';
35
+      state.status = undefined;
36
+      state.token = undefined;
37
+      state.person = undefined;
38
+      state.agency = undefined;
39
+      state.user = undefined;
40
+    },
41
+    runInit(state, item) {
42
+      state.flag = true;
43
+      state.user = item.user;
44
+      state.token = item.token;
45
+      state.person = item.person;
46
+      state.agency = item.agency;
47
+    },
48
+    updateFlag(state) {
49
+      state.flag = true;
29 50
     },
30 51
   },
31 52
   getters: {
32
-    isLoggedIn: state => !!state.token,
33 53
     authStatus: state => state.status,
34 54
   },
35 55
   actions: {
36
-    login({ commit }, user) {
56
+    init({
57
+      commit,
58
+    }) {
59
+      if (!log.isLoggedIn() && log.tokenExpired) {
60
+        log.clearValues();
61
+      } else log.updateTokenExpiry();
62
+      commit('runInit', {
63
+        user: log.getJSONObject('user'),
64
+        token: log.getJSONObject('token'),
65
+        person: log.getJSONObject('person'),
66
+        agency: log.getJSONObject('agency'),
67
+      });
68
+    },
69
+    login({
70
+      commit,
71
+      state,
72
+    }) {
37 73
       return new Promise((reject) => {
38 74
         commit('auth_request');
75
+        const user = {
76
+          username: state.username,
77
+          password: state.password,
78
+        };
39 79
         axios({
40 80
           url: '/api/register/authenticate',
41 81
           data: user,
42 82
           method: 'POST',
43 83
         })
44 84
           .then((resp) => {
45
-            console.log(resp.data);
46
-            sessionStorage.setItem('token', resp.data.token);
47
-            sessionStorage.setItem('username', resp.data.username);
48
-            sessionStorage.setItem('name', resp.data.name);
49
-            commit('auth_success', resp.data.token, resp.data);
85
+            log.clearValues();
86
+            log.setValues(resp.data);
87
+            commit('auth_success', resp.data);
50 88
           })
51 89
           .catch((err) => {
52 90
             commit('auth_error');
53
-            sessionStorage.removeItem('token');
54
-            sessionStorage.removeItem('username');
55
-            sessionStorage.removeItem('name');
91
+            log.clearValues();
56 92
             reject(err);
93
+            commit('auth_error', err.data);
57 94
           });
58 95
       });
59 96
     },
60
-    logout({ commit }) {
97
+    logout({
98
+      commit,
99
+    }) {
61 100
       return new Promise(() => {
62 101
         commit('logout');
63
-        sessionStorage.removeItem('token');
64
-        sessionStorage.removeItem('username');
65
-        sessionStorage.removeItem('name');
102
+        log.clearValues();
66 103
         delete axios.defaults.headers.common.Authorization;
67 104
       });
68 105
     },

Loading…
Отказ
Запис