Selaa lähdekoodia

Added Column Chooser

master
Kobus Botha 5 vuotta sitten
vanhempi
commit
049c739806

+ 1
- 4
public/index.html Näytä tiedosto

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

+ 8
- 8
src/App.vue Näytä tiedosto

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

+ 19
- 10
src/components/shared/checkItem.vue Näytä tiedosto

@@ -1,7 +1,7 @@
1 1
 <template>
2 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 5
       <label class="custom-control-label">{{title}}</label>
6 6
     </div>
7 7
   </div>
@@ -9,17 +9,26 @@
9 9
 
10 10
 <script>
11 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 18
   methods: {
19 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 29
 </script>
30
+<style>
31
+.mar-l-15 {
32
+  margin-left: 15px;
33
+}
34
+</style>

+ 124
- 50
src/components/shared/listView.vue Näytä tiedosto

@@ -12,6 +12,29 @@
12 12
       </div>
13 13
       <div class="p-2">
14 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 38
           <div class="p2" v-if="selectedItems.length > 0">
16 39
             <div
17 40
               class="btn btn-primary myBackground btn-width cursor-pointer"
@@ -28,9 +51,9 @@
28 51
     <div v-if="items && items.length > 0" class="table-responsive">
29 52
       <table
30 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 57
           <tr class="dnd-moved">
35 58
             <th v-for="(column, c) in Columns" :key="c">
36 59
               <div
@@ -115,15 +138,17 @@
115 138
 </template>
116 139
 
117 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 147
 export default {
124 148
   components: {
125 149
     BasePagination,
126 150
     Alert,
151
+    ListViewControl
127 152
   },
128 153
   mounted() {
129 154
     try {
@@ -135,51 +160,55 @@ export default {
135 160
     } catch (error) {
136 161
       throw error;
137 162
     }
163
+    this.getInitColumn();
138 164
   },
139 165
   props: {
140 166
     compact: {
141
-      default: true,
167
+      default: true
142 168
     },
143 169
     allowSelect: {
144
-      default: true,
170
+      default: true
145 171
     },
146 172
     allowMultipleSelect: {
147
-      default: false,
173
+      default: false
148 174
     },
149 175
     hideSearch: {
150
-      default: false,
176
+      default: false
151 177
     },
152 178
     showNew: {
153
-      default: true,
179
+      default: true
154 180
     },
155 181
     items: undefined,
156 182
     editable: {
157
-      default: false,
183
+      default: false
158 184
     },
159 185
     deleteable: {
160
-      default: false,
186
+      default: false
161 187
     },
162 188
     columnCount: {
163
-      default: 6,
189
+      default: 6
164 190
     },
165 191
     showPager: {
166
-      default: true,
192
+      default: true
167 193
     },
168 194
     title: {
169
-      default: undefined,
195
+      default: undefined
170 196
     },
171 197
     hideItemCount: {
172
-      default: false,
198
+      default: false
173 199
     },
174
-    
200
+
175 201
     currentPage: {
176 202
       default: 1
177 203
     },
178 204
     bordered: {
179 205
       default: true
180
-    }, 
206
+    },
181 207
     striped: {
182 208
       default: true
209
+    },
210
+    showColumnChooser: {
211
+      default: true
183 212
     }
184 213
   },
185 214
   data() {
@@ -187,33 +216,69 @@ export default {
187 216
       hover: -1,
188 217
       selectedItems: [],
189 218
       showControl: false,
190
-      sortKey: '',
219
+      sortKey: "",
191 220
       reverse: false,
192
-      searchItem: '',
221
+      searchItem: "",
193 222
       visibleItemsPerPageCount: 20,
194 223
       itemsPerPageList: ItemsPerPageList,
224
+      visibleColumn: [],
225
+      allColumn: []
195 226
     };
196 227
   },
197 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 263
     onClearSelected() {
199 264
       this.selectedItems = [];
200
-      this.$emit('onClearSelected');
265
+      this.$emit("onClearSelected");
201 266
     },
202 267
     isSelected(i) {
203 268
       const ind = this.getActualIndex(i);
204 269
       return _.some(this.selectedItems, x => x === ind);
205 270
     },
206 271
     onNew() {
207
-      this.$emit('onNew');
272
+      this.$emit("onNew");
208 273
     },
209 274
     isObject(item) {
210 275
       return !!item && item.constructor === Object;
211 276
     },
212 277
     onEdit(item) {
213
-      this.$emit('onEdit', item);
278
+      this.$emit("onEdit", item);
214 279
     },
215 280
     onDelete(item) {
216
-      this.$emit('onDelete', item);
281
+      this.$emit("onDelete", item);
217 282
     },
218 283
     onRowClick(item, i) {
219 284
       const ind = this.getActualIndex(i);
@@ -225,7 +290,7 @@ export default {
225 290
         }
226 291
         this.selectedItems.push(ind);
227 292
       }
228
-      this.$emit('onRowClick', this.selectedItems);
293
+      this.$emit("onRowClick", this.selectedItems);
229 294
     },
230 295
     getActualIndex(index) {
231 296
       return (this.currentPage - 1) * this.visibleItemsPerPageCount + index;
@@ -250,10 +315,10 @@ export default {
250 315
     async pageChangeHandle(value) {
251 316
       console.log(value);
252 317
       switch (value) {
253
-        case 'next':
318
+        case "next":
254 319
           this.currentPage += 1;
255 320
           break;
256
-        case 'previous':
321
+        case "previous":
257 322
           this.currentPage -= 1;
258 323
           break;
259 324
         default:
@@ -264,17 +329,17 @@ export default {
264 329
       if (this.currentPage !== 1) {
265 330
         this.currentPage = 1;
266 331
       }
267
-    },
332
+    }
268 333
   },
269 334
   computed: {
270 335
     ListWidth() {
271 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 341
     SortDirection() {
277
-      return this.reverse ? 'desc' : 'asc';
342
+      return this.reverse ? "desc" : "asc";
278 343
     },
279 344
     PageCount() {
280 345
       return this.visibleItemsPerPageCount !== 0
@@ -282,30 +347,34 @@ export default {
282 347
         : 1;
283 348
     },
284 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 364
       const list = [];
286 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 367
       return list;
302 368
     },
303 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 374
               .toLowerCase()
307
-              .indexOf(this.searchItem.toLowerCase()) > -1,
308
-        ),);
375
+              .indexOf(this.searchItem.toLowerCase()) > -1
376
+        )
377
+      );
309 378
       return _.orderBy(list, this.sortKey, this.SortDirection);
310 379
     },
311 380
     DisplayItems() {
@@ -317,7 +386,8 @@ export default {
317 386
       }
318 387
       return list.slice(startSlice, endSlice);
319 388
     },
320
-  },
389
+    GetAllColumn() {}
390
+  }
321 391
 };
322 392
 </script>
323 393
 <style scoped>
@@ -331,6 +401,10 @@ th[draggable] a {
331 401
   text-decoration: none;
332 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 408
 .active {
335 409
   background-color: rgba(255, 255, 255, 0.5);
336 410
   cursor: pointer;

+ 37
- 8
src/components/shared/listViewControl.vue Näytä tiedosto

@@ -1,24 +1,53 @@
1 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 13
     </div>
6 14
   </div>
7 15
 </template>
8 16
 <script>
9
-import CheckItem from './checkItem.vue';
17
+import CheckItem from "./checkItem.vue";
10 18
 
11 19
 export default {
12 20
   components: {
13
-    CheckItem,
21
+    CheckItem
22
+  },
23
+  data() {
24
+    return {
25
+      searchItem: undefined
26
+    };
14 27
   },
15 28
   props: {
16
-    items: undefined,
29
+    items: undefined
17 30
   },
18 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 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…
Peruuta
Tallenna