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

Added Upload Campaign

master
30117125 преди 3 години
родител
ревизия
8e3e5a8da1

+ 41
- 25
src/components/admin/misc/carouselSearch.vue Целия файл

@@ -1,6 +1,6 @@
1 1
 <template>
2 2
   <div>
3
-    <div class="container">
3
+    <div v-if="loaded" class="container">
4 4
       <div class="container">
5 5
         <div class="row">
6 6
           <div class="col-md-12 col-lg-8">
@@ -24,67 +24,83 @@
24 24
         </div>
25 25
       </div>
26 26
     </div>
27
+    <div v-else class="text-center mt-5">
28
+      <vue-loaders
29
+        class="my-auto"
30
+        name="line-spin-fade-loader"
31
+        color="black"
32
+        scale="1"
33
+      ></vue-loaders>
34
+    </div>
27 35
   </div>
28 36
 </template>
29 37
 
30 38
 <script>
31
-import { mapState, mapActions } from 'vuex';
32
-import ListView from '../../shared/listView.vue';
33
-import ListView2 from '../../shared/listView.vue';
34
-import Log from '../../../assets/Log';
39
+/* eslint-disable */
40
+import { mapState, mapActions } from "vuex";
41
+import ListView from "../../shared/listView.vue";
42
+import ListView2 from "../../shared/listView.vue";
43
+import Log from "../../../assets/Log";
35 44
 
36 45
 export default {
37
-  name: 'CarouselSearch',
46
+  name: "CarouselSearch",
38 47
   props: {
39
-    name: String,
48
+    name: String
40 49
   },
41 50
   components: {
42 51
     ListView,
43
-    ListView2,
52
+    ListView2
44 53
   },
45 54
   data() {
46 55
     return {
47
-      user: Log.getUser(),
56
+      loaded: false,
57
+      user: Log.getUser()
48 58
     };
49 59
   },
50 60
   mounted() {
51
-    if (this.name === 'Timeshare') {
52
-      this.getItems(this.user.id);
53
-    } else {
54
-      this.getLiveProperties();
55
-    }
61
+    this.loadData().then(() => {
62
+      setTimeout(() => {
63
+        this.loaded = true;
64
+      }, 100);
65
+    });
56 66
   },
57 67
   computed: {
58
-    ...mapState('myWeeks', ['items']),
59
-    ...mapState('propertyList', ['propertiesLive']),
68
+    ...mapState("myWeeks", ["items"]),
69
+    ...mapState("propertyList", ["propertiesLive"]),
60 70
     // eslint-disable-next-line vue/return-in-computed-property
61 71
     nameChanged() {
62
-      if (this.name === 'Timeshare') {
72
+      if (this.name === "Timeshare") {
63 73
         this.getItems(this.user.id);
64 74
       } else {
65 75
         this.getLiveProperties();
66 76
       }
67
-    },
77
+    }
68 78
   },
69 79
   methods: {
70
-    ...mapActions('myWeeks', ['getItems']),
71
-    ...mapActions('propertyList', ['getLiveProperties']),
80
+    ...mapActions("myWeeks", ["getItems"]),
81
+    ...mapActions("propertyList", ["getLiveProperties"]),
72 82
     onRowClick(item) {
73
-         
74 83
       // if (this.name === 'Timeshare') {
75 84
       //   const week = this.items[item];
76 85
       //   this.$emit('onSelected', week);
77 86
       // } else {
78 87
       //   const prop = this.propertiesLive[item];
79
-      //           alert(JSON.stringify(prop));   
80
-        this.$emit('onSelected', item);
88
+      //           alert(JSON.stringify(prop));
89
+      this.$emit("onSelected", item);
81 90
       //}
82 91
     },
92
+    async loadData() {
93
+      if (this.name === "Timeshare") {
94
+        await this.getItems(this.user.id);
95
+      } else {
96
+        await this.getLiveProperties();
97
+      }
98
+    }
83 99
   },
84 100
   watch: {
85 101
     nameChanged() {
86 102
       return null;
87
-    },
88
-  },
103
+    }
104
+  }
89 105
 };
90 106
 </script>

+ 75
- 0
src/components/admin/misc/carouselSearchProperty.vue Целия файл

@@ -0,0 +1,75 @@
1
+<template>
2
+  <div>
3
+    <div v-if="loaded" class="container">
4
+      <div class="row">
5
+        <div class="col">
6
+          <div class="section-header">
7
+            <h2>Search</h2>
8
+          </div>
9
+        </div>
10
+      </div>
11
+
12
+      <div class="row">
13
+        <div class="container">
14
+          <ListView
15
+            :items="properties"
16
+            :showNew="false"
17
+            :showColumnChooser="false"
18
+            @onRowClick="onRowClick"
19
+          />
20
+        </div>
21
+      </div>
22
+    </div>
23
+    <div v-else class="text-center mt-5">
24
+      <vue-loaders
25
+        class="my-auto"
26
+        name="line-spin-fade-loader"
27
+        color="black"
28
+        scale="1"
29
+      ></vue-loaders>
30
+    </div>
31
+  </div>
32
+</template>
33
+
34
+<script>
35
+/* eslint-disable */
36
+import { mapState, mapActions } from "vuex";
37
+import ListView from "../../shared/listView.vue";
38
+import Log from "../../../assets/Log";
39
+
40
+export default {
41
+  name: "CarouselSearch",
42
+  props: {
43
+    name: String
44
+  },
45
+  components: {
46
+    ListView
47
+  },
48
+  data() {
49
+    return {
50
+      loaded: false,
51
+      user: Log.getUser()
52
+    };
53
+  },
54
+  mounted() {
55
+    this.loadData().then(() => {
56
+      setTimeout(() => {
57
+        this.loaded = true;
58
+      }, 100);
59
+    });
60
+  },
61
+  computed: {
62
+    ...mapState("propertyList", ["properties"])
63
+  },
64
+  methods: {
65
+    ...mapActions("propertyList", ["getAdminProperties"]),
66
+    onRowClick(item) {
67
+      console.log(item[0]);
68
+      this.$emit("onSelected", item[0]);
69
+    },
70
+    async loadData() {
71
+      await this.getAdminProperties(this.user.id);
72
+    }
73
+  }
74
+};
75
+</script>

+ 201
- 0
src/components/marketing/campaignUpload.vue Целия файл

@@ -0,0 +1,201 @@
1
+<template>
2
+  <div>
3
+    <main v-if="boolLoaded" id="main" style="margin-top:20px; padding-bottom:50px;">
4
+      <div class="container">
5
+        <div class="row">
6
+          <div class="col">
7
+            <div class="section-header">
8
+              <h2>Upload Campaign</h2>
9
+            </div>
10
+          </div>
11
+        </div>
12
+        <div class="row">
13
+          <div class="col">
14
+            <!--UPLOAD-->
15
+            <h2 class="mb-5">New Campaign</h2>
16
+            <form enctype="multipart/form-data" novalidate v-if="isInitial || isSaving">
17
+              <div>
18
+                <input
19
+                  type="file"
20
+                  multiple
21
+                  :name="uploadFieldName"
22
+                  :disabled="isSaving"
23
+                  @change="
24
+                    filesChange($event.target.files);
25
+                    fileCount = $event.target.files.length;
26
+                  "
27
+                />
28
+                <p v-if="isSaving">Uploading {{ fileCount }} files...</p>
29
+              </div>
30
+            </form>
31
+            <div>
32
+              <alert v-if="isSuccess" :text="errorMessage" :type="errorOccurred" />
33
+              <button v-if="isSuccess" class="btn-solid-blue" @click="openInNewTab">
34
+                View
35
+              </button>
36
+              <alert v-if="isFailed" :text="errorMessage" :type="errorOccurred" />
37
+            </div>
38
+          </div>
39
+        </div>
40
+        <hr class="mt-5" />
41
+        <div class="row mt-5">
42
+          <div class="col">
43
+            <h2>Uploaded Campaigns</h2>
44
+          </div>
45
+        </div>
46
+        <div class="row">
47
+          <div class="col">
48
+            <ListView
49
+              :items="uploadedCampaigns"
50
+              :search="false"
51
+              @onDelete="Delete"
52
+              :deleteable="true"
53
+            />
54
+          </div>
55
+        </div>
56
+      </div>
57
+    </main>
58
+
59
+    <div v-else id="preloader"></div>
60
+  </div>
61
+</template>
62
+
63
+<script>
64
+/* eslint-disable */
65
+import { mapActions, mapState } from "vuex";
66
+import Alert from "../shared/alert";
67
+import ListView from "../shared/listView";
68
+
69
+const STATUS_INITIAL = 0,
70
+  STATUS_SAVING = 1,
71
+  STATUS_SUCCESS = 2,
72
+  STATUS_FAILED = 3;
73
+
74
+export default {
75
+  name: "app",
76
+  components: {
77
+    Alert,
78
+    ListView
79
+  },
80
+  data() {
81
+    return {
82
+      uploadedFiles: [],
83
+      errorOccurred: "",
84
+      errorMessage: "",
85
+      uploadError: null,
86
+      currentStatus: null,
87
+      uploadFieldName: "photos",
88
+      fileCount: 0,
89
+      files: new FormData(),
90
+      link: "",
91
+      boolLoaded: false
92
+    };
93
+  },
94
+  computed: {
95
+    ...mapState("campaign", ["uploadedCampaigns"]),
96
+    isInitial() {
97
+      return this.currentStatus === STATUS_INITIAL;
98
+    },
99
+    isSaving() {
100
+      return this.currentStatus === STATUS_SAVING;
101
+    },
102
+    isSuccess() {
103
+      return this.currentStatus === STATUS_SUCCESS;
104
+    },
105
+    isFailed() {
106
+      return this.currentStatus === STATUS_FAILED;
107
+    }
108
+  },
109
+  methods: {
110
+    ...mapActions("campaign", ["uploadCampaign", "getUploadedCampaign", "deleteUploadedCampaign"]),
111
+    openInNewTab() {
112
+      window.open(this.link, "_blank");
113
+    },
114
+    reset() {
115
+      // reset form to initial state
116
+      this.currentStatus = STATUS_INITIAL;
117
+      this.uploadedFiles = [];
118
+      this.uploadError = null;
119
+    },
120
+    Delete(item) {
121
+      this.deleteUploadedCampaign(item.id);
122
+    },
123
+    save() {
124
+      // upload data to the server
125
+      this.currentStatus = STATUS_SAVING;
126
+      const files = this.files;
127
+      this.boolLoaded = false;
128
+      this.uploadCampaign(files)
129
+        .then(data => {
130
+          console.log(data);
131
+          setTimeout(() => {
132
+            this.link = data.link;
133
+            this.currentStatus = STATUS_SUCCESS;
134
+            this.errorOccurred = "SUCCESS";
135
+            this.errorMessage = "Done! Please click View below to view the campaign " + data.link;
136
+            this.getUploadedCampaign().then(() => {
137
+              this.boolLoaded = true;
138
+            });
139
+          }, 100);
140
+        })
141
+        .catch(ex => {
142
+          console.log(ex);
143
+          this.currentStatus = STATUS_FAILED;
144
+          this.errorOccurred = "ERROR";
145
+          this.errorMessage = "Error!";
146
+        });
147
+
148
+      //   upload(formData)
149
+      //     .then(x => {
150
+      //       this.uploadedFiles = [].concat(x);
151
+      //       this.currentStatus = STATUS_SUCCESS;
152
+      //     })
153
+      //     .catch(err => {
154
+      //       this.uploadError = err.response;
155
+      //       this.currentStatus = STATUS_FAILED;
156
+      //     });
157
+    },
158
+    filesChange(fileList) {
159
+      this.files.append("file", fileList[0], fileList[0].name);
160
+      this.save();
161
+    }
162
+  },
163
+  mounted() {
164
+    this.reset();
165
+    this.getUploadedCampaign().then(() => {
166
+      this.boolLoaded = true;
167
+    });
168
+  }
169
+};
170
+</script>
171
+
172
+<style lang="scss" scoped>
173
+.dropbox {
174
+  outline: 2px dashed grey; /* the dash box */
175
+  outline-offset: -10px;
176
+  background: lightcyan;
177
+  color: dimgray;
178
+  padding: 10px 10px;
179
+  min-height: 200px; /* minimum height */
180
+  position: relative;
181
+  cursor: pointer;
182
+}
183
+
184
+.input-file {
185
+  opacity: 0; /* invisible but it's there! */
186
+  width: 100%;
187
+  height: 200px;
188
+  position: absolute;
189
+  cursor: pointer;
190
+}
191
+
192
+.dropbox:hover {
193
+  background: lightblue; /* when mouse over to the drop zone, change color */
194
+}
195
+
196
+.dropbox p {
197
+  font-size: 1.2em;
198
+  text-align: center;
199
+  padding: 50px 0;
200
+}
201
+</style>

