Browse Source

Added Column Chooser

master
Kobus Botha 5 years ago
parent
commit
049c739806

+ 1
- 4
public/index.html View File

33
 <script src="lib/easing/easing.min.js"></script>
33
 <script src="lib/easing/easing.min.js"></script>
34
 <script src="lib/owlcarousel/owl.carousel.min.js"></script>
34
 <script src="lib/owlcarousel/owl.carousel.min.js"></script>
35
 <script src="lib/scrollreveal/scrollreveal.min.js"></script>
35
 <script src="lib/scrollreveal/scrollreveal.min.js"></script>
36
-<script src="js/dragndrop.table.columns.js" type="text/javascript"></script>
37
 <script src="js/main.js"></script>
36
 <script src="js/main.js"></script>
38
-<script>
39
-  $('.table').dragableColumns();
40
-</script>
37
+
41
 
38
 
42
 </html>
39
 </html>

+ 8
- 8
src/App.vue View File

13
 </template>
13
 </template>
14
 
14
 
15
 <script>
15
 <script>
16
-import SearchTab from './components/shared/searchTab.vue';
17
-import NavBar from './components/shared/navBar.vue';
18
-import FooterSection from './components/shared/footerSection.vue';
16
+import SearchTab from "./components/shared/searchTab.vue";
17
+import NavBar from "./components/shared/navBar.vue";
18
+import FooterSection from "./components/shared/footerSection.vue";
19
 
19
 
20
 export default {
20
 export default {
21
-  name: 'app',
21
+  name: "app",
22
   components: {
22
   components: {
23
     SearchTab,
23
     SearchTab,
24
     NavBar,
24
     NavBar,
25
-    FooterSection,
25
+    FooterSection
26
   },
26
   },
27
   methods: {
27
   methods: {
28
     routerGoTo(goTo) {
28
     routerGoTo(goTo) {
29
       this.$router.push(goTo);
29
       this.$router.push(goTo);
30
-    },
31
-  },
30
+    }
31
+  }
32
 };
32
 };
33
 </script>
33
 </script>
34
 
34
 
35
 <style>
35
 <style>
36
 button:hover {
36
 button:hover {
37
   cursor: pointer;
37
   cursor: pointer;
38
-},
38
+}
39
 hr {
39
 hr {
40
   background-color: #60cbeb;
40
   background-color: #60cbeb;
41
 }
41
 }

+ 19
- 10
src/components/shared/checkItem.vue View File

1
 <template>
1
 <template>
2
   <div class="row p-2" @click="checkItem">
2
   <div class="row p-2" @click="checkItem">
3
-    <div class="custom-control custom-checkbox">
4
-      <input type="checkbox" class="custom-control-input" :checked="checked" />
3
+    <div class="custom-control custom-checkbox mar-l-15">
4
+      <input type="checkbox" class="custom-control-input mar-l-15" :checked="Show" />
5
       <label class="custom-control-label">{{title}}</label>
5
       <label class="custom-control-label">{{title}}</label>
6
     </div>
6
     </div>
7
   </div>
7
   </div>
9
 
9
 
10
 <script>
10
 <script>
11
 export default {
11
 export default {
12
-  props: ['title'],
13
-  data() {
14
-    return {
15
-      checked: true,
16
-    };
12
+  props: {
13
+    title: undefined,
14
+    show: {
15
+      default: false
16
+    }
17
   },
17
   },
18
   methods: {
18
   methods: {
19
     checkItem() {
19
     checkItem() {
20
-      this.checked = !this.checked;
21
-      this.$emit('checkItem', this.title, this.checked);
22
-    },
20
+      this.$emit("checkItem", this.title, !this.show);
21
+    }
23
   },
22
   },
23
+  computed: {
24
+    Show() {
25
+      return this.show;
26
+    }
27
+  }
24
 };
28
 };
25
 </script>
29
 </script>
30
+<style>
31
+.mar-l-15 {
32
+  margin-left: 15px;
33
+}
34
+</style>

