Lene Scholtz 5 yıl önce
ebeveyn
işleme
12f644fe34

+ 84
- 18
src/components/admin/status/timeshareAdminPage.vue Dosyayı Görüntüle

@@ -1,44 +1,110 @@
1 1
 <template>
2
-  <!-- <section class="intro-single"> -->
3
-  <div class="container">
2
+  <div>
3
+    <br />
4 4
     <br />
5 5
     <br />
6 6
     <br />
7 7
     <br />
8 8
     <div class="row">
9
-      <div class="col-md-12 col-lg-8">
10
-        <!-- <div class="title-single-box"> -->
11
-        <!-- <h1 class="title-single" style="text-align:left;">Timeshare Admin</h1> -->
12
-        <!-- </div> -->
13
-        <div class="title-box-d">
14
-          <h1 class="title-d" style="text-align:left; font-size: 250%">Timeshare Admin</h1>
15
-        </div>
16
-        <br />
9
+      <div class="offset-1 col-md-3">
10
+        <button
11
+          type="button"
12
+          :class="{'form-control btn btn-primary ': (1===1), 'my-disable': (!selectedItems || selectedItems.length === 0)}"
13
+          value="Verify Week(s)"
14
+          :disabled="selectedItems.length > 0"
15
+        >{{ButtonMessage}}</button>
16
+        <div>{{Message}}</div>
17
+      </div>
18
+      <div class="offset-1 col-md-10">
19
+        <ListView
20
+          :items="items"
21
+          :allowMultipleSelect="true"
22
+          @onRowClick="onRowClick"
23
+          @onClearSelected="onClearSelected"
24
+          :columnsCount="15"
25
+          :title="'Pending Weeks'"
26
+        />
17 27
       </div>
18
-    </div>
19
-    <div id="table" class="col-xs-12 table-responsive">
20
-      <datatable :columns="columns" :data="rows"></datatable>
21 28
     </div>
22 29
   </div>
23
-  <!-- </section> -->
24 30
 </template>
25 31
 <script>
26 32
 import { mapState, mapActions } from 'vuex';
33
+import Log from '../../../assets/Log';
34
+import ListView from '../../shared/listView.vue';
27 35
 
