@teammodlr/ui-kit 2.1.1 → 2.1.3

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.
@@ -6,13 +6,26 @@
6
6
  :class="tableComputedClasses"
7
7
  >
8
8
  <TableHeadRow>
9
+ <TableHead
10
+ v-if="modelValue"
11
+ scope="col"
12
+ :width="20"
13
+ >
14
+ <MCheckbox
15
+ :checked="indeterminate || selected.length === items.length"
16
+ :indeterminate="indeterminate"
17
+ @change="onChange"
18
+ />
19
+ </TableHead>
9
20
  <TableHead
10
21
  v-for="(header, index) in headers"
11
22
  :key="index"
12
23
  :width="header.width"
13
24
  :style="{textAlign: header.align}"
14
25
  >
15
- {{ header.name }}
26
+ <slot :name="`${header.key}-header`">
27
+ {{ header.name }}
28
+ </slot>
16
29
  </TableHead>
17
30
  </TableHeadRow>
18
31
  <TableBody>
@@ -22,11 +35,19 @@
22
35
  :key="index"
23
36
  #default="{ onHover }"
24
37
  >
38
+ <TableCell
39
+ v-if="modelValue"
40
+ >
41
+ <MCheckbox
42
+ v-model="selected"
43
+ :value="item"
44
+ @click.stop
45
+ />
46
+ </TableCell>
25
47
  <TableCell
26
48
  v-for="(header, index) in headers"
27
49
  :key="index"
28
50
  :style="{ textAlign: header.align}"
29
- @click.self="$emit('onClick', item)"
30
51
  >
31
52
  <slot :name="header.key" :item="item" :onHover="onHover">