+ 124
- 50
src/components/shared/listView.vue View File

12
       </div>
12
       </div>
13
       <div class="p-2">
13
       <div class="p-2">
14
         <div class="d-flex flex-row">
14
         <div class="d-flex flex-row">
15
+          <div class="p2" v-if="showColumnChooser">
16
+            <div
17
+              class="btn btn-primary myBackground btn-width cursor-pointer"
18
+              data-toggle="modal"
19
+              data-target="#myModal"
20
+            >Column Chooser</div>
21
+            <div class="col-md-12">
22
+              <div id="myModal" class="modal fade" role="dialog">
23
+                <div class="modal-dialog modal-lg">
24
+                  <!-- Modal content-->
25
+                  <div class="modal-content">
26
+                    <div class="modal-header">
27
+                      <h5>Column Chooser</h5>
28
+                      <button type="button" class="close" data-dismiss="modal">&times;</button>
29
+                    </div>
30
+                    <div style="margin-left:50px; margin-right:50px;margin-bottom:50px;">
31
+                      <ListViewControl :items="allColumn" @checkItem="checkItem" />
32
+                    </div>
33
+                  </div>
34
+                </div>
35
+              </div>
36
+            </div>
37
+          </div>
15
           <div class="p2" v-if="selectedItems.length > 0">
38
           <div class="p2" v-if="selectedItems.length > 0">
16
             <div
39
             <div
17
               class="btn btn-primary myBackground btn-width cursor-pointer"
40
               class="btn btn-primary myBackground btn-width cursor-pointer"
28
     <div v-if="items && items.length > 0" class="table-responsive">
51
     <div v-if="items && items.length > 0" class="table-responsive">
29
       <table
52
       <table
30
         id="table"
53
         id="table"
31
-        :class="{'table table-hover': (1 === 1), 'table-sm': compact, 'table-bordered': bordered, 'table-striped': striped}"
54
+        :class="{'table table-hover': (1 === 1), 'table-sm': compact, 'table-bordered': bordered}"
32
       >
55
       >
33
-        <thead >
56
+        <thead>
34
           <tr class="dnd-moved">
57
           <tr class="dnd-moved">
35
             <th v-for="(column, c) in Columns" :key="c">
58
             <th v-for="(column, c) in Columns" :key="c">
36
               <div
59
               <div
115
 </template>
138
 </template>
116
 
139
 
117
 <script>
140
 <script>
118
-import _ from 'lodash';
119
-import ItemsPerPageList from '../../assets/staticData/itemsPerPage';
120
-import BasePagination from './basePagination.vue';
121
-import Alert from './alert.vue';
141
+import _ from "lodash";
142
+import ItemsPerPageList from "../../assets/staticData/itemsPerPage";
143
+import BasePagination from "./basePagination.vue";
144
+import Alert from "./alert.vue";
145
+import ListViewControl from "./listViewControl.vue";
122
 
146
 