28 36
 export default {
29 37
   name: 'TimeshareAdmin',
30
-  created() {
31
-    this.gettimeshareAdmin();
38
+  components: {
39
+    ListView,
40
+  },
41
+  data() {
42
+    return {
43
+      user: Log.getUser(),
44
+      selectedItems: [],
45
+      showMessage: false,
46
+    };
47
+  },
48
+  mounted() {
49
+    console.log(this.user.id);
50
+    this.getItems(this.user.id);
32 51
   },
33 52
   computed: {
34
-    ...mapState('status', ['timeshareAdmin']),
53
+    SelectedItems() {
54
+      const selectedArray = [];
55
+      this.selectedItems.forEach(x => selectedArray.push(this.items[x]));
56
+      return selectedArray;
57
+    },
58
+    ButtonMessage() {
59
+      let msg = '';
60
+      if (!(this.selectedItems.length > 0)) {
61
+        msg = 'No Items selected';
62
+      } else {
63
+        msg = 'Verify item';
64
+        if (this.selectedItems.length > 1) {
65
+          msg += 's';
66
+        }
67
+      }
68
+      return msg;
69
+    },
70
+    Message() {
71
+      let msg = '';
72
+      if (!(this.selectedItems.length > 0)) {
73
+        msg = 'Please select the item(s) to verify.';
74
+      } else {
75
+        msg = `${this.selectedItems.length}`;
76
+        if (this.selectedItems.length === 1) {
77
+          msg += ' item ';
78
+        } else msg += ' items ';
79
+        msg += 'selected. Click to verify or select more...';
80
+      }
81
+      return msg;
82
+    },
83
+    ...mapState('myWeeks', ['items']),
35 84
   },
36 85
   methods: {
37
-    ...mapActions('status', ['gettimeshareAdmin']),
86
+    ...mapActions('myWeeks', ['getItems']),
87
+    onRowClick(items) {
88
+      this.selectedItems = items;
89
+    },
90
+    onEdit(item) {
91
+      this.$router.push(`/timeshare/${item.id}`);
92
+    },
93
+    onClearSelected() {
94
+      this.selectedItems = [];
95
+    },
38 96
   },
39 97
 };
40 98
 </script>
41 99
 
42 100
 
43 101
 <style>
102
+.my-disable {
103
+  background-color: silver;
104
+  border-color: silver;
105
+}
106
+.my-disable:hover {
107
+  background-color: lightgray;
108
+  border-color: lightgray;
109
+}
44 110
 </style>

+ 85
- 17
src/components/communication/templateDetail.vue Dosyayı Görüntüle

@@ -8,16 +8,13 @@
8 8
         <div class="col-md-12">
9 9
           <div class="d-flex">
10 10
             <div class="p-2 mr-auto">
11
-              <h2>Detailed Item</h2>
11
+              <h2>Template - Detail</h2>
12 12
             </div>
13 13
             <div class="p-2">
14
-              <div class="btn btn-primary myBackground">Add New</div>
14
+              <div class="btn btn-primary myBackground" v-if="!editable" @click="onEdit()">Edit</div>
15 15
             </div>
16 16
             <div class="p-2">
17
-              <div class="btn btn-primary myBackground">Edit</div>
18
-            </div>
19
-            <div class="p-2">
20
-              <div class="btn btn-primary myBackground">Close</div>
17
+              <div class="btn btn-primary myBackground" @click="onClose()">Save/Close</div>
21 18
             </div>
22 19
           </div>
23 20
         </div>
@@ -32,7 +29,14 @@
32 29
                 <b>I</b>
33 30
               </span>
34 31
             </div>
35
-            <input class="form-control" type="number" step="any" name="levy" v-model="item.id" />
32
+            <input
33
+              class="form-control"
34
+              type="number"
35
+              step="any"
36
+              name="levy"
37
+              v-model="item.id"
38
+              disabled
39
+            />
36 40
           </div>
37 41
         </div>
38 42
         <div class="col-md-8 text-left">
@@ -43,7 +47,14 @@
43 47
                 <b>N</b>
44 48
               </span>
45 49
             </div>
46
-            <input class="form-control" type="text" step="any" name="levy" v-model="item.name" />
50
+            <input
51
+              class="form-control"
52
+              type="text"
53
+              step="any"
54
+              name="levy"
55
+              v-model="item.name"
56
+              :disabled="!CanEdit"
57
+            />
47 58
           </div>
48 59
         </div>
49 60
         <div class="col-md-12">
@@ -57,7 +68,14 @@
57 68
                 <b>S</b>
58 69
               </span>
59 70
             </div>
60
-            <input class="form-control" type="text" step="any" name="levy" v-model="item.subject" />
71
+            <input
72
+              class="form-control"
73
+              type="text"
74
+              step="any"
75
+              name="levy"
76
+              v-model="item.subject"
77
+              :disabled="!CanEdit"
78
+            />
61 79
           </div>
62 80
         </div>
63 81
         <div class="col-md-12">
@@ -112,6 +130,7 @@
112 130
                     step="any"
113 131
                     name="levy"
114 132
                     v-model="item.body"
133
+                    :disabled="!CanEdit"
115 134
                   />
116 135
                 </div>
117 136
               </div>
@@ -135,28 +154,36 @@
135 154
               <h2>Coded Fields</h2>
136 155
             </div>
137 156
             <div class="p-2">
138
-              <div class="btn btn-primary myBackground" @click="addClose()">{{btnCaption}}</div>
157
+              <div
158
+                class="btn btn-primary myBackground"
159
+                @click="addClose()"
160
+                v-if="CanEdit"
161
+              >{{btnCaption}}</div>
139 162
             </div>
140 163
           </div>
141 164
         </div>
142
-        <div
143
-          class="col-md-12"
144
-          v-if="showNew"
145
-          style="background-color:rgba(255,255,255,0.75); border:silver solid thin;border-radius:10px;padding:10px;padding:10px 30px;"
146
-        >
147
-          <TemplateInnerItem />
165
+        <div class="col-md-12" v-if="showNew">
166
+          <TemplateInnerItem @onItemAdd="onItemAdd" />
148 167
         </div>
149 168
         <div class="col-md-12">
150 169
           <hr />
151 170
         </div>
152 171
         <div class="col-md-12">
153
-          <ListView :items="item.placeHolders" :hideSearch="true" />
172
+          <ListView
173
+            :items="item.placeHolders"
174
+            :hideSearch="true"
175
+            :showNew="false"
176
+            :deleteable="CanEdit"
177
+            :allowMultipleSelect="true"
178
+            @onDelete="onItemDelete"
179
+          />
154 180
         </div>
155 181
       </div>
156 182
     </div>
157 183
   </div>
158 184
 </template>
159 185
 <script>
186
+import { mapActions } from 'vuex';
160 187
 import ListView from '../shared/listView.vue';
161 188
 import TemplateInnerItem from './templateInnerItem.vue';
162 189
 
@@ -164,6 +191,7 @@ export default {
164 191
   data() {
165 192
     return {
166 193
       showNew: false,
194
+      openFields: false,
167 195
     };
168 196
   },
169 197
   components: {
@@ -172,18 +200,58 @@ export default {
172 200
   },
173 201
   props: {
174 202
     item: {},
203
+    editable: {
204
+      default: false,
205
+    },
175 206
   },
176 207
   computed: {
208
+    CanEdit() {
209
+      return this.editable || this.item.id === 0 || this.openFields;
210
+    },
177 211
     btnCaption() {
178 212
       return this.showNew ? 'Close' : 'New';
179 213
     },
214
+    ItemList() {
215
+      return this.item.placeHolders;
216
+    },
180 217
   },
181 218
   methods: {
219
+    ...mapActions('template', ['addItem', 'editItem']),
182 220
     addClose() {
183 221
       if (this.showNew) {
184 222
         this.showNew = false;
185 223
       } else this.showNew = true;
186 224
     },
225
+    onClose() {
226
+      if (this.item.id > 0) {
227
+        // edit
228
+        this.editItem(this.item);
229
+      } else {
230
+        // add.
231
+        this.addItem(this.item);
232
+      }
233
+      console.log(JSON.stringify(this.item));
234
+      this.$emit('onClose');
235
+    },
236
+    onItemDelete(item) {
237
+      this.item.placeHolders = _.remove(
238
+        this.item.placeHolders,
239
+        x => x !== item,
240
+      );
241
+    },
242
+    onEdit() {
243
+      this.openFields = true;
244
+    },
245
+    onItemAdd(item) {
246
+      const myList = this.item.placeHolders ? this.item.placeHolders : [];
247
+      myList.push({
248
+        name: item.name,
249
+        boundTo: item.property,
250
+        boundToClassDisplay: item.class.name,
251
+        boundToClass: item.class.fullName,
252
+      });
253
+      this.item.placeHolders = myList;
254
+    },
187 255
   },
188 256
 };
189 257
 </script>

+ 26
- 1
src/components/communication/templateInnerItem.vue Dosyayı Görüntüle

@@ -1,5 +1,8 @@
1 1
 <template>
2 2
   <div class="row">
3
+    <div class="col-md-12" v-if="message !== undefined">
4
+      <Alert :text="message" :type="'ERROR'" />
5
+    </div>
3 6
     <div class="col-md-3">
4 7
       <input
5 8
         class="form-control"
@@ -21,19 +24,24 @@
21 24
       </select>
22 25
     </div>
23 26
     <div class="col-md-3">
24
-      <div class="btn btn-primary myBackground w-100">Add</div>
27
+      <div class="btn btn-primary myBackground w-100" @click="onItemAdd()">Add</div>
25 28
     </div>
26 29
   </div>
27 30
 </template>
28 31
 <script>
29 32
 import { mapState, mapActions } from 'vuex';
33
+import Alert from '../shared/alert.vue';
30 34
 
31 35
 export default {
36
+  components: {
37
+    Alert,
38
+  },
32 39
   mounted() {
33 40
     this.init();
34 41
   },
35 42
   data() {
36 43
     return {
44
+      message: undefined,
37 45
       item: {
38 46
         name: undefined,
39 47
         class: undefined,
@@ -49,6 +57,23 @@ export default {
49 57
     onClassChanged() {
50 58
       this.getProperties(this.item.class);
51 59
     },
60
+    onItemAdd() {
61
+      let msg = '';
62
+      if (this.item.name === undefined) {
63
+        msg += 'Please give a name...';
64
+      }
65
+      if (this.item.class == undefined) {
66
+        msg += 'Please choose a class...';
67
+      }
68
+      if (this.item.property == undefined) {
69
+        msg += 'Please choose a property...';
70
+      }
71
+      if (msg.length > 0) {
72
+        this.message = msg;
73
+      } else {
74
+        this.$emit('onItemAdd', this.item);
75
+      }
76
+    },
52 77
   },
53 78
 };
54 79
 </script>

+ 14
- 4
src/components/communication/templatePage.vue Dosyayı Görüntüle

@@ -13,10 +13,10 @@
13 13
     </div>
14 14
     <div class="row">
15 15
       <div :class="listClass">
16
-        <ListView :items="list" @onRowClick="onRowClick" />
16
+        <ListView :items="list" @onRowClick="onRowClick" @onNew="onNew" :showNew="true" />
17 17
       </div>
18 18
       <div class="col-md-6" v-if="showDetailView">
19
-        <DetailView :item="detailItem" />
19
+        <DetailView :item="detailItem" @onClose="onDetailClose" :editable="clickedNew" />
20 20
       </div>
21 21
     </div>
22 22
 
@@ -33,6 +33,7 @@ export default {
33 33
   data() {
34 34
     return {
35 35
       detailItem: undefined,
36
+      clickedNew: false,
36 37
     };
37 38
   },
38 39
   components: {
@@ -56,8 +57,17 @@ export default {
56 57
   methods: {
57 58
     ...mapActions('template', ['getList']),
58 59
     onRowClick(item) {
59
-      console.log(item);
60
-      this.detailItem = item;
60
+      if (this.detailItem !== item) {
61
+        this.detailItem = item;
62
+      } else this.detailItem = undefined;
63
+      this.clickedNew = false;
64
+    },
65
+    onNew() {
66
+      this.detailItem = {};
67
+      this.clickedNew = true;
68
+    },
69
+    onDetailClose() {
70
+      this.detailItem = undefined;
61 71
     },
62 72
   },
63 73
 };

+ 102
- 11
src/components/shared/listView.vue Dosyayı Görüntüle

@@ -2,14 +2,35 @@
2 2
 /* eslint-disable guard-for-in */
3 3
 <template>
4 4
   <div>
5
-    <div class="d-flex justify-content-between" v-if="!hideSearch">
5
+    <div style="height:5px"></div>
6
+    <div class="d-flex justify-content-between table-title">
7
+      <div class="p-2" v-if="!hideSearch">
8
+        <input v-model="searchItem" class="form-control" :placeholder="currentPage" />
9
+      </div>
10
+      <div class="p-2" v-if="title">
11
+        <h2>{{title}}</h2>
12
+      </div>
6 13
       <div class="p-2">
7
-        <input v-model="searchItem" class="form-control" placeholder="Search ..." />
14
+        <div class="d-flex flex-row">
15
+          <div class="p2" v-if="selectedItems.length > 0">
16
+            <div
17
+              class="btn btn-primary myBackground btn-width"
18
+              @click="onClearSelected()"
19
+            >Clear Selected</div>
20
+          </div>
21
+          <div class="p2" v-if="showNew">
22
+            <div class="btn btn-primary myBackground btn-width" @click="onNew()">New</div>
23
+          </div>
24
+        </div>
8 25
       </div>
9 26
     </div>
10
-    <div v-if="items && items.length > 0">
11
-      <table id="table" class="table table-bordered table-hover">
12
-        <thead>
27
+    <div style="height:5px"></div>
28
+    <div v-if="items && items.length > 0" class="table-responsive">
29
+      <table
30
+        id="table"
31
+        :class="{'table table-bordered table-hover': (1 === 1), 'table-sm': compact}"
32
+      >
33
+        <thead class="my-table table-header">
13 34
           <tr class="dnd-moved">
14 35
             <th v-for="(column, c) in Columns" :key="c">
15 36
               <div @click="sortBy(column)">{{ column }}</div>
@@ -18,12 +39,12 @@
18 39
             <th v-if="deleteable"></th>
19 40
           </tr>
20 41
         </thead>
21
-        <tbody>
42
+        <tbody class="my-table">
22 43
           <tr
23 44
             v-for="(item, i) in DisplayItems"
24 45
             :key="i"
25
-            class="text-left dnd-moved"
26
-            @click="onRowClick(item)"
46
+            @click="onRowClick(item, i)"
47
+            :class="{'selected': isSelected(i), 'cursor-pointer': allowSelect}"
27 48
           >
28 49
             <td
29 50
               v-for="(column, c) in Columns"
@@ -38,7 +59,7 @@
38 59
           </tr>
39 60
         </tbody>
40 61
       </table>
41
-      <div class="d-flex justify-content-between">
62
+      <div class="d-flex justify-content-between" v-if="showPager">
42 63
         <div class="p-1">{{ currentPage + ' / ' + PageCount }}</div>
43 64
         <div class="p-1">
44 65
           <BasePagination
@@ -93,9 +114,21 @@ export default {
93 114
     }
94 115
   },
95 116
   props: {
117
+    compact: {
118
+      default: true,
119
+    },
120
+    allowSelect: {
121
+      default: true,
122
+    },
123
+    allowMultipleSelect: {
124
+      default: false,
125
+    },
96 126
     hideSearch: {
97 127
       default: false,
98 128
     },
129
+    showNew: {
130
+      default: true,
131
+    },
99 132
     items: undefined,
100 133
     editable: {
101 134
       default: false,
@@ -106,9 +139,16 @@ export default {
106 139
     columnsCount: {
107 140
       default: 6,
108 141
     },
142
+    showPager: {
143
+      default: true,
144
+    },
145
+    title: {
146
+      default: undefined,
147
+    },
109 148
   },
110 149
   data() {
111 150
     return {
151
+      selectedItems: [],
112 152
       showControl: false,
113 153
       sortKey: '',
114 154
       reverse: false,
@@ -119,6 +159,17 @@ export default {
119 159
     };
120 160
   },
121 161
   methods: {
162
+    onClearSelected() {
163
+      this.selectedItems = [];
164
+      this.$emit('onClearSelected');
165
+    },
166
+    isSelected(i) {
167
+      const ind = this.getActualIndex(i);
168
+      return _.some(this.selectedItems, x => x === ind);
169
+    },
170
+    onNew() {
171
+      this.$emit('onNew');
172
+    },
122 173
     isObject(item) {
123 174
       return !!item && item.constructor === Object;
124 175
     },
@@ -128,8 +179,20 @@ export default {
128 179
     onDelete(item) {
129 180
       this.$emit('onDelete', item);
130 181
     },
131
-    onRowClick(item) {
132
-      this.$emit('onRowClick', item);
182
+    onRowClick(item, i) {
183
+      const ind = this.getActualIndex(i);
184
+      if (_.some(this.selectedItems, x => x === ind)) {
185
+        this.selectedItems = this.selectedItems.filter(x => x !== ind);
186
+      } else {
187
+        if (!this.allowMultipleSelect) {
188
+          this.selectedItems = [];
189
+        }
190
+        this.selectedItems.push(ind);
191
+      }
192
+      this.$emit('onRowClick', this.selectedItems);
193
+    },
194
+    getActualIndex(index) {
195
+      return (this.currentPage - 1) * this.visibleItemsPerPageCount + index;
133 196
     },
134 197
     changeColumn(title, checked) {
135 198
       if (checked) {
@@ -248,4 +311,32 @@ th[draggable] a {
248 311
 .over {
249 312
   background-color: rgba(0, 0, 255, 0.35);
250 313
 }
314
+.my-border {
315
+  border: solid 3px silver;
316
+}
317
+.selected {
318
+  background-color: rgba(96, 203, 235, 0.5);
319
+  border: white 2px double;
320
+}
321
+.selected:hover {
322
+  background-color: rgba(96, 203, 235, 0.85);
323
+}
324
+.btn-width {
325
+  width: 125px;
326
+}
327
+.table-title {
328
+  padding: 5px;
329
+  border: rgba(200, 200, 200, 0.66) double 2px;
330
+  border-radius: 5px;
331
+  background-color: rgba(96, 203, 235, 0.25);
332
+}
333
+.table-title:hover {
334
+  background-color: rgba(96, 203, 235, 0.4);
335
+}
336
+.table-header {
337
+  background-color: rgba(200, 200, 200, 0.66);
338
+}
339
+.my-table {
340
+  border: rgba(150, 150, 150, 0.75) 3px double;
341
+}
251 342
 </style>

+ 6
- 0
src/components/shared/navBar.vue Dosyayı Görüntüle

@@ -144,6 +144,11 @@
144 144
                   class="dropdown-item cursor-pointer"
145 145
                   @click="routerGoTo('/unitConfiguration/list')"
146 146
                 >Unit Configuration</a>
147
+                <a
148
+                  class="dropdown-item cursor-pointer"
149
+                  @click="routerGoTo('/communication/template')"
150
+                >Templates</a>
151
+                <hr />
147 152
                 <a
148 153
                   class="dropdown-item cursor-pointer"
149 154
                   @click="routerGoTo('/status/userManagementPage')"
@@ -160,6 +165,7 @@
160 165
                   class="dropdown-item cursor-pointer"
161 166
                   @click="routerGoTo('/propertyTypes/list')"
162 167
                 >Property Types</a>
168
+                <hr />
163 169
                 <a
164 170
                   class="dropdown-item cursor-pointer"
165 171
                   @click="routerGoTo('/searchLog')"

+ 1
- 1
src/components/timeshare/sell/sellPage.vue Dosyayı Görüntüle

@@ -296,7 +296,7 @@
296 296
                 </div>
297 297
               </div>
298 298
             </div>
299
-            <DetailIndividual :currentUser="sellItem.owner" :showBank="true" />
299
+            <DetailIndividual :currentUser="sellItem.owner" :showBank="true" :showAddress="true" />
300 300
             <hr />
301 301
           </div>
302 302
           <br />

+ 17
- 0
src/store/modules/communication/template.js Dosyayı Görüntüle

@@ -5,6 +5,7 @@ export default {
5 5
   state: {
6 6
     list: [],
7 7
     item: {},
8
+    message: undefined,
8 9
   },
9 10
   mutations: {
10 11
     setList(state, list) {
@@ -21,5 +22,21 @@ export default {
21 22
         .then(result => commit('setList', result.data))
22 23
         .catch(console.error);
23 24
     },
25
+    addItem({
26
+      dispatch,
27
+    }, item) {
28
+      axios
29
+        .post('/api/template', item)
30
+        .then(() => dispatch('getList'))
31
+        .catch(console.error);
32
+    },
33
+    editItem({
34
+      dispatch,
35
+    }, item) {
36
+      axios
37
+        .put(`/api/template/${item.id}`, item)
38
+        .then(() => dispatch('getList'))
39
+        .catch(console.error);
40
+    },
24 41
   },
25 42
 };

Loading…
İptal
Kaydet