32
53
  {{//@ts-ignore
@@ -45,14 +66,17 @@
45
66
  </template>
46
67
 
47
68
  <script lang="ts">
48
- import { computed, defineComponent, type PropType } from 'vue';
69
+ import { computed, defineComponent, type PropType, toRaw } from 'vue';
49
70
  import type { TableHeadItem } from './types';
50
71
  import TableHeadRow from './TableHeadRow.vue';
51
72
  import TableHead from './TableHead.vue';
52
73
  import TableBody from './TableBody.vue';
53
74
  import TableRow from './TableRow.vue';
54
75
  import TableCell from './TableCell.vue';
76
+ import MCheckbox from '../checkbox/Checkbox.vue';
77
+
55
78
  import * as style from "./style";
79
+ import { indeterminate } from '../checkbox/style';
56
80
 
57
81
  export default defineComponent({
58
82
  name: "Table",
@@ -61,13 +85,17 @@ export default defineComponent({
61
85
  TableHead,
62
86
  TableBody,
63
87
  TableRow,
64
- TableCell
88
+ TableCell,
89
+ MCheckbox
65
90
  },
66
91
  emits: [
67
- 'update:sort',
68
- 'onClick'
92
+ 'update:modelValue',
69
93
  ],
70
94
  props: {
95
+ modelValue: {
96
+ type: Array,
97
+ default: null
98
+ },
71
99
  headers: {
72
100
  type: Array as PropType<Array<TableHeadItem>>,
73
101
  default: () => [],
@@ -89,7 +117,7 @@ export default defineComponent({
89
117
  default: false
90
118
  },
91
119
  },
92
- setup(props) {
120
+ setup(props, { emit, attrs }) {
93
121
 
94
122
  const wrapperComputedClasses = computed(() => {
95
123
  return [
@@ -111,9 +139,59 @@ export default defineComponent({
111
139
  ]
112
140
  });
113
141
 
142
+ const selected = computed({
143
+ get() {
144
+ return props.modelValue;
145
+ },
146
+ set(value) {
147
+ emit('update:modelValue', value);
148
+ }
149
+ });
150
+
151
+ const indeterminate = computed(() => {
152
+ return selected.value && selected.value.length > 0 && selected.value.length < props.items.length;
153
+ });
154
+
155
+ function compare (a: any, z: any) {
156
+ return a === z;
157
+ }
158
+
159
+ function onSelect (row: any) {
160
+
161
+ if (!attrs.onSelect) {
162
+ selected.value.push(row);
163
+ return;
164
+ }
165
+
166
+ // @ts-ignore
167
+ attrs.onSelect(row);
168
+ }
169
+
170
+ function selectAllRows() {
171
+ props.items.forEach((row: any) => {
172
+ if (selected.value.some((item) => compare(toRaw(item), toRaw(row)))) {
173
+ return
174
+ }
175
+
176
+ onSelect(row);
177
+ });
178
+ }
179
+
180
+ function onChange (event: any) {
181
+ if (event.target.checked) {
182
+ selectAllRows();
183
+ } else {
184
+ selected.value = [];
185
+ }
186
+ }
187
+
114
188
  return {
115
189
  wrapperComputedClasses,
116
- tableComputedClasses
190
+ tableComputedClasses,
191
+ selected,
192
+ indeterminate,
193
+ onChange,
194
+ onSelect
117
195
  }
118
196
  }
119
197
  })
@@ -26,6 +26,11 @@ import { ref } from "vue";
26
26
  import type { TableHeadItem } from "../types";
27
27
 
28
28
  let headers = ref<TableHeadItem[]>([
29
+ {
30
+ name: "ID",
31
+ key: "id",
32
+ width: 50
33
+ },
29
34
  {
30
35
  name: "Name",
31
36
  key: "name",
@@ -42,13 +47,13 @@ let headers = ref<TableHeadItem[]>([
42
47
  }
43
48
  ]);
44
49
 
45
- let items = ref([
46
- ...Array.from({ length: 30 }, () => ({
50
+ let items = [
51
+ ...Array.from({ length: 30 }, (v, i) => ({
52
+ id: i,
47
53
  name: "John Doe",
48
54
  age: 4
49
55
  }))
50
-
51
- ]);
56
+ ];
52
57
 
53
58
  const handleClick = (item: any) => {
54
59
  console.log(item);
@@ -1,7 +1,9 @@
1
1
  import MTable from "../Table.vue";
2
2
  import MButton from "../../button/Button.vue";
3
3
  import {
4
- MTableBasic, MTableEmpty
4
+ MTableBasic,
5
+ MTableEmpty,
6
+ MTableSelected
5
7
  } from "./index";
6
8
 
7
9
  import {
@@ -18,3 +20,4 @@ export default {
18
20
 
19
21
  export const Basic = createStory(MTableBasic);
20
22
  export const Empty = createStory(MTableEmpty);
23
+ export const Selected = createStory(MTableSelected);
@@ -1,2 +1,3 @@
1
1
  export { default as MTableBasic } from './basic.vue';
2
2
  export { default as MTableEmpty } from './empty.vue';
3
+ export { default as MTableSelected } from './selected.vue';
@@ -0,0 +1,68 @@
1
+ <template>
2
+ <MTable
3
+ :headers="headers"
4
+ :items="items"
5
+ @onClick="handleClick"
6
+ v-model="selected"
7
+ >
8
+ <template #name-header="{ item }">
9
+ Custom header slot if need be
10
+ </template>
11
+ <template #actions="{ item, onHover }">
12
+ {{ onHover }}
13
+ <MButton
14
+ color="blue"
15
+ secondary
16
+ size="sm"
17
+ >
18
+ Edit - {{ item.name }}
19
+ </MButton>
20
+ </template>
21
+
22
+ <template #empty>
23
+ Nothing here
24
+ </template>
25
+ </MTable>
26
+ </template>
27
+
28
+ <script setup lang="ts">
29
+ import { ref } from "vue";
30
+ import type { TableHeadItem } from "../types";
31
+
32
+ let headers = ref<TableHeadItem[]>([
33
+ {
34
+ name: "ID",
35
+ key: "id",
36
+ width: 50
37
+ },
38
+ {
39
+ name: "Name",
40
+ key: "name",
41
+ width: 200
42
+ },
43
+ {
44
+ name: "Age",
45
+ key: "age",
46
+ },
47
+ {
48
+ name: "Actions",
49
+ key: "actions",
50
+ align: "right"
51
+ }
52
+ ]);
53
+
54
+ let items = [
55
+ ...Array.from({ length: 30 }, (v, i) => ({
56
+ id: i,
57
+ name: "John Doe",
58
+ age: 4
59
+ }))
60
+ ];
61
+
62
+ let selected = ref([items[0]]);
63
+
64
+ const handleClick = (item: any) => {
65
+ console.log(item);
66
+ }
67
+
68
+ </script>
@@ -117,7 +117,7 @@ useInput.emits = (withListeners: boolean = true): string[] => {
117
117
  }
118
118
 
119
119
  useInput.props = () => ({
120
- modelValue: [String, Number, Boolean, Object, Array] as PropType<string | number | boolean | object | any[] | undefined>,
120
+ modelValue: [String, Number, Boolean, Object, Array] as PropType<string | number | boolean | object | Array<any> | any[] | undefined>,
121
121
  name: String,
122
122
  readonly: Boolean,
123
123
  required: Boolean,