123
 export default {
147
 export default {
124
   components: {
148
   components: {
125
     BasePagination,
149
     BasePagination,
126
     Alert,
150
     Alert,
151
+    ListViewControl
127
   },
152
   },
128
   mounted() {
153
   mounted() {
129
     try {
154
     try {
135
     } catch (error) {
160
     } catch (error) {
136
       throw error;
161
       throw error;
137
     }
162
     }
163
+    this.getInitColumn();
138
   },
164
   },
139
   props: {
165
   props: {
140
     compact: {
166
     compact: {
141
-      default: true,
167
+      default: true
142
     },
168
     },
143
     allowSelect: {
169
     allowSelect: {
144
-      default: true,
170
+      default: true
145
     },
171
     },
146
     allowMultipleSelect: {
172
     allowMultipleSelect: {
147
-      default: false,
173
+      default: false
148
     },
174
     },
149
     hideSearch: {
175
     hideSearch: {
150
-      default: false,
176
+      default: false
151
     },
177
     },
152
     showNew: {
178
     showNew: {
153
-      default: true,
179
+      default: true
154
     },
180
     },
155
     items: undefined,
181
     items: undefined,
156
     editable: {
182
     editable: {
157
-      default: false,
183
+      default: false
158
     },
184
     },
159
     deleteable: {
185
     deleteable: {
160
-      default: false,
186
+      default: false
161
     },
187
     },
162
     columnCount: {
188
     columnCount: {
163
-      default: 6,
189
+      default: 6
164
     },
190
     },
165
     showPager: {
191
     showPager: {
166
-      default: true,
192
+      default: true
167
     },
193
     },
168
     title: {
194
     title: {
169
-      default: undefined,
195
+      default: undefined
170
     },
196
     },
171
     hideItemCount: {
197
     hideItemCount: {
172
-      default: false,
198
+      default: false
173
     },
199
     },
174
-    
200
+
175
     currentPage: {
201
     currentPage: {
176
       default: 1
202
       default: 1
177
     },
203
     },
178
     bordered: {
204
     bordered: {
179
       default: true
205
       default: true
180
-    }, 
206
+    },
181
     striped: {
207
     striped: {
182
       default: true
208
       default: true
209
+    },
210
+    showColumnChooser: {
211
+      default: true
183
     }
212
     }
184
   },
213
   },
185
   data() {
214
   data() {
187
       hover: -1,
216
       hover: -1,
188
       selectedItems: [],
217
       selectedItems: [],
189
       showControl: false,
218
       showControl: false,
190
-      sortKey: '',
219
+      sortKey: "",
191
       reverse: false,
220
       reverse: false,
192
-      searchItem: '',
221
+      searchItem: "",
193
       visibleItemsPerPageCount: 20,
222
       visibleItemsPerPageCount: 20,
194
       itemsPerPageList: ItemsPerPageList,
223
       itemsPerPageList: ItemsPerPageList,
224
+      visibleColumn: [],
225
+      allColumn: []
195
     };
226
     };
196
   },
227
   },
197
   methods: {
228
   methods: {
229
+    checkItem(column, show) {
230
+      const list = [];
231
+      for (var i in this.allColumn) {
232
+        let item = this.allColumn[i];
233
+        if (item && item.column === column) {
234
+          item.show = show;
235
+        }
236
+        list.push(item);
237
+      }
238
+      this.allColumn = list;
239
+    },
240
+    getInitColumn() {
241
+      const list = [];
242
+      const listAll = [];
243
+      if (this.items) {
244
+        for (const i in Object.keys(this.items)) {
245
+          const item = this.items[i];
246
+          for (const o in Object.keys(item)) {
247
+            if (
248
+              !listAll.includes(Object.keys(item)[o]) &&
249
+              !Array.isArray(Object.values(item)[o])
250
+            ) {
251
+              const columnName = Object.keys(item)[o];
252
+              if (!listAll.some(x => x.column === columnName))
253
+                listAll.push({
254
+                  column: columnName,
255
+                  show: _.filter(listAll, x => x.show).length < this.columnCount
256
+                });
257
+            }
258
+          }
259
+        }
260
+      }
261
+      this.allColumn = listAll;
262
+    },
198
     onClearSelected() {
263
     onClearSelected() {
199
       this.selectedItems = [];
264
       this.selectedItems = [];
200
-      this.$emit('onClearSelected');
265
+      this.$emit("onClearSelected");
201
     },
266
     },
202
     isSelected(i) {
267
     isSelected(i) {
203
       const ind = this.getActualIndex(i);
268
       const ind = this.getActualIndex(i);
204
       return _.some(this.selectedItems, x => x === ind);
269
       return _.some(this.selectedItems, x => x === ind);
205
     },
270
     },
206
     onNew() {
271
     onNew() {
207
-      this.$emit('onNew');
272
+      this.$emit("onNew");
208
     },
273
     },
209
     isObject(item) {
274
     isObject(item) {
210
       return !!item && item.constructor === Object;
275
       return !!item && item.constructor === Object;
211
     },
276
     },
212
     onEdit(item) {
277
     onEdit(item) {
213
-      this.$emit('onEdit', item);
278
+      this.$emit("onEdit", item);
214
     },
279
     },
215
     onDelete(item) {
280
     onDelete(item) {
216
-      this.$emit('onDelete', item);
281
+      this.$emit("onDelete", item);
217
     },
282
     },
218
     onRowClick(item, i) {
283
     onRowClick(item, i) {
219
       const ind = this.getActualIndex(i);
284
       const ind = this.getActualIndex(i);
225
         }
290
         }
226
         this.selectedItems.push(ind);
291
         this.selectedItems.push(ind);
227
       }
292
       }