+ 307
- 275
src/components/marketing/landingPage.vue Целия файл

@@ -1,5 +1,5 @@
1 1
 <template>
2
-  <main id="main" style="margin-top:200px; padding-bottom:50px">
2
+  <div v-if="checkAccess" class="container">
3 3
     <div class="container">
4 4
       <div class="row">
5 5
         <div class="col">
@@ -9,295 +9,289 @@
9 9
         </div>
10 10
       </div>
11 11
     </div>
12
-
13
-    <div v-if="checkAccess" class="container">
14
-      <div class="container col-md-12" style="text-align:left">
15
-        <div class="form-goup row">
16
-          <div class="col-md-4">
17
-            <float-label>
18
-              <input
19
-                class="form-control uniInput"
20
-                type="text"
21
-                v-model="campaign.name"
22
-                placeholder="CAMPAIGN NAME"
23
-              />
24
-            </float-label>
25
-          </div>
26
-          <div class="col-md-4">
27
-            <float-label fixed label="START DATE">
28
-              <input class="form-control uniInput" type="date" v-model="campaign.startDate" />
29
-            </float-label>
30
-          </div>
31
-          <div class="col-md-4">
32
-            <float-label fixed label="END DATE">
33
-              <input class="form-control uniInput" type="date" v-model="campaign.endDate" />
34
-            </float-label>
35
-          </div>
12
+    <div v-if="loaded" class="container col-md-12" style="text-align:left">
13
+      <div class="form-goup row">
14
+        <div class="col-md-4">
15
+          <float-label>
16
+            <input
17
+              class="form-control uniInput"
18
+              type="text"
19
+              v-model="campaign.name"
20
+              placeholder="CAMPAIGN NAME"
21
+            />
22
+          </float-label>
36 23
         </div>
37
-        <div class="row mt-4">
38
-          <div class="col-md-4">
39
-            <float-label>
40
-              <input
41
-                class="form-control uniInput"
42
-                type="text"
43
-                v-model="campaign.subject"
44
-                placeholder="SUBJECT"
45
-              />
46
-            </float-label>
47
-          </div>
48
-          <div class="col-md-4">
49
-            <float-label>
50
-              <input
51
-                class="form-control uniInput"
52
-                type="number"
53
-                v-model="campaign.itemsPerRow"
54
-                placeholder="NUMBER OF ITEMS PER ROW"
55
-              />
56
-            </float-label>
57
-          </div>
24
+        <div class="col-md-4">
25
+          <float-label fixed label="START DATE">
26
+            <input class="form-control uniInput" type="date" v-model="campaign.startDate" />
27
+          </float-label>
58 28
         </div>
59
-        <br />
60
-        <div class="col-md-12">
61
-          <label>Main Body</label>
62
-          <ul class="nav nav-tabs" id="myTab" role="tablist">
63
-            <li class="nav-item">
64
-              <a
65
-                class="nav-link active"
66
-                id="directions-tab"
67
-                data-toggle="tab"
68
-                href="#directions"
69
-                role="tab"
70
-                aria-controls="directions"
71
-                aria-selected="false"
72
-                >Html</a
73
-              >
74
-            </li>
75
-            <li class="nav-item">
76
-              <a
77
-                class="nav-link"
78
-                id="resort-layout-tab"
79
-                data-toggle="tab"
80
-                href="#resort-layout"
81
-                role="tab"
82
-                aria-controls="resort-layout"
83
-                aria-selected="true"
84
-                >Preview</a
85
-              >
86
-            </li>
87
-          </ul>
29
+        <div class="col-md-4">
30
+          <float-label fixed label="END DATE">
31
+            <input class="form-control uniInput" type="date" v-model="campaign.endDate" />
32
+          </float-label>
33
+        </div>
34
+      </div>
35
+      <div class="row mt-4">
36
+        <div class="col-md-4">
37
+          <float-label>
38
+            <input
39
+              class="form-control uniInput"
40
+              type="text"
41
+              v-model="campaign.subject"
42
+              placeholder="SUBJECT"
43
+            />
44
+          </float-label>
45
+        </div>
46
+        <div class="col-md-4">
47
+          <float-label>
48
+            <input
49
+              class="form-control uniInput"
50
+              type="number"
51
+              v-model="campaign.itemsPerRow"
52
+              placeholder="NUMBER OF ITEMS PER ROW"
53
+            />
54
+          </float-label>
55
+        </div>
56
+      </div>
57
+      <br />
58
+      <div class="col-md-12">
59
+        <label>Main Body</label>
60
+        <ul class="nav nav-tabs" id="myTab" role="tablist">
61
+          <li class="nav-item">
62
+            <a
63
+              class="nav-link active"
64
+              id="directions-tab"
65
+              data-toggle="tab"
66
+              href="#directions"
67
+              role="tab"
68
+              aria-controls="directions"
69
+              aria-selected="false"
70
+              >Html</a
71
+            >
72
+          </li>
73
+          <li class="nav-item">
74
+            <a
75
+              class="nav-link"
76
+              id="resort-layout-tab"
77
+              data-toggle="tab"
78
+              href="#resort-layout"
79
+              role="tab"
80
+              aria-controls="resort-layout"
81
+              aria-selected="true"
82
+              >Preview</a
83
+            >
84
+          </li>
85
+        </ul>
86
+        <div
87
+          class="tab-content"
88
+          id="myTabContent"
89
+          style="background-color:rgba(255,255,255,0.75);padding:10px;border:silver solid thin;border-radius:10px;"
90
+        >
88 91
           <div
89
-            class="tab-content"
90
-            id="myTabContent"
91
-            style="background-color:rgba(255,255,255,0.75);padding:10px;border:silver solid thin;border-radius:10px;"
92
+            class="tab-pane fade show active"
93
+            style="background-color:rgba(255,255,255,0.75);padding:10px;"
94
+            id="directions"
95
+            role="tabpanel"
96
+            aria-labelledby="directions-tab"
92 97
           >
93
-            <div
94
-              class="tab-pane fade show active"
95
-              style="background-color:rgba(255,255,255,0.75);padding:10px;"
96
-              id="directions"
97
-              role="tabpanel"
98
-              aria-labelledby="directions-tab"
99
-            >
100
-              <div class="text-left">
101
-                <div class="input-group mb-3">
102
-                  <label>
103
-                    <i>Place the tag [items] as a place holder for the week items.</i>
104
-                  </label>
105
-                </div>
106
-                <div class="input-group mb-3">
107
-                  <!-- <div class="input-group-prepend">
98
+            <div class="text-left">
99
+              <div class="input-group mb-3">
100
+                <label>
101
+                  <i>Place the tag [items] as a place holder for the week items.</i>
102
+                </label>
103
+              </div>
104
+              <div class="input-group mb-3">
105
+                <!-- <div class="input-group-prepend">
108 106
                     <span class="input-group-text" style="color: #60CBEB">
109 107
                       <b>B</b>
110 108
                     </span>
111 109
                   </div>-->
112
-                  <textarea
113
-                    class="form-control"
114
-                    type="text"
115
-                    rows="10"
116
-                    step="any"
117
-                    name="levy"
118
-                    v-model="campaign.body"
119
-                  />
120
-                </div>
110
+                <textarea
111
+                  class="form-control"
112
+                  type="text"
113
+                  rows="10"
114
+                  step="any"
115
+                  name="levy"
116
+                  v-model="campaign.body"
117
+                />
121 118
               </div>
122 119
             </div>
123
-            <div
124
-              class="tab-pane fade"
125
-              id="resort-layout"
126
-              role="tabpanel"
127
-              aria-labelledby="resort-layout-tab"
128
-            >
129
-              <div class="no-style" v-html="campaign.body"></div>
130
-            </div>
131 120
           </div>
132
-        </div>
133
-        <br />
134
-        <div class="col-md-12">
135
-          <label>Item Template</label>
136
-          <ul class="nav nav-tabs" id="myTab" role="tablist">
137
-            <li class="nav-item">
138
-              <a
139
-                class="nav-link active"
140
-                id="template-tab"
141
-                data-toggle="tab"
142
-                href="#template"
143
-                role="tab"
144
-                aria-controls="template"
145
-                aria-selected="false"
146
-                >Html</a
147
-              >
148
-            </li>
149
-            <li class="nav-item">
150
-              <a
151
-                class="nav-link"
152
-                id="preview-tab"
153
-                data-toggle="tab"
154
-                href="#preview"
155
-                role="tab"
156
-                aria-controls="preview"
157
-                aria-selected="true"
158
-                >Preview</a
159
-              >
160
-            </li>
161
-          </ul>
162 121
           <div
163
-            class="tab-content"
164
-            id="myTabContent"
165
-            style="background-color:rgba(255,255,255,0.75);padding:10px;border:silver solid thin;border-radius:10px;"
122
+            class="tab-pane fade"
123
+            id="resort-layout"
124
+            role="tabpanel"
125
+            aria-labelledby="resort-layout-tab"
166 126
           >
