@gorbulevsv/table 0.0.15 → 0.0.17
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.
- package/README.md +148 -117
- package/dist/components/Table.svelte +13 -11
- package/dist/components/TableRow.svelte +5 -5
- package/package.json +1 -1
- package/dist/remotes/fake.remote.d.ts +0 -6
- package/dist/remotes/fake.remote.js +0 -23
package/README.md
CHANGED
|
@@ -1,117 +1,148 @@
|
|
|
1
|
-
## Svelte TABLE
|
|
2
|
-
|
|
3
|
-
Sveltekit компонент таблицы с оформлением на **Bootstrap 6**.
|
|
4
|
-
|
|
5
|
-
Добавьте `<Table />` на свою страницу.
|
|
6
|
-
|
|
7
|
-
##
|
|
8
|
-
|
|
9
|
-
У компонента есть параметры:
|
|
10
|
-
|
|
11
|
-
- `title` - заголовок таблицы (опционально),
|
|
12
|
-
- `data` - данные, передаваемые в таблицу в формате массива объектов, например:
|
|
13
|
-
|
|
14
|
-
```ts
|
|
15
|
-
let data = [
|
|
16
|
-
{
|
|
17
|
-
uid: 1,
|
|
18
|
-
name: 'Serge',
|
|
19
|
-
email: 'sergify@rr.r',
|
|
20
|
-
status: 'ok'
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
uid: 2,
|
|
24
|
-
name: 'Helen',
|
|
25
|
-
email: 'helen@rr.r',
|
|
26
|
-
status: 'go'
|
|
27
|
-
}
|
|
28
|
-
];
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
, с нужным вам количеством полей,
|
|
32
|
-
|
|
33
|
-
- `titles` - заголовки колонок таблицы (опционально), если не указывать, то значения берутся из ключей объектов **data**,
|
|
34
|
-
- `grows` - массив **grow** значений (опционально), для задания каждой колонке доли ширины в таблице, например:
|
|
35
|
-
|
|
36
|
-
`[2,1,1,1]`,
|
|
37
|
-
если не указывать, то значения устанавливаются равными единице,
|
|
38
|
-
|
|
39
|
-
-`_class` и `_style` - для задания классов и стилей оформления в формате:
|
|
40
|
-
|
|
41
|
-
```ts
|
|
42
|
-
{ table?: string; header?: string; row?: string }
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
, где `table`, `header`, `row` оформляют всю таблицу, заголовки столбцов или строки таблицы соответственно.
|
|
46
|
-
|
|
47
|
-
##
|
|
48
|
-
|
|
49
|
-
Пример:
|
|
50
|
-
|
|
51
|
-
```ts
|
|
52
|
-
let data = [
|
|
53
|
-
{
|
|
54
|
-
uid: 1,
|
|
55
|
-
name: 'Serge',
|
|
56
|
-
email: 'sergify@rr.r',
|
|
57
|
-
status: 'ok'
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
uid: 2,
|
|
61
|
-
name: 'Helen',
|
|
62
|
-
email: 'helen@rr.r',
|
|
63
|
-
status: 'go'
|
|
64
|
-
}
|
|
65
|
-
];
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
```html
|
|
69
|
-
<table {data} grows="{[2,1,1,1]}" />
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
##
|
|
73
|
-
|
|
74
|
-
Вы можете отрендерить в ячейке таблицы сниппеты.
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
1
|
+
## Svelte TABLE
|
|
2
|
+
|
|
3
|
+
Sveltekit компонент таблицы с оформлением на **Bootstrap 6**.
|
|
4
|
+
|
|
5
|
+
Добавьте `<Table />` на свою страницу.
|
|
6
|
+
|
|
7
|
+
##
|
|
8
|
+
|
|
9
|
+
У компонента есть параметры:
|
|
10
|
+
|
|
11
|
+
- `title` - заголовок таблицы (опционально),
|
|
12
|
+
- `data` - данные, передаваемые в таблицу в формате массива объектов, например:
|
|
13
|
+
|
|
14
|
+
```ts
|
|
15
|
+
let data = [
|
|
16
|
+
{
|
|
17
|
+
uid: 1,
|
|
18
|
+
name: 'Serge',
|
|
19
|
+
email: 'sergify@rr.r',
|
|
20
|
+
status: 'ok'
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
uid: 2,
|
|
24
|
+
name: 'Helen',
|
|
25
|
+
email: 'helen@rr.r',
|
|
26
|
+
status: 'go'
|
|
27
|
+
}
|
|
28
|
+
];
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
, с нужным вам количеством полей,
|
|
32
|
+
|
|
33
|
+
- `titles` - заголовки колонок таблицы (опционально), если не указывать, то значения берутся из ключей объектов **data**,
|
|
34
|
+
- `grows` - массив **grow** значений (опционально), для задания каждой колонке доли ширины в таблице, например:
|
|
35
|
+
|
|
36
|
+
`[2,1,1,1]`,
|
|
37
|
+
если не указывать, то значения устанавливаются равными единице,
|
|
38
|
+
|
|
39
|
+
-`_class` и `_style` - для задания классов и стилей оформления в формате:
|
|
40
|
+
|
|
41
|
+
```ts
|
|
42
|
+
{ table?: string; header?: string; row?: string }
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
, где `table`, `header`, `row` оформляют всю таблицу, заголовки столбцов или строки таблицы соответственно.
|
|
46
|
+
|
|
47
|
+
##
|
|
48
|
+
|
|
49
|
+
Пример:
|
|
50
|
+
|
|
51
|
+
```ts
|
|
52
|
+
let data = [
|
|
53
|
+
{
|
|
54
|
+
uid: 1,
|
|
55
|
+
name: 'Serge',
|
|
56
|
+
email: 'sergify@rr.r',
|
|
57
|
+
status: 'ok'
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
uid: 2,
|
|
61
|
+
name: 'Helen',
|
|
62
|
+
email: 'helen@rr.r',
|
|
63
|
+
status: 'go'
|
|
64
|
+
}
|
|
65
|
+
];
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
```html
|
|
69
|
+
<table {data} grows="{[2,1,1,1]}" />
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
##
|
|
73
|
+
|
|
74
|
+
Вы можете отрендерить в ячейке таблицы сниппеты. Тогда нам нужно изменить **data** следующим образом:
|
|
75
|
+
|
|
76
|
+
```ts
|
|
77
|
+
let data = [
|
|
78
|
+
{
|
|
79
|
+
uid: 1,
|
|
80
|
+
name: 'Max',
|
|
81
|
+
email: 'max@rr.r',
|
|
82
|
+
status: 'ok',
|
|
83
|
+
picture: {
|
|
84
|
+
snippet: pictureSnippet,
|
|
85
|
+
url: 'https://avatars.mds.yandex.net/i?id=70ac3804623c28aefe512774776838b4_l-16338923-images-thumbs&n=13',
|
|
86
|
+
title: 'Привет'
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
uid: 2,
|
|
91
|
+
name: 'Helen',
|
|
92
|
+
email: 'helen@rr.r',
|
|
93
|
+
status: 'ok',
|
|
94
|
+
picture: {
|
|
95
|
+
snippet: pictureSnippet,
|
|
96
|
+
url: 'https://avatars.mds.yandex.net/i?id=dbb82f339bab80491528cf7c02428ee4_l-10752576-images-thumbs&n=13',
|
|
97
|
+
title: 'Как дела'
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
];
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Здесь мы добавили к данным в **data** поле `picture`, которое содержит поля `snippet`, `url`, `title`. Поле `snippet` в данном случае обязательное, если мы хотим отрендерить этот `picture`, оно равно нашему сниппету. А поля `url`, `title` - это данные, которые мы передаём в сниппет.
|
|
104
|
+
|
|
105
|
+
Вот пример нашего сниппета:
|
|
106
|
+
|
|
107
|
+
```ts
|
|
108
|
+
{#snippet pictureSnippet(obj: { picture: { url: string; title: string } })}
|
|
109
|
+
<div class="d-flex flex-column gap-1 rounded-3 overflow-hidden">
|
|
110
|
+
<div>{obj.picture.title}</div>
|
|
111
|
+
<img class="img-fluid rounded-3" src={obj.picture.url} alt={obj.picture.title} />
|
|
112
|
+
</div>
|
|
113
|
+
{/snippet}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
В сниппете в параметрах нужно указывать объект, а не отдельные параметры. Т.е. нужно
|
|
117
|
+
|
|
118
|
+
```ts
|
|
119
|
+
{#snippet pictureSnippet(obj: { picture: { url: string; title: string } })}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
, а не
|
|
123
|
+
|
|
124
|
+
```ts
|
|
125
|
+
{#snippet pictureSnippet(picture: { url: string; title: string } )}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
, и не
|
|
129
|
+
|
|
130
|
+
```ts
|
|
131
|
+
{#snippet pictureSnippet(url: string; title: string )}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Последние варианты не сработают, т.к. внутри `<Table />` это рендерится приблизительно как `{@render cell?.(data[i])}`, где `data[i]` это объект вроде
|
|
135
|
+
|
|
136
|
+
```ts
|
|
137
|
+
{
|
|
138
|
+
uid: 2,
|
|
139
|
+
name: 'Helen',
|
|
140
|
+
email: 'helen@rr.r',
|
|
141
|
+
status: 'ok',
|
|
142
|
+
picture: {
|
|
143
|
+
snippet: pictureSnippet,
|
|
144
|
+
url: 'https://avatars.mds.yandex.net/i?id=dbb82f339bab80491528cf7c02428ee4_l-10752576-images-thumbs&n=13',
|
|
145
|
+
title: 'Как дела'
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
```
|
|
@@ -42,6 +42,7 @@
|
|
|
42
42
|
});
|
|
43
43
|
|
|
44
44
|
function onPrev(i: number, titles: string[], array: any[][]) {
|
|
45
|
+
console.log(array);
|
|
45
46
|
if (i > 0) {
|
|
46
47
|
[titles[i], titles[i - 1]] = [titles[i - 1], titles[i]];
|
|
47
48
|
[growsState[i], growsState[i - 1]] = [growsState[i - 1], growsState[i]];
|
|
@@ -49,26 +50,27 @@
|
|
|
49
50
|
[row[i], row[i - 1]] = [row[i - 1], row[i]];
|
|
50
51
|
}
|
|
51
52
|
} else {
|
|
52
|
-
|
|
53
|
-
[
|
|
53
|
+
const length = array[0].length - 1;
|
|
54
|
+
[titles[i], titles[length]] = [titles[length], titles[i]];
|
|
55
|
+
[growsState[i], growsState[length]] = [growsState[length], growsState[i]];
|
|
54
56
|
for (const row of array) {
|
|
55
|
-
[row[i], row[
|
|
57
|
+
[row[i], row[row.length - 1]] = [row[row.length - 1], row[i]];
|
|
56
58
|
}
|
|
57
59
|
}
|
|
58
60
|
}
|
|
59
61
|
function onNext(i: number, titles: string[], array: any[][]) {
|
|
60
|
-
if (i
|
|
61
|
-
[titles[i], titles[0]] = [titles[0], titles[i]];
|
|
62
|
-
[growsState[i], growsState[0]] = [growsState[0], growsState[i]];
|
|
63
|
-
for (const row of array) {
|
|
64
|
-
[row[i], row[0]] = [row[0], row[i]];
|
|
65
|
-
}
|
|
66
|
-
} else {
|
|
62
|
+
if (i < array[0].length - 1) {
|
|
67
63
|
[titles[i], titles[i + 1]] = [titles[i + 1], titles[i]];
|
|
68
64
|
[growsState[i], growsState[i + 1]] = [growsState[i + 1], growsState[i]];
|
|
69
65
|
for (const row of array) {
|
|
70
66
|
[row[i], row[i + 1]] = [row[i + 1], row[i]];
|
|
71
67
|
}
|
|
68
|
+
} else {
|
|
69
|
+
[titles[i], titles[0]] = [titles[0], titles[i]];
|
|
70
|
+
[growsState[i], growsState[0]] = [growsState[0], growsState[i]];
|
|
71
|
+
for (const row of array) {
|
|
72
|
+
[row[i], row[0]] = [row[0], row[i]];
|
|
73
|
+
}
|
|
72
74
|
}
|
|
73
75
|
}
|
|
74
76
|
</script>
|
|
@@ -91,7 +93,7 @@
|
|
|
91
93
|
_style={_style?.header}
|
|
92
94
|
/>
|
|
93
95
|
|
|
94
|
-
{#each dataStateFiltered as row
|
|
96
|
+
{#each dataStateFiltered as row}
|
|
95
97
|
<TableRow
|
|
96
98
|
data={row}
|
|
97
99
|
grows={growsState}
|
|
@@ -7,21 +7,21 @@
|
|
|
7
7
|
titles: string[];
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
-
let { data, grows, _class = 'bg-1
|
|
10
|
+
let { data, grows, _class = 'bg-1 bg-50 align-items-center', _style, titles }: IProps = $props();
|
|
11
11
|
// Объединяем в один объект titles - то будут keys, и data - это будут values
|
|
12
|
-
const
|
|
12
|
+
const dataWithTitles = $derived(Object.fromEntries(titles.map((k, i) => [k, data[i]])));
|
|
13
13
|
</script>
|
|
14
14
|
|
|
15
15
|
<div class="d-flex align-items-strech w-100">
|
|
16
16
|
{#each data as cell, i}
|
|
17
17
|
<div
|
|
18
|
-
class="d-flex
|
|
18
|
+
class="d-flex gap-1 text-wrap px-3 py-1 {_class}"
|
|
19
19
|
style="flex: {grows?.[i]} {grows?.[i]} 0%; {_style}"
|
|
20
20
|
>
|
|
21
|
-
{#if
|
|
21
|
+
{#if !cell?.snippet}
|
|
22
22
|
{@html cell}
|
|
23
23
|
{:else}
|
|
24
|
-
{@render cell?.(
|
|
24
|
+
{@render cell?.snippet?.(dataWithTitles)}
|
|
25
25
|
{/if}
|
|
26
26
|
</div>
|
|
27
27
|
{/each}
|
package/package.json
CHANGED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { query } from '$app/server';
|
|
2
|
-
export const getData = query(async () => {
|
|
3
|
-
return [
|
|
4
|
-
{
|
|
5
|
-
uid: crypto.randomUUID(),
|
|
6
|
-
name: 'Serge',
|
|
7
|
-
email: 'sergify@rr.r',
|
|
8
|
-
status: "<div class='badge bg-info bg-20'>start</div>"
|
|
9
|
-
},
|
|
10
|
-
{
|
|
11
|
-
uid: crypto.randomUUID(),
|
|
12
|
-
name: 'Helen',
|
|
13
|
-
email: 'helen@rr.r',
|
|
14
|
-
status: 'go'
|
|
15
|
-
},
|
|
16
|
-
{
|
|
17
|
-
uid: crypto.randomUUID(),
|
|
18
|
-
name: 'Max',
|
|
19
|
-
email: 'max@rr.r',
|
|
20
|
-
status: 'go'
|
|
21
|
-
}
|
|
22
|
-
];
|
|
23
|
-
});
|