@modeltables/fontawesome-vuetify 1.7.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ export class DataSetItems {
2
+ id: number = 0;
3
+ startPosition: boolean = false;
4
+ selected: boolean = false;
5
+ rowClass: string = '';
6
+ dataItem: Object = Object.assign({});
7
+ }
@@ -0,0 +1,7 @@
1
+ import { HeaderModel } from "../models/tablemodels";
2
+
3
+ export class DataSetHeader {
4
+ id: number = 0;
5
+ startPosition: boolean = false;
6
+ dataHeader: HeaderModel = new HeaderModel();
7
+ }
@@ -1,5 +1,6 @@
1
1
  <script lang="ts">
2
2
  import { faCalendar } from '@fortawesome/free-regular-svg-icons';
3
+ import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';
3
4
  export default {
4
5
  props: {
5
6
  data: {
@@ -15,6 +16,9 @@
15
16
  required: true
16
17
  }
17
18
  },
19
+ components: {
20
+ FontAwesomeIcon: FontAwesomeIcon
21
+ },
18
22
  data() {
19
23
  return {
20
24
  data: this.data,
@@ -33,7 +37,7 @@
33
37
  </script>
34
38
 
35
39
  <template>
36
- <v-date-input :prepend-icon="''" label="Date input" @save="filterDate($event)" :v-model="data" :model-value="filter">
40
+ <v-date-input :prepend-icon="''" @save="filterDate($event)" :v-model="data" :model-value="filter">
37
41
  <template v-if="calendar" #prepend-inner>
38
42
  <FontAwesomeIcon :icon="calendar" />
39
43
  </template>
@@ -17,4 +17,14 @@ export const isString = (s: any) =>{
17
17
  export const toDate = (value: any) => {
18
18
  const date = new Date(value);
19
19
  return date.toLocaleDateString() + ' ' + date.toLocaleTimeString();
20
- }
20
+ }
21
+
22
+ export const isEqual = (object1: Object, object2: Object) => {
23
+ for(let prop1 of Object.keys(object1)){
24
+ if(object1[prop1] != object2[prop1]){
25
+ return false;
26
+ }
27
+ }
28
+
29
+ return true;
30
+ }
@@ -2,4 +2,8 @@ export const change = 'change';
2
2
  export const load = 'load';
3
3
  export const rowClick = 'rowClick';
4
4
  export const search = 'search';
5
+ export const itemSelection = 'itemSelection';
6
+ export const multiSelection = 'multiSelection';
7
+ export const selectedRow = 'selected-row';
8
+ export const rowClass = 'row-class';
5
9
  export const Id = 'Id';
@@ -22,6 +22,7 @@ export declare class PaginatedResponse<T> {
22
22
  export declare class Options {
23
23
  Key?: string;
24
24
  ShowKey: boolean;
25
+ SelectedKey?: string;
25
26
  Name?: string;
26
27
  Active: boolean;
27
28
  }
@@ -28,6 +28,7 @@ export class PaginatedResponse {
28
28
  export class Options {
29
29
  constructor() {
30
30
  this.Key = "Id";
31
+ this.SelectedKey = "Selected",
31
32
  this.Name = undefined;
32
33
  this.ShowKey = false;
33
34
  this.Active = true;
@@ -21,7 +21,8 @@ export class PaginatedResponse<T>{
21
21
 
22
22
  export class Options{
23
23
  Key?: string;
24
- ShowKey: boolean;
24
+ SelectedKey?: string;
25
+ ShowKey: boolean = false;
25
26
  Name?: string;
26
- Active: boolean;
27
- }
27
+ Active: boolean = false;
28
+ }
@@ -12,20 +12,24 @@ export default {
12
12
  required: true,
13
13
  default: () => new Options()
14
14
  },
15
- prop: {
15
+ dataHeader: {
16
16
  type: Object,
17
17
  required: true
18
18
  },
19
- index: {
19
+ id: {
20
20
  type: Number,
21
21
  required: true
22
+ },
23
+ startPosition: {
24
+ type: Boolean,
25
+ required: true
22
26
  }
23
27
  },
24
28
  data() {
25
29
  return {
26
30
  key: this.key,
27
- prop: this.prop,
28
- index: this.index,
31
+ dataHeader: this.dataHeader,
32
+ id: this.id,
29
33
  carretDown: faCaretDown,
30
34
  carretUp: faCaretUp
31
35
  }
@@ -44,21 +48,21 @@ export default {
44
48
  </script>
45
49
 
46
50
  <template>
47
- <div v-if="index > 0"
51
+ <div v-if="!startPosition"
48
52
  style="display: flex">
49
- {{ prop.title }}
50
- <div v-if="prop.sort">
51
- <FontAwesomeIcon @click="sort($event, prop, index)" :icon="carretDown"></FontAwesomeIcon>
53
+ {{ dataHeader.title }}
54
+ <div v-if="dataHeader.sort">
55
+ <FontAwesomeIcon @click="sort($event, dataHeader, id)" :icon="carretDown"></FontAwesomeIcon>
52
56
  </div>
53
57
  <div v-else>
54
- <FontAwesomeIcon @click="sort($event, prop, index)" :icon="carretUp"></FontAwesomeIcon>
58
+ <FontAwesomeIcon @click="sort($event, dataHeader, id)" :icon="carretUp"></FontAwesomeIcon>
55
59
  </div>
56
60
  </div>
57
61
  <div v-else-if="options.Active">
58
- {{ prop.title }}
62
+ {{ dataHeader.title }}
59
63
  </div>
60
64
  <div v-else>
61
- {{ prop.title }}
65
+ {{ dataHeader.title }}
62
66
  </div>
63
67
 
64
68
  </template>
@@ -1,10 +1,11 @@
1
1
  <script lang="ts">
2
2
  import { ref } from 'vue'
3
3
  import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';
4
- import { faRefresh, faSearch } from '@fortawesome/free-solid-svg-icons';
4
+ import { faRefresh, faSearch, faIndent, faCheck } from '@fortawesome/free-solid-svg-icons';
5
+ import { faSquare } from '@fortawesome/free-regular-svg-icons';
5
6
  import { HeaderModel, Options } from '@/components/models/tablemodels';
6
7
  import { PaginatonModel } from '@/components/models/tablemodels';
7
- import { change, load, rowClick, search } from '@/components/helpers/resources';
8
+ import { change, itemSelection, load, multiSelection, rowClass, rowClick, search, selectedRow } from '@/components/helpers/resources';
8
9
  import Date from '@/components/headerFilters/Date.vue';
9
10
  import Search from '@/components/search/SearchView.vue';
10
11
  import Text from '@/components/headerFilters/Text.vue';
@@ -13,6 +14,9 @@ import Filters from '@/components/headerFilters/Filters.vue';
13
14
  import SortView from '@/components/sort/SortView.vue';
14
15
  import PaginationView from '@/components/pagination/PaginationView.vue';
15
16
  import DataItem from '@/components/table/data/ItemView.vue';
17
+ import { isEqual } from '../helpers/instances';
18
+ import { DataSetItems } from '../dataSets/dataSetHeader';
19
+ import { DataSetHeader } from '../dataSets/dataSetItems';
16
20
 
17
21
  export default {
18
22
  props: {
@@ -74,6 +78,21 @@ export default {
74
78
  type: Boolean,
75
79
  required: false,
76
80
  default: () => false
81
+ },
82
+ select: {
83
+ type: Boolean,
84
+ required: false,
85
+ default: () => false,
86
+ },
87
+ multiSelect: {
88
+ type: Boolean,
89
+ required: false,
90
+ default: () => false,
91
+ },
92
+ selectedItems: {
93
+ type: Array<Object>,
94
+ required: false,
95
+ default: () => []
77
96
  }
78
97
  },
79
98
  components: {
@@ -93,28 +112,38 @@ export default {
93
112
  },
94
113
  watch: {
95
114
  dataItems(newValue, oldValue) {
96
- this.dataItems = newValue;
115
+ this.initData(newValue);
97
116
  if(this.firstChange){
98
117
  this.initFilters();
99
118
  this.firstChange = false;
119
+ setTimeout(() => {
120
+ this.loaded = true;
121
+ }, 800)
100
122
  }
101
123
  },
124
+ dataSetItems(newValue, oldValue){
125
+ this.dataSetItems = newValue;
126
+ },
102
127
  pagination(newValue: PaginatonModel, oldValue) {
103
- console.log(newValue);
104
128
  this.page = newValue.CurrentPage;
105
129
  this.perPage = newValue.PerPage;
106
130
  this.pageCount = newValue.PageCount;
107
131
  this.totalCount = newValue.TotalCount;
108
132
  }
109
133
  },
110
- emits: [change, load, rowClick, search],
134
+ emits: [change, load, rowClick, search, itemSelection, multiSelection],
111
135
  data() {
112
- console.log(this.options);
113
136
  return {
137
+ selectedProp: this.options.SelectedKey!,
138
+ rowClass: rowClass,
114
139
  dataheader: this.dataheader,
115
140
  dataItems: this.dataItems,
116
141
  dialog: false,
142
+ selected: this.selectedItems,
117
143
  new: true,
144
+ dataSetItems: [] as DataSetItems[],
145
+ dataSetHeaders: [] as DataSetHeader[],
146
+ loaded: false,
118
147
  options: this.options,
119
148
  name: this.name,
120
149
  currentId: this.currentId,
@@ -122,17 +151,22 @@ export default {
122
151
  loading: this.loading,
123
152
  faSearch: faSearch,
124
153
  reload: faRefresh,
154
+ faIndent: faIndent,
155
+ faCheck: faCheck,
156
+ faSquare: faSquare,
125
157
  lastItem: {},
126
158
  completes: this.completes,
127
159
  filters: { CurrentPage: 1, PerPage: 10, SortColumn: '', SortDirection: 1 } as any,
128
160
  showFilters: this.showFilters,
129
161
  modelValue: ref([]),
130
162
  firstChange: true,
163
+ multiSelected: false,
131
164
  perPage: this.pagination!.PerPage,
132
165
  page: this.pagination!.CurrentPage,
133
166
  pageCount: this.pagination!.PageCount,
134
167
  totalCount:this.pagination!.TotalCount,
135
168
  showTime: this.showTime,
169
+ isEqual: isEqual
136
170
  };
137
171
  },
138
172
  methods: {
@@ -151,6 +185,44 @@ export default {
151
185
  this.filters[prop] = null;
152
186
  }
153
187
  },
188
+ initData(dataItems){
189
+ let dataSetItems = [] as DataSetItems[];
190
+
191
+ for(let [index, item] of dataItems.entries()){
192
+ let dataSet = new DataSetItems();
193
+ dataSet.id = index + 1;
194
+ dataSet.selected = false;
195
+ dataSet.rowClass = '';
196
+ dataSet.dataItem = item
197
+
198
+ if(dataSet.id == 1){
199
+ dataSet.startPosition = true;
200
+ }
201
+
202
+ dataSetItems = [...dataSetItems, dataSet];
203
+ }
204
+
205
+ this.dataSetItems = dataSetItems;
206
+ this.dataItems = dataItems;
207
+
208
+ },
209
+ initHeaders() {
210
+ let dataSetHeaders = [] as DataSetHeader[];
211
+
212
+ for(let [index, item] of this.dataheader.entries()){
213
+ let dataHeader = new DataSetHeader();
214
+ dataHeader.id = index + 1;
215
+ dataHeader.dataHeader = item;
216
+
217
+ if(dataHeader.id == 1) {
218
+ dataHeader.startPosition = true;
219
+ }
220
+
221
+ dataSetHeaders = [...dataSetHeaders, dataHeader];
222
+ }
223
+
224
+ this.dataSetHeaders = dataSetHeaders;
225
+ },
154
226
  initFilters() {
155
227
  let item = this.dataItems[0];
156
228
  for(let key of Object.keys(item)){
@@ -164,21 +236,33 @@ export default {
164
236
  this.$emit(search, this.filters);
165
237
  }
166
238
  },
167
- async updateItem(item: any, event: any){
168
- event.preventDefault();
239
+ async updateItem(item: DataSetItems, index: number){
169
240
  if(!this.crud){
170
- this.rowClick(item);
241
+ this.rowClick(item.dataItem);
171
242
  }else{
172
- this.currentId = item[this.options.Key!];
173
- this.$emit(change, item);
243
+ this.currentId = item.dataItem[this.options.Key!];
244
+ this.$emit(change, item.dataItem);
174
245
  }
175
- },
176
- filterDate(event: any, dataItem: any){
177
- let item = dataItem;
178
- if(item != null){
179
- dataItem = event == '' ? null : new window.Date(event);
180
- }else{
181
- dataItem = new window.Date(event);
246
+
247
+ if(this.select){
248
+ for(let dataSet of this.dataSetItems){
249
+ dataSet.rowClass = '';
250
+ }
251
+
252
+ item.rowClass = selectedRow;
253
+ this.$emit(itemSelection, item.dataItem);
254
+ }
255
+
256
+ if(this.multiSelect){
257
+ item.selected = !item.selected;
258
+
259
+ if(item.rowClass == selectedRow){
260
+ item.rowClass = '';
261
+ }else{
262
+ item.rowClass = selectedRow;
263
+ }
264
+
265
+ this.$emit(multiSelection, this.dataSetItems.filter(dataSet => dataSet.selected).map(dataSet => { return dataSet.dataItem } ));
182
266
  }
183
267
  },
184
268
  filterValue(event: any, dataItem: any){
@@ -190,9 +274,12 @@ export default {
190
274
  dataItem = value;
191
275
  }
192
276
  },
193
- isActive(index){
194
- if(!this.options.Active && !this.options.ShowKey){
195
- return index > 0;
277
+ filterDate(event: any, dataItem: any){
278
+ let item = dataItem;
279
+ if(item != null){
280
+ dataItem = event == '' ? null : new window.Date(event);
281
+ }else{
282
+ dataItem = new window.Date(event);
196
283
  }
197
284
  },
198
285
  optionschange(event: any){
@@ -239,8 +326,22 @@ export default {
239
326
  prop.sort = !prop.sort;
240
327
  this.filters.SortColumn = Object.keys(this.dataItems[0])[index];
241
328
  this.filters.SortDirection = window.Number(prop.sort);
242
- console.log(this.filters);
243
329
  this.search();
330
+ },
331
+ selectItem(event){
332
+ console.log(event);
333
+ },
334
+ multiSelectItems(event){
335
+ for(const value of this.dataSetItems){
336
+ if(!this.multiSelected){
337
+ value.selected = true;
338
+ value.rowClass = selectedRow;
339
+ }else{
340
+ value.selected = false;
341
+ value.rowClass = '';
342
+ }
343
+ }
344
+ this.multiSelected = !this.multiSelected;
244
345
  }
245
346
  }
246
347
  }
@@ -259,59 +360,80 @@ export default {
259
360
  </v-row>
260
361
  <v-row>
261
362
  <v-data-table
363
+ v-if="loaded"
364
+ @update:options="optionschange($event)"
365
+ :v-bind:loading-text="'Loading... Please wait'"
262
366
  :color="'white'"
263
367
  :striped="'odd'"
264
- :v-bind:loading-text="'Loading... Please wait'"
265
368
  :loading="loading"
266
369
  :v-bind:model-value="modelValue"
267
370
  :items="dataItems"
268
- @update:options="optionschange($event)"
269
371
  :items-per-page="perPage"
270
372
  :page="page"
271
373
  hide-default-header
272
374
  hide-default-footer
273
375
  multi-sort
376
+ hover
274
377
  return-object>
275
- <template v-slot:item="{ item, index }" >
276
- <tr v-if="index == 0 && showFilters" class="filter-items" >
277
- <td v-for="(prop, index) in dataheader"
278
- v-if="isActive(index)">
279
- <SortView
280
- :prop="prop"
281
- :index="index"
282
- @sort="sort($event, prop, index)">
283
- </SortView>
284
- </td>
285
- </tr>
286
- <tr v-if="index == 0 && showFilters" class="filter-items" >
287
- <td v-for="(prop, index) in Object.keys(item)"
288
- v-if="isActive(index)">
289
- <Filters
290
- :item="item"
291
- :filters="filters"
292
- :showFilters="showFilters"
293
- :options="options"
294
- :prop="prop"
295
- @filterDate="filterDate($event, filters[prop])"
296
- @filterValue="filterValue($event, filters[prop])">
297
- </Filters>
298
- </td>
299
- </tr>
300
- <tr @dblclick="updateItem(item, $event)">
301
- <td v-for="(prop, index) in Object.keys(item)"
302
- v-if="isActive(index)">
303
- <DataItem
304
- :item="item"
305
- :prop="prop"
306
- :options="options"
307
- :index="index">
308
- </DataItem>
309
- </td>
310
- </tr>
378
+ <template v-slot:item="{ item, index }">
379
+ <template v-for="dataSet in dataSetItems" :v-bind="item" v-bind:key="dataSet.id">
380
+ <template v-if="isEqual(item, dataSet.dataItem)">
381
+ <tr v-if="dataSet.startPosition && showFilters" class="filter-items" >
382
+ <td v-if="multiSelect" @click="multiSelectItems($event)">
383
+ <FontAwesomeIcon v-if="multiSelected" :icon="faCheck"></FontAwesomeIcon>
384
+ <FontAwesomeIcon v-else :icon="faSquare"></FontAwesomeIcon>
385
+ </td>
386
+ <td v-for="(item, index) in dataheader">
387
+ <SortView
388
+ :dataHeader="item"
389
+ :startPosition="index < 1"
390
+ :id="index"
391
+ @sort="sort($event, item, index)">
392
+ </SortView>
393
+ </td>
394
+ </tr>
395
+ <tr v-if="dataSet.startPosition && showFilters" class="filter-items" >
396
+ <td v-if="multiSelect">
397
+ </td>
398
+ <td v-for="prop in Object.keys(dataSet.dataItem)">
399
+ <Filters
400
+ :item="dataSet.dataItem"
401
+ :filters="filters"
402
+ :showFilters="showFilters"
403
+ :options="options"
404
+ :prop="prop"
405
+ @filterValue="filterValue($event, filters[prop])">
406
+ </Filters>
407
+ </td>
408
+ </tr>
409
+ <tr @click="updateItem(dataSet, dataSet.id!)" :class="dataSet.rowClass">
410
+ <td v-if="multiSelect" v-bind="dataSet.dataItem">
411
+ <FontAwesomeIcon v-if="dataSet.selected" :icon="faCheck"></FontAwesomeIcon>
412
+ <FontAwesomeIcon v-else :icon="faSquare"></FontAwesomeIcon>
413
+ </td>
414
+ <td v-for="(prop) in Object.keys(dataSet.dataItem)">
415
+ <DataItem
416
+ :item="dataSet.dataItem"
417
+ :prop="prop"
418
+ :options="options"
419
+ :id="dataSet.id!">
420
+ </DataItem>
421
+ </td>
422
+ </tr>
423
+ </template>
424
+ </template>
311
425
  </template>
312
426
  </v-data-table>
427
+ <v-data-table-server
428
+ v-else
429
+ :items-length="0"
430
+ item-key="name"
431
+ loading-text="Loading... Please wait"
432
+ loading>
433
+ </v-data-table-server>
313
434
  </v-row>
314
435
  <PaginationView
436
+ v-if="loaded"
315
437
  :page="page"
316
438
  :perPage="perPage"
317
439
  :pageCount="pageCount"
@@ -355,4 +477,8 @@ export default {
355
477
  height: 56px;
356
478
  }
357
479
 
480
+ .selected-row{
481
+ background-color: rgb(209, 208, 208);
482
+ }
483
+
358
484
  </style>
@@ -8,7 +8,7 @@
8
8
  type: Object,
9
9
  required: true
10
10
  },
11
- index: {
11
+ id: {
12
12
  type: Number,
13
13
  required: true
14
14
  },
@@ -26,8 +26,8 @@
26
26
  item(newValue: any, oldValue: any) {
27
27
  this.item = newValue;
28
28
  },
29
- index(newValue: any, oldValue: any) {
30
- this.index = newValue;
29
+ id(newValue: any, oldValue: any) {
30
+ this.id = newValue;
31
31
  },
32
32
  prop(newValue: any, oldValue: any) {
33
33
  this.prop = newValue;
@@ -36,7 +36,7 @@
36
36
  data() {
37
37
  return {
38
38
  item: this.item,
39
- index: this.index,
39
+ id: this.id,
40
40
  prop: this.prop,
41
41
  options: this.options,
42
42
  isDateTime: isDateTime,
@@ -51,7 +51,7 @@
51
51
  {{ item[prop] }}
52
52
  </span>
53
53
  <span v-else-if="prop == options.Key! && options.Active">
54
- {{ index + 1 }}
54
+ {{ id }}
55
55
  </span>
56
56
  <span v-else-if="isDateTime(item[prop])">
57
57
  {{ toDate(item[prop]) }}