167
-            <div
168
-              class="tab-pane fade show active"
169
-              style="background-color:rgba(255,255,255,0.75);padding:10px;"
170
-              id="template"
171
-              role="tabpanel"
172
-              aria-labelledby="template-tab"
127
+            <div class="no-style" v-html="campaign.body"></div>
128
+          </div>
129
+        </div>
130
+      </div>
131
+      <br />
132
+      <div class="col-md-12">
133
+        <label>Item Template</label>
134
+        <ul class="nav nav-tabs" id="myTab" role="tablist">
135
+          <li class="nav-item">
136
+            <a
137
+              class="nav-link active"
138
+              id="template-tab"
139
+              data-toggle="tab"
140
+              href="#template"
141
+              role="tab"
142
+              aria-controls="template"
143
+              aria-selected="false"
144
+              >Html</a
173 145
             >
174
-              <div class="text-left">
175
-                <div class="input-group mb-3">
176
-                  <label>
177
-                    <i>
178
-                      Place the tag [image] as a place holder for the week's image.
179
-                      <br />Place the tag [link] for a hypher link to the week's page
180
-                    </i>
181
-                  </label>
182
-                </div>
183
-                <div class="input-group mb-3">
184
-                  <!-- <div class="input-group-prepend">
146
+          </li>
147
+          <li class="nav-item">
148
+            <a
149
+              class="nav-link"
150
+              id="preview-tab"
151
+              data-toggle="tab"
152
+              href="#preview"
153
+              role="tab"
154
+              aria-controls="preview"
155
+              aria-selected="true"
156
+              >Preview</a
157
+            >
158
+          </li>
159
+        </ul>
160
+        <div
161
+          class="tab-content"
162
+          id="myTabContent"
163
+          style="background-color:rgba(255,255,255,0.75);padding:10px;border:silver solid thin;border-radius:10px;"
164
+        >
165
+          <div
166
+            class="tab-pane fade show active"
167
+            style="background-color:rgba(255,255,255,0.75);padding:10px;"
168
+            id="template"
169
+            role="tabpanel"
170
+            aria-labelledby="template-tab"
171
+          >
172
+            <div class="text-left">
173
+              <div class="input-group mb-3">
174
+                <label>
175
+                  <i>
176
+                    Place the tag [image] as a place holder for the week's image.
177
+                    <br />Place the tag [link] for a hypher link to the week's page
178
+                  </i>
179
+                </label>
180
+              </div>
181
+              <div class="input-group mb-3">
182
+                <!-- <div class="input-group-prepend">
185 183
                     <span class="input-group-text" style="color: #60CBEB">
186 184
                       <b>B</b>
187 185
                     </span>
188 186
                   </div>-->
189
-                  <textarea
190
-                    class="form-control"
191
-                    type="text"
192
-                    rows="10"
193
-                    step="any"
194
-                    name="levy"
195
-                    v-model="campaign.itemBody"
196
-                  />
197
-                </div>
187
+                <textarea
188
+                  class="form-control"
189
+                  type="text"
190
+                  rows="10"
191
+                  step="any"
192
+                  name="levy"
193
+                  v-model="campaign.itemBody"
194
+                />
198 195
               </div>
199 196
             </div>
200
-            <div class="tab-pane fade" id="preview" role="tabpanel" aria-labelledby="preview-tab">
201
-              <div class="no-style" v-html="campaign.itemBody"></div>
202
-            </div>
197
+          </div>
198
+          <div class="tab-pane fade" id="preview" role="tabpanel" aria-labelledby="preview-tab">
199
+            <div class="no-style" v-html="campaign.itemBody"></div>
203 200
           </div>
204 201
         </div>
205
-        <div class="col-md-12"></div>
206
-        <br />
207
-        <div class="col-md-12">
208
-          <label>
209
-            <b>Place Holders</b>
210
-          </label>
211
-          <div class="d-flex">
212
-            <div class="p-2">
213
-              <div class="btn btn-primary myBackground" @click="addClose()" v-if="CanEdit">
214
-                {{ btnCaption }}
215
-              </div>
202
+      </div>
203
+      <div class="col-md-12"></div>
204
+      <br />
205
+      <div class="col-md-12">
206
+        <label>
207
+          <b>Place Holders</b>
208
+        </label>
209
+        <div class="d-flex">
210
+          <div class="p-2">
211
+            <div class="btn-solid-blue" @click="addClose()" v-if="CanEdit">
212
+              {{ btnCaption }}
216 213
             </div>
217 214
           </div>
218 215
         </div>
219
-        <div class="col-md-12" v-if="showNew">
220
-          <LandingPageItems
221
-            @onItemAdd="onItemAdd"
222
-            :selectedClass="defaultPlaceholderClass"
223
-            :canSelectClass="false"
224
-            :editItem="placeholderItem"
225
-          />
226
-        </div>
227
-        <div class="col-md-12">
228
-          <hr />
229
-        </div>
230
-        <div class="col-md-12">
231
-          <ListView
232
-            :items="PlaceHolders"
233
-            :hideSearch="true"
234
-            :showColumnChooser="false"
235
-            :showNew="false"
236
-            :allowMultipleSelect="true"
237
-            :canEdit="false"
238
-            :deleteable="CanEdit"
239
-            @onDelete="onItemDelete"
240
-            :displayColumns="placeHolderColumns"
241
-            :sortKey="'name'"
242
-          />
243
-          <!-- :displayColumns="placeHolderColumns" -->
244
-        </div>
245
-        <br />
246
-        <div class="col-md-12">
247
-          <label>
248
-            <b>Weeks</b>
249
-          </label>
250
-          <div class="d-flex">
251
-            <div class="p-2">
252
-              <div class="btn btn-primary myBackground" @click="addWeekClose()" v-if="CanEditWeeks">
253
-                {{ btnCaptionWeek }}
254
-              </div>
216
+      </div>
217
+      <div class="col-md-12" v-if="showNew">
218
+        <LandingPageItems
219
+          @onItemAdd="onItemAdd"
220
+          :selectedClass="CheckType"
221
+          :canSelectClass="false"
222
+        />
223
+      </div>
224
+      <div class="col-md-12">
225
+        <hr />
226
+      </div>
227
+      <div class="col-md-12">
228
+        <ListView
229
+          :items="PlaceHolders"
230
+          :hideSearch="true"
231
+          :showColumnChooser="false"
232
+          :showNew="false"
233
+          :allowMultipleSelect="true"
234
+          :canEdit="false"
235
+          :deleteable="CanEdit"
236
+          @onDelete="onItemDelete"
237
+          :displayColumns="placeHolderColumns"
238
+        />
239
+        <!-- :displayColumns="placeHolderColumns" -->
240
+      </div>
241
+      <br />
242
+      <div class="col-md-12">
243
+        <label>
244
+          <b>Weeks</b>
245
+        </label>
246
+        <div class="d-flex">
247
+          <div class="p-2">
248
+            <div class="btn-solid-blue" @click="addWeekClose()" v-if="CanEditWeeks">
249
+              {{ btnCaptionWeek }}
255 250
             </div>
256 251
           </div>
257 252
         </div>
258
-        <div class="col-md-12" v-if="showNewWeek">
259
-          <WeekAdd @onWeekItemAdd="AddNewWeek" />
260
-        </div>
261
-        <div class="col-md-12">
262
-          <hr />
263
-        </div>
264
-        <div class="col-md-12">
265
-          <ListView
266
-            :items="Weeks"
267
-            :hideSearch="true"
268
-            :showColumnChooser="false"
269
-            :showNew="false"
270
-            :canEdit="false"
271
-            :deleteable="CanEdit"
272
-            :allowMultipleSelect="false"
273
-            @onDelete="onItemDeleteWeek"
274
-            :sortKey="'weekUni'"
275
-            :displayColumns="weekColumns"
276
-            :displayFormats="weekFormats"
277
-          />
278
-          <!-- -->
279
-        </div>
280
-        <br />
281
-        <br />
282
-        <div class="form-group row">
283
-          <button type="button" @click="SaveData()" class="btn-solid-blue">
284
-            Save
285
-          </button>
286
-          <button type="button" @click="Close()" class="btn-solid-blue">
287
-            Close
288
-          </button>
289
-        </div>
290 253
       </div>
291
-      <div v-if="wait" id="preloader"></div>
254
+      <div class="col-md-12" v-if="showNewWeek">
255
+        <WeekAdd @onWeekItemAdd="AddNewWeek" />
256
+      </div>
257
+      <div class="col-md-12">
258
+        <hr />
259
+      </div>
260
+      <div class="col-md-12">
261
+        <ListView
262
+          :items="Weeks"
263
+          :hideSearch="true"
264
+          :showColumnChooser="false"
265
+          :showNew="false"
266
+          :canEdit="false"
267
+          :deleteable="CanEdit"
268
+          :allowMultipleSelect="false"
269
+          @onDelete="onItemDeleteWeek"
270
+          :displayColumns="weekColumns"
271
+          :displayFormats="weekFormats"
272
+        />
273
+        <!-- -->
274
+      </div>
275
+      <br />
276
+      <br />
277
+      <div class="form-group row">
278
+        <button type="button" @click="SaveData()" class="btn-solid-blue">
279
+          Save
280
+        </button>
281
+        <button type="button" @click="Close()" class="btn-solid-blue">
282
+          Close
283
+        </button>
284
+      </div>
292 285
     </div>
293
-    <div v-else class="container">
294
-      <div class="row">
295
-        <div class="col">
296
-          <alert :text="'You don\'t have permission to view this page'" :type="'ERROR'" />
297
-        </div>
286
+    <div v-else id="preloader"></div>
287
+  </div>
288
+  <div v-else class="container">
289
+    <div class="row">
290
+      <div class="col">
291
+        <alert :text="'You don\'t have permission to view this page'" :type="'ERROR'" />
298 292
       </div>
299 293
     </div>
300
-  </main>
294
+  </div>
301 295
 </template>
302 296
 
303 297
 <script>
@@ -326,6 +320,7 @@ export default {
326 320
   },
