@modeltables/fontawesome-vuetify 1.8.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,13 +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);
245
+ }
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 } ));
174
266
  }
175
267
  },
176
268
  filterValue(event: any, dataItem: any){
@@ -190,9 +282,6 @@ export default {
190
282
  dataItem = new window.Date(event);
191
283
  }
192
284
  },
193
- isNumber(n: any) {
194
- return !isNaN(parseFloat(n)) && !isNaN(n - 0)
195
- },
196
285
  optionschange(event: any){
197
286
  this.page = event!.page;
198
287
  this.filters.CurrentPage = this.page;
@@ -237,8 +326,22 @@ export default {
237
326
  prop.sort = !prop.sort;
238
327
  this.filters.SortColumn = Object.keys(this.dataItems[0])[index];
239
328
  this.filters.SortDirection = window.Number(prop.sort);
240
- console.log(this.filters);
241
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;
242
345
  }
243
346
  }
244
347
  }
@@ -257,55 +360,80 @@ export default {
257
360
  </v-row>
258
361
  <v-row>
259
362
  <v-data-table
363
+ v-if="loaded"
364
+ @update:options="optionschange($event)"
365
+ :v-bind:loading-text="'Loading... Please wait'"
260
366
  :color="'white'"
261
367
  :striped="'odd'"
262
- :v-bind:loading-text="'Loading... Please wait'"
263
368
  :loading="loading"
264
369
  :v-bind:model-value="modelValue"
265
370
  :items="dataItems"
266
- @update:options="optionschange($event)"
267
371
  :items-per-page="perPage"
268
372
  :page="page"
269
373
  hide-default-header
270
374
  hide-default-footer
271
375
  multi-sort
376
+ hover
272
377
  return-object>
273
- <template v-slot:item="{ item, index }" >
274
- <tr v-if="index == 0 && showFilters" class="filter-items" >
275
- <td v-for="(prop, index) in dataheader">
276
- <SortView
277
- :prop="prop"
278
- :index="index"
279
- @sort="sort($event, prop, index)">
280
- </SortView>
281
- </td>
282
- </tr>
283
- <tr v-if="index == 0 && showFilters" class="filter-items" >
284
- <td v-for="(prop, index) in Object.keys(item)">
285
- <Filters
286
- :item="item"
287
- :filters="filters"
288
- :showFilters="showFilters"
289
- :options="options"
290
- :prop="prop"
291
- @filterValue="filterValue($event, filters[prop])">
292
- </Filters>
293
- </td>
294
- </tr>
295
- <tr @dblclick="updateItem(item, $event)">
296
- <td v-for="(prop) in Object.keys(item)">
297
- <DataItem
298
- :item="item"
299
- :prop="prop"
300
- :options="options"
301
- :index="index">
302
- </DataItem>
303
- </td>
304
- </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>
305
425
  </template>
306
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>
307
434
  </v-row>
308
435
  <PaginationView
436
+ v-if="loaded"
309
437
  :page="page"
310
438
  :perPage="perPage"
311
439
  :pageCount="pageCount"
@@ -349,4 +477,8 @@ export default {
349
477
  height: 56px;
350
478
  }
351
479
 
480
+ .selected-row{
481
+ background-color: rgb(209, 208, 208);
482
+ }
483
+
352
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]) }}