Kobus 5 år sedan
förälder
incheckning
baaa6694ea
40 ändrade filer med 2553 tillägg och 1180 borttagningar
  1. 951
    177
      package-lock.json
  2. 4
    0
      package.json
  3. 5
    2
      public/css/style.css
  4. 37
    0
      public/img/ligthbox/close.svg
  5. 49
    0
      public/img/ligthbox/next.svg
  6. 49
    0
      public/img/ligthbox/prev.svg
  7. Binär
      public/img/testimonial-1.jpg
  8. Binär
      public/img/testimonial-1.png
  9. Binär
      public/img/testimonial-2.jpg
  10. Binär
      public/img/testimonial-2.png
  11. Binär
      public/img/testimonial-3.2.jpg
  12. Binär
      public/img/testimonial-3.jpg
  13. Binär
      public/img/testimonial-4.png
  14. 36
    0
      src/components/admin/status/changeLogPage.vue
  15. 36
    0
      src/components/admin/status/tenderWeekAdminPage.vue
  16. 36
    0
      src/components/admin/status/timeshareAdminPage.vue
  17. 36
    0
      src/components/admin/status/userManagementPage.vue
  18. 0
    217
      src/components/home/agentSection.vue
  19. 0
    2
      src/components/home/homePage.vue
  20. 2
    4
      src/components/home/propertySection.vue
  21. 18
    27
      src/components/home/serviceSection.vue
  22. 81
    12
      src/components/home/testimonialSection.vue
  23. 10
    4
      src/components/misc/contactUs.vue
  24. 12
    3
      src/components/property/propertyCard.vue
  25. 11
    7
      src/components/property/propertyImage.vue
  26. 180
    282
      src/components/property/propertyPage.vue
  27. 148
    0
      src/components/property/propertySearchFields.vue
  28. 62
    37
      src/components/property/propertySearchPage.vue
  29. 27
    3
      src/components/property/propertyUserField.vue
  30. 94
    117
      src/components/property/propertyeditPage.vue
  31. 7
    7
      src/components/shared/footerSection.vue
  32. 201
    0
      src/components/shared/lightBoxGallery.vue
  33. 9
    13
      src/components/shared/navBar.vue
  34. 117
    92
      src/components/shared/searchTab.vue
  35. 135
    108
      src/components/timeshare/resort/unitPage.vue
  36. 59
    52
      src/components/user/loginPage.vue
  37. 25
    0
      src/router/index.js
  38. 2
    0
      src/store/index.js
  39. 107
    0
      src/store/modules/property/property.js
  40. 7
    14
      src/store/modules/searchTab.js

+ 951
- 177
package-lock.json
Filskillnaden har hållits tillbaka eftersom den är för stor
Visa fil


+ 4
- 0
package.json Visa fil

@@ -13,13 +13,17 @@
13 13
     "animate.css": "^3.7.2",
14 14
     "axios": "^0.19.0",
15 15
     "core-js": "^2.6.5",
16
+    "datatables.net": "^1.10.19",
16 17
     "lodash": "^4.17.15",
17 18
     "material-design-icons-iconfont": "^3.0.3",
19
+    "node-sass": "^4.12.0",
18 20
     "roboto-fontface": "*",
21
+    "sass-loader": "^7.3.1",
19 22
     "stylus-loader": "^3.0.2",
20 23
     "vue": "^2.6.10",
21 24
     "vue-eva-icons": "^1.1.1",
22 25
     "vue-router": "^3.0.7",
26
+    "vue-trix": "^1.0.0",
23 27
     "vuetify": "^1.5.5",
24 28
     "vuex": "^3.1.1"
25 29
   },

+ 5
- 2
public/css/style.css Visa fil

@@ -1570,6 +1570,9 @@ footer .credits {
1570 1570
     font-size: 14px;
1571 1571
 }
1572 1572
 
1573
+.pt-3-half {
1574
+    padding-top: 1.4rem;
1575
+}
1573 1576
 