327 321
   data() {
328 322
     return {
323
+      loaded: false,
329 324
       wait: false,
330 325
       isNew: true,
331 326
       showNew: false,
@@ -333,17 +328,15 @@ export default {
333 328
       weekColumns: ["image", "weekUni"],
334 329
       weekFormats: ["image", ""],
335 330
       placeHolderColumns: ["name", "boundTo", "format"],
336
-      defaultPlaceholderClass: {
337
-        fullName: "UnivateProperties_API.Model.Timeshare.TimeshareWeek",
338
-        name: "TimeshareWeek"
339
-      }
331
+      defaultPlaceholderClass: this.CheckType
340 332
     };
341 333
   },
342 334
   props: {
335
+    passedDown: {},
343 336
     placeHolders: [],
344 337
     weeks: [],
345 338
     editable: {
346
-      default: false
339
+      default: true
347 340
     }
348 341
   },
349 342
   methods: {
@@ -357,6 +350,7 @@ export default {
357 350
     SaveData() {
358 351
       this.wait = true;
359 352
       if (this.isNew) {
353
+        this.campaign.isTimeshare = true;
360 354
         for (let i = 0; i < this.campaign.items.length; i++) {
361 355
           this.campaign.items[i].week = undefined;
362 356
           if (
@@ -371,6 +365,7 @@ export default {
371 365
           this.campaign.placeHolders[i].format = this.campaign.placeHolders[i].formatTemplate;
372 366
         }
373 367
         //console.log(JSON.stringify(this.campaign));
368
+        console.log(this.passedDown);
374 369
         this.saveCampaign(this.campaign)
375 370
           .then(fulfilled => {
376 371
             this.$router.push("/landingPages");
@@ -379,9 +374,10 @@ export default {
379 374
             console.log(error.message);
380 375
           });
381 376
       } else {
382
-        this.updateCampaign(this.campaign).then(() => {
383
-          this.$router.push("/landingPages");
384
-        });
377
+        console.log(this.passedDown);
378
+        // this.updateCampaign(this.campaign).then(() => {
379
+        //   this.$router.push("/landingPages");
380
+        // });
385 381
       }
386 382
     },
387 383
     Close() {
@@ -400,8 +396,7 @@ export default {
400 396
         format: item.format,
401 397
         formatTemplate: item.formatTemplate
402 398
       });
403
-      this.PlaceHolders = myList;
404
-      this.campaign.placeHolders = this.PlaceHolders;
399
+      this.campaign.placeHolders = myList;
405 400
       this.showNew = false;
406 401
     },
407 402
     addClose() {
@@ -439,14 +434,28 @@ export default {
439 434
     onItemDeleteWeek(item) {
440 435
       this.campaign.items = _.remove(this.campaign.items, x => x !== item);
441 436
       this.Weeks = this.campaign.items;
437
+    },
438
+    async loadData() {
439
+      if (this.$route.params.id) {
440
+        await this.getCampaign(this.$route.params.id);
441
+        this.wait = false;
442
+        if (this.$route.params.id > 0) {
443
+          this.isNew = false;
444
+        }
445
+      } else {
446
+        await this.getCampaign(0);
447
+        if (this.passedDown === "0") {
448
+          this.isNew = true;
449
+        }
450
+      }
442 451
     }
443 452
   },
444 453
   mounted() {
445
-    this.getCampaign(this.$route.params.id);
446
-    this.wait = false;
447
-    if (this.$route.params.id > 0) {
448
-      this.isNew = false;
449
-    }
454
+    this.loadData().then(() => {
455
+      setTimeout(() => {
456
+        this.loaded = true;
457
+      }, 100);
458
+    });
450 459
   },
451 460
   computed: {
452 461
     ...mapState("campaign", ["campaign", "campaignPlaceHolders", "campaignItems"]),
@@ -457,6 +466,29 @@ export default {
457 466
         return false;
458 467
       }
459 468
     },
469
+    CheckType() {
470
+      var obj = {};
471
+      if (this.campaign.id > 0) {
472
+        console.log(this.campaign);
473
+        if (this.campaign.isTimeshare) {
474
+          obj = {
475
+            fullName: "UnivateProperties_API.Model.Timeshare.TimeshareWeek",
476
+            name: "TimeshareWeek"
477
+          };
478
+        } else {
479
+          obj = {
480
+            fullName: "UnivateProperties_API.Model.Properties.Property",
481
+            name: "Property"
482
+          };
483
+        }
484
+      } else {
485
+        obj = {
486
+          fullName: "UnivateProperties_API.Model.Timeshare.TimeshareWeek",
487
+          name: "TimeshareWeek"
488
+        };
489
+      }
490
+      return obj;
491
+    },
460 492
     PlaceHolders() {
461 493
       if (this.campaign && this.campaign.placeHolders) {
462 494
         return this.campaign.placeHolders;
@@ -470,10 +502,10 @@ export default {
470 502
       return this.weeks;
471 503
     },
472 504
     CanEdit() {
473
-      return this.editable || this.campaign.id === 0;
505
+      return this.editable || this.campaign.id === 0 || this.passedDown === "0";
474 506
     },
475 507
     CanEditWeeks() {
476
-      return this.editable || this.campaign.id === 0;
508
+      return this.editable || this.campaign.id === 0 || this.passedDown === "0";
477 509
     },
478 510
     btnCaption() {
479 511
       return this.showNew ? "Close" : "New";

+ 242
- 0
src/components/marketing/landingPageAddProperty.vue Целия файл

@@ -0,0 +1,242 @@
1
+<template>
2
+  <div>
3
+    <div v-if="loaded">
4
+      <div class="row">
5
+        <div class="col-md-12" v-if="message !== undefined">
6
+          <Alert :text="message" :type="'ERROR'" />
7
+        </div>
8
+      </div>
9
+      <div class="container col-md-12" style="text-align:left">
10
+        <div class="form-group row">
11
+          <div class="col-md-3">
12
+            <button type="button" class="btn-solid-blue" @click="SearchWeeks()">
13
+              FIND PROPERTY
14
+            </button>
15
+            <modal name="propSearch" :width="700" :height="900">
16
+              <Search @onSelected="onSelected" />
17
+            </modal>
18
+          </div>
19
+          <div class="col-md-2 mt-3">
20
+            <input class="form-control" type="label" disabled :value="propertyObj.reference" />
21
+          </div>
22
+          <div class="col-md-2">
23
+            <label>Upload Image?</label>
24
+            <div class="custom-control custom-switch">
25
+              <input
26
+                type="checkbox"
27
+                class="custom-control-input"
28
+                id="customSwitch1"
29
+                :checked="uploadImage"
30
+                @change="checkImage"
31
+              />
32
+              <label class="custom-control-label" for="customSwitch1">{{
33
+                uploadImage ? "Yes" : "No"
34
+              }}</label>
35
+            </div>
36
+          </div>
37
+          <div class="col-md-3">
38
+            <Images v-if="uploadImage" :allowMultiple="false" :loadedImages="LoadedImages" />
39
+            <input
40
+              v-else
41
+              class="form-control"
42
+              type="text"
43
+              placeholder="image url"
44
+              v-model="propertyObj.imageUrl"
45
+            />
46
+          </div>
47
+          <div class="col-md-2">
48
+            <label>Custom Place holders</label>
49
+            <div class="custom-control custom-switch">
50
+              <input
51
+                type="checkbox"
52
+                class="custom-control-input"
53
+                id="customSwitch2"
54
+                :checked="showPlaceholder"
55
+                @change="ShowFields"
56
+              />
57
+              <label class="custom-control-label" for="customSwitch2">{{
58
+                showPlaceholder ? "Yes" : "No"
59
+              }}</label>
60
+            </div>
61
+          </div>
62
+        </div>
63
+        <hr v-if="showPlaceholder" />
64
+        <!-- <div class="form-group row">
65
+        <div class="col-md-5">
66
+          <button
67
+            type="button"
68
+            @click="ShowFields()"
69
+            class="btn btn-primary myBackground"
70
+          >Add Custom Place Holders</button>
71
+        </div>
72
+      </div>-->
73
+        <div class="form-group row">
74
+          <div class="col-md-12" v-if="messageCPH !== undefined">
75
+            <Alert :text="messageCPH" :type="'ERROR'" />
76
+          </div>
77
+        </div>
78
+        <div class="form-group row" v-if="showPlaceholder">
79
+          <div class="col-md-2">
80
+            <label>Place Holder</label>
81
+          </div>
82
+          <div class="col-md-3">
83
+            <input class="form-control" type="text" v-model="placeHolder" />
84
+          </div>
85
+          <div class="col-md-2">
86
+            <label>Value</label>
87
+          </div>
88
+          <div class="col-md-3">
89
+            <input class="form-control" type="text" v-model="value" />
90
+          </div>
91
+          <div class="col-md-2">
92
+            <button type="button" @click="AddCustomHolder()" class="btn-solid-blue">
93
+              Add
94
+            </button>
95
+          </div>
96
+        </div>
97
+        <div class="form-group row" v-if="showPlaceholder">
98
+          <div class="col-md-12">
99
+            <ListView
100
+              :items="placeHolders"
101
+              :hideSearch="true"
102
+              :showColumnChooser="false"
103
+              :showNew="false"
104
+              :allowMultipleSelect="false"
105
+              :canEdit="false"
106
+              :deleteable="true"
107
+              @onDelete="onItemDelete"
108
+            />
109
+          </div>
110
+        </div>
111
+        <div class="form-group row">
112
+          <div class="col-md-1 offset-md-11">
113
+            <button type="button" @click="SaveData()" class="btn-solid-blue">
114
+              Add
115
+            </button>
116
+          </div>
117
+        </div>
118
+      </div>
119
+    </div>
120
+  </div>
121
+</template>
122
+
123
+<script>
124
+/* eslint-disable */
125
+import Search from "../admin/misc/carouselSearchProperty.vue";
126
+import Images from "../property/propertyImage.vue";
127
+import { mapState, mapActions } from "vuex";
128
+import Alert from "../shared/alert.vue";
129
+import ListView from "../shared/listView.vue";
130
+
131
+export default {
132
+  name: "LandingPageWeek",
133
+  components: {
134
+    Search,
135
+    Images,
136
+    Alert,
137
+    ListView
138
+  },
139
+  data() {
140
+    return {
141
+      loaded: false,
142
+      uploadImage: false,
143
+      message: undefined,
144
+      messageCPH: undefined,
145
+      weekUni: "",
146
+      propertyObj: {},
147
+      placeHolders: [],
148
+      showPlaceholder: false,
149
+      placeHolder: undefined,
150
+      value: undefined
151
+    };
152
+  },
153
+  methods: {
154
+    ...mapActions("campaignItem", ["getCampaignItem"]),
155
+    SearchWeeks() {
156
+      this.$modal.show("propSearch");
157
+    },
158
+    onSelected(item) {
159
+      this.propertyObj = item;
160
+      console.log(this.propertyObj);
161
+      this.$modal.hide("propSearch");
162
+    },
163
+    checkImage(item) {
164
+      this.uploadImage = !this.uploadImage;
165
+    },
166
+    ShowFields() {
167
+      this.showPlaceholder = !this.showPlaceholder;
168
+    },
169
+    SaveData() {
170
+      this.message = undefined;
171
+      let msg = "";
172
+      if (!this.propertyObj) {
173
+        msg += "Please select a week. ";
174
+      }
175
+      if (this.propertyObj.image === undefined && this.propertyObj.imageUrl === undefined) {
176
+        msg += "Please select an image for this week. ";
177
+      }
178
+      if (msg.length > 0) {
179
+        this.message = msg;
180
+      } else {
181
+        if (this.uploadImage) {
182
+          this.campaignItem.image = this.propertyObj.image[0];
183
+        } else {
184
+          this.campaignItem.image = this.propertyObj.imageUrl;
185
+        }
186
+        this.campaignItem.property = this.propertyObj;
187
+        this.campaignItem.propertyId = this.propertyObj.id;
188
+
189
+        if (this.placeHolders.length > 0) {
190
+          this.campaignItem.placeHolders = this.placeHolders;
191
+          this.placeHolders = [];
192
+        }
193
+        this.$emit("onWeekItemAdd", this.campaignItem);
194
+        this.campaignItem.placeHolders = [];
195
+      }
196
+    },
197
+    LoadedImages(values) {
198
+      this.propertyObj.image = values;
199
+    },
200
+    AddCustomHolder() {
201
+      this.messageCPH = undefined;
202
+      let msg = "";
203
+
204
+      if (this.placeHolder === undefined) {
205
+        msg += "Please enter a Place Holder name. ";
206
+      }
207
+      if (this.value === undefined) {
208
+        msg += "Please enter a Value. ";
209
+      }
210
+
211
+      if (msg.length > 0) {
212
+        this.messageCPH = msg;
213
+      } else {
214
+        this.placeHolders.push({
215
+          placeHolder: this.placeHolder,
216
+          value: this.value
217
+        });
218
+        this.placeHolder = undefined;
219
+        this.value = undefined;
220
+      }
221
+    },
222
+    onItemDelete(item) {
223
+      this.placeHolders = _.remove(this.placeHolders, x => x !== item);
224
+    },
225
+    async loadData() {
226
+      if (this.$route.params.id) {
227
+        await this.getCampaignItem(this.$route.params.id);
228
+      }
229
+    }
230
+  },
231
+  mounted() {
232
+    this.loadData().then(() => {
233
+      setTimeout(() => {
234
+        this.loaded = true;
235
+      }, 100);
236
+    });
237
+  },
238
+  computed: {
239
+    ...mapState("campaignItem", ["campaignItem"])
240
+  }
241
+};
242
+</script>

+ 42
- 36
src/components/marketing/landingPageItems.vue Целия файл

@@ -1,19 +1,20 @@
1 1
 <template>
2
-  <div class="row">
3
-    <div class="col-md-12" v-if="message !== undefined">
4
-      <Alert :text="message" :type="'ERROR'" />
5
-    </div>
6
-    <div class="col-md-3">
7
-      <input
8
-        class="form-control"
9
-        type="text"
10
-        step="any"
11
-        name="levy"
12
-        placeholder="Name"
13
-        v-model="item.name"
14
-      />
15
-    </div>
16
-    <!-- <div class="col-md-3">
2
+  <div>
3
+    <div v-if="loaded" class="row">
4
+      <div class="col-md-12" v-if="message !== undefined">
5
+        <Alert :text="message" :type="'ERROR'" />
6
+      </div>
7
+      <div class="col-md-3 mt-3">
8
+        <input
9
+          class="form-control"
10
+          type="text"
11
+          step="any"
12
+          name="levy"
13
+          placeholder="Name"
14
+          v-model="item.name"
15
+        />
16
+      </div>
17
+      <!-- <div class="col-md-3">
17 18
       <select
18 19
         v-if="canSelectClass"
19 20
         class="form-control"
@@ -24,22 +25,24 @@
24 25
       </select>
25 26
       <input v-else disabled class="form-control" v-model="selectedClass.name" />
26 27
     </div>-->
27
-    <div class="col-md-3">
28
-      <select class="form-control" v-model="item.property">
29
-        <option v-for="(item, i) in properties" :key="i">{{item}}</option>
30
-      </select>
31
-    </div>
32
-    <div class="col-md-3">
33
-      <select class="form-control" v-model="item.format" @change="onFormatChanged">
34
-        <option v-for="(item, i) in formats" :key="i">{{item.displayName}}</option>
35
-      </select>
36
-    </div>
37
-    <div class="col-md-3">
38
-      <div class="btn btn-primary myBackground w-100" @click="onItemAdd()">Add</div>
28
+      <div class="col-md-3 mt-3">
29
+        <select class="form-control" v-model="item.property">
30
+          <option v-for="(item, i) in properties" :key="i">{{ item }}</option>
31
+        </select>
32
+      </div>
33
+      <div class="col-md-3 mt-3">
34
+        <select class="form-control" v-model="item.format" @change="onFormatChanged">
35
+          <option v-for="(item, i) in formats" :key="i">{{ item.displayName }}</option>
36
+        </select>
37
+      </div>
38
+      <div class="col-md-3">
39
+        <div class="btn-solid-blue" @click="onItemAdd()">Add</div>
40
+      </div>
39 41
     </div>
40 42
   </div>
41 43
 </template>
42 44
 <script>
45
+/* eslint-disable */
43 46
 import { mapState, mapActions } from "vuex";
44 47
 import Alert from "../shared/alert.vue";
45 48
 
@@ -48,15 +51,15 @@ export default {
48 51
     Alert
49 52
   },
50 53
   mounted() {
51
-    this.init();
52
-    this.getFormats();
53
-    if (this.selectedClass !== undefined) {
54
-      this.item.class = this.selectedClass;
55
-      this.getProperties(this.item.class);
56
-    }
54
+    this.loadData().then(() => {
55
+      setTimeout(() => {
56
+        this.loaded = true;
57
+      }, 100);
58
+    });
57 59
   },
58 60
   data() {
59 61
     return {
62
+      loaded: false,
60 63
       message: undefined,
61 64
       item: {
62 65
         name: undefined,
@@ -71,9 +74,7 @@ export default {
71 74
     canSelectClass: {
72 75
       default: true
73 76
     },
74
-    selectedClass: {
75
-      default: Object
76
-    }
77
+    selectedClass: {}
77 78
   },
78 79
   computed: {
79 80
     ...mapState("info", ["classes", "properties"]),
@@ -114,6 +115,11 @@ export default {
114 115
       } else {
115 116
         this.$emit("onItemAdd", this.item);
116 117
       }
118
+    },
119
+    async loadData() {
120
+      await this.init();
121
+      await this.getFormats();
122
+      await this.getProperties(this.selectedClass);
117 123
     }
118 124
   }
119 125
 };

+ 493
- 0
src/components/marketing/landingPageProperty.vue Целия файл

@@ -0,0 +1,493 @@
1
+<template>
2
+  <div v-if="checkAccess" class="container">
3
+    <div v-if="loaded" class="container col-md-12" style="text-align:left">
4
+      <div class="form-goup row">
5
+        <div class="col-md-4">
6
+          <float-label>
7
+            <input
8
+              class="form-control uniInput"
9
+              type="text"
10
+              v-model="campaign.name"
11
+              placeholder="CAMPAIGN NAME"
12
+            />
13
+          </float-label>
14
+        </div>
15
+        <div class="col-md-4">
16
+          <float-label fixed label="START DATE">
17
+            <input class="form-control uniInput" type="date" v-model="campaign.startDate" />
18
+          </float-label>
19
+        </div>
20
+        <div class="col-md-4">
21
+          <float-label fixed label="END DATE">
22
+            <input class="form-control uniInput" type="date" v-model="campaign.endDate" />
23
+          </float-label>
24
+        </div>
25
+      </div>
26
+      <div class="row mt-4">
27
+        <div class="col-md-4">
28
+          <float-label>
29
+            <input
30
+              class="form-control uniInput"
31
+              type="text"
32
+              v-model="campaign.subject"
33
+              placeholder="SUBJECT"
34
+            />
35
+          </float-label>
36
+        </div>
37
+        <div class="col-md-4">
38
+          <float-label>
39
+            <input
40
+              class="form-control uniInput"
41
+              type="number"
42
+              v-model="campaign.itemsPerRow"
43
+              placeholder="NUMBER OF ITEMS PER ROW"
44
+            />
45
+          </float-label>
46
+        </div>
47
+      </div>
48
+      <br />
49
+      <div class="col-md-12">
50
+        <label>Main Body</label>
51
+        <ul class="nav nav-tabs" id="myTab" role="tablist">
52
+          <li class="nav-item">
53
+            <a
54
+              class="nav-link active"
55
+              id="directions-tab"
56
+              data-toggle="tab"
57
+              href="#directions"
58
+              role="tab"
59
+              aria-controls="directions"
60
+              aria-selected="false"
61
+              >Html</a
62
+            >
63
+          </li>
64
+          <li class="nav-item">
65
+            <a
66
+              class="nav-link"
67
+              id="resort-layout-tab"
68
+              data-toggle="tab"
69
+              href="#resort-layout"
70
+              role="tab"
71
+              aria-controls="resort-layout"
72
+              aria-selected="true"
73
+              >Preview</a
74
+            >
75
+          </li>
76
+        </ul>
77
+        <div
78
+          class="tab-content"
79
+          id="myTabContent"
80
+          style="background-color:rgba(255,255,255,0.75);padding:10px;border:silver solid thin;border-radius:10px;"
81
+        >
82
+          <div
83
+            class="tab-pane fade show active"
84
+            style="background-color:rgba(255,255,255,0.75);padding:10px;"
85
+            id="directions"
86
+            role="tabpanel"
87
+            aria-labelledby="directions-tab"
88
+          >
89
+            <div class="text-left">
90
+              <div class="input-group mb-3">
91
+                <label>
92
+                  <i>Place the tag [items] as a place holder for the week items.</i>
93
+                </label>
94
+              </div>
95
+              <div class="input-group mb-3">
96
+                <!-- <div class="input-group-prepend">
97
+                    <span class="input-group-text" style="color: #60CBEB">
98
+                      <b>B</b>
99
+                    </span>
100
+                  </div>-->
101
+                <textarea
102
+                  class="form-control"
103
+                  type="text"
104
+                  rows="10"
105
+                  step="any"
106
+                  name="levy"
107
+                  v-model="campaign.body"
108
+                />
109
+              </div>
110
+            </div>
111
+          </div>
112
+          <div
113
+            class="tab-pane fade"
114
+            id="resort-layout"
115
+            role="tabpanel"
116
+            aria-labelledby="resort-layout-tab"
117
+          >
118
+            <div class="no-style" v-html="campaign.body"></div>
119
+          </div>
120
+        </div>
121
+      </div>
122
+      <br />
123
+      <div class="col-md-12">
124
+        <label>Item Template</label>
125
+        <ul class="nav nav-tabs" id="myTab" role="tablist">
126
+          <li class="nav-item">
127
+            <a
128
+              class="nav-link active"
129
+              id="template-tab"
130
+              data-toggle="tab"
131
+              href="#template"
132
+              role="tab"
133
+              aria-controls="template"
134
+              aria-selected="false"
135
+              >Html</a
136
+            >
137
+          </li>
138
+          <li class="nav-item">
139
+            <a
140
+              class="nav-link"
141
+              id="preview-tab"
142
+              data-toggle="tab"
143
+              href="#preview"
144
+              role="tab"
145
+              aria-controls="preview"
146
+              aria-selected="true"
147
+              >Preview</a
148
+            >
149
+          </li>
150
+        </ul>
151
+        <div
152
+          class="tab-content"
153
+          id="myTabContent"
154
+          style="background-color:rgba(255,255,255,0.75);padding:10px;border:silver solid thin;border-radius:10px;"
155
+        >
156
+          <div
157
+            class="tab-pane fade show active"
158
+            style="background-color:rgba(255,255,255,0.75);padding:10px;"
159
+            id="template"
160
+            role="tabpanel"
161
+            aria-labelledby="template-tab"
162
+          >
163
+            <div class="text-left">
164
+              <div class="input-group mb-3">
165
+                <label>
166
+                  <i>
167
+                    Place the tag [image] as a place holder for the week's image.
168
+                    <br />Place the tag [link] for a hypher link to the week's page
169
+                  </i>
170
+                </label>
171
+              </div>
172
+              <div class="input-group mb-3">
173
+                <!-- <div class="input-group-prepend">
174
+                    <span class="input-group-text" style="color: #60CBEB">
175
+                      <b>B</b>
176
+                    </span>
177
+                  </div>-->
178
+                <textarea
179
+                  class="form-control"
180
+                  type="text"
181
+                  rows="10"
182
+                  step="any"
183
+                  name="levy"
184
+                  v-model="campaign.itemBody"
185
+                />
186
+              </div>
187
+            </div>
188
+          </div>
189
+          <div class="tab-pane fade" id="preview" role="tabpanel" aria-labelledby="preview-tab">
190
+            <div class="no-style" v-html="campaign.itemBody"></div>
191
+          </div>
192
+        </div>
193
+      </div>
194
+      <div class="col-md-12"></div>
195
+      <br />
196
+      <div class="col-md-12">
197
+        <label>
198
+          <b>Place Holders</b>
199
+        </label>
200
+        <div class="d-flex">
201
+          <div class="p-2">
202
+            <div class="btn-solid-blue" @click="addClose()" v-if="CanEdit">
203
+              {{ btnCaption }}
204
+            </div>
205
+          </div>
206
+        </div>
207
+      </div>
208
+      <div class="col-md-12" v-if="showNew">
209
+        <LandingPageItems
210
+          @onItemAdd="onItemAdd"
211
+          :selectedClass="defaultPlaceholderClass"
212
+          :canSelectClass="false"
213
+        />
214
+      </div>
215
+      <div class="col-md-12">
216
+        <hr />
217
+      </div>
218
+      <div class="col-md-12">
219
+        <ListView
220
+          :items="PlaceHolders"
221
+          :hideSearch="true"
222
+          :showColumnChooser="false"
223
+          :showNew="false"
224
+          :allowMultipleSelect="true"
225
+          :canEdit="false"
226
+          :deleteable="CanEdit"
227
+          @onDelete="onItemDelete"
228
+          :displayColumns="placeHolderColumns"
229
+          :sortKey="'name'"
230
+        />
231
+        <!-- :displayColumns="placeHolderColumns" -->
232
+      </div>
233
+      <br />
234
+      <div class="col-md-12">
235
+        <label>
236
+          <b>Properties</b>
237
+        </label>
238
+        <div class="d-flex">
239
+          <div class="p-2">
240
+            <div class="btn-solid-blue" @click="addWeekClose()" v-if="CanEditWeeks">
241
+              {{ btnCaptionWeek }}
242
+            </div>
243
+          </div>
244
+        </div>
245
+      </div>
246
+      <div class="col-md-12" v-if="showNewWeek">
247
+        <WeekAdd @onWeekItemAdd="AddNewProperty" />
248
+      </div>
249
+      <div class="col-md-12">
250
+        <hr />
251
+      </div>
252
+      <div class="col-md-12">
253
+        <ListView
254
+          :items="Properties"
255
+          :hideSearch="true"
256
+          :showColumnChooser="false"
257
+          :showNew="false"
258
+          :canEdit="false"
259
+          :deleteable="CanEdit"
260
+          :allowMultipleSelect="false"
261
+          @onDelete="onItemDeleteWeek"
262
+          :sortKey="'reference'"
263
+          :displayColumns="propertyColumns"
264
+          :displayFormats="weekFormats"
265
+          :allowSelect="false"
266
+        />
267
+        <!-- -->
268
+      </div>
269
+      <br />
270
+      <br />
271
+      <div class="form-group row">
272
+        <button type="button" @click="SaveData()" class="btn-solid-blue">
273
+          Save
274
+        </button>
275
+        <button type="button" @click="Close()" class="btn-solid-blue">
276
+          Close
277
+        </button>
278
+      </div>
279
+    </div>
280
+    <div v-else id="preloader"></div>
281
+  </div>
282
+  <div v-else class="container">
283
+    <div class="row">
284
+      <div class="col">
285
+        <alert :text="'You don\'t have permission to view this page'" :type="'ERROR'" />
286
+      </div>
287
+    </div>
288
+  </div>
289
+</template>
290
+
291
+<script>
292
+/* eslint-disable */
293
+import { VueEditor } from "vue2-editor";
294
+import { mapState, mapActions } from "vuex";
295
+
296
+import Log from "../../assets/Log";
297
+import alert from "../shared/alert";
298
+import FieldEditor from "../../components/shared/fieldEditor";
299
+import ListView from "../shared/listView.vue";
300
+import Search from "../admin/misc/carouselSearch.vue";
301
+import LandingPageItems from "./landingPageItems.vue";
302
+import WeekAdd from "./landingPageAddProperty.vue";
303
+
304
+export default {
305
+  name: "LandingPage",
306
+  components: {
307
+    VueEditor,
308
+    FieldEditor,
309
+    Search,
310
+    LandingPageItems,
311
+    ListView,
312
+    WeekAdd,
313
+    alert
314
+  },
315
+  data() {
316
+    return {
317
+      loaded: false,
318
+      wait: false,
319
+      isNew: true,
320
+      showNew: false,
321
+      showNewWeek: false,
322
+      propertyColumns: ["image", "reference"],
323
+      weekFormats: ["image", ""],
324
+      placeHolderColumns: ["name", "boundTo", "format"],
325
+      defaultPlaceholderClass: {
326
+        fullName: "UnivateProperties_API.Model.Properties.Property",
327
+        name: "Property"
328
+      }
329
+    };
330
+  },
331
+  props: {
332
+    passedDown: {},
333
+    placeHolders: [],
334
+    weeks: [],
335
+    editable: {
336
+      default: false
337
+    }
338
+  },
339
+  methods: {
340
+    ...mapActions("campaign", [
341
+      "getCampaign",
342
+      "saveCampaign",
343
+      "updateCampaign",
344
+      "getCampaignItems",
345
+      "getCampaignPlaceHolders"
346
+    ]),
347
+    SaveData() {
348
+      this.wait = true;
349
+      if (this.isNew) {
350
+        this.campaign.isTimeshare = false;
351
+        for (let i = 0; i < this.campaign.items.length; i++) {
352
+          this.campaign.items[i].week = undefined;
353
+          if (
354
+            this.campaign.items[i].placeHolders &&
355
+            this.campaign.items[i].placeHolders.length > 0
356
+          ) {
357
+            this.campaign.items[i].campaignItemPlaceHolder = this.campaign.items[i].placeHolders;
358
+          }
359
+        }
360
+
361
+        for (let i = 0; i < this.campaign.placeHolders.length; i++) {
362
+          this.campaign.placeHolders[i].format = this.campaign.placeHolders[i].formatTemplate;
363
+        }
364
+        console.log(JSON.stringify(this.campaign));
365
+        this.campaign.weekId = null;
366
+        this.saveCampaign(this.campaign)
367
+          .then(fulfilled => {
368
+            this.$router.push("/landingPages");
369
+          })
370
+          .catch(error => {
371
+            console.log(error.message);
372
+          });
373
+      } else {
374
+        this.updateCampaign(this.campaign).then(() => {
375
+          this.$router.push("/landingPages");
376
+        });
377
+      }
378
+    },
379
+    Close() {
380
+      this.$router.push("/landingPages");
381
+    },
382
+    NewWeek() {
383
+      this.$router.push("/landingPage/week/0");
384
+    },
385
+    onItemAdd(item) {
386
+      const myList = this.campaign.placeHolders ? this.campaign.placeHolders : [];
387
+      myList.push({
388
+        name: item.name,
389
+        boundTo: item.property,
390
+        boundToClassDisplay: item.class.name,
391
+        boundToClass: item.class.fullName,
392
+        format: item.format,
393
+        formatTemplate: item.formatTemplate
394
+      });
395
+      this.PlaceHolders = myList;
396
+      this.campaign.placeHolders = this.PlaceHolders;
397
+      this.showNew = false;
398
+    },
399
+    addClose() {
400
+      if (this.showNew) {
401
+        this.showNew = false;
402
+      } else this.showNew = true;
403
+    },
404
+    addWeekClose() {
405
+      if (this.showNewWeek) {
406
+        this.showNewWeek = false;
407
+      } else {
408
+        this.showNewWeek = true;
409
+      }
410
+    },
411
+    onItemDelete(item) {
412
+      this.campaign.placeHolders = _.remove(this.campaign.placeHolders, x => x !== item);
413
+      this.placeHolders = this.campaign.placeHolders;
414
+    },
415
+    // AddWeek(item) {
416
+    //   // const myList = this.campaign.items ? this.campaign.items : [];
417
+    //   // myList.push(item);
418
+    //   // this.campaign.items = myList;
419
+    //   //this.showNewWeek = false;
420
+    // },
421
+    AddNewProperty(property) {
422
+      var item = {
423
+        image: property.image,
424
+        reference: property.property.reference,
425
+        propertyId: property.propertyId,
426
+        placeHolders: property.placeHolders
427
+      };
428
+
429
+      this.campaign.items.push(item);
430
+      this.showNewWeek = false;
431
+    },
432
+    onItemDeleteWeek(item) {
433
+      this.campaign.items = _.remove(this.campaign.items, x => x !== item);
434
+      this.Weeks = this.campaign.items;
435
+    },
436
+    async loadData() {
437
+      if (!this.passedDown) {
438
+        await this.getCampaign(this.$route.params.id);
439
+        this.wait = false;
440
+        if (this.$route.params.id > 0) {
441
+          this.isNew = false;
442
+        }
443
+      } else {
444
+        await this.getCampaign(0);
445
+        if (this.passedDown === "0") {
446
+          this.isNew = true;
447
+        }
448
+      }
449
+    }
450
+  },
451
+  mounted() {
452
+    this.loadData().then(() => {
453
+      setTimeout(() => {
454
+        this.loaded = true;
455
+      }, 100);
456
+    });
457
+  },
458
+  computed: {
459
+    ...mapState("campaign", ["campaign", "campaignPlaceHolders", "campaignItems"]),
460
+    checkAccess() {
461
+      if (Log.getUser().role === "Super Admin" || Log.getUser().role === "Designer") {
462
+        return true;
463
+      } else {
464
+        return false;
465
+      }
466
+    },
467
+    PlaceHolders() {
468
+      if (this.campaign && this.campaign.placeHolders) {
469
+        return this.campaign.placeHolders;
470
+      }
471
+      return this.placeHolders;
472
+    },
473
+    Properties() {
474
+      if (this.campaign && this.campaign.items) {
475
+        return this.campaign.items;
476
+      }
477
+      return this.weeks;
478
+    },
479
+    CanEdit() {
480
+      return this.editable || this.campaign.id === 0 || this.passedDown === "0";
481
+    },
482
+    CanEditWeeks() {
483
+      return this.editable || this.campaign.id === 0 || this.passedDown === "0";
484
+    },
485
+    btnCaption() {
486
+      return this.showNew ? "Close" : "New";
487
+    },
488
+    btnCaptionWeek() {
489
+      return this.showNewWeek ? "Close" : "New";
490
+    }
491
+  }
492
+};
493
+</script>

+ 114
- 114
src/components/marketing/landingPageWeek.vue Целия файл

@@ -1,69 +1,67 @@
1 1
 <template>
2 2
   <div>
3
-    <div class="row">
4
-      <div class="col-md-12" v-if="message !== undefined">
5
-        <Alert :text="message" :type="'ERROR'" />
6
-      </div>
7
-    </div>
8
-    <div class="container col-md-12" style="text-align:left">
9
-      <div class="form-group row">
10
-        <div class="col-md-2">
11
-          <label>Find Week</label>
12
-          <button
13
-            type="button"
14
-            class="input-group-text fa fa-search"
15
-            style="color: #60CBEB"
16
-            @click="SearchWeeks()"
17
-          ></button>          
18
-          <modal name="weeksearch"  :width="700" :height="900" >
19
-            <Search :name="'Timeshare'" @onSelected="onSelected" />
20
-          </modal>          
21
-        </div>
22
-        <div class="col-md-3">
23
-          <input class="form-control" type="label" disabled :value="weekUni" />
3
+    <div v-if="loaded">
4
+      <div class="row">
5
+        <div class="col-md-12" v-if="message !== undefined">
6
+          <Alert :text="message" :type="'ERROR'" />
24 7
         </div>
25
-        <div class="col-md-2">
26
-          <label>Upload Image?</label>
27
-          <div class="custom-control custom-switch">
28
-            <input
29
-              type="checkbox"
30
-              class="custom-control-input"
31
-              id="customSwitch1"
32
-              :checked="uploadImage"
33
-              @change="checkImage"
34
-            />
35
-            <label class="custom-control-label" for="customSwitch1">{{uploadImage ? 'Yes' : 'No'}}</label>
8
+      </div>
9
+      <div class="container col-md-12" style="text-align:left">
10
+        <div class="form-group row">
11
+          <div class="col-md-3">
12
+            <button type="button" class="btn-solid-blue" @click="SearchWeeks()">
13
+              FIND WEEK
14
+            </button>
15
+            <modal name="weeksearch" :width="700" :height="900">
16
+              <Search :name="'Timeshare'" @onSelected="onSelected" />
17
+            </modal>
36 18
           </div>
37
-        </div>
38
-        <div class="col-md-3">
39
-          <Images v-if="uploadImage" :allowMultiple="false" :loadedImages="LoadedImages" />
40
-          <input
41
-            v-else
42
-            class="form-control"
43
-            type="text"
44
-            placeholder="image url"
45
-            v-model="weekItem.imageUrl"
46
-          />
47
-        </div>
48
-        <div class="col-md-2">
49
-          <label>Custom Place holders</label>
50
-          <div class="custom-control custom-switch">
19
+          <div class="col-md-2 mt-3">
20
+            <input class="form-control" type="label" disabled :value="weekUni" />
21
+          </div>
22
+          <div class="col-md-2">
23
+            <label>Upload Image?</label>
24
+            <div class="custom-control custom-switch">
25
+              <input
26
+                type="checkbox"
27
+                class="custom-control-input"
28
+                id="customSwitch1"
29
+                :checked="uploadImage"
30
+                @change="checkImage"
31
+              />
32
+              <label class="custom-control-label" for="customSwitch1">{{
33
+                uploadImage ? "Yes" : "No"
34
+              }}</label>
35
+            </div>
36
+          </div>
37
+          <div class="col-md-3">
38
+            <Images v-if="uploadImage" :allowMultiple="false" :loadedImages="LoadedImages" />
51 39
             <input
52
-              type="checkbox"
53
-              class="custom-control-input"
54
-              id="customSwitch2"
55
-              :checked="showPlaceholder"
56
-              @change="ShowFields"
40
+              v-else
41
+              class="form-control"
42
+              type="text"
43
+              placeholder="image url"
44
+              v-model="weekItem.imageUrl"
57 45
             />
58
-            <label
59
-              class="custom-control-label"
60
-              for="customSwitch2"
61
-            >{{showPlaceholder ? 'Yes' : 'No'}}</label>
46
+          </div>
47
+          <div class="col-md-2">
48
+            <label>Custom Place holders</label>
49
+            <div class="custom-control custom-switch">
50
+              <input
51
+                type="checkbox"
52
+                class="custom-control-input"
53
+                id="customSwitch2"
54
+                :checked="showPlaceholder"
55
+                @change="ShowFields"
56
+              />
57
+              <label class="custom-control-label" for="customSwitch2">{{
58
+                showPlaceholder ? "Yes" : "No"
59
+              }}</label>
60
+            </div>
62 61
           </div>
63 62
         </div>
64
-      </div>
65
-      <hr v-if="showPlaceholder" />
66
-      <!-- <div class="form-group row">
63
+        <hr v-if="showPlaceholder" />
64
+        <!-- <div class="form-group row">
67 65
         <div class="col-md-5">
68 66
           <button
69 67
             type="button"
@@ -72,55 +70,50 @@
72 70
           >Add Custom Place Holders</button>
73 71
         </div>
74 72
       </div>-->
75
-      <div class="form-group row">
76
-        <div class="col-md-12" v-if="messageCPH !== undefined">
77
-          <Alert :text="messageCPH" :type="'ERROR'" />
78
-        </div>
79
-      </div>
80
-      <div class="form-group row" v-if="showPlaceholder">
81
-        <div class="col-md-2">
82
-          <label>Place Holder</label>
83
-        </div>
84
-        <div class="col-md-3">
85
-          <input class="form-control" type="text" v-model="placeHolder" />
86
-        </div>
87
-        <div class="col-md-2">
88
-          <label>Value</label>
89
-        </div>
90
-        <div class="col-md-3">
91
-          <input class="form-control" type="text" v-model="value" />
73
+        <div class="form-group row">
74
+          <div class="col-md-12" v-if="messageCPH !== undefined">
75
+            <Alert :text="messageCPH" :type="'ERROR'" />
76
+          </div>
92 77
         </div>
93
-        <div class="col-md-2">
94
-          <button
95
-            type="button"
96
-            @click="AddCustomHolder()"
97
-            class="btn btn-primary myBackground"
98
-            style="width: 85px; height:40px;"
99
-          >Add</button>
78
+        <div class="form-group row" v-if="showPlaceholder">
79
+          <div class="col-md-2">
80
+            <label>Place Holder</label>
81
+          </div>
82
+          <div class="col-md-3">
83
+            <input class="form-control" type="text" v-model="placeHolder" />
84
+          </div>
85
+          <div class="col-md-2">
86
+            <label>Value</label>
87
+          </div>
88
+          <div class="col-md-3">
89
+            <input class="form-control" type="text" v-model="value" />
90
+          </div>
91
+          <div class="col-md-2">
92
+            <button type="button" @click="AddCustomHolder()" class="btn-solid-blue">
93
+              Add
94
+            </button>
95
+          </div>
100 96
         </div>
101
-      </div>
102
-      <div class="form-group row" v-if="showPlaceholder">
103
-        <div class="col-md-12">
104
-          <ListView
105
-            :items="placeHolders"
106
-            :hideSearch="true"
107
-            :showColumnChooser="false"
108
-            :showNew="false"
109
-            :allowMultipleSelect="false"
110
-            :canEdit="false"
111
-            :deleteable="true"
112
-            @onDelete="onItemDelete"
113
-          />
97
+        <div class="form-group row" v-if="showPlaceholder">
98
+          <div class="col-md-12">
99
+            <ListView
100
+              :items="placeHolders"
101
+              :hideSearch="true"
102
+              :showColumnChooser="false"
103
+              :showNew="false"
104
+              :allowMultipleSelect="false"
105
+              :canEdit="false"
106
+              :deleteable="true"
107
+              @onDelete="onItemDelete"
108
+            />
109
+          </div>
114 110
         </div>
115
-      </div>
116
-      <div class="form-group row">
117
-        <div class="col-md-1 offset-md-11">
118
-          <button
119
-            type="button"
120
-            @click="SaveData()"
121
-            class="btn btn-primary myBackground"
122
-            style="width: 85px; height:40px;"
123
-          >Add</button>
111
+        <div class="form-group row">
112
+          <div class="col-md-1 offset-md-11">
113
+            <button type="button" @click="SaveData()" class="btn-solid-blue">
114
+              Add
115
+            </button>
116
+          </div>
124 117
         </div>
125 118
       </div>
126 119
     </div>
@@ -128,6 +121,7 @@
128 121
 </template>
129 122
 
130 123
 <script>
124
+/* eslint-disable */
131 125
 import Search from "../admin/misc/carouselSearch.vue";
132 126
 import Images from "../property/propertyImage.vue";
133 127
 import { mapState, mapActions } from "vuex";
@@ -144,6 +138,7 @@ export default {
144 138
   },
145 139
   data() {
146 140
     return {
141
+      loaded: false,
147 142
       uploadImage: false,
148 143
       message: undefined,
149 144
       messageCPH: undefined,
@@ -161,13 +156,13 @@ export default {
161 156
   },
162 157
   methods: {
163 158
     ...mapActions("campaignItem", ["getCampaignItem"]),
164
-    SearchWeeks(){
159
+    SearchWeeks() {
165 160
       this.$modal.show("weeksearch");
166 161
     },
167
-    onSelected(item) {            
162
+    onSelected(item) {
168 163
       this.weekItem.selectedWeek = item[0];
169
-      this.weekUni = item[0].weekUni; 
170
-      this.$modal.hide("weeksearch");           
164
+      this.weekUni = item[0].weekUni;
165
+      this.$modal.hide("weeksearch");
171 166
     },
172 167
     checkImage(item) {
173 168
       this.uploadImage = !this.uploadImage;
@@ -181,10 +176,7 @@ export default {
181 176
       if (this.weekItem.selectedWeek === undefined) {
182 177
         msg += "Please select a week. ";
183 178
       }
184
-      if (
185
-        this.weekItem.image === undefined &&
186
-        this.weekItem.imageUrl === undefined
187
-      ) {
179
+      if (this.weekItem.image === undefined && this.weekItem.imageUrl === undefined) {
188 180
         msg += "Please select an image for this week. ";
189 181
       }
190 182
       if (msg.length > 0) {
@@ -233,14 +225,22 @@ export default {
233 225
     },
234 226
     onItemDelete(item) {
235 227
       this.placeHolders = _.remove(this.placeHolders, x => x !== item);
228
+    },
229
+    async loadData() {
230
+      if (this.$route.params.id) {
231
+        await this.getCampaignItem(this.$route.params.id);
232
+      }
236 233
     }
237 234
   },
238 235
   mounted() {
239
-    this.getCampaignItem(this.$route.params.id);
236
+    this.loadData().then(() => {
237
+      setTimeout(() => {
238
+        this.loaded = true;
239
+      }, 100);
240
+    });
240 241
   },
241 242
   computed: {
242 243
     ...mapState("campaignItem", ["campaignItem"])
243 244
   }
244 245
 };
245 246
 </script>
246
-

+ 12
- 5
src/components/marketing/landingPages.vue Целия файл

@@ -1,7 +1,7 @@
1 1
 <template>
2 2
   <!-- eslint-disable max-len -->
3 3
   <main id="main" style="margin-top:-20px; padding-bottom:50px">
4
-    <div class="container">
4
+    <div v-if="loaded" class="container">
5 5
       <div class="row">
6 6
         <div class="col-md-12 col-lg-8">
7 7
           <div class="section-header">
@@ -33,6 +33,7 @@
33 33
         </div>
34 34
       </div>
35 35
     </div>
36
+    <div v-else id="preloader"></div>
36 37
   </main>
37 38
 </template>
38 39
 
@@ -53,7 +54,8 @@ export default {
53 54
   data() {
54 55
     return {
55 56
       columns: ["name", "startDate", "endDate", "subject"],
56
-      formats: ["text", "date", "date", "text"]
57
+      formats: ["text", "date", "date", "text"],
58
+      loaded: false
57 59
     };
58 60
   },
59 61
   methods: {
@@ -68,15 +70,20 @@ export default {
68 70
     //   this.publishProperty(item);
69 71
     // }
70 72
     New() {
71
-      this.$router.push("/landingPage/0");
73
+      this.$router.push("/newLandingPage");
72 74
     },
73 75
     ClientVue(item) {
74 76
       this.$router.push(`/MarketingCampaign/${item.id}`);
77
+    },
78
+    async loadData() {
79
+      await this.getCampaigns();
80
+      await this.$emit("setLandingPage", false);
75 81
     }
76 82
   },
77 83
   mounted() {
78
-    this.getCampaigns();
79
-    this.$emit("setLandingPage", false);
84
+    this.loadData().then(() => {
85
+      this.loaded = true;
86
+    });
80 87
   },
81 88
   computed: {
82 89
     ...mapState("campaign", ["campaigns"]),

+ 46
- 0
src/components/marketing/newLandingPage.vue Целия файл

@@ -0,0 +1,46 @@
1
+<template>
2
+  <main id="main" style="margin-top:200px; padding-bottom:50px">
3
+    <div class="container">
4
+      <div class="row">
5
+        <div class="col">
6
+          <div class="section-header">
7
+            <h2>Landing Page</h2>
8
+          </div>
9
+        </div>
10
+      </div>
11
+      <div class="row">
12
+        <div class="col-6">
13
+          <select name="landingType" class="form-control uniSelect" v-model="selectedType">
14
+            <option value="property">Property Campaign</option>
15
+            <option value="timeshare">Timeshare Campaign</option>
16
+          </select>
17
+        </div>
18
+      </div>
19
+      <div v-if="selectedType === 'property'" class="row">
20
+        <propertyLanding passedDown="0" />
21
+      </div>
22
+      <div v-if="selectedType === 'timeshare'" class="row">
23
+        <timeshareLanding passedDown="0" />
24
+      </div>
25
+    </div>
26
+  </main>
27
+</template>
28
+
29
+<script>
30
+/* eslint-disable */
31
+import propertyLanding from "./landingPageProperty";
32
+import timeshareLanding from "./landingPage";
33
+export default {
34
+  components: {
35
+    propertyLanding,
36
+    timeshareLanding
37
+  },
38
+  data() {
39
+    return {
40
+      selectedType: ""
41
+    };
42
+  }
43
+};
44
+</script>
45
+
46
+<style lang="scss" scoped></style>

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

@@ -312,10 +312,10 @@
312 312
                         <router-link to="/payments">Payments</router-link>
313 313
                       </li>
314 314
                       <li v-if="ROLE === 'Super Admin'">
315
-                        <router-link to="/landingPages">Landing Pages / Campaignes</router-link>
315
+                        <router-link to="/campaignUpload">Landing Pages / Campaignes</router-link>
316 316
                       </li>
317 317
                       <li v-if="ROLE === 'Designer'">
318
-                        <router-link to="/landingPages">Landing Pages / Campaignes</router-link>
318
+                        <router-link to="/campaignUpload">Landing Pages / Campaignes</router-link>
319 319
                       </li>
320 320
                       <li>
321 321
                         <router-link class="btn-white-border p-2" to="/user/login"

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

@@ -95,8 +95,11 @@ import PaymentOption from '../components/financial/paymentOption.vue'
95 95
 import EFTPage from '../components/financial/eftPage.vue'
96 96
 import PayFast from '../components/financial/payFast.vue'
97 97
 
98
+import CampaignUpload from '../components/marketing/campaignUpload.vue'
98 99
 import LandingPages from "../components/marketing/landingPages.vue";
99 100
 import LandingPage from "../components/marketing/landingPage.vue";
101
+import LandingPageProperty from "../components/marketing/landingPageProperty.vue";
102
+import NewLandingPage from '../components/marketing/newLandingPage.vue'
100 103
 import LandingPageWeek from "../components/marketing/landingPageWeek.vue";
101 104
 import MarketingPage from "../components/marketing/clientView.vue";
102 105
 import MarketingPageExp from "../components/marketing/landingPageExpired.vue";
@@ -458,16 +461,31 @@ export default new Router({
458 461
       name: "Payments",
459 462
       component: Payments
460 463
     },
464
+    {
465
+      path: "/campaignUpload",
466
+      name: "CampaignUpload",
467
+      component: CampaignUpload
468
+    },
461 469
     {
462 470
       path: "/landingPages",
463 471
       name: "LandingPages",
464 472
       component: LandingPages
465 473
     },
474
+    {
475
+      path: "/newLandingPage",
476
+      name: "newLandingPage",
477
+      component: NewLandingPage
478
+    },
466 479
     {
467 480
       path: "/landingPage/:id",
468 481
       name: "LandingPage",
469 482
       component: LandingPage
470 483
     },
484
+    {
485
+      path: "/landingPageProperty/:id",
486
+      name: "LandingPageProperty",
487
+      component: LandingPageProperty
488
+    },
471 489
     {
472 490
       path: "/landingPage/week/:id",
473 491
       name: "LandingPageWeek",

+ 6
- 2
src/store/modules/communication/info.js Целия файл

@@ -20,10 +20,10 @@ export default {
20 20
   },
21 21
   getters: {},
22 22
   actions: {
23
-    init({
23
+    async init({
24 24
       dispatch,
25 25
     }) {
26
-      dispatch('clearAll');
26
+      await dispatch('clearAll');
27 27
       dispatch('getClasses');
28 28
     },
29 29
     getClasses({
@@ -42,5 +42,9 @@ export default {
42 42
         .then(result => commit('setProperties', result.data))
43 43
         .catch(ex => console.log(ex.response));
44 44
     },
45
+    clearAll({commit}){
46
+     console.log("it was here");
47
+      commit('clearAll')
48
+    }
45 49
   },
46 50
 };

+ 53
- 1
src/store/modules/marketing/campaigns.js Целия файл

@@ -1,5 +1,7 @@
1
+/* eslint-disable */
1 2
 import axios from "axios";
2 3
 import { Object } from "core-js";
4
+import promise from "core-js/fn/promise";
3 5
 
4 6
 export default {
5 7
     namespaced: true,
@@ -9,7 +11,8 @@ export default {
9 11
         campaignDTO: {},
10 12
         campaignHtml: '',
11 13
         campaignPlaceHolders: [],
12
-        campaignItems: []
14
+        campaignItems: [],
15
+        uploadedCampaigns: []
13 16
     },
14 17
     mutations: {
15 18
         setCampaign(state, campaign) {
@@ -36,6 +39,13 @@ export default {
36 39
         },
37 40
         setCampaignHTML(state, campaign) {
38 41
             state.campaignHtml = campaign;
42
+        },
43
+        setUploadedCampaigns(state, campaigns){
44
+            state.uploadedCampaigns = campaigns
45
+        },
46
+        deleteUploadedById(state, id){
47
+            var index = state.uploadedCampaigns.findIndex((camp) => camp.id == id)
48
+            state.uploadedCampaigns.splice(index, 1)
39 49
         }
40 50
     },
41 51
     getters: {},
@@ -93,6 +103,48 @@ export default {
93 103
                 .delete(`/api/campaign/${id}`)
94 104
                 .then(result => commit("removeCampaign", id))
95 105
                 .catch(console.error);
106
+        },
107
+        async uploadCampaign({commit}, file){
108
+            return await new Promise((resolve, reject) => {
109
+                axios({
110
+                    method: 'post',
111
+                    url: '/api/campaign/FileUpload',
112
+                    data: file,
113
+                    headers: { 'Content-Type': 'multipart/form-data' },
114
+                  }).then((resp) => {
115
+                    resolve(resp.data)
116
+                  }).catch((ex) => {
117
+                    reject(ex.response)
118
+                  })
119
+            })
120
+            
121
+        },
122
+        async getUploadedCampaign({commit}){
123
+            return await new Promise((resolve, reject) => {
124
+                 axios.get(`/api/campaign/GetUploaded`)
125
+                .then((resp) => {
126
+                    resolve(resp)
127
+                    commit("setUploadedCampaigns", resp.data)
128
+                })
129
+                .catch((ex) => {
130
+                    reject(ex)
131
+                    console.log(ex.response);
132
+                })
133
+            })
134
+            
135
+        },
136
+        async deleteUploadedCampaign({commit}, id){
137
+            return await new Promise((resolve, reject) => {
138
+                axios.delete(`api/campaign/DeleteUploaded/`+ id)
139
+                .then((resp) => {
140
+                    commit("deleteUploadedById", id)
141
+                    resolve(resp)
142
+                })
143
+                .catch((ex) => {
144
+                    console.log(ex.response)
145
+                    reject(ex.response)
146
+                })
147
+            })
96 148
         }
97 149
     }
98 150
 };

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