228
-      this.$emit('onRowClick', this.selectedItems);
293
+      this.$emit("onRowClick", this.selectedItems);
229
     },
294
     },
230
     getActualIndex(index) {
295
     getActualIndex(index) {
231
       return (this.currentPage - 1) * this.visibleItemsPerPageCount + index;
296
       return (this.currentPage - 1) * this.visibleItemsPerPageCount + index;
250
     async pageChangeHandle(value) {
315
     async pageChangeHandle(value) {
251
       console.log(value);
316
       console.log(value);
252
       switch (value) {
317
       switch (value) {
253
-        case 'next':
318
+        case "next":
254
           this.currentPage += 1;
319
           this.currentPage += 1;
255
           break;
320
           break;
256
-        case 'previous':
321
+        case "previous":
257
           this.currentPage -= 1;
322
           this.currentPage -= 1;
258
           break;
323
           break;
259
         default:
324
         default:
264
       if (this.currentPage !== 1) {
329
       if (this.currentPage !== 1) {
265
         this.currentPage = 1;
330
         this.currentPage = 1;
266
       }
331
       }
267
-    },
332
+    }
268
   },
333
   },
269
   computed: {
334
   computed: {
270
     ListWidth() {
335
     ListWidth() {
271
       if (this.showControl) {
336
       if (this.showControl) {
272
-        return 'col-md-9';
337
+        return "col-md-9";
273
       }
338
       }
274
-      return 'col-md-12';
339
+      return "col-md-12";
275
     },
340
     },
276
     SortDirection() {
341
     SortDirection() {
277
-      return this.reverse ? 'desc' : 'asc';
342
+      return this.reverse ? "desc" : "asc";
278
     },
343
     },
279
     PageCount() {
344
     PageCount() {
280
       return this.visibleItemsPerPageCount !== 0
345
       return this.visibleItemsPerPageCount !== 0
282
         : 1;
347
         : 1;
283
     },
348
     },
284
     Columns() {
349
     Columns() {
350
+      const listColumns = [];
351
+      if (!this.allColumn || this.allColumn.length === 0) {
352
+        this.getInitColumn();
353
+      }
354
+      const list = _.filter(this.allColumn, x => x.show);
355
+      for (const i in list) {
356
+        const item = list[i];
357
+        if (item) {
358
+          listColumns.push(item.column);
359
+        }
360
+      }
361
+      return listColumns;
362
+    },
363
+    AllColumns() {
285
       const list = [];
364
       const list = [];
286
       if (this.items) {
365
       if (this.items) {
287
-        for (const i in Object.keys(this.items)) {
288
-          const item = this.items[i];
289
-          for (const o in Object.keys(item)) {
290
-            if (
291
-              !list.includes(Object.keys(item)[o])
292
-              && !Array.isArray(Object.values(item)[o])
293
-            ) {
294
-              if (list.length < this.columnCount) {
295
-                list.push(Object.keys(item)[o]);
296
-              }
297
-            }
298
-          }
299
-        }
300
       }
366
       }
301
       return list;
367
       return list;
302
     },
368
     },
303
     FilteredItems() {
369
     FilteredItems() {
304
-      const list = _.filter(this.items, item => Object.values(item).some(
305
-          i => JSON.stringify(i)
370
+      const list = _.filter(this.items, item =>
371
+        Object.values(item).some(
372
+          i =>
373
+            JSON.stringify(i)
306
               .toLowerCase()
374
               .toLowerCase()
307
-              .indexOf(this.searchItem.toLowerCase()) > -1,
308
-        ),);
375
+              .indexOf(this.searchItem.toLowerCase()) > -1
376
+        )
377
+      );
309
       return _.orderBy(list, this.sortKey, this.SortDirection);
378
       return _.orderBy(list, this.sortKey, this.SortDirection);
310
     },
379
     },
311
     DisplayItems() {
380
     DisplayItems() {
317
       }
386
       }
318
       return list.slice(startSlice, endSlice);
387
       return list.slice(startSlice, endSlice);
319
     },
388
     },
320
-  },
389
+    GetAllColumn() {}
390
+  }
321
 };