1574 1577
 /*======================================
1575 1578
 //--//-->   FORM INPUT
@@ -1589,7 +1592,7 @@ footer .credits {
1589 1592
 .form {
1590 1593
     position: relative;
1591 1594
     z-index: 1;
1592
-    background: rgb(236, 233, 233);
1595
+    background: #F8F9F9;
1593 1596
     max-width: 360px;
1594 1597
     margin: 0 auto 100px;
1595 1598
     padding: 45px;
@@ -1600,7 +1603,7 @@ footer .credits {
1600 1603
 .regform {
1601 1604
     position: relative;
1602 1605
     z-index: 1;
1603
-    background: rgb(236, 233, 233);
1606
+    background: #F8F9F9;
1604 1607
     max-width: 600px;
1605 1608
     margin: 0 auto 100px;
1606 1609
     padding: 45px;

+ 37
- 0
public/img/ligthbox/close.svg Visa fil

@@ -0,0 +1,37 @@
1
+<?xml version="1.0" encoding="iso-8859-1"?>
2
+<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
3
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Capa_1" x="0px" y="0px" viewBox="0 0 47.971 47.971" style="enable-background:new 0 0 47.971 47.971;" xml:space="preserve">
4
+<g>
5
+	<path d="M28.228,23.986L47.092,5.122c1.172-1.171,1.172-3.071,0-4.242c-1.172-1.172-3.07-1.172-4.242,0L23.986,19.744L5.121,0.88   c-1.172-1.172-3.07-1.172-4.242,0c-1.172,1.171-1.172,3.071,0,4.242l18.865,18.864L0.879,42.85c-1.172,1.171-1.172,3.071,0,4.242   C1.465,47.677,2.233,47.97,3,47.97s1.535-0.293,2.121-0.879l18.865-18.864L42.85,47.091c0.586,0.586,1.354,0.879,2.121,0.879   s1.535-0.293,2.121-0.879c1.172-1.171,1.172-3.071,0-4.242L28.228,23.986z" fill="#FFFFFF"/>
6
+</g>
7
+<g>
8
+</g>
9
+<g>
10
+</g>
11
+<g>
12
+</g>
13
+<g>
14
+</g>
15
+<g>
16
+</g>
17
+<g>
18
+</g>
19
+<g>
20
+</g>
21
+<g>
22
+</g>
23
+<g>
24
+</g>
25
+<g>
26
+</g>
27
+<g>
28
+</g>
29
+<g>
30
+</g>
31
+<g>
32
+</g>
33
+<g>
34
+</g>
35
+<g>
36
+</g>
37
+</svg>

+ 49
- 0
public/img/ligthbox/next.svg Visa fil

@@ -0,0 +1,49 @@
1
+<?xml version="1.0" encoding="iso-8859-1"?>
2
+<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
3
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Capa_1" x="0px" y="0px" viewBox="0 0 240.823 240.823" style="enable-background:new 0 0 240.823 240.823;" xml:space="preserve">
4
+<g>
5
+	<path id="Chevron_Right_1_" d="M183.189,111.816L74.892,3.555c-4.752-4.74-12.451-4.74-17.215,0c-4.752,4.74-4.752,12.439,0,17.179   l99.707,99.671l-99.695,99.671c-4.752,4.74-4.752,12.439,0,17.191c4.752,4.74,12.463,4.74,17.215,0l108.297-108.261   C187.881,124.315,187.881,116.495,183.189,111.816z" fill="#FFFFFF"/>
6
+	<g>
7
+	</g>
8
+	<g>
9
+	</g>
10
+	<g>
11
+	</g>
12
+	<g>
13
+	</g>
14
+	<g>
15
+	</g>
16
+	<g>
17
+	</g>
18
+</g>
19
+<g>
20
+</g>
21
+<g>
22
+</g>
23
+<g>
24
+</g>
25
+<g>
26
+</g>
27
+<g>
28
+</g>
29
+<g>
30
+</g>
31
+<g>
32
+</g>
33
+<g>
34
+</g>
35
+<g>
36
+</g>
37
+<g>
38
+</g>
39
+<g>
40
+</g>
41
+<g>
42
+</g>
43
+<g>
44
+</g>
45
+<g>
46
+</g>
47
+<g>
48
+</g>
49
+</svg>

+ 49
- 0
public/img/ligthbox/prev.svg Visa fil

@@ -0,0 +1,49 @@
1
+<?xml version="1.0" encoding="iso-8859-1"?>
2
+<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
3
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Capa_1" x="0px" y="0px" viewBox="0 0 240.823 240.823" style="enable-background:new 0 0 240.823 240.823;" xml:space="preserve">
4
+<g>
5
+	<path id="Chevron_Right" d="M57.633,129.007L165.93,237.268c4.752,4.74,12.451,4.74,17.215,0c4.752-4.74,4.752-12.439,0-17.179   l-99.707-99.671l99.695-99.671c4.752-4.74,4.752-12.439,0-17.191c-4.752-4.74-12.463-4.74-17.215,0L57.621,111.816   C52.942,116.507,52.942,124.327,57.633,129.007z" fill="#FFFFFF"/>
6
+	<g>
7
+	</g>
8
+	<g>
9
+	</g>
10
+	<g>
11
+	</g>
12
+	<g>
13
+	</g>
14
+	<g>
15
+	</g>
16
+	<g>
17
+	</g>
18
+</g>
19
+<g>
20
+</g>
21
+<g>
22
+</g>
23
+<g>
24
+</g>
25
+<g>
26
+</g>
27
+<g>
28
+</g>
29
+<g>
30
+</g>
31
+<g>
32
+</g>
33
+<g>
34
+</g>
35
+<g>
36
+</g>
37
+<g>
38
+</g>
39
+<g>
40
+</g>
41
+<g>
42
+</g>
43
+<g>
44
+</g>
45
+<g>
46
+</g>
47
+<g>
48
+</g>
49
+</svg>

Binär
public/img/testimonial-1.jpg Visa fil


Binär
public/img/testimonial-1.png Visa fil


Binär
public/img/testimonial-2.jpg Visa fil


Binär
public/img/testimonial-2.png Visa fil


Binär
public/img/testimonial-3.2.jpg Visa fil


Binär
public/img/testimonial-3.jpg Visa fil


Binär
public/img/testimonial-4.png Visa fil


+ 36
- 0
src/components/admin/status/changeLogPage.vue Visa fil

@@ -0,0 +1,36 @@
1
+<template>
2
+  <section class="intro-single">
3
+    <div class="container">
4
+      <div class="row">
5
+        <div class="col-md-12 col-lg-8">
6
+          <div class="title-single-box">
7
+            <h1 class="title-single" style="text-align:left;">Change Log</h1>
8
+          </div>
9
+        </div>
10
+      </div>
11
+    </div>
12
+    <div id="table" class="col-xs-12 table-responsive">
13
+      <datatable :columns="columns" :data="rows"></datatable>
14
+    </div>
15
+  </section>
16
+</template>
17
+<script>
18
+import { mapState, mapActions } from 'vuex';
19
+
20
+export default {
21
+  name: 'changeLogPage',
22
+  created() {
23
+    this.getchangeLogPage();
24
+  },
25
+  computed: {
26
+    ...mapState('status', ['changeLogPage']),
27
+  },
28
+  methods: {
29
+    ...mapActions('status', ['getchangeLogPage']),
30
+  },
31
+};
32
+</script>
33
+
34
+
35
+<style>
36
+</style>

+ 36
- 0
src/components/admin/status/tenderWeekAdminPage.vue Visa fil

@@ -0,0 +1,36 @@
1
+<template>
2
+  <section class="intro-single">
3
+    <div class="container">
4
+      <div class="row">
5
+        <div class="col-md-12 col-lg-8">
6
+          <div class="title-single-box">
7
+            <h1 class="title-single" style="text-align:left;">Tender Week Admin</h1>
8
+          </div>
9
+        </div>
10
+      </div>
11
+    </div>
12
+    <div id="table" class="col-xs-12 table-responsive">
13
+      <datatable :columns="columns" :data="rows"></datatable>
14
+    </div>
15
+  </section>
16
+</template>
17
+<script>
18
+import { mapState, mapActions } from 'vuex';
19
+
20
+export default {
21
+  name: 'TenderWeekAdmin',
22
+  created() {
23
+    this.gettenderWeekdmin();
24
+  },
25
+  computed: {
26
+    ...mapState('status', ['tenderWeekAdmin']),
27
+  },
28
+  methods: {
29
+    ...mapActions('status', ['gettenderWeekAdmin']),
30
+  },
31
+};
32
+</script>
33
+
34
+
35
+<style>
36
+</style>

+ 36
- 0
src/components/admin/status/timeshareAdminPage.vue Visa fil

@@ -0,0 +1,36 @@
1
+<template>
2
+  <section class="intro-single">
3
+    <div class="container">
4
+      <div class="row">
5
+        <div class="col-md-12 col-lg-8">
6
+          <div class="title-single-box">
7
+            <h1 class="title-single" style="text-align:left;">Timeshare Admin</h1>
8
+          </div>
9
+        </div>
10
+      </div>
11
+    </div>
12
+    <div id="table" class="col-xs-12 table-responsive">
13
+      <datatable :columns="columns" :data="rows"></datatable>
14
+    </div>
15
+  </section>
16
+</template>
17
+<script>
18
+import { mapState, mapActions } from 'vuex';
19
+
20
+export default {
21
+  name: 'TimeshareAdmin',
22
+  created() {
23
+    this.gettimeshareAdmin();
24
+  },
25
+  computed: {
26
+    ...mapState('status', ['timeshareAdmin']),
27
+  },
28
+  methods: {
29
+    ...mapActions('status', ['gettimeshareAdmin']),
30
+  },
31
+};
32
+</script>
33
+
34
+
35
+<style>
36
+</style>

+ 36
- 0
src/components/admin/status/userManagementPage.vue Visa fil

@@ -0,0 +1,36 @@
1
+<template>
2
+  <section class="intro-single">
3
+    <div class="container">
4
+      <div class="row">
5
+        <div class="col-md-12 col-lg-8">
6
+          <div class="title-single-box">
7
+            <h1 class="title-single" style="text-align:left;">User Management</h1>
8
+          </div>
9
+        </div>
10
+      </div>
11
+    </div>
12
+    <div id="table" class="col-xs-12 table-responsive">
13
+      <datatable :columns="columns" :data="rows"></datatable>
14
+    </div>
15
+  </section>
16
+</template>
17
+<script>
18
+import { mapState, mapActions } from 'vuex';
19
+
20
+export default {
21
+  name: 'userManagementPage',
22
+  created() {
23
+    this.getuserManagementPage();
24
+  },
25
+  computed: {
26
+    ...mapState('status', ['userManagementPage']),
27
+  },
28
+  methods: {
29
+    ...mapActions('status', ['getuserManagementPage']),
30
+  },
31
+};
32
+</script>
33
+
34
+
35
+<style>
36
+</style>

+ 0
- 217
src/components/home/agentSection.vue Visa fil

@@ -1,217 +0,0 @@
1
-<template>
2
-  <div>
3
-    <section class="section-agents section-t8">
4
-      <div class="container">
5
-        <div class="row">
6
-          <div class="col-md-12">
7
-            <div class="title-wrap d-flex justify-content-between">
8
-              <div class="title-box">
9
-                <h2 class="title-a">Best Agents</h2>
10
-              </div>
11
-              <div class="title-link">
12
-                <a href="agents-grid.html">
13
-                  All Agents
14
-                  <span class="ion-ios-arrow-forward"></span>
15
-                </a>
16
-              </div>
17
-            </div>
18
-          </div>
19
-        </div>
20
-        <div class="row">
21
-          <div class="col-md-4">
22
-            <div class="card-box-d">
23
-              <div class="card-img-d">
24
-                <img src="img/agent-4.jpg" alt class="img-d img-fluid" />
25
-              </div>
26
-              <div class="card-overlay card-overlay-hover">
27
-                <div class="card-header-d">
28
-                  <div class="card-title-d align-self-center">
29
-                    <h3 class="title-d">
30
-                      <a href="agent-single.html" class="link-two">
31
-                        Margaret Sotillo
32
-                        <br />Escala
33
-                      </a>
34
-                    </h3>
35
-                  </div>
36
-                </div>
37
-                <div class="card-body-d">
38
-                  <p
39
-                    class="content-d color-text-a"
40
-                  >Sed porttitor lectus nibh, Cras ultricies ligula sed magna dictum porta two.</p>
41
-                  <div class="info-agents color-a">
42
-                    <p>
43
-                      <strong>Phone:</strong> +54 356 945234
44
-                    </p>
45
-                    <p>
46
-                      <strong>Email:</strong> agents@example.com
47
-                    </p>
48
-                  </div>
49
-                </div>
50
-                <div class="card-footer-d">
51
-                  <div class="socials-footer d-flex justify-content-center">
52
-                    <ul class="list-inline">
53
-                      <li class="list-inline-item">
54
-                        <a href="#" class="link-one">
55
-                          <i class="fa fa-facebook" aria-hidden="true"></i>
56
-                        </a>
57
-                      </li>
58
-                      <li class="list-inline-item">
59
-                        <a href="#" class="link-one">
60
-                          <i class="fa fa-twitter" aria-hidden="true"></i>
61
-                        </a>
62
-                      </li>
63
-                      <li class="list-inline-item">
64
-                        <a href="#" class="link-one">
65
-                          <i class="fa fa-instagram" aria-hidden="true"></i>
66
-                        </a>
67
-                      </li>
68
-                      <li class="list-inline-item">
69
-                        <a href="#" class="link-one">
70
-                          <i class="fa fa-pinterest-p" aria-hidden="true"></i>
71
-                        </a>
72
-                      </li>
73
-                      <li class="list-inline-item">
74
-                        <a href="#" class="link-one">
75
-                          <i class="fa fa-dribbble" aria-hidden="true"></i>
76
-                        </a>
77
-                      </li>
78
-                    </ul>
79
-                  </div>
80
-                </div>
81
-              </div>
82
-            </div>
83
-          </div>
84
-          <div class="col-md-4">
85
-            <div class="card-box-d">
86
-              <div class="card-img-d">
87
-                <img src="img/agent-1.jpg" alt class="img-d img-fluid" />
88
-              </div>
89
-              <div class="card-overlay card-overlay-hover">
90
-                <div class="card-header-d">
91
-                  <div class="card-title-d align-self-center">
92
-                    <h3 class="title-d">
93
-                      <a href="agent-single.html" class="link-two">
94
-                        Stiven Spilver
95
-                        <br />Darw
96
-                      </a>
97
-                    </h3>
98
-                  </div>
99
-                </div>
100
-                <div class="card-body-d">
101
-                  <p
102
-                    class="content-d color-text-a"
103
-                  >Sed porttitor lectus nibh, Cras ultricies ligula sed magna dictum porta two.</p>
104
-                  <div class="info-agents color-a">
105
-                    <p>
106
-                      <strong>Phone:</strong> +54 356 945234
107
-                    </p>
108
-                    <p>
109
-                      <strong>Email:</strong> agents@example.com
110
-                    </p>
111
-                  </div>
112
-                </div>
113
-                <div class="card-footer-d">
114
-                  <div class="socials-footer d-flex justify-content-center">
115
-                    <ul class="list-inline">
116
-                      <li class="list-inline-item">
117
-                        <a href="#" class="link-one">
118
-                          <i class="fa fa-facebook" aria-hidden="true"></i>
119
-                        </a>
120
-                      </li>
121
-                      <li class="list-inline-item">
122
-                        <a href="#" class="link-one">
123
-                          <i class="fa fa-twitter" aria-hidden="true"></i>
124
-                        </a>
125
-                      </li>
126
-                      <li class="list-inline-item">
127
-                        <a href="#" class="link-one">
128
-                          <i class="fa fa-instagram" aria-hidden="true"></i>
129
-                        </a>
130
-                      </li>
131
-                      <li class="list-inline-item">
132
-                        <a href="#" class="link-one">
133
-                          <i class="fa fa-pinterest-p" aria-hidden="true"></i>
134
-                        </a>
135
-                      </li>
136
-                      <li class="list-inline-item">
137
-                        <a href="#" class="link-one">
138
-                          <i class="fa fa-dribbble" aria-hidden="true"></i>
139
-                        </a>
140
-                      </li>
141
-                    </ul>
142
-                  </div>
143
-                </div>
144
-              </div>
145
-            </div>
146
-          </div>
147
-          <div class="col-md-4">
148
-            <div class="card-box-d">
149
-              <div class="card-img-d">
150
-                <img src="img/agent-5.jpg" alt class="img-d img-fluid" />
151
-              </div>
152
-              <div class="card-overlay card-overlay-hover">
153
-                <div class="card-header-d">
154
-                  <div class="card-title-d align-self-center">
155
-                    <h3 class="title-d">
156
-                      <a href="agent-single.html" class="link-two">
157
-                        Emma Toledo
158
-                        <br />Cascada
159
-                      </a>
160
-                    </h3>
161
-                  </div>
162
-                </div>
163
-                <div class="card-body-d">
164
-                  <p
165
-                    class="content-d color-text-a"
166
-                  >Sed porttitor lectus nibh, Cras ultricies ligula sed magna dictum porta two.</p>
167
-                  <div class="info-agents color-a">
168
-                    <p>
169
-                      <strong>Phone:</strong> +54 356 945234
170
-                    </p>
171
-                    <p>
172
-                      <strong>Email:</strong> agents@example.com
173
-                    </p>
174
-                  </div>
175
-                </div>
176
-                <div class="card-footer-d">
177
-                  <div class="socials-footer d-flex justify-content-center">
178
-                    <ul class="list-inline">
179
-                      <li class="list-inline-item">
180
-                        <a href="#" class="link-one">
181
-                          <i class="fa fa-facebook" aria-hidden="true"></i>
182
-                        </a>
183
-                      </li>
184
-                      <li class="list-inline-item">
185
-                        <a href="#" class="link-one">
186
-                          <i class="fa fa-twitter" aria-hidden="true"></i>
187
-                        </a>
188
-                      </li>
189
-                      <li class="list-inline-item">
190
-                        <a href="#" class="link-one">
191
-                          <i class="fa fa-instagram" aria-hidden="true"></i>
192
-                        </a>
193
-                      </li>
194
-                      <li class="list-inline-item">
195
-                        <a href="#" class="link-one">
196
-                          <i class="fa fa-pinterest-p" aria-hidden="true"></i>
197
-                        </a>
198
-                      </li>
199
-                      <li class="list-inline-item">
200
-                        <a href="#" class="link-one">
201
-                          <i class="fa fa-dribbble" aria-hidden="true"></i>
202
-                        </a>
203
-                      </li>
204
-                    </ul>
205
-                  </div>
206
-                </div>
207
-              </div>
208
-            </div>
209
-          </div>
210
-        </div>
211
-      </div>
212
-    </section>
213
-  </div>
214
-</template>
215
-<script>
216
-export default {};
217
-</script>

+ 0
- 2
src/components/home/homePage.vue Visa fil

@@ -16,7 +16,6 @@
16 16
 import CarouselSection from './carouselSection.vue';
17 17
 import ServiceSection from './serviceSection.vue';
18 18
 import PropertySection from './propertySection.vue';
19
-import AgentSection from './agentSection.vue';
20 19
 import NewsSection from './newsSection.vue';
21 20
 import TestimonialSection from './testimonialSection.vue';
22 21
 
@@ -25,7 +24,6 @@ export default {
25 24
     CarouselSection,
26 25
     ServiceSection,
27 26
     PropertySection,
28
-    AgentSection,
29 27
     NewsSection,
30 28
     TestimonialSection,
31 29
   },

+ 2
- 4
src/components/home/propertySection.vue Visa fil

@@ -9,10 +9,8 @@
9 9
                 <h2 class="title-a">Latest Properties</h2>
10 10
               </div>
11 11
               <div class="title-link">
12
-                <a href="property-grid.html">
13
-                  All Property
14
-                  <span class="ion-ios-arrow-forward"></span>
15
-                </a>
12
+                <router-link to="/timeshare/buy">All Properties</router-link>
13
+                <span class="ion-ios-arrow-forward"></span>
16 14
               </div>
17 15
             </div>
18 16
           </div>

+ 18
- 27
src/components/home/serviceSection.vue Visa fil

@@ -16,24 +16,21 @@
16 16
             <div class="card-box-c foo">
17 17
               <div class="card-header-c d-flex">
18 18
                 <div class="card-box-ico">
19
-                  <span class="fa fa-gamepad"></span>
19
+                  <span class="fa fa-umbrella"></span>
20 20
                 </div>
21 21
                 <div class="card-title-c align-self-center">
22
-                  <h2 class="title-c">Lifestyle</h2>
22
+                  <h2 class="title-c">Timeshare</h2>
23 23
                 </div>
24 24
               </div>
25 25
               <div class="card-body-c">
26 26
                 <p class="content-c">
27
-                  Sed porttitor lectus nibh. Cras ultricies ligula sed magna dictum porta. Praesent sapien massa,
28
-                  convallis a pellentesque
29
-                  nec, egestas non nisi.
27
+                  Need to sell your timeshare, or thinking of buying a holiday week?
28
+                  <br />Get in touch to meet the professionals that has made timeshare resales a pleasure...
30 29
                 </p>
31 30
               </div>
32 31
               <div class="card-footer-c">
33
-                <a href="#" class="link-c link-icon">
34
-                  Read more
35
-                  <span class="ion-ios-arrow-forward"></span>
36
-                </a>
32
+                <router-link to="/timeshare/buy">Read more</router-link>
33
+                <span class="ion-ios-arrow-forward"></span>
37 34
               </div>
38 35
             </div>
39 36
           </div>
@@ -41,24 +38,21 @@
41 38
             <div class="card-box-c foo">
42 39
               <div class="card-header-c d-flex">
43 40
                 <div class="card-box-ico">
44
-                  <span class="fa fa-usd"></span>
41
+                  <span class="fa fa-home"></span>
45 42
                 </div>
46 43
                 <div class="card-title-c align-self-center">
47
-                  <h2 class="title-c">Loans</h2>
44
+                  <h2 class="title-c">Residential</h2>
48 45
                 </div>
49 46
               </div>
50 47
               <div class="card-body-c">
51 48
                 <p class="content-c">
52
-                  Nulla porttitor accumsan tincidunt. Curabitur aliquet quam id dui posuere blandit. Mauris blandit
53
-                  aliquet elit, eget tincidunt
54
-                  nibh pulvinar a.
49
+                  Find your dream home or looking to sell your residential property, instead?
50
+                  <br />We pride ourself on professionalism and the right expertise...
55 51
                 </p>
56 52
               </div>
57 53
               <div class="card-footer-c">
58
-                <a href="#" class="link-c link-icon">
59
-                  Read more
60
-                  <span class="ion-ios-arrow-forward"></span>
61
-                </a>
54
+                <router-link to="/property/Residential/Search">Read more</router-link>
55
+                <span class="ion-ios-arrow-forward"></span>
62 56
               </div>
63 57
             </div>
64 58
           </div>
@@ -66,24 +60,21 @@
66 60
             <div class="card-box-c foo">
67 61
               <div class="card-header-c d-flex">
68 62
                 <div class="card-box-ico">
69
-                  <span class="fa fa-home"></span>
63
+                  <span class="fa fa-building-o"></span>
70 64
                 </div>
71 65
                 <div class="card-title-c align-self-center">
72
-                  <h2 class="title-c">Sell</h2>
66
+                  <h2 class="title-c">Commercial</h2>
73 67
                 </div>
74 68
               </div>
75 69
               <div class="card-body-c">
76 70
                 <p class="content-c">
77
-                  Sed porttitor lectus nibh. Cras ultricies ligula sed magna dictum porta. Praesent sapien massa,
78
-                  convallis a pellentesque
79
-                  nec, egestas non nisi.
71
+                  Want to generate profit through leasing or rental?
72
+                  <br />Allow us to act as the mediator between landlord and tenants...
80 73
                 </p>
81 74
               </div>
82 75
               <div class="card-footer-c">
83
-                <a href="#" class="link-c link-icon">
84
-                  Read more
85
-                  <span class="ion-ios-arrow-forward"></span>
86
-                </a>
76
+                <router-link to="/property/Commercial/Search">Read more</router-link>
77
+                <span class="ion-ios-arrow-forward"></span>
87 78
               </div>
88 79
             </div>
89 80
           </div>

+ 81
- 12
src/components/home/testimonialSection.vue Visa fil

@@ -1,4 +1,5 @@
1 1
 <template>
2
+  <!-- eslint-disable max-len -->
2 3
   <div>
3 4
     <section class="section-testimonials section-t8 nav-arrow-a">
4 5
       <div class="container">
@@ -17,7 +18,9 @@
17 18
               <div class="row">
18 19
                 <div class="col-sm-12 col-md-6">
19 20
                   <div class="testimonial-img">
20
-                    <img src="img/testimonial-1.jpg" alt class="img-fluid" />
21
+                    <router-link to="/resort/csp">
22
+                      <img src="img/testimonial-1.png" alt class="CrystalSprings" />
23
+                    </router-link>
21 24
                   </div>
22 25
                 </div>
23 26
                 <div class="col-sm-12 col-md-6">
@@ -26,14 +29,17 @@
26 29
                   </div>
27 30
                   <div class="testimonials-content">
28 31
                     <p class="testimonial-text">
29
-                      Lorem ipsum dolor sit amet, consectetur adipisicing elit. Omnis, cupiditate ea nam praesentium
30
-                      debitis hic ber quibusdam
31
-                      voluptatibus officia expedita corpori.
32
+                      Loved my stay at Crystal Springs. Appreciated the proffesionalism and friendliness of the staff.
33
+                      Thoroughly enjoyed the hike, game drive, jaccuzzi, heated pool, steam room and even the trampolines. Our chalet was in stellar condition.
34
+                      The heaters, extra blankets and fire place ensured we kept warm and toasty during the cold evenings.
35
+                      The food at the restaurant was delicious, and the experience was made even better by the friendly waitress who served us. Arriving to find Ferreiro Roche and Champagne in our chalet was the cherry on top.
36
+                      I would wholeheartedly recommend this resort any day. Well done Crystal Springs!
32 37
                     </p>
33 38
                   </div>
34 39
                   <div class="testimonial-author-box">
35
-                    <img src="img/mini-testimonial-1.jpg" alt class="testimonial-avatar" />
36
-                    <h5 class="testimonial-author">Albert & Erika</h5>
40
+                    <eva-icon name="people-outline" fill="#60CBEB"></eva-icon>
41
+                    <h5 class="testimonial-author">Anati Bacela</h5>
42
+                    <p>- on visiting Crystal Springs</p>
37 43
                   </div>
38 44
                 </div>
39 45
               </div>
@@ -44,7 +50,9 @@
44 50
               <div class="row">
45 51
                 <div class="col-sm-12 col-md-6">
46 52
                   <div class="testimonial-img">
47
-                    <img src="img/testimonial-2.jpg" alt class="img-fluid" />
53
+                    <router-link to="/resort/nl">
54
+                      <img src="img/testimonial-2.png" alt class="Ngwenya Lodge" />
55
+                    </router-link>
48 56
                   </div>
49 57
                 </div>
50 58
                 <div class="col-sm-12 col-md-6">
@@ -53,14 +61,75 @@
53 61
                   </div>
54 62
                   <div class="testimonials-content">
55 63
                     <p class="testimonial-text">
56
-                      Lorem ipsum dolor sit amet, consectetur adipisicing elit. Omnis, cupiditate ea nam praesentium
57
-                      debitis hic ber quibusdam
58
-                      voluptatibus officia expedita corpori.
64
+                      We have been going to Ngwenya for 25 years or more. every year we have had wonderful sightings from our verandah. To me it is paradise on earth and we never grow tired of it.
65
+                      Wonderful play area for people of all ages, the gardens are well kept, the restaurant is good and the chalets are well maintained.
66
+                      Most of all what I love about Ngwenya is it's peaceful and tranquil atmosphere and the close proximity to our amazing wild life We will continue going for many more years
59 67
                     </p>
60 68
                   </div>
61 69
                   <div class="testimonial-author-box">
62
-                    <img src="img/mini-testimonial-2.jpg" alt class="testimonial-avatar" />
63
-                    <h5 class="testimonial-author">Pablo & Emma</h5>
70
+                    <eva-icon name="people-outline" fill="#60CBEB"></eva-icon>
71
+                    <h5 class="testimonial-author">Linda Lewis</h5>
72
+                    <p>- on visiting Ngwenya Lodge</p>
73
+                  </div>
74
+                </div>
75
+              </div>
76
+            </div>
77
+          </div>
78
+          <div class="carousel-item-a">
79
+            <div class="testimonials-box">
80
+              <div class="row">
81
+                <div class="col-sm-12 col-md-6">
82
+                  <div class="testimonial-img">
83
+                    <router-link to="/resort/mnr">
84
+                      <img src="img/testimonial-3.2.jpg" alt class="Mabalingwe Nature Reserve" />
85
+                    </router-link>
86
+                  </div>
87
+                </div>
88
+                <div class="col-sm-12 col-md-6">
89
+                  <div class="testimonial-ico">
90
+                    <span class="ion-ios-quote"></span>
91
+                  </div>
92
+                  <div class="testimonials-content">
93
+                    <p class="testimonial-text">
94
+                      Great experience, I loved the place, so amazing and we saw many more animals. Had different kinds of visitors everyday (Impala, wild pig, monkeys, birds and more).
95
+                      The nature was great with all mountains and valleys and lakes. Every corner had a new moment. The staff was very friendly and helpful at all times.
96
+                      Thanks to the restaurant staff for helping me organizing my Husband's birthday surprise dinner. Best memories ever. Looking forward to my next visit with friends and more family members.
97
+                    </p>
98
+                  </div>
99
+                  <div class="testimonial-author-box">
100
+                    <eva-icon name="people-outline" fill="#60CBEB"></eva-icon>
101
+                    <h5 class="testimonial-author">Sophie Adewale</h5>
102
+                    <p>- on visiting Mabalingwe Nature Reserve</p>
103
+                  </div>
104
+                </div>
105
+              </div>
106
+            </div>
107
+          </div>
108
+          <div class="carousel-item-a">
109
+            <div class="testimonials-box">
110
+              <div class="row">
111
+                <div class="col-sm-12 col-md-6">
112
+                  <div class="testimonial-img">
113
+                    <router-link to="/resort/le">
114
+                      <img src="img/testimonial-4.png" alt class="Little Eden" />
115
+                    </router-link>
116
+                  </div>
117
+                </div>
118
+                <div class="col-sm-12 col-md-6">
119
+                  <div class="testimonial-ico">
120
+                    <span class="ion-ios-quote"></span>
121
+                  </div>
122
+                  <div class="testimonials-content">
123
+                    <p class="testimonial-text">
124
+                      Everything!! Little Eden is like a secret jewel no one but yourself and your very best
125
+                      friends should now about but at the same time its like discovering something so
126
+                      awesome you can never keep it to yourslef. You have to tell the world!!!
127
+                    </p>
128
+                  </div>
129
+                  <div class="testimonial-author-box">
130
+                    <eva-icon name="people-outline" fill="#60CBEB"></eva-icon>
131
+                    <h5 class="testimonial-author">Sisna & Andries Venter</h5>
132
+                    <p>- on visiting Little Eden</p>
64 133
                   </div>
65 134
                 </div>
66 135
               </div>

+ 10
- 4
src/components/misc/contactUs.vue Visa fil

@@ -1,10 +1,16 @@
1 1
 <template>
2 2
   <div class="container">
3
-    <div class="row">
4
-      <div class="col-md-12">
5
-        <h1 class="my-4">Contact Us</h1>
3
+    <section class="intro-single">
4
+      <div class="container">
5
+        <div class="row">
6
+          <div class="col-md-12 col-lg-8">
7
+            <div class="title-single-box">
8
+              <h1 class="title-single" style="text-align:left;">Contact Us</h1>
9
+            </div>
10
+          </div>
11
+        </div>
6 12
       </div>
7
-    </div>
13
+    </section>
8 14
     <div class="map-wrapper">
9 15
       <div class="map-canvas" id="map-canvas"></div>
10 16
       <a

+ 12
- 3
src/components/property/propertyCard.vue Visa fil

@@ -19,6 +19,15 @@
19 19
                   class="link-a"
20 20
                 >{{ currentProperty.shortDescription }}</router-link>
21 21
               </h4>
22
+              <h4 class="card-title-c">
23
+                <router-link :to="`/property/property/${currentProperty.id}`" class="link-a">
24
+                  {{ currentProperty.province }}
25
+                  <br />
26
+                  {{ currentProperty.city }}
27
+                  <br />
28
+                  {{ currentProperty.suburb }}
29
+                </router-link>
30
+              </h4>
22 31
             </div>
23 32
             <div class="card-body-a">
24 33
               <div class="price-box d-flex">
@@ -67,7 +76,7 @@
67 76
 <script>
68 77
 export default {
69 78
   props: {
70
-    properties: Object
71
-  }
79
+    properties: Object,
80
+  },
72 81
 };
73
-</script>
82
+</script>

+ 11
- 7
src/components/property/propertyImage.vue Visa fil

@@ -15,7 +15,7 @@
15 15
     </div>
16 16
     <br />
17 17
     <div class="form-group row">
18
-      <div v-for="img in image" class="col-md-2">
18
+      <div v-for="(img, i) in image" class="col-md-2" :key="i">
19 19
         <img :src="img" style="height:200px; width:150px; object-fit: cover;" />
20 20
         <br />
21 21
         <a class="fa fa-times del" @click="removeImage(key)" />
@@ -27,10 +27,13 @@
27 27
 
28 28
 <script>
29 29
 export default {
30
+  props: {
31
+    loadedImages: Function,
32
+  },
30 33
   data() {
31 34
     return {
32 35
       images: {},
33
-      image: []
36
+      image: [],
34 37
     };
35 38
   },
36 39
 
@@ -43,6 +46,7 @@ export default {
43 46
       if (!this.images.length) return;
44 47
 
45 48
       this.createImage(this.images);
49
+      this.loadedImages(this.image);
46 50
     },
47 51
 
48 52
     createImage(file) {
@@ -50,7 +54,7 @@ export default {
50 54
         const reader = new FileReader();
51 55
         var vm = this;
52 56
 
53
-        reader.onload = e => {
57
+        reader.onload = (e) => {
54 58
           vm.image.push(e.target.result);
55 59
           console.log(vm.image);
56 60
         };
@@ -63,9 +67,9 @@ export default {
63 67
       this.images.splice(key, 1);
64 68
 
65 69
       if (!this.image.length) {
66
-        this.$refs.im.value = "";
70
+        this.$refs.im.value = '';
67 71
       }
68
-    }
69
-  }
72
+    },
73
+  },
70 74
 };
71
-</script>
75
+</script>

+ 180
- 282
src/components/property/propertyPage.vue Visa fil

@@ -1,63 +1,32 @@
1 1
 <template>
2
-  <div>
2
+  <!-- eslint-disable max-len -->
3
+  <div v-if="property">
3 4
     <section class="intro-single">
4 5
       <div class="container">
5 6
         <div class="row">
6 7
           <div class="col-md-12 col-lg-8">
7 8
             <div class="title-single-box">
8
-              <h1 class="title-single">{{ Property.shortDescription }}</h1>
9
-              <span class="color-text-a">{{ Property.suburb }}</span>
9
+              <h1 class="title-single">{{ property.shortDescription }}</h1>
10 10
             </div>
11 11
           </div>
12
-          <!-- <div class="col-md-12 col-lg-4">
13
-            <nav aria-label="breadcrumb" class="breadcrumb-box d-flex justify-content-lg-end">
14
-              <ol class="breadcrumb">
15
-                <li class="breadcrumb-item">
16
-                  <a href="index.html">Home</a>
17
-                </li>
18
-                <li class="breadcrumb-item">
19
-                  <a href="property-grid.html">Properties</a>
20
-                </li>
21
-                <li class="breadcrumb-item active" aria-current="page">304 Blaster Up</li>
22
-              </ol>
23
-            </nav>
24
-          </div>-->
25 12
         </div>
26 13
       </div>
27 14
     </section>
28 15
     <!--/ Intro Single End /-->
29 16
 
30
-    <!--/ Property Single Star /-->
17
+    <!--/ property Single Star /-->
31 18
     <section class="property-single nav-arrow-b">
32 19
       <div class="container">
20
+        <div class="row">
21
+          <lightBox
22
+            :thumbnails="propertyImages"
23
+            :largeImages="propertyImages"
24
+            :caption="false"
25
+            class="lightBox"
26
+          />
27
+        </div>
33 28
         <div class="row">
34 29
           <div class="col-sm-12">
35
-            <div id="property-single-carousel" class="owl-carousel owl-arrow gallery-property">
36
-              <div class="carousel-item-b">
37
-                <img
38
-                  :src="propertyImages[0]"
39
-                  style="height:800px; width:1200px; object-fit: cover;"
40
-                />
41
-              </div>
42
-              <div class="carousel-item-b">
43
-                <img
44
-                  :src="propertyImages[1]"
45
-                  style="height:800px; width:1200px; object-fit: cover;"
46
-                />
47
-              </div>
48
-              <div class="carousel-item-b">
49
-                <img
50
-                  :src="propertyImages[2]"
51
-                  style="height:800px; width:1200px; object-fit: cover;"
52
-                />
53
-              </div>
54
-              <div class="carousel-item-b">
55
-                <img
56
-                  :src="propertyImages[3]"
57
-                  style="height:800px; width:1200px; object-fit: cover;"
58
-                />
59
-              </div>
60
-            </div>
61 30
             <div class="row justify-content-between">
62 31
               <div class="col-md-7 col-lg-7 section-md-t3">
63 32
                 <div class="row">
@@ -67,8 +36,8 @@
67 36
                     </div>
68 37
                   </div>
69 38
                 </div>
70
-                <div class="property-description" v-html="Property.description" />
71
-                <div v-for="display in Property.displayData">
39
+                <div class="property-description" v-html="property.description" />
40
+                <div v-for="display in property.displayData" :key="display.id">
72 41
                   <div class="row section-t3">
73 42
                     <div class="col-sm-12">
74 43
                       <div class="title-box-d">
@@ -77,7 +46,7 @@
77 46
                     </div>
78 47
                   </div>
79 48
                   <div class="summary-list">
80
-                    <ul class="list" v-for="item in display.values">
49
+                    <ul class="list" v-for="item in display.values" :key="item.id">
81 50
                       <li class="d-flex justify-content-between">
82 51
                         <strong>{{ item.name }}:</strong>
83 52
                         <span v-html="item.value"></span>
@@ -93,15 +62,15 @@
93 62
                       <span class="ion-money">R</span>
94 63
                     </div>
95 64
                     <div class="card-title-c align-self-center">
96
-                      <h5 class="title-c">{{ Property.price }}</h5>
65
+                      <h5 class="title-c">{{ formatPrice(property.price) }}</h5>
97 66
                     </div>
98 67
                   </div>
99 68
                 </div>
100 69
                 <div class="property-summary">
101
-                  <!-- <div class="row">
70
+                  <div class="row">
102 71
                     <div class="col-sm-12">
103 72
                       <div class="title-box-d section-t4">
104
-                        <h3 class="title-d">Quick Summary</h3>
73
+                        <h3 class="title-d">Summary</h3>
105 74
                       </div>
106 75
                     </div>
107 76
                   </div>
@@ -109,236 +78,142 @@
109 78
                     <ul class="list">
110 79
                       <li class="d-flex justify-content-between">
111 80
                         <strong>Property ID:</strong>
112
-                        <span>1134</span>
113
-                      </li>
114
-                      <li class="d-flex justify-content-between">
115
-                        <strong>Location:</strong>
116
-                        <span>Chicago, IL 606543</span>
117
-                      </li>
118
-                      <li class="d-flex justify-content-between">
119
-                        <strong>Property Type:</strong>
120
-                        <span>House</span>
81
+                        <span>{{ property.id }}</span>
121 82
                       </li>
122 83
                       <li class="d-flex justify-content-between">
123 84
                         <strong>Status:</strong>
124
-                        <span>Sale</span>
125
-                      </li>
126
-                      <li class="d-flex justify-content-between">
127
-                        <strong>Area:</strong>
128
-                        <span>
129
-                          340m
130
-                          <sup>2</sup>
131
-                        </span>
132
-                      </li>
133
-                      <li class="d-flex justify-content-between">
134
-                        <strong>Beds:</strong>
135
-                        <span>4</span>
85
+                        <span v-if="property.isSale">Sale</span>
86
+                        <span v-else>Rental</span>
136 87
                       </li>
137 88
                       <li class="d-flex justify-content-between">
138
-                        <strong>Baths:</strong>
139
-                        <span>2</span>
140
-                      </li>
141
-                      <li class="d-flex justify-content-between">
142
-                        <strong>Garage:</strong>
143
-                        <span>1</span>
144
-                      </li>
145
-                    </ul>
146
-                  </div>-->
147
-                </div>
148
-              </div>
149
-            </div>
150
-          </div>
151
-          <div class="col-md-10 offset-md-1">
152
-            <ul class="nav nav-pills-a nav-pills mb-3 section-t3" id="pills-tab" role="tablist">
153
-              <li class="nav-item">
154
-                <a
155
-                  class="nav-link active"
156
-                  id="pills-video-tab"
157
-                  data-toggle="pill"
158
-                  href="#pills-video"
159
-                  role="tab"
160
-                  aria-controls="pills-video"
161
-                  aria-selected="true"
162
-                >Video</a>
163
-              </li>
164
-              <li class="nav-item">
165
-                <a
166
-                  class="nav-link"
167
-                  id="pills-plans-tab"
168
-                  data-toggle="pill"
169
-                  href="#pills-plans"
170
-                  role="tab"
171
-                  aria-controls="pills-plans"
172
-                  aria-selected="false"
173
-                >Floor Plans</a>
174
-              </li>
175
-              <li class="nav-item">
176
-                <a
177
-                  class="nav-link"
178
-                  id="pills-map-tab"
179
-                  data-toggle="pill"
180
-                  href="#pills-map"
181
-                  role="tab"
182
-                  aria-controls="pills-map"
183
-                  aria-selected="false"
184
-                >Ubication</a>
185
-              </li>
186
-            </ul>
187
-            <div class="tab-content" id="pills-tabContent">
188
-              <div
189
-                class="tab-pane fade show active"
190
-                id="pills-video"
191
-                role="tabpanel"
192
-                aria-labelledby="pills-video-tab"
193
-              >
194
-                <iframe
195
-                  src="https://player.vimeo.com/video/73221098"
196
-                  width="100%"
197
-                  height="460"
198
-                  frameborder="0"
199
-                  webkitallowfullscreen
200
-                  mozallowfullscreen
201
-                  allowfullscreen
202
-                ></iframe>
203
-              </div>
204
-              <div
205
-                class="tab-pane fade"
206
-                id="pills-plans"
207
-                role="tabpanel"
208
-                aria-labelledby="pills-plans-tab"
209
-              >
210
-                <img src="img/plan2.jpg" alt class="img-fluid" />
211
-              </div>
212
-              <div
213
-                class="tab-pane fade"
214
-                id="pills-map"
215
-                role="tabpanel"
216
-                aria-labelledby="pills-map-tab"
217
-              >
218
-                <iframe
219
-                  src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3022.1422937950147!2d-73.98731968482413!3d40.75889497932681!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x89c25855c6480299%3A0x55194ec5a1ae072e!2sTimes+Square!5e0!3m2!1ses-419!2sve!4v1510329142834"
220
-                  width="100%"
221
-                  height="460"
222
-                  frameborder="0"
223
-                  style="border:0"
224
-                  allowfullscreen
225
-                ></iframe>
226
-              </div>
227
-            </div>
228
-          </div>
229
-          <div class="col-md-12">
230
-            <div class="row section-t3">
231
-              <div class="col-sm-12">
232
-                <div class="title-box-d">
233
-                  <h3 class="title-d">Contact Agent</h3>
234
-                </div>
235
-              </div>
236
-            </div>
237
-            <div class="row">
238
-              <div class="col-md-6 col-lg-4">
239
-                <img src="img/agent-4.jpg" alt class="img-fluid" />
240
-              </div>
241
-              <div class="col-md-6 col-lg-4">
242
-                <div class="property-agent">
243
-                  <h4 class="title-agent">Anabella Geller</h4>
244
-                  <p class="color-text-a">
245
-                    Nulla porttitor accumsan tincidunt. Vestibulum ac diam sit amet quam vehicula elementum sed sit amet
246
-                    dui. Quisque velit nisi,
247
-                    pretium ut lacinia in, elementum id enim.
248
-                  </p>
249
-                  <ul class="list-unstyled">
250
-                    <li class="d-flex justify-content-between">
251
-                      <strong>Phone:</strong>
252
-                      <span class="color-text-a">(222) 4568932</span>
253
-                    </li>
254
-                    <li class="d-flex justify-content-between">
255
-                      <strong>Mobile:</strong>
256
-                      <span class="color-text-a">777 287 378 737</span>
257
-                    </li>
258
-                    <li class="d-flex justify-content-between">
259
-                      <strong>Email:</strong>
260
-                      <span class="color-text-a">annabella@example.com</span>
261
-                    </li>
262
-                    <li class="d-flex justify-content-between">
263
-                      <strong>Skype:</strong>
264
-                      <span class="color-text-a">Annabela.ge</span>
265
-                    </li>
266
-                  </ul>
267
-                  <div class="socials-a">
268
-                    <ul class="list-inline">
269
-                      <li class="list-inline-item">
270
-                        <a href="#">
271
-                          <i class="fa fa-facebook" aria-hidden="true"></i>
272
-                        </a>
273
-                      </li>
274
-                      <li class="list-inline-item">
275
-                        <a href="#">
276
-                          <i class="fa fa-twitter" aria-hidden="true"></i>
277
-                        </a>
278
-                      </li>
279
-                      <li class="list-inline-item">
280
-                        <a href="#">
281
-                          <i class="fa fa-instagram" aria-hidden="true"></i>
282
-                        </a>
283
-                      </li>
284
-                      <li class="list-inline-item">
285
-                        <a href="#">
286
-                          <i class="fa fa-pinterest-p" aria-hidden="true"></i>
287
-                        </a>
288
-                      </li>
289
-                      <li class="list-inline-item">
290
-                        <a href="#">
291
-                          <i class="fa fa-dribbble" aria-hidden="true"></i>
292
-                        </a>
89
+                        <strong>Address:</strong>
90
+                        <span
91
+                          v-html="formatAddress(property.addressLine1) + formatAddress(property.addressLine2) + formatAddress(property.addressLine3) + formatAddress(property.suburb.description) + formatAddress(property.city.description) + formatAddress(property.province.description) "
92
+                        ></span>
293 93
                       </li>
294 94
                     </ul>
295 95
                   </div>
296 96
                 </div>
297
-              </div>
298
-              <div class="col-md-12 col-lg-4">
299
-                <div class="property-contact">
300
-                  <form class="form-a">
301
-                    <div class="row">
302
-                      <div class="col-md-12 mb-1">
303
-                        <div class="form-group">
304
-                          <input
305
-                            type="text"
306
-                            class="form-control form-control-lg form-control-a"
307
-                            id="inputName"
308
-                            placeholder="Name *"
309
-                            required
310
-                          />
311
-                        </div>
312
-                      </div>
313
-                      <div class="col-md-12 mb-1">
314
-                        <div class="form-group">
315
-                          <input
316
-                            type="email"
317
-                            class="form-control form-control-lg form-control-a"
318
-                            id="inputEmail1"
319
-                            placeholder="Email *"
320
-                            required
321
-                          />
322
-                        </div>
97
+                <div class="col-md-12">
98
+                  <div class="row section-t3">
99
+                    <div class="col-sm-12">
100
+                      <div class="title-box-d">
101
+                        <h3 class="title-d">Contact Agent</h3>
323 102
                       </div>
324
-                      <div class="col-md-12 mb-1">
325
-                        <div class="form-group">
326
-                          <textarea
327
-                            id="textMessage"
328
-                            class="form-control"
329
-                            placeholder="Comment *"
330
-                            name="message"
331
-                            cols="45"
332
-                            rows="8"
333
-                            required
334
-                          ></textarea>
103
+                    </div>
104
+                  </div>
105
+                  <div class="row">
106
+                    <div class="col-md-12">
107
+                      <img src="img/agent-4.jpg" alt class="img-fluid" />
108
+                    </div>
109
+                  </div>
110
+                  <div class="row">
111
+                    <div class="col-md-12">
112
+                      <div class="property-agent">
113
+                        <h4 class="title-agent">Anabella Geller</h4>
114
+                        <p class="color-text-a">
115
+                          Nulla porttitor accumsan tincidunt. Vestibulum ac diam sit amet quam vehicula elementum sed sit amet
116
+                          dui. Quisque velit nisi,
117
+                          pretium ut lacinia in, elementum id enim.
118
+                        </p>
119
+                        <ul class="list-unstyled">
120
+                          <li class="d-flex justify-content-between">
121
+                            <strong>Phone:</strong>
122
+                            <span class="color-text-a">(222) 4568932</span>
123
+                          </li>
124
+                          <li class="d-flex justify-content-between">
125
+                            <strong>Mobile:</strong>
126
+                            <span class="color-text-a">777 287 378 737</span>
127
+                          </li>
128
+                          <li class="d-flex justify-content-between">
129
+                            <strong>Email:</strong>
130
+                            <span class="color-text-a">annabella@example.com</span>
131
+                          </li>
132
+                          <li class="d-flex justify-content-between">
133
+                            <strong>Skype:</strong>
134
+                            <span class="color-text-a">Annabela.ge</span>
135
+                          </li>
136
+                        </ul>
137
+                        <div class="socials-a">
138
+                          <ul class="list-inline">
139
+                            <li class="list-inline-item">
140
+                              <a href="#">
141
+                                <i class="fa fa-facebook" aria-hidden="true"></i>
142
+                              </a>
143
+                            </li>
144
+                            <li class="list-inline-item">
145
+                              <a href="#">
146
+                                <i class="fa fa-twitter" aria-hidden="true"></i>
147
+                              </a>
148
+                            </li>
149
+                            <li class="list-inline-item">
150
+                              <a href="#">
151
+                                <i class="fa fa-instagram" aria-hidden="true"></i>
152
+                              </a>
153
+                            </li>
154
+                            <li class="list-inline-item">
155
+                              <a href="#">
156
+                                <i class="fa fa-pinterest-p" aria-hidden="true"></i>
157
+                              </a>
158
+                            </li>
159
+                            <li class="list-inline-item">
160
+                              <a href="#">
161
+                                <i class="fa fa-dribbble" aria-hidden="true"></i>
162
+                              </a>
163
+                            </li>
164
+                          </ul>
335 165
                         </div>
336 166
                       </div>
337
-                      <div class="col-md-12">
338
-                        <button type="submit" class="btn btn-a">Send Message</button>
167
+                    </div>
168
+                  </div>
169
+                  <div class="row">
170
+                    <div class="col-md-12">
171
+                      <div class="property-contact">
172
+                        <form class="form-a">
173
+                          <div class="row">
174
+                            <div class="col-md-12 mb-1">
175
+                              <div class="form-group">
176
+                                <input
177
+                                  type="text"
178
+                                  class="form-control form-control-lg form-control-a"
179
+                                  id="inputName"
180
+                                  placeholder="Name *"
181
+                                  required
182
+                                />
183
+                              </div>
184
+                            </div>
185
+                            <div class="col-md-12 mb-1">
186
+                              <div class="form-group">
187
+                                <input
188
+                                  type="email"
189
+                                  class="form-control form-control-lg form-control-a"
190
+                                  id="inputEmail1"
191
+                                  placeholder="Email *"
192
+                                  required
193
+                                />
194
+                              </div>
195
+                            </div>
196
+                            <div class="col-md-12 mb-1">
197
+                              <div class="form-group">
198
+                                <textarea
199
+                                  id="textMessage"
200
+                                  class="form-control"
201
+                                  placeholder="Comment *"
202
+                                  name="message"
203
+                                  cols="45"
204
+                                  rows="8"
205
+                                  required
206
+                                ></textarea>
207
+                              </div>
208
+                            </div>
209
+                            <div class="col-md-12">
210
+                              <button type="submit" class="btn btn-a">Send Message</button>
211
+                            </div>
212
+                          </div>
213
+                        </form>
339 214
                       </div>
340 215
                     </div>
341
-                  </form>
216
+                  </div>
342 217
                 </div>
343 218
               </div>
344 219
             </div>
@@ -350,25 +225,48 @@
350 225
 </template>
351 226
 
352 227
 <script>
228
+import { mapState, mapActions } from 'vuex';
229
+import lightBox from '../shared/lightBoxGallery.vue';
230
+
353 231
 export default {
354
-  name: "Property",
232
+  name: 'property',
233
+  components: {
234
+    lightBox,
235
+  },
355 236
   data() {
356
-    return {
357
-      Property: {},
358
-      propertyImages: []
359
-    };
237
+    return {};
238
+  },
239
+  mounted() {
240
+    this.getProperty(Object.assign({}, { id: this.$route.params.id }));
241
+    this.getPropertyImages(Object.assign({}, { id: this.$route.params.id }));
242
+  },
243
+  computed: {
244
+    ...mapState('property', ['property', 'propertyImages']),
245
+  },
246
+  methods: {
247
+    ...mapActions('property', ['getProperty', 'getPropertyImages']),
248
+    formatPrice(value) {
249
+      const val = (value / 1).toFixed(2);
250
+      return val.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ' ');
251
+    },
252
+    formatAddress(value) {
253
+      if (value !== '') {
254
+        return `${value}<br/>`;
255
+      }
256
+      return '';
257
+    },
360 258
   },
361
-  created() {
362
-    const axios = require("axios");
363
-    axios
364
-      .get(`http://localhost:57260/Property/Property/${this.$route.params.id}`)
365
-      .then(response => (this.Property = response.data));
366
-
367
-    axios
368
-      .get(
369
-        `http://localhost:57260/property/PropertyImage/getpropertyimages/${this.$route.params.id}`
370
-      )
371
-      .then(response => (this.propertyImages = response.data));
372
-  }
373 259
 };
374 260
 </script>
261
+
262
+<style lang ="scss">
263
+.light-box {
264
+  &__thumbnail {
265
+    margin: 20px;
266
+    width: 200px;
267
+  }
268
+}
269
+img {
270
+  max-width: 100%;
271
+}
272
+</style>

+ 148
- 0
src/components/property/propertySearchFields.vue Visa fil

@@ -0,0 +1,148 @@
1
+<template>
2
+  <div>
3
+    <div class="col-md-6 mb-2">
4
+      <div class="form-group">
5
+        <label for="city">For:</label>
6
+        <select
7
+          class="form-control form-control-lg form-control-a"
8
+          id="forSelector"
9
+          v-model="selectedType"
10
+          @change="TypeSelected"
11
+        >
12
+          <option value="Sale">Sale</option>
13
+          <option value="Rent">Rent</option>
14
+        </select>
15
+      </div>
16
+      <div class="form-group" v-if="propertyType === 'Residential'">
17
+        <label for="city">Property Type</label>
18
+        <select
19
+          class="form-control form-control-lg form-control-a"
20
+          id="forSelector"
21
+          v-model="selectedPropertyTypeRes"
22
+          @change="PropertyTypeSelected"
23
+        >
24
+          <option>All</option>
25
+          <option
26
+            v-for="(propertyType, i) in propertyTypesRes"
27
+            :key="i"
28
+          >{{ propertyType.description }}</option>
29
+        </select>
30
+      </div>
31
+      <div v-else class="form-group">
32
+        <label for="city">Property Type</label>
33
+        <select
34
+          class="form-control form-control-lg form-control-a"
35
+          id="forSelector"
36
+          v-model="selectedPropertyTypeCom"
37
+          @change="PropertyTypeSelected"
38
+        >
39
+          <option>All</option>
40
+          <option
41
+            v-for="(propertyType, i) in propertyTypesCom"
42
+            :key="i"
43
+          >{{ propertyType.description }}</option>
44
+        </select>
45
+      </div>
46
+      <div class="form-group">
47
+        <label for="city">Provice</label>
48
+        <select
49
+          class="form-control form-control-lg form-control-a"
50
+          id="provinceselector"
51
+          @change="ProvinceSelected"
52
+          v-model="selectedProvince"
53
+        >
54
+          <option>All</option>
55
+          <option v-for="(province, i) in provinces" :key="i">{{ province.description }}</option>
56
+        </select>
57
+      </div>
58
+    </div>
59
+    <div class="col-md-6 mb-2">
60
+      <div class="form-group">
61
+        <label for="city">City</label>
62
+        <select
63
+          class="form-control form-control-lg form-control-a"
64
+          id="cityselector"
65
+          @change="CitySelected"
66
+          v-model="selectedCity"
67
+        >
68
+          <option>All</option>
69
+          <option v-for="(city, i) in cities" :key="i">{{ city.description }}</option>
70
+        </select>
71
+      </div>
72
+    </div>
73
+    <div class="col-md-6 mb-2">
74
+      <div class="form-group">
75
+        <label for="city">Suburb</label>
76
+        <select
77
+          class="form-control form-control-lg form-control-a"
78
+          id="suburbselector"
79
+          v-model="selectedSuburb"
80
+          @change="SuburbSelected"
81
+        >
82
+          <option>All</option>
83
+          <option v-for="(suburb, i) in suburbs" :key="i">{{ suburb.description }}</option>
84
+        </select>
85
+      </div>
86
+    </div>
87
+  </div>
88
+</template>
89
+
90
+<script>
91
+import { mapState, mapActions } from 'vuex';
92
+
93
+export default {
94
+  props: {
95
+    propertyType: String,
96
+  },
97
+  data() {
98
+    return {
99
+      selectedType: 'Sale',
100
+      selectedProvince: 'All',
101
+      selectedCity: 'All',
102
+      selectedSuburb: 'All',
103
+      selectedPropertyTypeRes: 'All',
104
+      selectedPropertyTypeCom: 'All',
105
+    };
106
+  },
107
+  mounted() {
108
+    this.getProvince();
109
+    this.$emit('TypeSelectedUpdated', this.selectedType);
110
+    this.getPropertyTypesRes();
111
+    this.getPropertyTypesCom();
112
+  },
113
+  computed: {
114
+    ...mapState('searchTab', ['provinces', 'cities', 'suburbs']),
115
+    ...mapState('property', ['propertyTypesRes', 'propertyTypesCom']),
116
+  },
117
+  methods: {
118
+    ...mapActions('searchTab', ['getProvince', 'getCities', 'getSuburbs']),
119
+    ...mapActions('property', ['getPropertyTypesRes', 'getPropertyTypesCom']),
120
+    TypeSelected(item) {
121
+      this.$emit('TypeSelectedUpdated', item.target.value);
122
+    },
123
+    PropertyTypeSelected(item) {
124
+      this.$emit('PropertyTypeSelectedUpdated', item.target.value);
125
+    },
126
+    ProvinceSelected(item) {
127
+      if (item.target.value !== 'All') {
128
+        this.getCities(Object.assign({}, { province: this.selectedProvince }));
129
+      }
130
+      this.$emit('ProvinceSelectedUpdated', item.target.value);
131
+    },
132
+    CitySelected(item) {
133
+      if (item.target.value !== 'All') {
134
+        this.getSuburbs(
135
+          Object.assign(
136
+            {},
137
+            { province: this.selectedProvince, city: this.selectedCity },
138
+          ),
139
+        );
140
+      }
141
+      this.$emit('CitySelectedUpdated', item.target.value);
142
+    },
143
+    SuburbSelected(item) {
144
+      this.$emit('SuburbSelectedUpdated', item.target.value);
145
+    },
146
+  },
147
+};
148
+</script>

+ 62
- 37
src/components/property/propertySearchPage.vue Visa fil

@@ -8,12 +8,12 @@
8 8
     <br />
9 9
     <div>
10 10
       <propertyCard
11
-        v-if="Properties.length > 0"
11
+        v-if="properties.length > 0"
12 12
         name="propertyholder"
13
-        :properties="Properties"
13
+        :properties="properties"
14 14
         :key="propertysearch"
15 15
       />
16
-      <div v-if="Properties.length === 0">
16
+      <div v-if="properties.length === 0">
17 17
         <img src="../../../public/img/no-homes.gif" />
18 18
         <br />
19 19
         <br />
@@ -96,26 +96,35 @@
96 96
   </div>
97 97
 </template>
98 98
 <script>
99
-import propertyCard from "../property/propertyCard.vue";
100
-import { isNull } from "util";
99
+import { mkdir } from 'fs';
100
+import { mapState, mapActions } from 'vuex';
101
+import propertyCard from './propertyCard.vue';
101 102
 
102 103
 export default {
103
-  name: "propertysearch",
104
+  name: 'propertysearch',
104 105
   components: {
105
-    propertyCard
106
+    propertyCard,
106 107
   },
107 108
   data() {
108 109
     return {
109
-      Properties: [],
110
-      type: "",
111
-      propertyType: "",
112
-      propertyTypeparam: "",
113
-      province: "",
114
-      city: "",
115
-      suburb: ""
110
+      type: '',
111
+      propertyType: '',
112
+      propertyTypeparam: '',
113
+      province: '',
114
+      city: '',
115
+      suburb: '',
116
+      proptype: '',
117
+      keyword: '',
116 118
     };
117 119
   },
120
+  methods: {
121
+    ...mapActions('property', [
122
+      'searchPropertiesParams',
123
+      'searchPropertiesKeyword',
124
+    ]),
125
+  },
118 126
   computed: {
127
+    ...mapState('property', ['properties']),
119 128
     ParamsChanged() {
120 129
       this.propertyTypeparam = this.$route.params.propertyType;
121 130
       this.type = this.$route.query.type;
@@ -123,42 +132,58 @@ export default {
123 132
       this.province = this.$route.query.province;
124 133
       this.city = this.$route.query.city;
125 134
       this.suburb = this.$route.query.suburb;
135
+      this.proptype = this.$route.query.propType;
136
+      this.keyword = this.$route.query.keyword;
126 137
 
127
-      if (typeof this.propertyType === "undefined") {
138
+      if (typeof this.propertyType === 'undefined') {
128 139
         this.propertyType = this.propertyTypeparam;
129 140
       }
130 141
 
131
-      let search = "";
132
-      if (this.type !== "") {
133
-        search = search + "type:" + this.type;
142
+      if (this.type === '') {
143
+        this.type = 'undefined';
134 144
       }
135
-      if (this.propertyType !== "") {
136
-        search = search + "|propertyType:" + this.propertyType;
145
+      if (this.propertyType === '') {
146
+        this.propertyType = 'undefined';
137 147
       }
138
-      if (this.province !== "") {
139
-        search = search + "|province:" + this.province;
148
+      if (this.province === '') {
149
+        this.province = 'undefined';
140 150
       }
141
-      if (this.city !== "") {
142
-        search = search + "|city:" + this.city;
151
+      if (this.city === '') {
152
+        this.city = 'undefined';
143 153
       }
144
-      if (this.suburb !== "") {
145
-        search = search + "|suburb:" + this.suburb;
154
+      if (this.suburb === '') {
155
+        this.suburb = 'undefined';
156
+      }
157
+      if (this.proptype === '') {
158
+        this.propType = 'undefined';
159
+      }
160
+      if (typeof this.keyword === 'undefined' || this.keyword === '') {
161
+        this.searchPropertiesParams(
162
+          Object.assign(
163
+            {},
164
+            {
165
+              type: this.type,
166
+              propertyType: this.propertyType,
167
+              province: this.province,
168
+              city: this.city,
169
+              suburb: this.suburb,
170
+              propType: this.proptype,
171
+            },
172
+          ),
173
+        );
174
+      } else {
175
+        this.searchPropertiesKeyword(
176
+          Object.assign({}, { keyword: this.keyword }),
177
+        );
146 178
       }
147 179
 
148
-      console.log(search);
149
-
150
-      const axios = require("axios");
151
-      axios
152
-        .get(
153
-          `http://localhost:57260/Property/Property/Search/${this.type}/${this.propertyType}/${this.province}/${this.city}/${this.suburb}`
154
-        )
155
-        .then(response => (this.Properties = response.data));
156
-    }
180
+      return null;
181
+    },
157 182
   },
158 183
   watch: {
159 184
     ParamsChanged() {
160 185
       console.log(JSON.stringify(this.$route.query));
161
-    }
162
-  }
186
+    },
187
+  },
163 188
 };
164 189
 </script>

+ 27
- 3
src/components/property/propertyUserField.vue Visa fil

@@ -1,6 +1,6 @@
1 1
 <template>
2 2
   <div class="form-group row">
3
-    <div class="col-md-4 mb-2" v-for="currentField in fields">
3
+    <div class="col-md-4 mb-2" v-for="(currentField, i) in fields" :key="i">
4 4
       <label>{{ currentField.name }}</label>
5 5
       <input
6 6
         v-if="currentField.type === 'number'"
@@ -8,6 +8,8 @@
8 8
         type="number"
9 9
         name="currentField.name"
10 10
         id="currentField.id"
11
+        v-model="setFields[i]"
12
+        @change="UpdateSetFields(currentField, i)"
11 13
       />
12 14
       <input
13 15
         v-if="currentField.type === 'text'"
@@ -15,10 +17,16 @@
15 17
         type="text"
16 18
         name="currentField.name"
17 19
         id="currentField.id"
20
+        v-model="setFields[i]"
21
+        @change="UpdateSetFields(currentField, i)"
18 22
       />
19 23
       <div v-if="currentField.type === 'yesno'">
20
-        <select class="form-control form-control-lg form-control-a" id="currentField.id">
21
-          <option>Please Select</option>
24
+        <select
25
+          class="form-control form-control-lg form-control-a"
26
+          id="currentField.id"
27
+          v-model="setFields[i]"
28
+          @change="UpdateSetFields(currentField, i)"
29
+        >
22 30
           <option value="yes">Yes</option>
23 31
           <option value="no">No</option>
24 32
         </select>
@@ -29,8 +37,24 @@
29 37
 
30 38
 <script>
31 39
 export default {
40
+  name: 'UserDefinedField',
32 41
   props: {
33 42
     fields: [],
43
+    SetFieldValue: Function,
44
+  },
45
+  data() {
46
+    return {
47
+      setFields: [],
48
+    };
49
+  },
50
+  methods: {
51
+    UpdateSetFields(field, index) {
52
+      const item = {
53
+        userDefinedFieldId: field.id,
54
+        value: this.setFields[index],
55
+      };
56
+      this.$emit('UpdateUserDefinedFields', item);
57
+    },
34 58
   },
35 59
 };
36 60
 </script>

+ 94
- 117
src/components/property/propertyeditPage.vue Visa fil

@@ -41,19 +41,21 @@
41 41
                 </select>
42 42
               </div>
43 43
               <div v-if="propertyType === 'Commercial'" class="col-md-4">
44
-                <label>Property Name</label>
44
+                <label for="Property Name"></label>
45 45
                 <input
46
-                  class="form-control form-control-lg form-control-a"
46
+                  class="form-control"
47 47
                   type="text"
48
+                  placeholder="Property Name"
48 49
                   name="propertyName"
49 50
                   id="propertyName"
50 51
                   v-model="property.propertyName"
51 52
                 />
52 53
               </div>
53 54
               <div v-if="propertyType === 'Commercial'" class="col-md-4">
54
-                <label>Unit</label>
55
+                <label for="Unit"></label>
55 56
                 <input
56
-                  class="form-control form-control-lg form-control-a"
57
+                  class="form-control"
58
+                  placeholder="Unit"
57 59
                   type="text"
58 60
                   name="unit"
59 61
                   id="unit"
@@ -178,26 +180,20 @@
178 180
             <div class="form-group row">
179 181
               <div class="col-md-12">
180 182
                 <label for="Property Description"></label>
181
-                <textarea
182
-                  class="form-control editor"
183
-                  placeholder="Property Description"
184
-                  name="description"
185
-                  v-model="property.description"
186
-                  id="description"
187
-                ></textarea>
183
+                <TextEditor name="description" v-model="property.description" id="description" />
188 184
                 <br />
189 185
                 <p>* A listing fee of R380 including VAT is payable to list your Property on the Uni-Vate website</p>
190 186
               </div>
191 187
             </div>
192 188
             <div class="form-group row" />
193 189
             <UserField
194
-              v-if="ApiRunning & propertyType === 'Residential'"
195
-              :fields="propValuesProp[0].fields"
190
+              v-if="propertyType === 'Residential' & propertyOverviewFields.length > 0"
191
+              :fields="propertyOverviewFields[0].fields"
196 192
               :id="overviewProps"
197 193
               @UpdateUserDefinedFields="UpdateUserDefinedFields"
198 194
             ></UserField>
199 195
             <div class="form-group row" />
200
-            <div v-for="item in propertyValues" :key="item.id">
196
+            <div v-for="item in propertyFields" :key="item.id">
201 197
               <div class="row">
202 198
                 <div class="col-sm-12">
203 199
                   <div class="title-box-d">
@@ -220,13 +216,12 @@
220 216
               </div>
221 217
             </div>
222 218
             <ImageLoad :loadedImages="loadedImages" />
223
-            <button type="button" @click="SubmitData()" class="btn btn-a">Save</button>
224
-            <!-- <router-link
225
-              to="/property/search"
226
-              @click.stop.prevent="SubmitData()"
227
-              class="btn btn-b"
228
-              tag="button"
229
-            >Save</router-link>-->
219
+            <button
220
+              type="button"
221
+              @click="SubmitData()"
222
+              class="btn btn-b-n"
223
+              style="width: 85px; height:40px;"
224
+            >Save</button>
230 225
           </form>
231 226
         </div>
232 227
       </div>
@@ -235,75 +230,69 @@
235 230
 </template>
236 231
 
237 232
 <script>
238
-import UserField from "./propertyUserField.vue";
239
-import ImageLoad from "./propertyImage.vue";
240
-// https://vuejsexamples.com/a-vue-wrapper-around-the-trix-rich-text-editor/
233
+import { mapState, mapActions } from 'vuex';
234
+import TextEditor from 'vue-trix';
235
+import UserField from './propertyUserField.vue';
236
+import ImageLoad from './propertyImage.vue';
237
+
241 238
 export default {
242
-  name: "PropertyEdit",
239
+  name: 'PropertyEdit',
243 240
   components: {
244 241
     UserField,
245
-    ImageLoad
242
+    ImageLoad,
243
+    TextEditor,
246 244
   },
247 245
   data() {
248 246
     return {
249
-      ApiRunning: true,
250
-      propertyType: "Residential",
251
-      salesType: "Rental",
252
-      imageFile: "",
253
-      provinces: [],
254
-      cities: [],
255
-      suburbs: [],
256
-      propertyValues: [],
257
-      propValuesProp: [],
258
-      propertyTypes: [],
259
-      selectedProvince: "",
260
-      selectedCity: "",
247
+      propertyType: 'Residential',
248
+      salesType: 'Rental',
249
+      selectedProvince: '',
250
+      selectedCity: '',
261 251
       property: {
262 252
         propertyTypeId: 0,
263
-        propertyName: "",
264
-        unit: "",
265
-        addressLine1: "",
266
-        addressLine2: "",
267
-        addressLine3: "",
253
+        propertyName: '',
254
+        unit: '',
255
+        addressLine1: '',
256
+        addressLine2: '',
257
+        addressLine3: '',
268 258
         suburbId: 0,
269 259
         cityId: 0,
270 260
         provinceId: 0,
271
-        price: "",
272
-        per: "",
273
-        description: "",
261
+        price: '',
262
+        per: '',
263
+        description: '',
274 264
         isSale: false,
275 265
         propertyUserFields: [],
276
-        propertyImages: []
266
+        propertyImages: [],
277 267
       },
278 268
       images: [],
279
-      propertyFieldValues: []
269
+      propertyFieldValues: [],
280 270
     };
281 271
   },
282 272
   methods: {
273
+    ...mapActions('searchTab', ['getProvince', 'getCities', 'getSuburbs']),
274
+    ...mapActions('property', [
275
+      'getPropertyTypes',
276
+      'getPropertyOverviewFields',
277
+      'getPropertyFields',
278
+      'saveProperty',
279
+    ]),
283 280
     SubmitData() {
284
-      // let isDefault = true;
285
-      // this.images.forEach((imagedata) => {
286
-      //   this.property.propertyImages.push({
287
-      //     image: imagedata,
288
-      //     isDefault,
289
-      //   });
290
-      //   isDefault = false;
291
-      // });
292
-
293
-      // this.property.propertyUserFields = this.propertyFieldValues;
281
+      let isDefault = true;
282
+      this.images.forEach((imagedata) => {
283
+        this.property.propertyImages.push({
284
+          image: imagedata,
285
+          isDefault,
286
+        });
287
+        isDefault = false;
288
+      });
289
+      this.property.propertyUserFields = this.propertyFieldValues;
294 290
 
295
-      // const axios = require('axios');
296
-      // axios
297
-      //   .post('http://localhost:57260/Property/Property', this.property)
298
-      //   .then((response) => {})
299
-      //   .catch((e) => {
300
-      //     alert(e);
301
-      //   });
291
+      this.saveProperty(Object.assign({}, { newProperty: this.property }));
302 292
 
303
-      // this.$router.push("/property/search");
304 293
       this.$router.push({
305
-        path: "/property/search",
306
-        query: { type: this.salesType, propertyType: this.propertyType }
294
+        path: '/property/search',
295
+        query: { type: this.salesType, propertyType: this.propertyType },
307 296
       });
308 297
     },
309 298
     ProvinceSelected(item) {
@@ -311,12 +300,7 @@ export default {
311 300
         this.selectedProvince = this.provinces[
312 301
           item.target.options.selectedIndex - 1
313 302
         ].description;
314
-        const axios = require("axios");
315
-        axios
316
-          .get(
317
-            `http://localhost:57260/region/city/getby/${this.selectedProvince}`
318
-          )
319
-          .then(response => (this.cities = response.data));
303
+        this.getCities(Object.assign({}, { province: this.selectedProvince }));
320 304
       }
321 305
     },
322 306
     CitySelected(item) {
@@ -324,12 +308,12 @@ export default {
324 308
         this.selectedCity = this.cities[
325 309
           item.target.options.selectedIndex - 1
326 310
         ].description;
327
-        const axios = require("axios");
328
-        axios
329
-          .get(
330
-            `http://localhost:57260/region/Suburb/${this.selectedProvince}/${this.selectedCity}`
331
-          )
332
-          .then(response => (this.suburbs = response.data));
311
+        this.getSuburbs(
312
+          Object.assign(
313
+            {},
314
+            { province: this.selectedProvince, city: this.selectedCity },
315
+          ),
316
+        );
333 317
       }
334 318
     },
335 319
     loadedImages(values) {
@@ -337,7 +321,7 @@ export default {
337 321
     },
338 322
     UpdateUserDefinedFields(item) {
339 323
       let update = false;
340
-      this.propertyFieldValues.forEach(element => {
324
+      this.propertyFieldValues.forEach((element) => {
341 325
         if (element.userDefinedFieldId === item.userDefinedFieldId) {
342 326
           element.value = item.value;
343 327
           update = true;
@@ -346,56 +330,49 @@ export default {
346 330
       if (!update) {
347 331
         this.propertyFieldValues.push(item);
348 332
       }
349
-    }
333
+    },
350 334
   },
351 335
   mounted() {
352 336
     this.propertyType = this.$route.params.propType;
353 337
     this.salesType = this.$route.params.saleType;
354 338
 
355
-    const axios = require("axios");
356
-    axios
357
-      .get("http://localhost:57260/Property/PropertyFields/Property Overview")
358
-      .then(response => (this.propValuesProp = response.data));
359
-
360
-    axios
361
-      .get(
362
-        `http://localhost:57260/property/propertyfields/Propertytype/${this.propertyType}`
363
-      )
364
-      .then(response => (this.propertyValues = response.data));
365
-
366
-    axios
367
-      .get(
368
-        `http://localhost:57260/Property/PropertyType/type/${this.propertyType}`
369
-      )
370
-      .then(response => (this.propertyTypes = response.data));
371
-
372
-    axios
373
-      .get("http://localhost:57260/region/province")
374
-      .then(response => (this.provinces = response.data));
339
+    this.getProvince();
340
+    this.getPropertyTypes(
341
+      Object.assign({}, { propertyType: this.$route.params.propType }),
342
+    );
343
+    this.getPropertyOverviewFields();
344
+    this.getPropertyFields(
345
+      Object.assign({}, { propertyType: this.$route.params.propType }),
346
+    );
375 347
   },
376 348
   computed: {
349
+    ...mapState('searchTab', ['provinces', 'cities', 'suburbs']),
350
+    ...mapState('property', [
351
+      'propertyTypes',
352
+      'propertyOverviewFields',
353
+      'propertyFields',
354
+    ]),
377 355
     SalesTypeChanged() {
356
+      // eslint-disable-next-line vue/no-side-effects-in-computed-properties
378 357
       this.propertyType = this.$route.params.propType;
358
+      // eslint-disable-next-line vue/no-side-effects-in-computed-properties
379 359
       this.salesType = this.$route.params.saleType;
380 360
 
381
-      const axios = require("axios");
382
-      axios
383
-        .get(
384
-          `http://localhost:57260/Property/PropertyType/type/${this.propertyType}`
385
-        )
386
-        .then(response => (this.propertyTypes = response.data));
361
+      this.getPropertyTypes(
362
+        Object.assign({}, { propertyType: this.$route.params.propType }),
363
+      );
364
+
365
+      this.getPropertyFields(
366
+        Object.assign({}, { propertyType: this.$route.params.propType }),
367
+      );
387 368
 
388
-      axios
389
-        .get(
390
-          `http://localhost:57260/property/propertyfields/Propertytype/${this.propertyType}`
391
-        )
392
-        .then(response => (this.propertyValues = response.data));
393
-    }
369
+      return this.propertyType;
370
+    },
394 371
   },
395 372
   watch: {
396 373
     SalesTypeChanged() {
397 374
       console.log(this.salesType);
398
-    }
399
-  }
375
+    },
376
+  },
400 377
 };
401
-</script>
378
+</script>

+ 7
- 7
src/components/shared/footerSection.vue Visa fil

@@ -74,7 +74,7 @@
74 74
               </div>
75 75
               <div class="w-body-a">
76 76
                 <ul class="list-unstyled">
77
-                  <li class="item-list-a">
77
+                  <li class="item-list-a" style="margin-bottom: 1em">
78 78
                     <a href="https:\\www.daelive.com">
79 79
                       <img
80 80
                         class="img-fluid"
@@ -84,8 +84,8 @@
84 84
                       />
85 85
                     </a>
86 86
                   </li>
87
-                  <br />
88
-                  <li class="item-list-a">
87
+
88
+                  <li class="item-list-a" style="margin-bottom: 1em">
89 89
                     <a href="https:\\www.gomelo.co.za">
90 90
                       <img
91 91
                         class="img-fluid"
@@ -95,8 +95,8 @@
95 95
                       />
96 96
                     </a>
97 97
                   </li>
98
-                  <br />
99
-                  <li class="item-list-a">
98
+
99
+                  <li class="item-list-a" style="margin-bottom: 1em">
100 100
                     <a href="https:\\www.rci.co.za">
101 101
                       <img
102 102
                         class="img-fluid"
@@ -106,8 +106,8 @@
106 106
                       />
107 107
                     </a>
108 108
                   </li>
109
-                  <br />
110
-                  <li class="item-list-a">
109
+
110
+                  <li class="item-list-a" style="margin-bottom: 1em">
111 111
                     <a href="https:\\www.voasa.co.za">
112 112
                       <img
113 113
                         class="img-fluid"

+ 201
- 0
src/components/shared/lightBoxGallery.vue Visa fil

@@ -0,0 +1,201 @@
1
+<template>
2
+  <div class="scrolling-wrapper">
3
+    <img
4
+      @click="lightboxEffect(index)"
5
+      v-for="(thumbnail, index) in thumbnails"
6
+      :key="thumbnail"
7
+      :src="thumbnail"
8
+      style="height:150px; width:150px; object-fit: cover;"
9
+      class="light-box__thumbnail"
10
+    />
11
+    <transition name="fade" mode="out-in">
12
+      <div @click.stop="bg = !bg" class="light-box__bg" v-if="bg"></div>
13
+    </transition>
14
+
15
+    <div v-if="bg">
16
+      <div class="light-box__close" @click.stop="bg = !bg"></div>
17
+      <p class="light-box__count" v-if="count">
18
+        {{currentImage + 1 }}/
19
+        <span>{{ thumbnails.length}}</span>
20
+      </p>
21
+      <div @click="prev" class="light-box__prev light-box__btn"></div>
22
+
23
+      <div v-if="bg" class="light-box__container">
24
+        <transition name="fade" mode="out-in">
25
+          <img
26
+            :key="currentImage"
27
+            :src="largeImages[currentImage]"
28
+            class="light-box__container__img"
29
+          />
30
+        </transition>
31
+      </div>
32
+
33
+      <div class="light-box__caption" v-if="caption">
34
+        <p v-if="captions[currentImage]">{{ captions[currentImage]}}</p>
35
+      </div>
36
+
37
+      <div @click="next" class="light-box__next light-box__btn"></div>
38
+    </div>
39
+  </div>
40
+</template>
41
+
42
+<script>
43
+export default {
44
+  data() {
45
+    return {
46
+      bg: false,
47
+      currentImage: 0,
48
+      count: true
49
+    };
50
+  },
51
+  props: {
52
+    thumbnails: {
53
+      type: Array,
54
+      required: true
55
+    },
56
+    largeImages: {
57
+      type: Array,
58
+      required: true
59
+    },
60
+    captions: {
61
+      type: Array,
62
+      required: true
63
+    },
64
+    thumbnailsPath: {
65
+      type: String,
66
+      required: true
67
+    },
68
+    largePath: {
69
+      type: String,
70
+      required: true
71
+    },
72
+    caption: true
73
+  },
74
+  methods: {
75
+    lightboxEffect(curr) {
76
+      this.currentImage = curr;
77
+      this.bg = !this.bg;
78
+    },
79
+    next() {
80
+      if (this.currentImage < this.largeImages.length - 1) {
81
+        // eslint-disable-next-line no-plusplus
82
+        this.currentImage++;
83
+      } else {
84
+        this.currentImage = 0;
85
+      }
86
+    },
87
+    prev() {
88
+      if (this.currentImage > 0) {
89
+        // eslint-disable-next-line no-plusplus
90
+        this.currentImage--;
91
+      } else {
92
+        this.currentImage = this.largeImages.length - 1;
93
+      }
94
+    }
95
+  }
96
+};
97
+</script>
98
+
99
+<style lang="scss">
100
+.fade-enter-active,
101
+.fade-leave-active {
102
+  transition: opacity 0.2s;
103
+}
104
+.fade-enter,
105
+.fade-leave-to {
106
+  opacity: 0;
107
+}
108
+.light-box {
109
+  &__bg {
110
+    position: fixed;
111
+    left: 0;
112
+    top: 0;
113
+    right: 0;
114
+    bottom: 0;
115
+    background-color: rgba(0, 0, 0, 0.89);
116
+    z-index: 1000;
117
+  }
118
+
119
+  &__thumbnail {
120
+    cursor: pointer;
121
+  }
122
+
123
+  &__close {
124
+    padding: 10px;
125
+    position: absolute;
126
+    right: 5px;
127
+    top: 10px;
128
+    background-image: url(../../../public/img/ligthbox/close.svg);
129
+    background-size: contain;
130
+    background-position: center;
131
+  }
132
+  &__container {
133
+    position: absolute;
134
+    z-index: 2000;
135
+    display: flex;
136
+    justify-content: center;
137
+    align-items: center;
138
+    max-width: 700px;
139
+    left: 50%;
140
+    top: 50%;
141
+    transform: translate(-50%, -50%);
142
+    min-height: 800px;
143
+    img {
144
+      align-self: center;
145
+    }
146
+  }
147
+  &__btn {
148
+    background-size: contain;
149
+    background-position: center;
150
+    align-self: center;
151
+    padding: 15px;
152
+  }
153
+
154
+  &__close,
155
+  &__btn {
156
+    cursor: pointer;
157
+  }
158
+
159
+  &__close,
160
+  &__btn,
161
+  &__caption,
162
+  &__count {
163
+    position: absolute;
164
+    z-index: 3000;
165
+  }
166
+
167
+  &__next {
168
+    background-image: url(../../../public/img/ligthbox/next.svg);
169
+    right: 20px;
170
+  }
171
+  &__prev {
172
+    background-image: url(../../../public/img/ligthbox/prev.svg);
173
+    left: 20px;
174
+  }
175
+  &__next,
176
+  &__prev {
177
+    top: 50%;
178
+    transform: translateY(-50%);
179
+  }
180
+
181
+  &__caption {
182
+    bottom: 0;
183
+    width: 100%;
184
+    height: 50px;
185
+    display: flex;
186
+    align-items: center;
187
+    color: #fff;
188
+    font-size: 20px;
189
+    justify-content: center;
190
+  }
191
+
192
+  &__count {
193
+    left: 20px;
194
+    font-size: 16px;
195
+    color: #fff;
196
+    top: 14px;
197
+    padding: 0;
198
+    margin: 0;
199
+  }
200
+}
201
+</style>

+ 9
- 13
src/components/shared/navBar.vue Visa fil

@@ -151,28 +151,24 @@
151 151
               <a class="dropdown-item cursor-pointer" @click="routerGoTo('/status/list')">Status</a>
152 152
               <a
153 153
                 class="dropdown-item cursor-pointer"
154
-                @click="routerGoTo('/status/list')"
154
+                @click="routerGoTo('/status/timeshareAdmin')"
155 155
               >Timeshare Week Admin</a>
156 156
               <a
157 157
                 class="dropdown-item cursor-pointer"
158
-                @click="routerGoTo('/status/list')"
159
-              >Changes Logs</a>
160
-              <a
161
-                class="dropdown-item cursor-pointer"
162
-                @click="routerGoTo('/status/list')"
163
-              >User Management & Access</a>
158
+                @click="routerGoTo('/status/tenderWeekAdmin')"
159
+              >Tender Week Management</a>
164 160
               <a
165 161
                 class="dropdown-item cursor-pointer"
166
-                @click="routerGoTo('/status/list')"
167
-              >Tender Week Management</a>
162
+                @click="routerGoTo('/unitConfiguration/list')"
163
+              >Unit Configuration</a>
168 164
               <a
169 165
                 class="dropdown-item cursor-pointer"
170
-                @click="routerGoTo('/status/list')"
171
-              >Timeshare Week Approval</a>
166
+                @click="routerGoTo('/status/userManagementPage')"
167
+              >User Management & Access</a>
172 168
               <a
173 169
                 class="dropdown-item cursor-pointer"
174
-                @click="routerGoTo('/unitConfiguration/list')"
175
-              >Unit Configuration</a>
170
+                @click="routerGoTo('/status/changeLogPage')"
171
+              >Changes Logs</a>
176 172
             </div>
177 173
           </li>
178 174
           <li class="nav-item">

+ 117
- 92
src/components/shared/searchTab.vue Visa fil

@@ -5,7 +5,7 @@
5 5
       <h3 class="title-d">Search</h3>
6 6
     </div>
7 7
     <span class="close-box-collapse right-boxed ion-ios-close"></span>
8
-    <div class="box-collapse-wrap form">
8
+    <div class="box-collapse-wrap">
9 9
       <form class="form-a">
10 10
         <div class="row">
11 11
           <div class="col-md-12 mb-2">
@@ -15,123 +15,148 @@
15 15
                 type="text"
16 16
                 class="form-control form-control-lg form-control-a"
17 17
                 placeholder="Keyword"
18
+                v-model="keyword"
18 19
               />
19 20
             </div>
20 21
           </div>
21
-          <div class="col-md-4 mb-2">
22
-            <div class="form-group">
23
-              <input class="form-check-input" type="radio" name="paid" value="Yes" />
24
-              <label class="form-check-label" for="paid">Timeshare</label>
25
-            </div>
26
-          </div>
27
-          <div class="col-md-4 mb-2">
28
-            <div class="form-group">
29
-              <input class="form-check-input" type="radio" name="paid" value="Yes" />
30
-              <label class="form-check-label" for="paid">Residential</label>
31
-            </div>
32
-          </div>
33
-          <div class="col-md-4 mb-2">
34
-            <div class="form-group">
35
-              <input class="form-check-input" type="radio" name="paid" value="Yes" />
36
-              <label class="form-check-label" for="paid">Commercial</label>
37
-            </div>
38
-          </div>
39
-          <div class="col-md-6 mb-2">
40
-            <div class="form-group">
41
-              <input class="form-check-input" type="radio" name="paid" value="Yes" />
42
-              <label class="form-check-label" for="paid">Sale</label>
43
-            </div>
44
-          </div>
45
-          <div class="col-md-6 mb-2">
46
-            <div class="form-group">
47
-              <input class="form-check-input" type="radio" name="paid" value="Yes" />
48
-              <label class="form-check-label" for="paid">Rent</label>
49
-            </div>
50
-          </div>
51
-          <div class="col-md-6 mb-2">
52
-            <div class="form-group">
53
-              <label for="city">Provice</label>
54
-              <select
55
-                class="form-control form-control-lg form-control-a"
56
-                id="provinceselector"
57
-                @change="ProvinceSelected"
58
-                v-model="selectedProvince"
59
-              >
60
-                <option>All</option>
61
-                <option v-for="(province, i) in provinces" :key="i">{{ province.description }}</option>
62
-              </select>
63
-            </div>
64
-          </div>
65
-          <div class="col-md-6 mb-2">
66
-            <div class="form-group">
67
-              <label for="city">City</label>
68
-              <select
69
-                class="form-control form-control-lg form-control-a"
70
-                id="cityselector"
71
-                @change="CitySelected"
72
-                v-model="selectedCity"
22
+          <div class="col-md-12">
23
+            <ul class="nav nav-pills-a nav-pills mb-3 section-t3" id="pills-tab" role="tablist">
24
+              <li class="nav-item">
25
+                <a
26
+                  class="nav-link active"
27
+                  id="pills-video-tab"
28
+                  data-toggle="pill"
29
+                  href="#pills-video"
30
+                  role="tab"
31
+                  aria-controls="pills-video"
32
+                  aria-selected="true"
33
+                  v-on:click="updateType('Timeshare')"
34
+                >Timeshare</a>
35
+              </li>
36
+              <li class="nav-item">
37
+                <a
38
+                  class="nav-link"
39
+                  id="pills-plans-tab"
40
+                  data-toggle="pill"
41
+                  href="#pills-plans"
42
+                  role="tab"
43
+                  aria-controls="pills-plans"
44
+                  aria-selected="false"
45
+                  v-on:click="updateType('Residential')"
46
+                >Residential</a>
47
+              </li>
48
+              <li class="nav-item">
49
+                <a
50
+                  class="nav-link"
51
+                  id="pills-map-tab"
52
+                  data-toggle="pill"
53
+                  href="#pills-map"
54
+                  role="tab"
55
+                  aria-controls="pills-map"
56
+                  aria-selected="false"
57
+                  v-on:click="updateType('Commercial')"
58
+                >Commercial</a>
59
+              </li>
60
+            </ul>
61
+            <div class="tab-content" id="pills-tabContent">
62
+              <div
63
+                class="tab-pane fade show active"
64
+                id="pills-video"
65
+                role="tabpanel"
66
+                aria-labelledby="pills-video-tab"
67
+              >timeshare search</div>
68
+              <div
69
+                class="tab-pane fade"
70
+                id="pills-plans"
71
+                role="tabpanel"
72
+                aria-labelledby="pills-plans-tab"
73 73
               >
74
-                <option>All</option>
75
-                <option v-for="(city, i) in cities" :key="i">{{ city.description }}</option>
76
-              </select>
77
-            </div>
78
-          </div>
79
-          <div class="col-md-6 mb-2">
80
-            <div class="form-group">
81
-              <label for="city">Suburb</label>
82
-              <select
83
-                class="form-control form-control-lg form-control-a"
84
-                id="suburbselector"
85
-                v-model="selectedSuburb"
74
+                <propertySearch
75
+                  propertyType="Residential"
76
+                  @TypeSelectedUpdated="TypeSelectedUpdated"
77
+                  @ProvinceSelectedUpdated="ProvinceSelectedUpdated"
78
+                  @CitySelectedUpdated="CitySelectedUpdated"
79
+                  @SuburbSelectedUpdated="SuburbSelectedUpdated"
80
+                  @PropertyTypeSelectedUpdated="PropertyTypeSelectedUpdated"
81
+                />
82
+              </div>
83
+              <div
84
+                class="tab-pane fade"
85
+                id="pills-map"
86
+                role="tabpanel"
87
+                aria-labelledby="pills-map-tab"
86 88
               >
87
-                <option>All</option>
88
-                <option v-for="(suburb, i) in suburbs" :key="i">{{ suburb.description }}</option>
89
-              </select>
89
+                <propertySearch
90
+                  propertyType="Commercial"
91
+                  @TypeSelectedUpdated="TypeSelectedUpdated"
92
+                  @ProvinceSelectedUpdated="ProvinceSelectedUpdated"
93
+                  @CitySelectedUpdated="CitySelectedUpdated"
94
+                  @SuburbSelectedUpdated="SuburbSelectedUpdated"
95
+                  @PropertyTypeSelectedUpdated="PropertyTypeSelectedUpdated"
96
+                />
97
+              </div>
90 98
             </div>
91 99
           </div>
92
-
93 100
           <div class="col-md-12">
94
-            <!-- <button type="submit" class="btn btn-b">Search</button> -->
95
-            <router-link to="/property/search" class="btn btn-b" tag="button">Search</router-link>
101
+            <button type="submit" class="btn btn-b" @click="Search">Search</button>
96 102
           </div>
97 103
         </div>
98 104
       </form>
99 105
     </div>
100 106
   </div>
101 107
 </template>
108
+
102 109
 <script>
103
-import { mapState, mapActions } from 'vuex';
110
+import propertySearch from '../property/propertySearchFields.vue';
104 111
 
105 112
 export default {
113
+  components: {
114
+    propertySearch,
115
+  },
106 116
   data() {
107 117
     return {
118
+      selectedPropertyType: 'timeshare',
119
+      selectedType: '',
108 120
       selectedProvince: '',
109 121
       selectedCity: '',
110 122
       selectedSuburb: '',
123
+      selectedPropType: '',
124
+      keyword: '',
111 125
     };
112 126
   },
113
-  mounted() {
114
-    this.getProvince();
115
-  },
116
-  computed: {
117
-    ...mapState('searchTab', ['provinces', 'cities', 'suburbs']),
118
-  },
119 127
   methods: {
120
-    ...mapActions('searchTab', ['getProvince', 'getCities', 'getSuburbs']),
121
-    ProvinceSelected(item) {
122
-      if (item.target.value !== 'All') {
123
-        this.getCities(Object.assign({}, this.selectedProvince));
124
-      }
128
+    updateType(item) {
129
+      this.selectedPropertyType = item;
130
+    },
131
+    TypeSelectedUpdated(item) {
132
+      this.selectedType = item;
133
+    },
134
+    PropertyTypeSelectedUpdated(item) {
135
+      this.selectedPropType = item;
136
+    },
137
+    ProvinceSelectedUpdated(item) {
138
+      this.selectedProvince = item;
139
+    },
140
+    CitySelectedUpdated(item) {
141
+      this.selectedCity = item;
142
+    },
143
+    SuburbSelectedUpdated(item) {
144
+      this.selectedSuburb = item;
125 145
     },
126
-    CitySelected(item) {
127
-      if (item.target.value !== 'All') {
128
-        this.getSuburbs(
129
-          Object.assign(
130
-            {},
131
-            { province: this.selectedProvince, city: this.city },
132
-          ),
133
-        );
134
-      }
146
+    Search() {
147
+      // need to see how to differenciate between properties and timeshare.
148
+      this.$router.push({
149
+        path: '/property/search',
150
+        query: {
151
+          type: this.selectedType,
152
+          propertyType: this.selectedPropertyType,
153
+          province: this.selectedProvince,
154
+          city: this.selectedCity,
155
+          suburb: this.selectedSuburb,
156
+          propType: this.propertyType,
157
+          keyword: this.keyword,
158
+        },
159
+      });
135 160
     },
136 161
   },
137 162
 };

+ 135
- 108
src/components/timeshare/resort/unitPage.vue Visa fil

@@ -1,126 +1,141 @@
1 1
 <template>
2
-  <div class="container">
3
-    <div class="row mb-4">
4
-      <div class="col-md-12">
5
-        <h1 class="my-4">{{resort.prName}}</h1>
6
-      </div>
7
-      <div class="col-md-6">
8
-        <p>{{description}}</p>
9
-      </div>
10
-      <div class="col-md-6">
11
-        <form
12
-          id="mainForm"
13
-          method="POST"
14
-          action="/interested-timeshare/"
15
-          accept-charset="UTF-8"
16
-          enctype="multipart/form-data"
17
-        >
18
-          <div class="form-row">
19
-            <div class="col-md-6">
20
-              <label for="resortName">Unit</label>
21
-              <input
22
-                class="form-control"
23
-                type="text"
24
-                id="resort"
25
-                name="resortName"
26
-                :value="week.unit"
27
-                disabled
28
-              />
29
-            </div>
30
-            <div class="col-md-6">
31
-              <label for="resortWeek">Week</label>
32
-              <input
33
-                class="form-control"
34
-                type="text"
35
-                id="week"
36
-                name="resortWeek"
37
-                :value="week.week"
38
-                disabled
39
-              />
2
+  <section>
3
+    <section class="intro-single">
4
+      <div class="container">
5
+        <div class="row">
6
+          <div class="col-md-12 col-lg-8">
7
+            <div class="title-single-box">
8
+              <h1 class="title-single" style="text-align:left;">{{resort.prName}}</h1>
40 9
             </div>
41 10
           </div>
42
-          <div class="form-row">
43
-            <div class="col-md-6">
44
-              <label for="resortModule">Module</label>
45
-              <input
46
-                class="form-control"
47
-                type="text"
48
-                id="module"
49
-                name="resortModule"
50
-                :value="week.module"
51
-                disabled
52
-              />
11
+        </div>
12
+      </div>
13
+    </section>
14
+    <div class="container">
15
+      <div class="row mb-4">
16
+        <div class="col-md-6">
17
+          <p>{{description}}</p>
18
+        </div>
19
+        <div class="col-md-6">
20
+          <form
21
+            id="mainForm"
22
+            method="POST"
23
+            action="/interested-timeshare/"
24
+            accept-charset="UTF-8"
25
+            enctype="multipart/form-data"
26
+          >
27
+            <div class="form-row">
28
+              <div class="col-md-6">
29
+                <label for="resortunit">Unit</label>
30
+                <input
31
+                  class="form-control"
32
+                  type="text"
33
+                  id="resort"
34
+                  name="resortunit"
35
+                  :value="week.unit"
36
+                  disabled
37
+                />
38
+              </div>
39
+              <div class="col-md-6">
40
+                <label for="resortWeek">Week</label>
41
+                <input
42
+                  class="form-control"
43
+                  type="text"
44
+                  id="week"
45
+                  name="resortWeek"
46
+                  :value="week.week"
47
+                  disabled
48
+                />
49
+              </div>
53 50
             </div>
54
-            <div class="col-md-6">
55
-              <label for="price">Price</label>
56
-              <input
57
-                class="form-control"
58
-                type="text"
59
-                name="price"
60
-                id="price"
61
-                :value="'R ' + week.price"
62
-                disabled
63
-              />
51
+            <br />
52
+            <div class="form-row">
53
+              <div class="col-md-6">
54
+                <label for="resortModule">Module</label>
55
+                <input
56
+                  class="form-control"
57
+                  type="text"
58
+                  id="module"
59
+                  name="resortModule"
60
+                  :value="week.module"
61
+                  disabled
62
+                />
63
+              </div>
64
+              <div class="col-md-6">
65
+                <label for="price">Price</label>
66
+                <input
67
+                  class="form-control"
68
+                  type="text"
69
+                  name="price"
70
+                  id="price"
71
+                  :value="'R ' + week.price"
72
+                  disabled
73
+                />
74
+              </div>
64 75
             </div>
65
-          </div>
66
-          <div class="form-row">
67
-            <div class="col-md-6">
68
-              <label for="resortModule">Current Year Levy</label>
69
-              <input
70
-                class="form-control"
71
-                type="text"
72
-                id="levy"
73
-                name="levy"
74
-                :value="'R ' + week.currentLevy"
75
-                disabled
76
-              />
76
+            <br />
77
+            <div class="form-row">
78
+              <div class="col-md-6">
79
+                <label for="resortModule">Current Year Levy</label>
80
+                <input
81
+                  class="form-control"
82
+                  type="text"
83
+                  id="levy"
84
+                  name="levy"
85
+                  :value="'R ' + week.currentLevy"
86
+                  disabled
87
+                />
88
+              </div>
77 89
             </div>
78
-          </div>
79
-          <div class="form-row">
80
-            <div class="col-md-12">
81
-              <input class="form-control" type="text" name="name" placeholder="Name" />
90
+            <br />
91
+            <div class="form-row">
92
+              <div class="col-md-12">
93
+                <input class="form-control" type="text" name="name" placeholder="Name" />
94
+              </div>
82 95
             </div>
83
-          </div>
84
-          <div class="form-row">
85
-            <div class="col-md-12">
86
-              <input class="form-control" type="text" name="mobile" placeholder="Contact Number" />
96
+            <br />
97
+            <div class="form-row">
98
+              <div class="col-md-12">
99
+                <input
100
+                  class="form-control"
101
+                  type="number"
102
+                  name="mobile"
103
+                  placeholder="Contact Number"
104
+                />
105
+              </div>
87 106
             </div>
88
-          </div>
89
-          <div class="form-row">
90
-            <div class="col-md-12">
91
-              <input class="form-control" type="email" name="email" placeholder="Email" />
107
+            <br />
108
+            <div class="form-row">
109
+              <div class="col-md-12">
110
+                <input class="form-control" type="email" name="email" placeholder="Email" />
111
+              </div>
92 112
             </div>
93
-          </div>
113
+            <br />
94 114
 
95
-          <button class="btn btn-blue even-width mr-auto" type="submit">ENQUIRE NOW</button>
115
+            <button class="btn btn-b-c even-width mr-auto" type="submit">Enquire Now</button>
96 116
 
97
-          <a
98
-            class="btn btn-blue even-width mr-auto"
99
-            href="/share-transfer-initiation-for-purchaser/"
100
-          >MAKE AN OFFER</a>
101
-          <a
102
-            class="btn btn-blue even-width mr-auto"
103
-            href="#"
104
-            data-toggle="modal"
105
-            data-target="#loginOrRegister"
106
-          >MAKE AN OFFER</a>
117
+            <a
118
+              class="btn btn-b-n even-width mr-auto"
119
+              href="/share-transfer-initiation-for-purchaser/"
120
+            >Make an Offer</a>
107 121
 
108
-          <a class="btn btn-blue even-width mr-auto" href="javascript:history.back()">BACK</a>
109
-        </form>
110
-      </div>
111
-    </div>
112
-    <div class="row mb-4">
113
-      <div class="col-md-4">
114
-        <img class="img-fluid" :src="image1" alt="Resort Image" />
115
-      </div>
116
-      <div class="col-md-4">
117
-        <img class="img-fluid" :src="image2" alt="Resort Image" />
122
+            <a class="btn btn-b-c even-width mr-auto" href="javascript:history.back()">Back</a>
123
+          </form>
124
+        </div>
118 125
       </div>
119
-      <div class="col-md-4">
120
-        <img class="img-fluid" :src="image3" alt="Resort Image" />
126
+      <div class="row mb-4">
127
+        <div class="col-md-4">
128
+          <img class="img-fluid" :src="image1" alt="Resort Image" />
129
+        </div>
130
+        <div class="col-md-4">
131
+          <img class="img-fluid" :src="image2" alt="Resort Image" />
132
+        </div>
133
+        <div class="col-md-4">
134
+          <img class="img-fluid" :src="image3" alt="Resort Image" />
135
+        </div>
121 136
       </div>
122 137
     </div>
123
-  </div>
138
+  </section>
124 139
 </template>
125 140
 
126 141
 <script>
@@ -151,3 +166,15 @@ export default {
151 166
   },
152 167
 };
153 168
 </script>
169
+<style scoped>
170
+.btn.btn-b-c {
171
+  background-color: #ffffff;
172
+  color: #60cbeb;
173
+  border-radius: 0;
174
+}
175
+
176
+.btn.btn-b-c:hover {
177
+  background-color: #089bf0;
178
+  color: #ffffff;
179
+}
180
+</style>

+ 59
- 52
src/components/user/loginPage.vue Visa fil

@@ -1,65 +1,72 @@
1 1
 <template>
2
-  <!-- eslint-disable max-len -->
3
-  <div class="login-page">
4
-    <form id="signIn">
5
-      <div class="form">
6
-        <div>
7
-          <h4>Login</h4>
8
-        </div>
9
-        <div class="row">
10
-          <div>
11
-            <eva-icon name="lock-outline" fill="#60CBEB"></eva-icon>
12
-          </div>
13
-          <div class="col-md-11">
14
-            <input
15
-              class="form-control"
16
-              v-model="username"
17
-              placeholder="Username"
18
-              type="text"
19
-              name="username"
20
-              value
21
-            />
22
-          </div>
2
+  <div class="container">
3
+    <!-- eslint-disable max-len -->
4
+    <div class="login-page">
5
+      <form id="signIn">
6
+        <div class="form">
23 7
           <div>
24
-            <eva-icon v-if="!showPassword" name="eye-off" fill="#60CBEB" @click="togglePassword()"></eva-icon>
25
-            <eva-icon v-else name="eye" fill="#60CBEB" @click="passwordToggled()"></eva-icon>
8
+            <h4>Login</h4>
26 9
           </div>
27
-          <div class="col-md-11">
28
-            <input
29
-              class="form-control"
30
-              :type="isPasswordShown"
31
-              v-model="password"
32
-              id="password"
33
-              placeholder="Password"
34
-              name="password"
35
-              value
36
-            />
10
+          <div class="row">
11
+            <div>
12
+              <eva-icon name="lock-outline" fill="#60CBEB"></eva-icon>
13
+            </div>
14
+            <div class="col-md-11">
15
+              <input
16
+                class="form-control"
17
+                v-model="username"
18
+                placeholder="Username"
19
+                type="text"
20
+                name="username"
21
+                value
22
+              />
23
+            </div>
24
+            <div>
25
+              <eva-icon
26
+                v-if="!showPassword"
27
+                name="eye-off"
28
+                fill="#60CBEB"
29
+                @click="togglePassword()"
30
+              ></eva-icon>
31
+              <eva-icon v-else name="eye" fill="#60CBEB" @click="passwordToggled()"></eva-icon>
32
+            </div>
33
+            <div class="col-md-11">
34
+              <input
35
+                class="form-control"
36
+                :type="isPasswordShown"
37
+                v-model="password"
38
+                id="password"
39
+                placeholder="Password"
40
+                name="password"
41
+                value
42
+              />
43
+            </div>
37 44
           </div>
45
+          <div class="form-group row"></div>
46
+          <button @click="Login" class="btn btn-b-n" type="submit">Sign In</button>
47
+          <p v-if="user !== null">{{ user }}</p>
38 48
         </div>
39
-        <div class="form-group row"></div>
40
-        <button @click="Login" class="btn btn-b-n" type="submit">Sign In</button>
41
-        <p v-if="user !== null">{{ user }}</p>
42
-      </div>
43
-    </form>
49
+      </form>
44 50
 
45
-    <form id="forgot">
46
-      <div class="form">
47
-        <h5>Trouble signing in?</h5>
48
-        <div>
49
-          <div class="row">
50
-            <eva-icon name="email" fill="#60CBEB"></eva-icon>
51
+      <form id="forgot">
52
+        <div class="form">
53
+          <h5>Trouble signing in?</h5>
54
+          <div>
55
+            <div class="row">
56
+              <eva-icon name="email" fill="#60CBEB"></eva-icon>
51 57
 
52
-            <div class="col-md-11">
53
-              <input class="form-control" placeholder="Your Email" type="text" name="email" value />
58
+              <div class="col-md-11">
59
+                <input class="form-control" placeholder="Your Email" type="text" name="email" value />
60
+              </div>
54 61
             </div>
55 62
           </div>
63
+          <div class="form-group row"></div>
64
+          <div class="offset-md-3 col-md-5">
65
+            <button class="btn btn-b-n" type="submit">Get Help</button>
66
+          </div>
56 67
         </div>
57
-        <div class="form-group row"></div>
58
-        <div class="offset-md-3 col-md-5">
59
-          <button class="btn btn-b-n" type="submit">Get Help</button>
60
-        </div>
61
-      </div>
62
-    </form>
68
+      </form>
69
+    </div>
63 70
   </div>
64 71
 </template>
65 72
 

+ 25
- 0
src/router/index.js Visa fil

@@ -19,6 +19,10 @@ import AboutUs from '../components/about/aboutUsPage.vue';
19 19
 import AboutTimeshare from '../components/about/aboutTimeshare.vue';
20 20
 
21 21
 import Status from '../components/admin/status/statusPage.vue';
22
+import timeshareAdminPage from '../components/admin/status/timeshareAdminPage.vue';
23
+import tenderWeekAdminPage from '../components/admin/status/tenderWeekAdminPage.vue';
24
+import userManagementPage from '../components/admin/status/userManagementPage.vue';
25
+import changeLogPage from '../components/admin/status/changeLogPage.vue';
22 26
 import UnitConfiguration from '../components/admin/unitConfiguration/unitConfigurationPage.vue';
23 27
 
24 28
 import ResortPage from '../components/timeshare/resort/resortPage.vue';
@@ -26,6 +30,7 @@ import UnitPage from '../components/timeshare/resort/unitPage.vue';
26 30
 
27 31
 import ContactUs from '../components/misc/contactUs.vue';
28 32
 
33
+
29 34
 Vue.use(Router);
30 35
 
31 36
 export default new Router({
@@ -99,6 +104,26 @@ export default new Router({
99 104
     name: 'StatusList',
100 105
     component: Status,
101 106
   },
107
+  {
108
+    path: '/status/timeshareAdmin',
109
+    name: 'TimeshareAdmin',
110
+    component: timeshareAdminPage,
111
+  },
112
+  {
113
+    path: '/status/tenderWeekAdmin',
114
+    name: 'TenderWeekAdmin',
115
+    component: tenderWeekAdminPage,
116
+  },
117
+  {
118
+    path: '/status/userManagementPage',
119
+    name: 'userManagementPage',
120
+    component: userManagementPage,
121
+  },
122
+  {
123
+    path: '/status/changeLogPage',
124
+    name: 'changeLogPage',
125
+    component: changeLogPage,
126
+  },
102 127
   {
103 128
     path: '/unitConfiguration/list',
104 129
     name: 'UnitConfiguration',

+ 2
- 0
src/store/index.js Visa fil

@@ -8,6 +8,7 @@ import UnitConfigurationModule from './modules/timeshare/unitConfiguration';
8 8
 import TimeshareBuyModule from './modules/timeshare/buyPage';
9 9
 import SearchTabModule from './modules/searchTab';
10 10
 import ResortModule from './modules/timeshare/resort';
11
+import PropertyModule from './modules/property/property';
11 12
 import WeekModule from './modules/timeshare/week';
12 13
 
13 14
 Vue.use(Vuex);
@@ -21,6 +22,7 @@ export default new Vuex.Store({
21 22
     timeshareBuy: TimeshareBuyModule,
22 23
     searchTab: SearchTabModule,
23 24
     resort: ResortModule,
25
+    property: PropertyModule,
24 26
     week: WeekModule,
25 27
   },
26 28
 });

+ 107
- 0
src/store/modules/property/property.js Visa fil

@@ -0,0 +1,107 @@
1
+import axios from 'axios';
2
+
3
+export default {
4
+  namespaced: true,
5
+  state: {
6
+    property: null,
7
+    propertyImages: [],
8
+    propertyTypes: [],
9
+    propertyTypesRes: [],
10
+    propertyTypesCom: [],
11
+    propertyOverviewFields: [],
12
+    propertyFields: [],
13
+    properties: [],
14
+  },
15
+  mutations: {
16
+    setProperty(state, property) {
17
+      state.property = property;
18
+    },
19
+    setPropertyImages(state, images) {
20
+      state.propertyImages = images;
21
+    },
22
+    setPropertyTypes(state, types) {
23
+      state.propertyTypes = types;
24
+    },
25
+    setPropertyTypesRes(state, types) {
26
+      state.propertyTypesRes = types;
27
+    },
28
+    setPropertyTypesCom(state, types) {
29
+      state.propertyTypesCom = types;
30
+    },
31
+    setPropertyOverviewFields(state, fields) {
32
+      state.propertyOverviewFields = fields;
33
+    },
34
+    setPropertyFields(state, fields) {
35
+      state.propertyFields = fields;
36
+    },
37
+    updateCurrentProperty(state, property) {
38
+      state.property = property;
39
+    },
40
+    updateSearch(state, propertySearch) {
41
+      state.properties = propertySearch;
42
+    },
43
+  },
44
+  getters: {},
45
+  actions: {
46
+    getProperty({ commit }, item) {
47
+      axios
48
+        .get(`http://localhost:57260/Property/Property/${item.id}`)
49
+        .then(result => commit('setProperty', result.data))
50
+        .catch(console.error);
51
+    },
52
+    getPropertyImages({ commit }, item) {
53
+      axios
54
+        .get(`http://localhost:57260/property/PropertyImage/getpropertyimages/${item.id}`)
55
+        .then(result => commit('setPropertyImages', result.data))
56
+        .catch(console.error);
57
+    },
58
+    getPropertyTypes({ commit }, item) {
59
+      axios
60
+        .get(`http://localhost:57260/Property/PropertyType/type/${item.propertyType}`)
61
+        .then(result => commit('setPropertyTypes', result.data))
62
+        .catch(console.error);
63
+    },
64
+    getPropertyTypesRes({ commit }) {
65
+      axios
66
+        .get('http://localhost:57260/Property/PropertyType/type/Residential')
67
+        .then(result => commit('setPropertyTypesRes', result.data))
68
+        .catch(console.error);
69
+    },
70
+    getPropertyTypesCom({ commit }) {
71
+      axios
72
+        .get('http://localhost:57260/Property/PropertyType/type/Commercial')
73
+        .then(result => commit('setPropertyTypesCom', result.data))
74
+        .catch(console.error);
75
+    },
76
+    getPropertyOverviewFields({ commit }) {
77
+      axios
78
+        .get('http://localhost:57260/Property/PropertyFields/Property Overview')
79
+        .then(response => commit('setPropertyOverviewFields', response.data));
80
+    },
81
+    getPropertyFields({ commit }, item) {
82
+      axios
83
+        .get(`http://localhost:57260/property/propertyfields/Propertytype/${item.propertyType}`)
84
+        .then(response => commit('setPropertyFields', response.data));
85
+    },
86
+    saveProperty({ commit }, item) {
87
+      axios
88
+        .post('http://localhost:57260/Property/Property', item.newProperty)
89
+        .then(result => commit('updateCurrentProperty', result.data))
90
+        .catch(console.error);
91
+    },
92
+    searchPropertiesParams({ commit }, item) {
93
+      axios
94
+        .get(
95
+          `http://localhost:57260/Property/Property/Search/${item.type}/${item.propertyType}/${item.province}/${item.city}/${item.suburb}/${item.propType}`,
96
+        )
97
+        .then(response => commit('updateSearch', response.data))
98
+        .catch(console.error);
99
+    },
100
+    searchPropertiesKeyword({ commit }, item) {
101
+      axios
102
+        .get(`http://localhost:57260/Property/Property/Search/Keyword/${item.keyword}`)
103
+        .then(response => commit('updateSearch', response.data))
104
+        .catch(console.error);
105
+    },
106
+  },
107
+};

+ 7
- 14
src/store/modules/searchTab.js Visa fil

@@ -20,27 +20,20 @@ export default {
20 20
   },
21 21
   getters: {},
22 22
   actions: {
23
-    getProvince({
24
-      commit,
25
-    }) {
26
-      axios.get('http://localhost:57260/region/province')
23
+    getProvince({ commit }) {
24
+      axios
25
+        .get('http://localhost:57260/region/province')
27 26
         .then(result => commit('setProvince', result.data))
28 27
         .catch(console.error);
29 28
     },
30
-    getCities({
31
-      commit,
32
-    }, province) {
29
+    getCities({ commit }, item) {
33 30
       axios
34
-        .get(`http://localhost:57260/region/city/getby/${province}`)
31
+        .get(`http://localhost:57260/region/city/getby/${item.province}`)
35 32
         .then(result => commit('setCities', result.data));
36 33
     },
37
-    getSuburbs({
38
-      commit,
39
-    }, item) {
34
+    getSuburbs({ commit }, item) {
40 35
       axios
41
-        .get(
42
-          `http://localhost:57260/region/Suburb/${item.province}/${item.city}`,
43
-        )
36
+        .get(`http://localhost:57260/region/Suburb/${item.province}/${item.city}`)
44 37
         .then(result => commit('setSuburbs', result.data));
45 38
     },
46 39
   },

Laddar…
Avbryt
Spara