391
 };
322
 </script>
392
 </script>
323
 <style scoped>
393
 <style scoped>
331
   text-decoration: none;
401
   text-decoration: none;
332
   color: #333333;
402
   color: #333333;
333
 }
403
 }
404
+.table-striped > tbody > tr:nth-child(2n + 1) > td,
405
+.table-striped > tbody > tr:nth-child(2n + 1) > th {
406
+  background-color: rgba(225, 225, 225, 0.8);
407
+}
334
 .active {
408
 .active {
335
   background-color: rgba(255, 255, 255, 0.5);
409
   background-color: rgba(255, 255, 255, 0.5);
336
   cursor: pointer;
410
   cursor: pointer;

+ 37
- 8
src/components/shared/listViewControl.vue View File

1
 <template>
1
 <template>
2
-  <div>
3
-    <div v-for="item in items" :key="item">
4
-      <CheckItem :title="item" @checkItem="changeColumn" />
2
+  <div class="container">
3
+    <div class="offset-3 col-md-6">
4
+      <input v-model="searchItem" class="form-control" placeholder="Search...." />
5
+    </div>
6
+    <hr />
7
+    <div class="row">
8
+      <div v-for="item in items" :key="item" class="col-md-4">
9
+        <div :class="{'inSearch': isInSelected(item)}">
10
+          <CheckItem :title="item.column" :show="item.show" @checkItem="checkItem" />
11
+        </div>
12
+      </div>
5
     </div>
13
     </div>
6
   </div>
14
   </div>
7
 </template>
15
 </template>
8
 <script>
16
 <script>
9
-import CheckItem from './checkItem.vue';
17
+import CheckItem from "./checkItem.vue";
10
 
18
 
11
 export default {
19
 export default {
12
   components: {
20
   components: {
13
-    CheckItem,
21
+    CheckItem
22
+  },
23
+  data() {
24
+    return {
25
+      searchItem: undefined
26
+    };
14
   },
27
   },
15
   props: {
28
   props: {
16
-    items: undefined,
29
+    items: undefined
17
   },
30
   },
18
   methods: {
31
   methods: {
19
-    changeColumn(title, checked) {
20
-      this.$emit('changeColumn', title, checked);
32
+    isInSelected(i) {
33
+      if (this.searchItem && this.searchItem.length > 0) {
34
+        return (
35
+          i.column.toLowerCase().indexOf(this.searchItem.toLowerCase()) > -1
36
+        );
37
+      }
38
+      return false;
21
     },
39
     },
40
+    checkItem(column, show) {
41
+      this.$emit("checkItem", column, show);
42
+    }
22
   },
43
   },
44
+  computed: {}
23
 };
45
 };
24
 </script>
46
 </script>
47
+<style>
48
+.inSearch {
49
+  border: 1px solid rgba(50, 50, 50, 0.5);
50
+  border-radius: 10px;
51
+  background-color: rgba(225, 225, 225, 0.6);
52
+}
53
+</style>

Loading…
Cancel
Save