@iyulab/data-components 0.10.0 โ†’ 0.12.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,130 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.12.0] - 2026-08-04
4
+
5
+ ### Fixed
6
+
7
+ - ๐Ÿ”ด**`u-rich-table` ์˜ ์ „์ฒด์„ ํƒ์ด ๋‹ค๋ฅธ ํŽ˜์ด์ง€์˜ ์„ ํƒ์„ ์กฐ์šฉํžˆ ํŒŒ๊ดดํ–ˆ๋‹ค.** ์„œ๋ฒ„ ํŽ˜์ด์ง•
8
+ (`totalCount`/`currentPage`/`page-change`)์—์„œ ์„ ํƒ ์ƒํƒœ๋Š” ํŽ˜์ด์ง€๋ฅผ ๋„˜์–ด ์œ ์ง€๋˜๋Š”๋ฐ,
9
+ ์ „์ฒด์„ ํƒ ์ฒดํฌ๋ฐ•์Šค๋งŒ ๊ทธ ์‚ฌ์‹ค์„ ๋ชจ๋ฅด๊ณ  ์žˆ์—ˆ๋‹ค:
10
+ - ์ฒดํฌ ์ƒํƒœ๋ฅผ **ยซ๋ˆ„์  ์„ ํƒ ์ˆ˜ == ์ด ํŽ˜์ด์ง€ ํ–‰ ์ˆ˜ยป** ๋กœ ๊ณ„์‚ฐํ–ˆ๋‹ค โ‡’ 1ํŽ˜์ด์ง€๋ฅผ ์ „๋Ÿ‰ ์„ ํƒํ•˜๊ณ 
11
+ 2ํŽ˜์ด์ง€๋กœ ๋„˜์–ด๊ฐ€๋ฉด **์•„๋ฌด๊ฒƒ๋„ ๊ณ ๋ฅด์ง€ ์•Š์•˜๋Š”๋ฐ ์ผœ์ ธ ๋ณด์˜€๋‹ค.**
12
+ - ๊ทธ ์ƒํƒœ์—์„œ ์ฒดํฌ๋ฐ•์Šค๋ฅผ ๋„๋ฉด ์„ ํƒ ์ง‘ํ•ฉ์„ **ํ†ต์งธ๋กœ ๋น„์› ๋‹ค** โ‡’ ์‚ฌ์šฉ์ž์—๊ฒŒ๋Š” *"์ด ํŽ˜์ด์ง€ ํ•ด์ œ"*
13
+ ๋กœ ๋ณด์ด๋Š” ์กฐ์ž‘์ด 1ํŽ˜์ด์ง€์˜ ์„ ํƒ์„ ๋ง์—†์ด ์ง€์› ๋‹ค.
14
+ - ์ผœ๋Š” ์ชฝ๋„ ํ•ฉ์ง‘ํ•ฉ์ด ์•„๋‹ˆ๋ผ **์น˜ํ™˜**์ด์—ˆ๋‹ค โ‡’ 2ํŽ˜์ด์ง€์—์„œ ์ „์ฒด์„ ํƒํ•˜๋ฉด 1ํŽ˜์ด์ง€ ์„ ํƒ๋ถ„์ด ์‚ฌ๋ผ์กŒ๋‹ค.
15
+ `Ctrl`/`Cmd` + `A` ๋„ ๊ฐ™์€ ๊ฒฝ๋กœ์˜€๋‹ค.
16
+
17
+ โ‡’ ์ „์ฒด์„ ํƒ/ํ•ด์ œ์˜ ๋ฒ”์œ„๋ฅผ **ํ˜„์žฌ ํŽ˜์ด์ง€**๋กœ ํ™•์ •ํ–ˆ๋‹ค(ํ•ฉ์ง‘ํ•ฉยท์ฐจ์ง‘ํ•ฉ). ์ฒดํฌ๋ฐ•์Šค์˜ ๋ถ„์ž์™€ ๋ถ„๋ชจ๊ฐ€
18
+ ๋ชจ๋‘ ํ˜„์žฌ ํŽ˜์ด์ง€ ๊ธฐ์ค€์ด ๋˜์–ด, ๋‹ค๋ฅธ ํŽ˜์ด์ง€์˜ ์„ ํƒ๋ถ„์ด ์ด ํŽ˜์ด์ง€์˜ ํ‘œ์‹œ๋กœ ์ƒˆ์ง€ ์•Š๋Š”๋‹ค.
19
+
20
+ โš **๋‹จ์ผ ํŽ˜์ด์ง€ ์‚ฌ์šฉ(`totalCount = 0`)์—์„œ๋Š” ๋™์ž‘์ด ์ข…์ „๊ณผ ์™„์ „ํžˆ ๊ฐ™๋‹ค** โ€” ํ˜„์žฌ ํŽ˜์ด์ง€๊ฐ€
21
+ ๊ณง ์ „์ฒด์ด๋ฏ€๋กœ ํ•ฉ์ง‘ํ•ฉยท์ฐจ์ง‘ํ•ฉ์ด ์น˜ํ™˜ยท์ „์—ญ์†Œ๊ฑฐ์™€ ์ผ์น˜ํ•œ๋‹ค.
22
+
23
+ ### Added
24
+
25
+ - **์„ ํƒ ์ง‘ํ•ฉ์„ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๋‹ค** โ€” ์ข…์ „์—๋Š” ์„ ํƒ ์ƒํƒœ๊ฐ€ `private` ์ด๋ผ ์†Œ๋น„์•ฑ์ด ยซํ•ด์ œยป์™€
26
+ ยซ๋‹ค๋ฅธ ํŽ˜์ด์ง€์— ์žˆ์Œยป์„ ๊ตฌ๋ถ„ํ•  ๋ฐฉ๋ฒ•์ด ์—†์—ˆ๊ณ , ๊ทธ๋ž˜์„œ ์ถ”์ •ํ•  ์ˆ˜๋ฐ–์— ์—†์—ˆ๋‹ค.
27
+ - **`selectedRowIds`** *(getter)* โ€” ํŽ˜์ด์ง€๋ฅผ ๊ฐ€๋กœ์งˆ๋Ÿฌ ๋ˆ„์ ๋œ **๋ชจ๋“ ** ์„ ํƒ ์‹๋ณ„์ž.
28
+ `getSelectedRows()` ๋Š” ํ˜„์žฌ ํŽ˜์ด์ง€์˜ ํ–‰ ๊ฐ์ฒด๋งŒ ์ฃผ๋ฏ€๋กœ(๊ฐ–๊ณ  ์žˆ์ง€ ์•Š์€ ํ–‰์„ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค)
29
+ *"์—ฌ๋Ÿฌ ํŽ˜์ด์ง€์— ๊ฑธ์ณ ๊ณ ๋ฅธ ๋’ค ์ผ๊ด„ ์ฒ˜๋ฆฌ"* ์—๋Š” ์ด์ชฝ์ด ํ•„์š”ํ•˜๋‹ค. **์Šค๋ƒ…์ƒท**์ด๋ผ ๋Œ๋ ค๋ฐ›์€
30
+ ์ง‘ํ•ฉ์„ ๊ณ ์ณ๋„ ๋‚ด๋ถ€ ์ƒํƒœ๊ฐ€ ํ”๋“ค๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.
31
+ - **`setSelection(ids)`** โ€” ์„ ํƒ์„ ํ†ต์งธ๋กœ ๋Œ€์ฒดํ•œ๋‹ค. ํ˜„์žฌ ํŽ˜์ด์ง€์— ์—†๋Š” ์‹๋ณ„์ž๋„ ๋ฐ›๋Š”๋‹ค.
32
+ โš **๊ฐ™์€ ์ง‘ํ•ฉ์ด๋ฉด ์•„๋ฌด ์ผ๋„ ํ•˜์ง€ ์•Š๋Š”๋‹ค** โ€” `selection-change` ๋ฅผ ๋ฐ›์•„ ์•ฑ ์ƒํƒœ๋ฅผ ๊ฐฑ์‹ ํ•˜๊ณ 
33
+ ๋‹ค์‹œ ์ด๊ฒƒ์„ ๋ถ€๋ฅด๋Š” ๋ฐฐ์„ ์ด ์ž์—ฐ์Šค๋Ÿฌ์šด๋ฐ, ๋ฌด์กฐ๊ฑด ๋ฐœ์ƒ์‹œํ‚ค๋ฉด ๊ทธ ์ž๋ฆฌ๊ฐ€ ๋ฌดํ•œ ๋ฃจํ”„๊ฐ€ ๋œ๋‹ค.
34
+ - **`clearSelection()`** โ€” ๋ˆ„์ ๋ถ„๊นŒ์ง€ ์ „๋ถ€ ๋น„์šด๋‹ค. ์ „์ฒด์„ ํƒ ์ฒดํฌ๋ฐ•์Šค๊ฐ€ ยซ์ด ํŽ˜์ด์ง€ยป ๋ฒ”์œ„๊ฐ€
35
+ ๋˜๋ฉด์„œ ์ „์—ญ ์†Œ๊ฑฐ์˜ ์ž๋ฆฌ๊ฐ€ ์—†์–ด์กŒ๊ณ , ์ผ๊ด„ ์ฒ˜๋ฆฌ ํ›„ ์•ฑ์ด ์ƒํƒœ๋ฅผ ๋˜๋Œ๋ฆฌ๋Š” ๊ฒฝ๋กœ๊ฐ€ ์—ฌ๊ธฐ๋‹ค.
36
+ - **`selection-change` detail ์— `selectedIds: string[]` ์ถ”๊ฐ€** โ€” `selectedRows`(ํ˜„์žฌ ํŽ˜์ด์ง€)์™€
37
+ ๋‚˜๋ž€ํžˆ ๋ˆ„์  ์‹๋ณ„์ž๋ฅผ ์‹ฃ๋Š”๋‹ค. ๋‘ ํ•„๋“œ์˜ ๊ธธ์ด๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ์ด ์„œ๋ฒ„ ํŽ˜์ด์ง•์—์„œ๋Š” ์ •์ƒ์ด๋‹ค.
38
+ - **`select-all` ์ด๋ฒคํŠธ** โ€” ์‚ฌ์šฉ์ž๊ฐ€ ์ „์ฒด์„ ํƒ ์ฒดํฌ๋ฐ•์Šค๋ฅผ ์กฐ์ž‘ํ–ˆ๋‹ค๋Š” **์˜๋„**๋ฅผ ๋”ฐ๋กœ ์•Œ๋ฆฐ๋‹ค.
39
+ `selection-change` ๋งŒ์œผ๋กœ๋Š” *"์„ธ ํ–‰์„ ๊ณจ๋ž๋‹ค"* ์™€ *"์ „์ฒด์„ ํƒ์„ ๋ˆŒ๋ €๋‹ค"* ๊ฐ€ ๊ตฌ๋ถ„๋˜์ง€ ์•Š๋Š”๋ฐ,
40
+ ์„œ๋ฒ„ ํŽ˜์ด์ง•์—์„œ ํ›„์ž๋Š” ์•ฑ์ด *"์กฐ๊ฑด์— ๋งž๋Š” N๊ฑด ์ „๋ถ€"* ๋ฅผ ์ œ์•ˆํ•  ์ž๋ฆฌ๋‹ค.
41
+ โš **`scope: 'page' | 'all'` ํ•„๋“œ๋Š” ๋‘์ง€ ์•Š์•˜๋‹ค** โ€” ์ด ์ปดํฌ๋„ŒํŠธ๋Š” `'all'` ์„ ๋‚ผ ์ˆ˜ ์—†๋‹ค.
42
+ ์ „์—ญ ์ „์ฒด์„ ํƒ์€ ์‹๋ณ„์ž ๋ชฉ๋ก์ด ์•„๋‹ˆ๋ผ **์กฐํšŒ ์กฐ๊ฑด**์ด๋ผ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๊ณ ,
43
+ ๊ฐ’์ด ํ•˜๋‚˜๋ฟ์ธ ์œ ๋‹ˆ์˜จ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋ชจ๋ฅด๋Š” ๊ฐœ๋…์„ ์•„๋Š” ์ฒ™ํ•˜๋Š” ํ•„๋“œ๊ฐ€ ๋œ๋‹ค.
44
+
45
+ ### Changed
46
+
47
+ - **์„ ํƒ ๊ฑด์ˆ˜ ๋ผ๋ฒจ์ด ๋‘ ์ˆซ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ด ์•Œ๋ฆฐ๋‹ค** โ€” ์„ ํƒ์ด ํŽ˜์ด์ง€๋ฅผ ๊ฐ€๋กœ์ง€๋ฅด๋ฉด
48
+ `4 selected (1 on this page)` ์ฒ˜๋Ÿผ ๋ˆ„์ ๊ณผ ์ด ํŽ˜์ด์ง€ ๋ชซ์„ ํ•จ๊ป˜ ๋‚ธ๋‹ค. ํ•œ ํŽ˜์ด์ง€ ์•ˆ์— ๋จธ๋ฌด๋Š”
49
+ ๋™์•ˆ์—๋Š” ์ข…์ „๋Œ€๋กœ `3 selected` ๋‹ค. ๋‘ ์ˆซ์ž๊ฐ€ ๋‹ค๋ฅด๋‹ค๋Š” ์‚ฌ์‹ค ์ž์ฒด๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์•ผ ํ•œ๋‹ค.
50
+ - **์„ ํƒ ๊ฑด์ˆ˜ยทํŽ˜์ด์ง€ ํฌ๊ธฐ ๋ฌธ๊ตฌ๊ฐ€ ๋กœ์ผ€์ผ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋กœ ์ด์ฃผํ–ˆ๋‹ค**(`selected` ยท
51
+ `selectedAcrossPages` ยท `rowsPerPage`). `0.11.0` ์˜ ์ด์ฃผ๊ฐ€ ์ค‘์ฒฉ ํ…œํ”Œ๋ฆฟ ์•ˆ์˜ ๋‘ ๊ฑด์„
52
+ ๋‚จ๊ฒจ ๋‘์–ด, ๋‹ค๋ฅธ ๋ฌธ๊ตฌ๊ฐ€ ์ „๋ถ€ ์˜์–ด์ธ ํ™˜๊ฒฝ์—์„œ ์ด ๋‘˜๋งŒ ํ•œ๊ตญ์–ด๋กœ ๋‚˜์™”๋‹ค.
53
+
54
+ ## [0.11.0] - 2026-08-04
55
+
56
+ ### Fixed
57
+
58
+ - ๐Ÿ”ด**`LICENSE` ํŒŒ์ผ์ด ์—†์–ด ๊ฒŒ์‹œ๋ณธ์— MIT ์›๋ฌธ์ด ๋น ์ ธ ์žˆ์—ˆ๋‹ค.** `package.json` ์ด
59
+ `"license": "MIT"` ๋ฅผ ์„ ์–ธํ•˜๊ณ  `files` ์— `LICENSE` ๋ฅผ ๋‚˜์—ดํ–ˆ์ง€๋งŒ ํŒŒ์ผ ์ž์ฒด๊ฐ€ ์—†์—ˆ๋‹ค
60
+ โ‡’ `0.10.0` ๊นŒ์ง€์˜ tarball ์— ๋ผ์ด์„ ์Šค ์›๋ฌธ์ด ๋“ค์–ด ์žˆ์ง€ ์•Š๋‹ค. MIT ๋Š” *"์œ„ ์ €์ž‘๊ถŒ ๊ณ ์ง€์™€
61
+ ์ด ํ—ˆ๊ฐ€ ๊ณ ์ง€๋ฅผ ๋ชจ๋“  ์‚ฌ๋ณธ์— ํฌํ•จ์‹œ์ผœ์•ผ ํ•œ๋‹ค"* ๋Š” ์กฐ๊ฑด๋ถ€ ํ—ˆ๊ฐ€์ด๋ฏ€๋กœ, ์›๋ฌธ ๋ˆ„๋ฝ์€ ๊ทธ ์กฐ๊ฑด์„
62
+ ์Šค์Šค๋กœ ์ดํ–‰ํ•˜์ง€ ๋ชปํ•œ ์ƒํƒœ์˜€๋‹ค. โš `npm view โ€ฆ license` ๊ฐ€ `MIT` ๋ฅผ ๋ณด์—ฌ ์ฃผ๋Š” ๊ฒƒ์€
63
+ `package.json` ํ•„๋“œ๋ฅผ ์ฝ์€ ๊ฒƒ์ด์ง€ **์›๋ฌธ์ด ๋ฐฐํฌ๋๋‹ค๋Š” ๋œป์ด ์•„๋‹ˆ๋‹ค.**
64
+
65
+ ### Changed
66
+
67
+ - **`u-rich-table` ์˜ `_id` ๋ถ€์žฌ ๊ฒฝ๊ณ ๊ฐ€ ์˜์–ด๋กœ ์ด์ฃผํ–ˆ๋‹ค** โ€” ๊ฐœ๋ฐœ์ž ๋Œ€๋ฉด ์ง„๋‹จ์ด๋ฏ€๋กœ ๋กœ์ผ€์ผ
68
+ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๋„ฃ์ง€ ์•Š๋Š”๋‹ค(์‚ฌ์šฉ์ž๊ฐ€ ์ฝ๋Š” ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋‹ค).
69
+
70
+ - โš **ํ‘œ ๋ฌธ๊ตฌ๊ฐ€ ยซ์˜์–ด ๊ธฐ๋ณธ + ๋กœ์ผ€์ผ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌยป๋กœ ์ด์ฃผํ–ˆ๋‹ค** โ€” ๊ธฐ๋ณธ๊ฐ’ 7๊ฑด์ด ํ•œ๊ตญ์–ด ๋ฆฌํ„ฐ๋Ÿด์ด์—ˆ๋‹ค
71
+ (`u-rich-table` 6 ยท `u-simple-sheet` 1).
72
+
73
+ ```ts
74
+ import { Locale } from '@iyulab/components';
75
+ import { messages } from '@iyulab/data-components';
76
+
77
+ Locale.set('ko'); // ๊ฒ€์ฆ ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ ์ „ํ™˜๋œ๋‹ค
78
+ messages.register('ja', { empty: 'ใƒ‡ใƒผใ‚ฟใชใ—' }); // ์–ธ์–ด๋ฅผ ๋”ํ•˜๊ฑฐ๋‚˜ ๋ฌธ๊ตฌ๋ฅผ ๋ฎ๋Š”๋‹ค
79
+ ```
80
+
81
+ โš **ํ•œ๊ตญ์–ด ํ™˜๊ฒฝ์€ ์ข…์ „๊ณผ ๊ฐ™์€ ๋ฌธ๊ตฌ๋ฅผ ๋ณธ๋‹ค**(๋‚ด์žฅ `ko` ยท `ko-KR` โ†’ `ko`).
82
+ โš **์†Œ๋น„์ž๊ฐ€ ์ค€ ๊ฐ’์€ ์—ฌ์ „ํžˆ ์ด๊ธด๋‹ค** โ€” `emptyMessage` ๋“ฑ ํ”„๋กœํผํ‹ฐ ๊ณ„์•ฝ์€ ๊ทธ๋Œ€๋กœ๋‹ค.
83
+
84
+ โ˜…**๊ธฐ๋ณธ๊ฐ’์„ ยซ๋น„์šฐ๊ณ ยป ๋ Œ๋”์—์„œ ํ•ด์„ํ•œ๋‹ค.** ํ”„๋กœํผํ‹ฐ ์ดˆ๊ธฐ๊ฐ’์— ๋ฌธ์ž์—ด์„ ๋ฐ•์œผ๋ฉด **์ƒ์„ฑ ์‹œ์ ์˜
85
+ ๋กœ์ผ€์ผ์— ๊ณ ์ •**๋ผ ๋‚˜์ค‘์— `Locale.set()` ์„ ๋ถˆ๋Ÿฌ๋„ ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ํ‘œ๋Š” ๋”ฐ๋ผ์˜ค์ง€ ์•Š๋Š”๋‹ค.
86
+ โš **๋”ฐ๋ผ์„œ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ฝ์œผ๋ฉด ๊ธฐ๋ณธ ์ƒํƒœ์—์„œ `''` ๊ฐ€ ๋‚˜์˜จ๋‹ค**(์ข…์ „์—๋Š” ํ•œ๊ตญ์–ด ๋ฆฌํ„ฐ๋Ÿด).
87
+ ํ™”๋ฉด ๋ฌธ๊ตฌ๋Š” ๋ Œ๋” ๊ฒฐ๊ณผ๊ฐ€ ๊ณ„์•ฝ์ด๋‹ค.
88
+
89
+ โ˜…๊ฒ€์ฆ ๋ฉ”์‹œ์ง€(`ํ•„์ˆ˜ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค`)๋Š” **`@iyulab/components` ์˜ ํ‚ค์…‹**์„ ์“ด๋‹ค
90
+ (`Locale.getValue('valueMissing')` ยท 14๋กœ์ผ€์ผ). ๊ฐ™์€ ๋ฌธ์žฅ์„ ๋‘ ๊ณณ์— ๋‘์ง€ ์•Š๋Š”๋‹ค.
91
+
92
+ ### Requires
93
+
94
+ - `@iyulab/components >= 1.23.0` (`Locale.namespace`).
95
+
96
+ ### Added
97
+
98
+ - **`u-simple-sheet` ์˜ ํ–‰ ๋†’์ดยท์—ฌ๋ฐฑยท๊ธ€์ž ํฌ๊ธฐ๋ฅผ ์†Œ๋น„์ž๊ฐ€ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค** โ€” ์กฐ์ ˆ์  6์ข….
99
+
100
+ ```
101
+ --dc-row-height 24px ์…€ height ยท line-height (๋‘˜ ๋‹ค)
102
+ --dc-cell-padding-block 0px ์…€ ยท ํŽธ์ง‘ ์ž…๋ ฅ์˜ ์„ธ๋กœ ์—ฌ๋ฐฑ (ํ–‰ ๋†’์ด์— ๊ฐ€์‚ฐ)
103
+ --dc-cell-padding-inline 6px ใ€ƒ ๊ฐ€๋กœ ์—ฌ๋ฐฑ
104
+ --dc-font-size 13px ๋ณธ๋ฌธ ์…€ ยท ํŽธ์ง‘ ์ž…๋ ฅ ยท ๋“œ๋กญ๋‹ค์šด ํ•ญ๋ชฉ
105
+ --dc-header-font-size 12px ์—ด ๋จธ๋ฆฌ
106
+ --dc-header-font-weight 600 ใ€ƒ
107
+ ```
108
+
109
+ ์ข…์ „์—๋Š” ์น˜์ˆ˜๊ฐ€ ์ „๋ถ€ ๋ฆฌํ„ฐ๋Ÿด์ด๋ผ, ํ•œ ํ™”๋ฉด์— ํ‘œ๊ฐ€ ์—ฌ๋Ÿฟ์ผ ๋•Œ **์‹œํŠธ๋งŒ ๋‹ค๋ฅธ ๋†’์ด๋กœ ๋‚จ์•„๋„
110
+ ๋งž์ถœ ๋ฐฉ๋ฒ•์ด ์—†์—ˆ๋‹ค**(๊ณต๊ฐœ API ์— ์น˜์ˆ˜ ๋…ธ๋ธŒ 0๊ฑด ยท `part` 0๊ฑด). 0.10.0 ์ด ์—ฐ ์ƒ‰ ์ถ•๊ณผ ๊ฐ™์€
111
+ ์ž๋ฆฌ์ด๊ณ , ์ƒ‰์„ ๋งž์ถ”๊ณ  ๋‚˜์„œ์•ผ ๋†’์ด ์ฐจ์ด๊ฐ€ ๋“œ๋Ÿฌ๋‚œ ํ˜•ํƒœ๋‹ค.
112
+
113
+ โš **ํ–‰ ๋†’์ด์™€ `line-height` ๋Š” ํ•œ ํ† ํฐ์ด ์ •ํ•œ๋‹ค.** ๋”ฐ๋กœ ์—ด๋ฉด ์†Œ๋น„์ž๊ฐ€ ํ•œ์ชฝ๋งŒ ๋ฐ”๊ฟ” ๊ธ€์ž๊ฐ€
114
+ ์„ธ๋กœ๋กœ ์–ด๊ธ‹๋‚œ๋‹ค โ€” ๊ทธ ๋ฌถ์ž„์ด ์ด ์ถ•์˜ ์œ ์ผํ•œ ์ œ์•ฝ์ด๋‹ค.
115
+
116
+ โš **์ƒ‰ ์ถ•๊ณผ ๋‹ฌ๋ฆฌ ์—ญํ•  ํ† ํฐ์—์„œ ํŒŒ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค** โ€” ์—ญํ•  ์ธต์— ์น˜์ˆ˜ ์ถ•์ด ์—†๋‹ค. ๊ทธ๋ž˜์„œ
117
+ `:host` ๋ฆฌํ„ฐ๋Ÿด ๊ธฐ๋ณธ๊ฐ’์ด๊ณ , ์†Œ๋น„์ž๋Š” **์š”์†Œ ์„ ํƒ์ž**๋กœ ๋ฎ๋Š”๋‹ค(`:root` ๋Š” ๋‹ฟ์ง€ ์•Š๋Š”๋‹ค).
118
+
119
+ โš **๊ธฐ๋ณธ ๋ Œ๋”๋Š” ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.** ์„ ์–ธํ•˜์ง€ ์•Š์œผ๋ฉด ์ข…์ „ ๊ฐ’์œผ๋กœ ๊ทธ๋ ค์ง„๋‹ค.
120
+
121
+ โš **์„ ์–ธ๊ฐ’๊ณผ ์ฝํžˆ๋Š” ํ–‰ ๋†’์ด๋Š” 1.5px ๋‹ค๋ฅด๋‹ค** โ€” `border-collapse` ๋กœ ์ ‘ํžŒ ํ…Œ๋‘๋ฆฌ๊ฐ€ ์‚ฌ์šฉ๊ฐ’์—
122
+ ๋”ํ•ด์ง„๋‹ค(`24px` ์„ ์–ธ โ†’ `25.5px` ๋กœ ์ฝํž˜). 32px ๋กœ ๋งž์ถ”๋ ค๋ฉด `30.5px` ๋ฅผ ์„ ์–ธํ•œ๋‹ค.
123
+
124
+ `tests/browser/simple-sheet-density.browser.test.ts` ๊ฐ€ **์‹ค์ œ ํฌ๋กœ๋ฏธ์›€ ๊ณ„์‚ฐ๊ฐ’์œผ๋กœ** ํšจ๋ ฅ์„
125
+ ์žฐ๋‹ค โ€” ์†Œ์Šค ๋Œ€์กฐ๋Š” ยซ์ ํ˜€ ์žˆ์Œยป๋งŒ ์ฆ๋ช…ํ•˜๊ณ , ๋ฌธ์„œ ์Šค์ฝ”ํ”„ ์„ ์–ธ์ด ์„€๋„์˜ `:host` ๋ฅผ ์ด๊ธฐ๋Š”์ง€๋Š”
126
+ ์บ์Šค์ผ€์ด๋“œ ๋ฌธ์ œ๋ผ ๊ณ„์‚ฐ๊ฐ’์œผ๋กœ๋งŒ ๊ฐˆ๋ฆฐ๋‹ค.
127
+
3
128
  ## [0.10.0] - 2026-08-03
4
129
 
5
130
  ### Added
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 iyulab
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -190,6 +190,40 @@ u-rich-table { --dc-icon-color: #B0B0B0; }
190
190
  โš **`0.10.0` ์€ ์กฐ์ ˆ์ ๋งŒ ์—ฝ๋‹ˆ๋‹ค โ€” ๊ธฐ๋ณธ ๋ Œ๋”๋Š” ๋ณ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.** ๋‹ค์„ฏ ๋‹จ์ด ์ „๋ถ€
191
191
  `--u-txt-color-weak` ์—์„œ ํŒŒ์ƒ๋˜๋ฉฐ, ๋‹คํฌ ๋Œ€์‘๋„ ๊ทธ ์—ญํ•  ํ† ํฐ์ด ์ด๋ฏธ ๊ฐ–๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
192
192
 
193
+ ### ์‹œํŠธ ๋ฐ€๋„ยทํƒ€์ดํฌ ์กฐ์ ˆ (`u-simple-sheet` ยท 0.11.0~)
194
+
195
+ ํ•œ ํ™”๋ฉด์— ํ‘œ๊ฐ€ ์—ฌ๋Ÿฟ์ผ ๋•Œ **ํ–‰ ๋†’์ด๋ฅผ ์„œ๋กœ ๋งž์ถ”๊ธฐ ์œ„ํ•œ** ์กฐ์ ˆ์ ์ž…๋‹ˆ๋‹ค. ์ƒ‰ ์ถ•(์œ„)๊ณผ ๊ฐ™์€
196
+ ์ด์œ ๋กœ ์—ด๋ ธ์Šต๋‹ˆ๋‹ค โ€” ์–ด๋А ๋†’์ด๊ฐ€ ์˜ณ์€์ง€๋Š” ์†Œ๋น„์ž๊ฐ€ ์ •ํ•  ์ผ์ธ๋ฐ, ์ข…์ „์—๋Š” ์น˜์ˆ˜๊ฐ€ ์ „๋ถ€
197
+ ๋ฆฌํ„ฐ๋Ÿด์ด๋ผ ์ •ํ•  ๋ฐฉ๋ฒ•์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค.
198
+
199
+ | ํ† ํฐ | ๊ธฐ๋ณธ๊ฐ’ | ๋ฌด์—‡์„ ์ •ํ•˜๋‚˜ |
200
+ |---|---|---|
201
+ | `--dc-row-height` | `24px` | ์…€ `height` ์™€ `line-height` **๋‘˜ ๋‹ค** |
202
+ | `--dc-cell-padding-block` | `0px` | ์…€ยทํŽธ์ง‘ ์ž…๋ ฅ์˜ ์„ธ๋กœ ์—ฌ๋ฐฑ (ํ–‰ ๋†’์ด์— **๊ฐ€์‚ฐ**) |
203
+ | `--dc-cell-padding-inline` | `6px` | ใ€ƒ ๊ฐ€๋กœ ์—ฌ๋ฐฑ |
204
+ | `--dc-font-size` | `13px` | ๋ณธ๋ฌธ ์…€ ยท ํŽธ์ง‘ ์ž…๋ ฅ ยท ๋“œ๋กญ๋‹ค์šด ํ•ญ๋ชฉ |
205
+ | `--dc-header-font-size` | `12px` | ์—ด ๋จธ๋ฆฌ |
206
+ | `--dc-header-font-weight` | `600` | ใ€ƒ |
207
+
208
+ ```css
209
+ /* โš ์š”์†Œ ์„ ํƒ์ž๋กœ ๊ฒจ๋ˆ•๋‹ˆ๋‹ค โ€” :root ๋Š” ๋‹ฟ์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์•„๋ž˜ ์ฐธ์กฐ) */
210
+ u-simple-sheet {
211
+ --dc-row-height: 30.5px; /* ์ฝํžˆ๋Š” ํ–‰ ๋†’์ด 32px */
212
+ }
213
+ ```
214
+
215
+ โš **`:root` ๋กœ๋Š” ๋‹ฟ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.** ์ปค์Šคํ…€ ํ”„๋กœํผํ‹ฐ ์ƒ์†๊ฐ’์€ ์„€๋„ ๋ฃจํŠธ์˜ `:host` ์„ ์–ธ์—
216
+ ์ง‘๋‹ˆ๋‹ค. ์ƒ‰ ์ถ•๊ณผ ๋‹ฌ๋ฆฌ ์ด ์—ฌ์„ฏ์€ `:host` ์— ๋ฆฌํ„ฐ๋Ÿด ๊ธฐ๋ณธ๊ฐ’์„ ๊ฐ–๊ณ  ์žˆ์œผ๋ฏ€๋กœ(์—ญํ•  ์ธต์— ์น˜์ˆ˜
217
+ ์ถ•์ด ์—†์–ด ํŒŒ์ƒํ•  ๊ณณ์ด ์—†์Šต๋‹ˆ๋‹ค) **์š”์†Œ ์„ ํƒ์ž**(`u-simple-sheet { โ€ฆ }`)๋กœ ์„ ์–ธํ•˜์‹ญ์‹œ์˜ค.
218
+
219
+ โš **์„ ์–ธ๊ฐ’๊ณผ ยซ์ฝํžˆ๋Š”ยป ํ–‰ ๋†’์ด๋Š” 1.5px ๋‹ค๋ฆ…๋‹ˆ๋‹ค.** `border-collapse` ๋กœ ์ ‘ํžŒ ํ…Œ๋‘๋ฆฌ๊ฐ€
220
+ ์‚ฌ์šฉ๊ฐ’์— ๋”ํ•ด์ง‘๋‹ˆ๋‹ค โ€” ๊ธฐ๋ณธ `24px` ์„ ์–ธ์ด `25.5px` ๋กœ ์ฝํž™๋‹ˆ๋‹ค. 32px ๋กœ ๋งž์ถ”๋ ค๋ฉด
221
+ `30.5px` ๋ฅผ ์„ ์–ธํ•˜์‹ญ์‹œ์˜ค. (๊ฐ™์€ ์ด์œ ๋กœ **๋นˆ ํ–‰์€ ๋ฐ์ดํ„ฐ ํ–‰๋ณด๋‹ค 1.5px ๋‚ฎ์Šต๋‹ˆ๋‹ค** โ€”
222
+ `0.11.0` ์ด์ „๋ถ€ํ„ฐ ๊ทธ๋žฌ๊ณ , ๊ต์ •ํ•˜๋ฉด ๊ธฐ๋ณธ ๋ Œ๋”๊ฐ€ ๋ฐ”๋€Œ๋ฏ€๋กœ ์ด ๋ฆด๋ฆฌ์Šค์—์„œ๋Š” ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.)
223
+
224
+ โš **`0.11.0` ๋„ ์กฐ์ ˆ์ ๋งŒ ์—ฝ๋‹ˆ๋‹ค** โ€” ์„ ์–ธํ•˜์ง€ ์•Š์œผ๋ฉด ์ข…์ „๊ณผ ๊ฐ™์€ ๊ฐ’์œผ๋กœ ๊ทธ๋ ค์ง‘๋‹ˆ๋‹ค.
225
+ ์ด ์—ฌ์„ฏ์€ `u-simple-sheet` ์ „์šฉ์ž…๋‹ˆ๋‹ค(`u-data-view`ยท`u-rich-table` ์€ ์ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค).
226
+
193
227
  ### ์•Œ๋ ค์ง„ ์ œ์•ฝ
194
228
 
195
229
  - **ํ‘œ๋ฉด ๋†’์ด๋ฅผ ๋œปํ•˜๋Š” ํ† ํฐ์ด ์—†์Šต๋‹ˆ๋‹ค** โ€” ๋ฐฐ๊ฒฝ ์—ญํ•  ํ† ํฐ์€ ์ƒํ˜ธ์ž‘์šฉ ์ƒํƒœ ์ด๋ฆ„
@@ -1,5 +1,6 @@
1
1
  import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorateMetadata.js";
2
2
  import __decorate from "../../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorate.js";
3
+ import { messages } from "../../utilities/messages.js";
3
4
  import { styles } from "./USimpleSheet.styles.js";
4
5
  import { html } from "lit";
5
6
  import { customElement, property, state } from "lit/decorators.js";
@@ -25,7 +26,7 @@ var USimpleSheet = class USimpleSheet extends UElement {
25
26
  this.rows = 20;
26
27
  this.cols = 10;
27
28
  this.readonly = false;
28
- this.noMatchMessage = "์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ ์—†์Œ";
29
+ this.noMatchMessage = "";
29
30
  this._sel = null;
30
31
  this._editing = null;
31
32
  this._editVal = "";
@@ -612,7 +613,7 @@ var USimpleSheet = class USimpleSheet extends UElement {
612
613
  </div>
613
614
  ` : noMatch && isStrict ? html`
614
615
  <div class="cell-dropdown">
615
- <div class="dropdown-empty">${this.noMatchMessage}</div>
616
+ <div class="dropdown-empty">${this.noMatchMessage || messages.text("noMatch")}</div>
616
617
  </div>
617
618
  ` : ""}
618
619
  ` : this._formatValue(value, c, r)}
@@ -18,6 +18,25 @@ var baseStyles = css`
18
18
  --dc-header-color: var(--u-txt-color-weak, #757575); /* ์—ด ๋จธ๋ฆฌ ยท ํ–‰ ๋จธ๋ฆฌ */
19
19
  --dc-empty-color: var(--u-txt-color-weak, #757575); /* ๋นˆ ์ƒํƒœ ์•ˆ๋‚ด๋ฌธ */
20
20
  --dc-readonly-color: var(--u-txt-color-weak, #757575); /* ์ฝ๊ธฐ ์ „์šฉ ์…€ */
21
+
22
+ /* โ”€โ”€ ์†Œ๋น„์ž ์กฐ์ ˆ์  โ€” ๋ฐ€๋„ยทํƒ€์ดํฌ โ”€โ”€
23
+ โ˜…์ƒ‰ ์ถ•(์œ„)๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ ์—ด์—ˆ๋‹ค. ํ•œ ์ œํ’ˆ ์•ˆ์— ํ‘œ๊ฐ€ ์—ฌ๋Ÿฟ์ผ ๋•Œ ยซ์–ด๋А ๋†’์ด๊ฐ€ ์˜ณ์€๊ฐ€ยป๋Š”
24
+ ์†Œ๋น„์ž๊ฐ€ ์ •ํ•  ์ผ์ธ๋ฐ, ์ด ์ปดํฌ๋„ŒํŠธ๋Š” ์น˜์ˆ˜๊ฐ€ ์ „๋ถ€ ๋ฆฌํ„ฐ๋Ÿด์ด๋ผ ์ •ํ•  ๋ฐฉ๋ฒ•์ด ์—†์—ˆ๋‹ค.
25
+ โš **ํ–‰ ๋†’์ด์™€ line-height ๋Š” ํ•œ ํ† ํฐ์ด ์ •ํ•œ๋‹ค.** ๋”ฐ๋กœ ์—ด๋ฉด ์†Œ๋น„์ž๊ฐ€ ํ•œ์ชฝ๋งŒ ๋ฐ”๊ฟ”
26
+ ๊ธ€์ž๊ฐ€ ์„ธ๋กœ๋กœ ์–ด๊ธ‹๋‚œ๋‹ค โ€” ๊ทธ ๋ฌถ์ž„์ด ์ด ์ถ•์˜ ์œ ์ผํ•œ ์ œ์•ฝ์ด๋‹ค.
27
+ โš **์—ฌ๋ฐฑ ์ถ•์€ ยซ๊ฐ€์‚ฐยป์ด๋‹ค**: ์‹ค์ œ ํ–‰ ๋†’์ด = --dc-row-height + 2ร—--dc-cell-padding-block.
28
+ ๊ธฐ๋ณธ๊ฐ’์ด 0 ์ด๋ผ ์„ ์–ธํ•˜์ง€ ์•Š์œผ๋ฉด ์ข…์ „๊ณผ ๊ฐ™๋‹ค.
29
+ โš **์ƒ‰ ์ถ•๊ณผ ๋‹ฌ๋ฆฌ ์—ญํ•  ํ† ํฐ์—์„œ ํŒŒ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค** โ€” ์—ญํ•  ์ธต์— ์น˜์ˆ˜ ์ถ•์ด ์—†๋‹ค.
30
+ ๊ทธ๋ž˜์„œ ํด๋ฐฑ์ด ์•„๋‹ˆ๋ผ :host ๋ฆฌํ„ฐ๋Ÿด ๊ธฐ๋ณธ๊ฐ’์ด๊ณ , ์†Œ๋น„์ž๋Š” **์š”์†Œ ์„ ํƒ์ž**๋กœ ๋ฎ๋Š”๋‹ค
31
+ (:host ์„ ์–ธ์€ ์ƒ์†๊ฐ’์„ ์ด๊ธฐ๋ฏ€๋กœ :root ๋กœ๋Š” ๋‹ฟ์ง€ ์•Š๋Š”๋‹ค).
32
+ โš **์ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ยซ์ฝ๋Š”ยป ๋‹จ๋งŒ ์„ ์–ธํ•œ๋‹ค** โ€” ์ƒ‰ ์ถ•๊ณผ ๊ฐ™์€ ๊ทœ์น™์ด๋‹ค. */
33
+ --dc-row-height: 24px; /* ์…€ height ยท line-height (๋ฌถ์ž„) */
34
+ --dc-cell-padding-block: 0px; /* ์…€ ยท ํŽธ์ง‘ ์ž…๋ ฅ์˜ ์„ธ๋กœ ์—ฌ๋ฐฑ (๊ฐ€์‚ฐ) */
35
+ --dc-cell-padding-inline: 6px; /* ใ€ƒ ๊ฐ€๋กœ ์—ฌ๋ฐฑ */
36
+ --dc-font-size: 13px; /* ๋ณธ๋ฌธ ์…€ ยท ํŽธ์ง‘ ์ž…๋ ฅ ยท ๋“œ๋กญ๋‹ค์šด ํ•ญ๋ชฉ */
37
+ --dc-header-font-size: 12px; /* ์—ด ๋จธ๋ฆฌ */
38
+ --dc-header-font-weight: 600; /* ใ€ƒ */
39
+
21
40
  display: block;
22
41
  width: 100%;
23
42
  height: 400px;
@@ -78,8 +97,8 @@ var baseStyles = css`
78
97
  background: var(--u-neutral-100, #F5F5F5);
79
98
  padding: 4px 8px;
80
99
  text-align: center;
81
- font-size: 12px;
82
- font-weight: 600;
100
+ font-size: var(--dc-header-font-size);
101
+ font-weight: var(--dc-header-font-weight);
83
102
  color: var(--dc-header-color);
84
103
  border-right: 1px solid var(--u-border-color, #E0E0E0);
85
104
  border-bottom: 2px solid var(--u-border-color, #E0E0E0);
@@ -160,18 +179,20 @@ var baseStyles = css`
160
179
 
161
180
  /* Data cells */
162
181
  .cell {
163
- padding: 0 6px;
182
+ padding: var(--dc-cell-padding-block) var(--dc-cell-padding-inline);
164
183
  border-right: 1px solid var(--u-border-color-weak, #EEEEEE);
165
184
  border-bottom: 1px solid var(--u-border-color-weak, #EEEEEE);
166
- font-size: 13px;
185
+ font-size: var(--dc-font-size);
167
186
  color: var(--u-txt-color, #212121);
168
187
  min-width: 80px;
169
188
  overflow: hidden;
170
189
  text-overflow: ellipsis;
171
190
  white-space: nowrap;
172
191
  cursor: cell;
173
- height: 24px;
174
- line-height: 24px;
192
+ /* โš height ๋Š” ยซ๋นˆ ์…€ยป์„ ์ •ํ•œ๋‹ค โ€” ๋‚ด์šฉ์ด ์žˆ๋Š” ์…€์˜ ๋†’์ด๋Š” line-height ๊ฐ€ ๋งŒ๋“ ๋‹ค.
193
+ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ ๋ฐฐ์„ ํ•˜๋ฉด ๋ฐ์ดํ„ฐ ํ–‰๊ณผ ๋นˆ ํ–‰์˜ ๋†’์ด๊ฐ€ ๊ฐˆ๋ฆฐ๋‹ค(๋„ค๊ฑฐํ‹ฐ๋ธŒ ์ปจํŠธ๋กค์ด ์žก์€ ์ž๋ฆฌ). */
194
+ height: var(--dc-row-height);
195
+ line-height: var(--dc-row-height);
175
196
  vertical-align: middle;
176
197
  position: relative;
177
198
  box-sizing: border-box;
@@ -206,8 +227,9 @@ var baseStyles = css`
206
227
  border: none;
207
228
  outline: 2px solid var(--u-blue-500, #2196F3);
208
229
  outline-offset: -1px;
209
- padding: 0 6px;
210
- font-size: 13px;
230
+ /* โš ์…€๊ณผ ยซ๊ฐ™์€ ๊ฐ’ยป์ด์–ด์•ผ ํ•œ๋‹ค โ€” ์–ด๊ธ‹๋‚˜๋ฉด ํŽธ์ง‘ ์ง„์ž… ์ˆœ๊ฐ„ ๊ธ€์ž๊ฐ€ ํŠ„๋‹ค. */
231
+ padding: var(--dc-cell-padding-block) var(--dc-cell-padding-inline);
232
+ font-size: var(--dc-font-size);
211
233
  font-family: inherit;
212
234
  color: var(--u-txt-color, #212121);
213
235
  background: var(--u-bg-color, #FFFFFF);
@@ -235,7 +257,8 @@ var baseStyles = css`
235
257
 
236
258
  .dropdown-item {
237
259
  padding: 4px 8px;
238
- font-size: 13px;
260
+ /* ์…€ ๊ฐ’์˜ ํ›„๋ณด๋ฅผ ๋ณด์ด๋Š” ์ž๋ฆฌ๋‹ค โ€” ๋ณธ๋ฌธ ๊ธ€์ž ์ถ•์„ ๋”ฐ๋ฅธ๋‹ค. */
261
+ font-size: var(--dc-font-size);
239
262
  color: var(--u-txt-color, #212121);
240
263
  cursor: pointer;
241
264
  white-space: nowrap;
@@ -40,6 +40,35 @@ export declare class URichTable extends LitElement {
40
40
  revertRow(_rowId: string): void;
41
41
  setRowError(rowId: string, message: string): void;
42
42
  clearRowError(rowId: string): void;
43
+ /**
44
+ * ์„ ํƒ๋œ ํ–‰์˜ **์‹๋ณ„์ž ์ง‘ํ•ฉ** โ€” ํŽ˜์ด์ง€๋ฅผ ๊ฐ€๋กœ์งˆ๋Ÿฌ ๋ˆ„์ ๋œ ์ „๋ถ€.
45
+ *
46
+ * `getSelectedRows()` ๋Š” ํ˜„์žฌ ํŽ˜์ด์ง€์˜ ํ–‰ ๊ฐ์ฒด๋งŒ ๋Œ๋ ค์ฃผ๋ฏ€๋กœ(๊ฐ–๊ณ  ์žˆ์ง€ ์•Š์€ ํ–‰์„ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค)
47
+ * *"์—ฌ๋Ÿฌ ํŽ˜์ด์ง€์— ๊ฑธ์ณ ๊ณ ๋ฅธ ๋’ค ์ผ๊ด„ ์ฒ˜๋ฆฌ"* ์—๋Š” ์ด์ชฝ์ด ํ•„์š”ํ•˜๋‹ค.
48
+ *
49
+ * โš **์Šค๋ƒ…์ƒท์ด๋‹ค.** ๋‚ด๋ถ€ ์ง‘ํ•ฉ์„ ๊ทธ๋Œ€๋กœ ๋„˜๊ธฐ๋ฉด `ReadonlySet` ์ด ํƒ€์ž… ์ˆ˜์ค€ ์•ฝ์†์ผ ๋ฟ์ด๋ผ
50
+ * JS ์†Œ๋น„์ž๊ฐ€ `add` ๋กœ ๋‚ด๋ถ€ ์ƒํƒœ๋ฅผ **๊ฐฑ์‹  ์‹ ํ˜ธ ์—†์ด** ๋ง๊ฐ€๋œจ๋ฆด ์ˆ˜ ์žˆ๋‹ค. ๋ณต์ œ ๋น„์šฉ์€
51
+ * ์„ ํƒ ํฌ๊ธฐ์— ๋น„๋ก€ํ•˜๊ณ  ๋ฌด์‹œํ•  ์ˆ˜์ค€์ด๋‹ค.
52
+ */
53
+ get selectedRowIds(): ReadonlySet<string>;
54
+ /**
55
+ * ์„ ํƒ์„ **ํ†ต์งธ๋กœ ๋Œ€์ฒด**ํ•œ๋‹ค โ€” ํŽ˜์ด์ง€๋ฅผ ๊ฐ€๋กœ์ง€๋ฅด๋Š” ๋ˆ„์ ๋ถ„๊นŒ์ง€.
56
+ *
57
+ * ์•ฑ์ด ์ž๊ธฐ ์ƒํƒœ๋ฅผ ์ •๋ณธ์œผ๋กœ ์‚ผ๋Š” ๊ฒฝ์šฐ(์™ธ๋ถ€ ์ €์žฅยท๋ณต์›, ํ•„ํ„ฐ ๋ณ€๊ฒฝ ์‹œ ์ •๋ฆฌ)์˜ ์ง„์ž…์ ์ด๋‹ค.
58
+ * ํ˜„์žฌ ํŽ˜์ด์ง€์— ์—†๋Š” ์‹๋ณ„์ž๋ฅผ ๋„ฃ์–ด๋„ ๋œ๋‹ค โ€” ๊ทธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋ฉด ์„ ํƒ๋œ ๊ฒƒ์œผ๋กœ ๋ Œ๋”๋œ๋‹ค.
59
+ *
60
+ * โš **๊ฐ™์€ ์ง‘ํ•ฉ์ด๋ฉด ์•„๋ฌด ์ผ๋„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.** ์•ฑ์ด `selection-change` ๋ฅผ ๋ฐ›์•„ ์ž๊ธฐ ์ƒํƒœ๋ฅผ
61
+ * ๊ฐฑ์‹ ํ•˜๊ณ  ๋‹ค์‹œ ์ด๊ฒƒ์„ ๋ถ€๋ฅด๋Š” ๊ฒƒ์ด ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ฐฐ์„ ์ธ๋ฐ, ๋ฌด์กฐ๊ฑด ๋ฐœ์ƒ์‹œํ‚ค๋ฉด ๊ทธ ์ž๋ฆฌ๊ฐ€
62
+ * **๋ฌดํ•œ ๋ฃจํ”„**๊ฐ€ ๋œ๋‹ค.
63
+ */
64
+ setSelection(ids: Iterable<string>): void;
65
+ /**
66
+ * ์„ ํƒ์„ **์ „๋ถ€** ๋น„์šด๋‹ค โ€” ํŽ˜์ด์ง€๋ฅผ ๊ฐ€๋กœ์ง€๋ฅด๋Š” ๋ˆ„์ ๋ถ„๊นŒ์ง€.
67
+ *
68
+ * ์ „์ฒด์„ ํƒ ์ฒดํฌ๋ฐ•์Šค๋Š” ยซ์ด ํŽ˜์ด์ง€ยป๋งŒ ๋‹ค๋ฃจ๋ฏ€๋กœ ์ „์—ญ ์†Œ๊ฑฐ์˜ ์ž๋ฆฌ๊ฐ€ ์—†๋‹ค. ์ผ๊ด„ ์ฒ˜๋ฆฌ๋ฅผ ๋๋‚ธ ๋’ค
69
+ * ์•ฑ์ด ์ƒํƒœ๋ฅผ ๋˜๋Œ๋ฆฌ๋Š” ๊ฒฝ๋กœ๊ฐ€ ์—ฌ๊ธฐ๋‹ค. `selection-change` ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.
70
+ */
71
+ clearSelection(): void;
43
72
  /**
44
73
  * ํ–‰์˜ ์‹๋ณ„์ž. ์„ ํƒยทํ™•์žฅยทํ–‰ ์˜ค๋ฅ˜ ์ƒํƒœ๊ฐ€ ์ „๋ถ€ ์ด ๊ฐ’์œผ๋กœ ์ถ”์ ๋œ๋‹ค.
45
74
  *
@@ -52,8 +81,24 @@ export declare class URichTable extends LitElement {
52
81
  private _rowId;
53
82
  private _warnedMissingRowId;
54
83
  private _warnMissingRowId;
84
+ /**
85
+ * **ํ˜„์žฌ ํŽ˜์ด์ง€์˜** ์„ ํƒ๋œ ํ–‰. ์„œ๋ฒ„ ํŽ˜์ด์ง•์—์„œ ๋‹ค๋ฅธ ํŽ˜์ด์ง€์˜ ์„ ํƒ๋ถ„์€ ์—ฌ๊ธฐ ์—†๋‹ค โ€”
86
+ * ์ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ–๊ณ  ์žˆ์ง€ ์•Š์€ ํ–‰์„ ๋Œ๋ ค์ค„ ์ˆ˜๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
87
+ * ํŽ˜์ด์ง€๋ฅผ ๊ฐ€๋กœ์ง€๋ฅด๋Š” ์„ ํƒ ์ง‘ํ•ฉ์ด ํ•„์š”ํ•˜๋ฉด {@link selectedRowIds} ๋ฅผ ์“ด๋‹ค.
88
+ */
55
89
  getSelectedRows(): Record<string, unknown>[];
90
+ /** ์ด ํŽ˜์ด์ง€ ํ–‰๋“ค์˜ ์‹๋ณ„์ž. ์ „์ฒด์„ ํƒ/ํ•ด์ œ๊ฐ€ ยซ์ด ํŽ˜์ด์ง€ยป ๋ฒ”์œ„์ž„์„ ์ •์˜ํ•˜๋Š” ๊ฐ’์ด๋‹ค. */
91
+ private _pageRowIds;
92
+ /** ํ˜„์žฌ ํŽ˜์ด์ง€์—์„œ ์„ ํƒ๋œ ํ–‰ ์ˆ˜ โ€” ์ „์ฒด์„ ํƒ ์ฒดํฌ๋ฐ•์Šค์˜ ยซ๋ถ„์žยป. */
93
+ private get _selectedOnPage();
56
94
  render(): TemplateResult;
95
+ /**
96
+ * โš **๋‘ ์ˆซ์ž๋ฅผ ์„ž์ง€ ์•Š๋Š”๋‹ค.** ์ฒดํฌ๋ฐ•์Šค๋Š” ยซ์ด ํŽ˜์ด์ง€ยป๋ฅผ ์ผœ๊ณ  ๋„๋ฏ€๋กœ ๊ทธ ์ƒํƒœ๋„ ํŽ˜์ด์ง€ ๊ธฐ์ค€์ด๊ณ ,
97
+ * ๋ผ๋ฒจ์˜ ๊ฑด์ˆ˜๋Š” ํŽ˜์ด์ง€๋ฅผ ๊ฐ€๋กœ์ง€๋ฅด๋Š” **๋ˆ„์ **์ด๋‹ค. ์ข…์ „์—๋Š” ๋ถ„์ž๋งŒ ๋ˆ„์ ์ด๊ณ  ๋ถ„๋ชจ๊ฐ€ ํŽ˜์ด์ง€๋ผ
98
+ * ๋‹ค๋ฅธ ํŽ˜์ด์ง€์˜ ์„ ํƒ๋ถ„์ด ์ด ํŽ˜์ด์ง€์˜ ์ฒดํฌ ์ƒํƒœ๋กœ ์ƒˆ์–ด ๋‚˜์™”๋‹ค โ€” ํŽ˜์ด์ง€ 1์„ ์ „๋Ÿ‰ ์„ ํƒํ•˜๊ณ 
99
+ * ๋„˜์–ด๊ฐ€๋ฉด ํŽ˜์ด์ง€ 2์—์„œ ์•„๋ฌด๊ฒƒ๋„ ๊ณ ๋ฅด์ง€ ์•Š์•˜๋Š”๋ฐ ์ฒดํฌ๋ฐ•์Šค๊ฐ€ ์ผœ์ ธ ๋ณด์˜€๊ณ , ๊ทธ๊ฒƒ์„ ๋„๋ฉด
100
+ * ํŽ˜์ด์ง€ 1์˜ ์„ ํƒ์ด ์กฐ์šฉํžˆ ์‚ฌ๋ผ์กŒ๋‹ค.
101
+ */
57
102
  private _renderToolbar;
58
103
  private _renderHeader;
59
104
  private _renderFilterRow;
@@ -62,6 +107,23 @@ export declare class URichTable extends LitElement {
62
107
  private _renderCellContent;
63
108
  private _renderNewRow;
64
109
  private _renderPagination;
110
+ /**
111
+ * ์ „์ฒด์„ ํƒ ์ฒดํฌ๋ฐ•์Šค โ€” ๋ฒ”์œ„๋Š” **ํ˜„์žฌ ํŽ˜์ด์ง€**๋‹ค(ํ•ฉ์ง‘ํ•ฉ/์ฐจ์ง‘ํ•ฉ, ์น˜ํ™˜์ด ์•„๋‹ˆ๋‹ค).
112
+ * ์ข…์ „์—๋Š” ์ผค ๋•Œ `new Set(ํ˜„์žฌ ํŽ˜์ด์ง€)` ๋กœ **์น˜ํ™˜**ํ•˜๊ณ  ๋Œ ๋•Œ `new Set()` ์œผ๋กœ **์ „์—ญ ์†Œ๊ฑฐ**ํ•ด์„œ,
113
+ * ์–ด๋А ์ชฝ์ด๋“  ๋‹ค๋ฅธ ํŽ˜์ด์ง€์˜ ์„ ํƒ๋ถ„์ด ํ•จ๊ป˜ ๋‚ ์•„๊ฐ”๋‹ค. ์ „์—ญ ์†Œ๊ฑฐ๊ฐ€ ํ•„์š”ํ•˜๋ฉด {@link clearSelection}.
114
+ *
115
+ * ## ์™œ `select-all` ์„ ๋”ฐ๋กœ ๋‚ด๋ณด๋‚ด๋Š”๊ฐ€
116
+ *
117
+ * `selection-change` ๋งŒ์œผ๋กœ๋Š” *"์‚ฌ์šฉ์ž๊ฐ€ ์„ธ ํ–‰์„ ๊ณจ๋ž๋‹ค"* ์™€ *"์‚ฌ์šฉ์ž๊ฐ€ ์ „์ฒด์„ ํƒ์„ ๋ˆŒ๋ €๋‹ค"* ๊ฐ€
118
+ * ๊ตฌ๋ถ„๋˜์ง€ ์•Š๋Š”๋‹ค. ์„œ๋ฒ„ ํŽ˜์ด์ง•์—์„œ ๊ทธ ๊ตฌ๋ถ„์€ ์•ฑ์— ํ•„์š”ํ•˜๋‹ค โ€” ์ „์ฒด์„ ํƒ์„ ๋ˆ„๋ฅธ ์ˆœ๊ฐ„์ด
119
+ * *"์ด ์กฐ๊ฑด์— ๋งž๋Š” N๊ฑด ์ „๋ถ€"* ๋ฅผ ์ œ์•ˆํ•  ์ž๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
120
+ *
121
+ * โš **`scope: 'page' | 'all'` ํ•„๋“œ๋Š” ๋‘์ง€ ์•Š์•˜๋‹ค.** ์ด ์ปดํฌ๋„ŒํŠธ๋Š” `'all'` ์„ **๋‚ผ ์ˆ˜ ์—†๋‹ค** โ€”
122
+ * ๋‹ค๋ฅธ ํŽ˜์ด์ง€์˜ ํ–‰์„ ๊ฐ–๊ณ  ์žˆ์ง€ ์•Š๊ณ , ์„œ๋ฒ„ ํŽ˜์ด์ง•์—์„œ ยซ์ „์—ญ ์ „์ฒด์„ ํƒยป์€ id ๋ชฉ๋ก์ด ์•„๋‹ˆ๋ผ
123
+ * **์กฐํšŒ ์กฐ๊ฑด**์ด๋ผ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ๊ฐ’์ด ํ•˜๋‚˜๋ฟ์ธ ์œ ๋‹ˆ์˜จ์€
124
+ * *"๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋ชจ๋ฅด๋Š” ๊ฐœ๋…์„ ์•„๋Š” ์ฒ™ํ•˜๋Š”"* ํ•„๋“œ๊ฐ€ ๋œ๋‹ค. โ‡’ ์ปดํฌ๋„ŒํŠธ๋Š” **์˜๋„๋งŒ** ์•Œ๋ฆฌ๊ณ 
125
+ * ์ „์—ญ ํ•ด์„์€ ์•ฑ์ด ํ•œ๋‹ค.
126
+ */
65
127
  private _onSelectAll;
66
128
  private _onRowSelect;
67
129
  private _lastSelectedIndex;
@@ -83,6 +145,12 @@ export declare class URichTable extends LitElement {
83
145
  private _getOptionLabel;
84
146
  private _getPageNumbers;
85
147
  private _moveToNextEditableCell;
148
+ /**
149
+ * โš **๋‘ ํ•„๋“œ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒƒ์„ ์„ผ๋‹ค.** `selectedRows` ๋Š” **ํ˜„์žฌ ํŽ˜์ด์ง€์˜ ํ–‰ ๊ฐ์ฒด**์ด๊ณ 
150
+ * `selectedIds` ๋Š” ํŽ˜์ด์ง€๋ฅผ ๊ฐ€๋กœ์ง€๋ฅด๋Š” **๋ˆ„์  ์‹๋ณ„์ž**๋‹ค. ์„œ๋ฒ„ ํŽ˜์ด์ง•์—์„œ ๋‘˜์˜ ๊ธธ์ด๊ฐ€
151
+ * ๋‹ค๋ฅธ ๊ฒƒ์ด ์ •์ƒ์ด๋ฉฐ, ๊ทธ ์ฐจ์ด๋ฅผ ๊ฐ์ถœ ๋ฐฉ๋ฒ•์€ ์—†๋‹ค โ€” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค๋ฅธ ํŽ˜์ด์ง€์˜ ํ–‰์„
152
+ * ๊ฐ–๊ณ  ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
153
+ */
86
154
  private _fireSelectionChange;
87
155
  connectedCallback(): void;
88
156
  disconnectedCallback(): void;
@@ -90,6 +158,7 @@ export declare class URichTable extends LitElement {
90
158
  private _handleCopy;
91
159
  private _handlePaste;
92
160
  private _moveFocus;
161
+ /** `Ctrl`/`Cmd` + `A` โ€” ์ „์ฒด์„ ํƒ ์ฒดํฌ๋ฐ•์Šค์™€ ๊ฐ™์€ ๋ฒ”์œ„(ํ˜„์žฌ ํŽ˜์ด์ง€ ํ•ฉ์ง‘ํ•ฉ)์—ฌ์•ผ ํ•œ๋‹ค. */
93
162
  private _selectAll;
94
163
  static define(tagName?: string): void;
95
164
  }
@@ -1,9 +1,11 @@
1
1
  import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorateMetadata.js";
2
2
  import __decorate from "../../_virtual/_@oxc-project_runtime@0.142.0/helpers/esm/decorate.js";
3
+ import { messages } from "../../utilities/messages.js";
3
4
  import { richTableStyles } from "./styles.js";
4
5
  import { parseTSV, toTSV } from "./utils/clipboard.js";
5
6
  import { LitElement, html } from "lit";
6
7
  import { customElement, property, state } from "lit/decorators.js";
8
+ import { Locale } from "@iyulab/components/dist/utilities/Locale.js";
7
9
  //#region src/components/u-rich-table/URichTable.ts
8
10
  var URichTable = class URichTable extends LitElement {
9
11
  constructor(..._args) {
@@ -14,12 +16,16 @@ var URichTable = class URichTable extends LitElement {
14
16
  this.pageSize = 25;
15
17
  this.currentPage = 1;
16
18
  this.loading = false;
17
- this.emptyMessage = "๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค";
18
- this.loadingMessage = "๋กœ๋”ฉ ์ค‘...";
19
- this.filterPlaceholder = "ํ•„ํ„ฐ...";
20
- this.filterAllLabel = "์ „์ฒด";
21
- this.addRowLabel = "+ ์ƒˆ ํ–‰";
22
- this.pageInfoFormatter = (total, start, end) => `์ „์ฒด ${total.toLocaleString()}๊ฑด ์ค‘ ${start}-${end} ํ‘œ์‹œ`;
19
+ this.emptyMessage = "";
20
+ this.loadingMessage = "";
21
+ this.filterPlaceholder = "";
22
+ this.filterAllLabel = "";
23
+ this.addRowLabel = "";
24
+ this.pageInfoFormatter = (total, start, end) => messages.text("pageInfo", {
25
+ total: total.toLocaleString(),
26
+ start,
27
+ end
28
+ });
23
29
  this.selectable = false;
24
30
  this.editable = false;
25
31
  this.addable = false;
@@ -96,6 +102,44 @@ var URichTable = class URichTable extends LitElement {
96
102
  this.rowErrors = next;
97
103
  }
98
104
  /**
105
+ * ์„ ํƒ๋œ ํ–‰์˜ **์‹๋ณ„์ž ์ง‘ํ•ฉ** โ€” ํŽ˜์ด์ง€๋ฅผ ๊ฐ€๋กœ์งˆ๋Ÿฌ ๋ˆ„์ ๋œ ์ „๋ถ€.
106
+ *
107
+ * `getSelectedRows()` ๋Š” ํ˜„์žฌ ํŽ˜์ด์ง€์˜ ํ–‰ ๊ฐ์ฒด๋งŒ ๋Œ๋ ค์ฃผ๋ฏ€๋กœ(๊ฐ–๊ณ  ์žˆ์ง€ ์•Š์€ ํ–‰์„ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค)
108
+ * *"์—ฌ๋Ÿฌ ํŽ˜์ด์ง€์— ๊ฑธ์ณ ๊ณ ๋ฅธ ๋’ค ์ผ๊ด„ ์ฒ˜๋ฆฌ"* ์—๋Š” ์ด์ชฝ์ด ํ•„์š”ํ•˜๋‹ค.
109
+ *
110
+ * โš **์Šค๋ƒ…์ƒท์ด๋‹ค.** ๋‚ด๋ถ€ ์ง‘ํ•ฉ์„ ๊ทธ๋Œ€๋กœ ๋„˜๊ธฐ๋ฉด `ReadonlySet` ์ด ํƒ€์ž… ์ˆ˜์ค€ ์•ฝ์†์ผ ๋ฟ์ด๋ผ
111
+ * JS ์†Œ๋น„์ž๊ฐ€ `add` ๋กœ ๋‚ด๋ถ€ ์ƒํƒœ๋ฅผ **๊ฐฑ์‹  ์‹ ํ˜ธ ์—†์ด** ๋ง๊ฐ€๋œจ๋ฆด ์ˆ˜ ์žˆ๋‹ค. ๋ณต์ œ ๋น„์šฉ์€
112
+ * ์„ ํƒ ํฌ๊ธฐ์— ๋น„๋ก€ํ•˜๊ณ  ๋ฌด์‹œํ•  ์ˆ˜์ค€์ด๋‹ค.
113
+ */
114
+ get selectedRowIds() {
115
+ return new Set(this.selectedIds);
116
+ }
117
+ /**
118
+ * ์„ ํƒ์„ **ํ†ต์งธ๋กœ ๋Œ€์ฒด**ํ•œ๋‹ค โ€” ํŽ˜์ด์ง€๋ฅผ ๊ฐ€๋กœ์ง€๋ฅด๋Š” ๋ˆ„์ ๋ถ„๊นŒ์ง€.
119
+ *
120
+ * ์•ฑ์ด ์ž๊ธฐ ์ƒํƒœ๋ฅผ ์ •๋ณธ์œผ๋กœ ์‚ผ๋Š” ๊ฒฝ์šฐ(์™ธ๋ถ€ ์ €์žฅยท๋ณต์›, ํ•„ํ„ฐ ๋ณ€๊ฒฝ ์‹œ ์ •๋ฆฌ)์˜ ์ง„์ž…์ ์ด๋‹ค.
121
+ * ํ˜„์žฌ ํŽ˜์ด์ง€์— ์—†๋Š” ์‹๋ณ„์ž๋ฅผ ๋„ฃ์–ด๋„ ๋œ๋‹ค โ€” ๊ทธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋ฉด ์„ ํƒ๋œ ๊ฒƒ์œผ๋กœ ๋ Œ๋”๋œ๋‹ค.
122
+ *
123
+ * โš **๊ฐ™์€ ์ง‘ํ•ฉ์ด๋ฉด ์•„๋ฌด ์ผ๋„ ํ•˜์ง€ ์•Š๋Š”๋‹ค.** ์•ฑ์ด `selection-change` ๋ฅผ ๋ฐ›์•„ ์ž๊ธฐ ์ƒํƒœ๋ฅผ
124
+ * ๊ฐฑ์‹ ํ•˜๊ณ  ๋‹ค์‹œ ์ด๊ฒƒ์„ ๋ถ€๋ฅด๋Š” ๊ฒƒ์ด ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ฐฐ์„ ์ธ๋ฐ, ๋ฌด์กฐ๊ฑด ๋ฐœ์ƒ์‹œํ‚ค๋ฉด ๊ทธ ์ž๋ฆฌ๊ฐ€
125
+ * **๋ฌดํ•œ ๋ฃจํ”„**๊ฐ€ ๋œ๋‹ค.
126
+ */
127
+ setSelection(ids) {
128
+ const next = new Set(ids);
129
+ if (next.size === this.selectedIds.size && [...next].every((id) => this.selectedIds.has(id))) return;
130
+ this.selectedIds = next;
131
+ this._fireSelectionChange();
132
+ }
133
+ /**
134
+ * ์„ ํƒ์„ **์ „๋ถ€** ๋น„์šด๋‹ค โ€” ํŽ˜์ด์ง€๋ฅผ ๊ฐ€๋กœ์ง€๋ฅด๋Š” ๋ˆ„์ ๋ถ„๊นŒ์ง€.
135
+ *
136
+ * ์ „์ฒด์„ ํƒ ์ฒดํฌ๋ฐ•์Šค๋Š” ยซ์ด ํŽ˜์ด์ง€ยป๋งŒ ๋‹ค๋ฃจ๋ฏ€๋กœ ์ „์—ญ ์†Œ๊ฑฐ์˜ ์ž๋ฆฌ๊ฐ€ ์—†๋‹ค. ์ผ๊ด„ ์ฒ˜๋ฆฌ๋ฅผ ๋๋‚ธ ๋’ค
137
+ * ์•ฑ์ด ์ƒํƒœ๋ฅผ ๋˜๋Œ๋ฆฌ๋Š” ๊ฒฝ๋กœ๊ฐ€ ์—ฌ๊ธฐ๋‹ค. `selection-change` ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.
138
+ */
139
+ clearSelection() {
140
+ this.setSelection([]);
141
+ }
142
+ /**
99
143
  * ํ–‰์˜ ์‹๋ณ„์ž. ์„ ํƒยทํ™•์žฅยทํ–‰ ์˜ค๋ฅ˜ ์ƒํƒœ๊ฐ€ ์ „๋ถ€ ์ด ๊ฐ’์œผ๋กœ ์ถ”์ ๋œ๋‹ค.
100
144
  *
101
145
  * โš `_id` ๋Š” ์ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ **๋ถ€์—ฌํ•˜์ง€ ์•Š๋Š”๋‹ค.** ์†Œ๋น„์ž๊ฐ€ ๋„ฃ์–ด ์ฃผ์ง€ ์•Š์œผ๋ฉด ๋ชจ๋“  ํ–‰์˜
@@ -113,11 +157,24 @@ var URichTable = class URichTable extends LitElement {
113
157
  _warnMissingRowId() {
114
158
  if (this._warnedMissingRowId) return;
115
159
  this._warnedMissingRowId = true;
116
- console.warn("[@iyulab/data-components] u-rich-table: ํ–‰์— `_id` ๊ฐ€ ์—†์–ด **์œ„์น˜**๋กœ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ์žฌ์ •๋ ฌยท์žฌํŽ˜์ด์ง•๋˜๋ฉด ์„ ํƒ ์ƒํƒœ๊ฐ€ ๋‹ค๋ฅธ ํ–‰์œผ๋กœ ์˜ฎ๊ฒจ๊ฐ‘๋‹ˆ๋‹ค. ๊ฐ ํ–‰์— ๊ณ ์œ ํ•œ `_id` ๋ฅผ ๋ถ€์—ฌํ•˜์„ธ์š”.");
160
+ console.warn("[@iyulab/data-components] u-rich-table: rows have no `_id`, so selection is tracked by **position**. Re-sorting or re-paging the data moves the selection to a different row. Give every row a unique `_id`.");
117
161
  }
162
+ /**
163
+ * **ํ˜„์žฌ ํŽ˜์ด์ง€์˜** ์„ ํƒ๋œ ํ–‰. ์„œ๋ฒ„ ํŽ˜์ด์ง•์—์„œ ๋‹ค๋ฅธ ํŽ˜์ด์ง€์˜ ์„ ํƒ๋ถ„์€ ์—ฌ๊ธฐ ์—†๋‹ค โ€”
164
+ * ์ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ–๊ณ  ์žˆ์ง€ ์•Š์€ ํ–‰์„ ๋Œ๋ ค์ค„ ์ˆ˜๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
165
+ * ํŽ˜์ด์ง€๋ฅผ ๊ฐ€๋กœ์ง€๋ฅด๋Š” ์„ ํƒ ์ง‘ํ•ฉ์ด ํ•„์š”ํ•˜๋ฉด {@link selectedRowIds} ๋ฅผ ์“ด๋‹ค.
166
+ */
118
167
  getSelectedRows() {
119
168
  return this.data.filter((row, i) => this.selectedIds.has(this._rowId(row, i)));
120
169
  }
170
+ /** ์ด ํŽ˜์ด์ง€ ํ–‰๋“ค์˜ ์‹๋ณ„์ž. ์ „์ฒด์„ ํƒ/ํ•ด์ œ๊ฐ€ ยซ์ด ํŽ˜์ด์ง€ยป ๋ฒ”์œ„์ž„์„ ์ •์˜ํ•˜๋Š” ๊ฐ’์ด๋‹ค. */
171
+ _pageRowIds() {
172
+ return this.data.map((row, i) => this._rowId(row, i));
173
+ }
174
+ /** ํ˜„์žฌ ํŽ˜์ด์ง€์—์„œ ์„ ํƒ๋œ ํ–‰ ์ˆ˜ โ€” ์ „์ฒด์„ ํƒ ์ฒดํฌ๋ฐ•์Šค์˜ ยซ๋ถ„์žยป. */
175
+ get _selectedOnPage() {
176
+ return this._pageRowIds().reduce((n, id) => n + (this.selectedIds.has(id) ? 1 : 0), 0);
177
+ }
121
178
  render() {
122
179
  return html`
123
180
  ${this._renderToolbar()}
@@ -132,24 +189,36 @@ var URichTable = class URichTable extends LitElement {
132
189
  ${this._renderPagination()}
133
190
  `;
134
191
  }
192
+ /**
193
+ * โš **๋‘ ์ˆซ์ž๋ฅผ ์„ž์ง€ ์•Š๋Š”๋‹ค.** ์ฒดํฌ๋ฐ•์Šค๋Š” ยซ์ด ํŽ˜์ด์ง€ยป๋ฅผ ์ผœ๊ณ  ๋„๋ฏ€๋กœ ๊ทธ ์ƒํƒœ๋„ ํŽ˜์ด์ง€ ๊ธฐ์ค€์ด๊ณ ,
194
+ * ๋ผ๋ฒจ์˜ ๊ฑด์ˆ˜๋Š” ํŽ˜์ด์ง€๋ฅผ ๊ฐ€๋กœ์ง€๋ฅด๋Š” **๋ˆ„์ **์ด๋‹ค. ์ข…์ „์—๋Š” ๋ถ„์ž๋งŒ ๋ˆ„์ ์ด๊ณ  ๋ถ„๋ชจ๊ฐ€ ํŽ˜์ด์ง€๋ผ
195
+ * ๋‹ค๋ฅธ ํŽ˜์ด์ง€์˜ ์„ ํƒ๋ถ„์ด ์ด ํŽ˜์ด์ง€์˜ ์ฒดํฌ ์ƒํƒœ๋กœ ์ƒˆ์–ด ๋‚˜์™”๋‹ค โ€” ํŽ˜์ด์ง€ 1์„ ์ „๋Ÿ‰ ์„ ํƒํ•˜๊ณ 
196
+ * ๋„˜์–ด๊ฐ€๋ฉด ํŽ˜์ด์ง€ 2์—์„œ ์•„๋ฌด๊ฒƒ๋„ ๊ณ ๋ฅด์ง€ ์•Š์•˜๋Š”๋ฐ ์ฒดํฌ๋ฐ•์Šค๊ฐ€ ์ผœ์ ธ ๋ณด์˜€๊ณ , ๊ทธ๊ฒƒ์„ ๋„๋ฉด
197
+ * ํŽ˜์ด์ง€ 1์˜ ์„ ํƒ์ด ์กฐ์šฉํžˆ ์‚ฌ๋ผ์กŒ๋‹ค.
198
+ */
135
199
  _renderToolbar() {
136
- const selectedCount = this.selectedIds.size;
200
+ const total = this.selectedIds.size;
201
+ const onPage = this._selectedOnPage;
202
+ const crossesPages = total > onPage;
137
203
  return html`
138
204
  <div class="toolbar">
139
205
  ${this.selectable ? html`
140
206
  <div class="selection-info">
141
207
  <input type="checkbox"
142
- .checked=${selectedCount > 0 && selectedCount === this.data.length}
143
- .indeterminate=${selectedCount > 0 && selectedCount < this.data.length}
208
+ .checked=${this.data.length > 0 && onPage === this.data.length}
209
+ .indeterminate=${onPage > 0 && onPage < this.data.length}
144
210
  @change=${this._onSelectAll} />
145
- ${selectedCount > 0 ? html`<span>${selectedCount}๊ฑด ์„ ํƒ๋จ</span>` : ""}
211
+ ${total > 0 ? html`<span>${crossesPages ? messages.text("selectedAcrossPages", {
212
+ count: total,
213
+ onPage
214
+ }) : messages.text("selected", { count: total })}</span>` : ""}
146
215
  </div>
147
- ${selectedCount > 0 ? html`<slot name="bulk-actions"></slot>` : ""}
216
+ ${total > 0 ? html`<slot name="bulk-actions"></slot>` : ""}
148
217
  ` : ""}
149
218
  <div style="flex:1"></div>
150
219
  <slot name="toolbar-end"></slot>
151
220
  ${this.addable ? html`
152
- <button class="btn btn-success" @click=${this._onAddRowClick}>${this.addRowLabel}</button>
221
+ <button class="btn btn-success" @click=${this._onAddRowClick}>${this.addRowLabel || messages.text("addRow")}</button>
153
222
  ` : ""}
154
223
  </div>
155
224
  `;
@@ -184,10 +253,10 @@ var URichTable = class URichTable extends LitElement {
184
253
  ${this.columns.map((col) => html`
185
254
  <td>
186
255
  ${col.filterable !== false ? col.filterType === "select" && col.options ? html`<select @change=${(e) => this._onFilterChange(col.key, e.target.value)}>
187
- <option value="">${this.filterAllLabel}</option>
256
+ <option value="">${this.filterAllLabel || messages.text("filterAll")}</option>
188
257
  ${col.options.map((o) => html`<option value=${o.value}>${o.label}</option>`)}
189
258
  </select>` : html`<input
190
- placeholder=${this.filterPlaceholder}
259
+ placeholder=${this.filterPlaceholder || messages.text("filterPlaceholder")}
191
260
  @input=${(e) => this._onFilterChange(col.key, e.target.value)} />` : ""}
192
261
  </td>
193
262
  `)}
@@ -196,8 +265,8 @@ var URichTable = class URichTable extends LitElement {
196
265
  `;
197
266
  }
198
267
  _renderBody() {
199
- if (this.loading) return html`<tr><td colspan=${this._colSpan()}><div class="loading-overlay">${this.loadingMessage}</div></td></tr>`;
200
- if (this.data.length === 0) return html`<tr><td colspan=${this._colSpan()}><div class="empty-message">${this.emptyMessage}</div></td></tr>`;
268
+ if (this.loading) return html`<tr><td colspan=${this._colSpan()}><div class="loading-overlay">${this.loadingMessage || messages.text("loading")}</div></td></tr>`;
269
+ if (this.data.length === 0) return html`<tr><td colspan=${this._colSpan()}><div class="empty-message">${this.emptyMessage || messages.text("empty")}</div></td></tr>`;
201
270
  return this.data.map((row, rowIdx) => {
202
271
  const rowId = this._rowId(row, rowIdx);
203
272
  const isSelected = this.selectedIds.has(rowId);
@@ -326,16 +395,45 @@ var URichTable = class URichTable extends LitElement {
326
395
  25,
327
396
  50,
328
397
  100
329
- ].map((s) => html`<option value=${s} ?selected=${s === this.pageSize}>${s}ํ–‰</option>`)}
398
+ ].map((s) => html`<option value=${s} ?selected=${s === this.pageSize}>${messages.text("rowsPerPage", { size: s })}</option>`)}
330
399
  </select>
331
400
  </div>
332
401
  </div>
333
402
  `;
334
403
  }
404
+ /**
405
+ * ์ „์ฒด์„ ํƒ ์ฒดํฌ๋ฐ•์Šค โ€” ๋ฒ”์œ„๋Š” **ํ˜„์žฌ ํŽ˜์ด์ง€**๋‹ค(ํ•ฉ์ง‘ํ•ฉ/์ฐจ์ง‘ํ•ฉ, ์น˜ํ™˜์ด ์•„๋‹ˆ๋‹ค).
406
+ * ์ข…์ „์—๋Š” ์ผค ๋•Œ `new Set(ํ˜„์žฌ ํŽ˜์ด์ง€)` ๋กœ **์น˜ํ™˜**ํ•˜๊ณ  ๋Œ ๋•Œ `new Set()` ์œผ๋กœ **์ „์—ญ ์†Œ๊ฑฐ**ํ•ด์„œ,
407
+ * ์–ด๋А ์ชฝ์ด๋“  ๋‹ค๋ฅธ ํŽ˜์ด์ง€์˜ ์„ ํƒ๋ถ„์ด ํ•จ๊ป˜ ๋‚ ์•„๊ฐ”๋‹ค. ์ „์—ญ ์†Œ๊ฑฐ๊ฐ€ ํ•„์š”ํ•˜๋ฉด {@link clearSelection}.
408
+ *
409
+ * ## ์™œ `select-all` ์„ ๋”ฐ๋กœ ๋‚ด๋ณด๋‚ด๋Š”๊ฐ€
410
+ *
411
+ * `selection-change` ๋งŒ์œผ๋กœ๋Š” *"์‚ฌ์šฉ์ž๊ฐ€ ์„ธ ํ–‰์„ ๊ณจ๋ž๋‹ค"* ์™€ *"์‚ฌ์šฉ์ž๊ฐ€ ์ „์ฒด์„ ํƒ์„ ๋ˆŒ๋ €๋‹ค"* ๊ฐ€
412
+ * ๊ตฌ๋ถ„๋˜์ง€ ์•Š๋Š”๋‹ค. ์„œ๋ฒ„ ํŽ˜์ด์ง•์—์„œ ๊ทธ ๊ตฌ๋ถ„์€ ์•ฑ์— ํ•„์š”ํ•˜๋‹ค โ€” ์ „์ฒด์„ ํƒ์„ ๋ˆ„๋ฅธ ์ˆœ๊ฐ„์ด
413
+ * *"์ด ์กฐ๊ฑด์— ๋งž๋Š” N๊ฑด ์ „๋ถ€"* ๋ฅผ ์ œ์•ˆํ•  ์ž๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
414
+ *
415
+ * โš **`scope: 'page' | 'all'` ํ•„๋“œ๋Š” ๋‘์ง€ ์•Š์•˜๋‹ค.** ์ด ์ปดํฌ๋„ŒํŠธ๋Š” `'all'` ์„ **๋‚ผ ์ˆ˜ ์—†๋‹ค** โ€”
416
+ * ๋‹ค๋ฅธ ํŽ˜์ด์ง€์˜ ํ–‰์„ ๊ฐ–๊ณ  ์žˆ์ง€ ์•Š๊ณ , ์„œ๋ฒ„ ํŽ˜์ด์ง•์—์„œ ยซ์ „์—ญ ์ „์ฒด์„ ํƒยป์€ id ๋ชฉ๋ก์ด ์•„๋‹ˆ๋ผ
417
+ * **์กฐํšŒ ์กฐ๊ฑด**์ด๋ผ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ๊ฐ’์ด ํ•˜๋‚˜๋ฟ์ธ ์œ ๋‹ˆ์˜จ์€
418
+ * *"๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋ชจ๋ฅด๋Š” ๊ฐœ๋…์„ ์•„๋Š” ์ฒ™ํ•˜๋Š”"* ํ•„๋“œ๊ฐ€ ๋œ๋‹ค. โ‡’ ์ปดํฌ๋„ŒํŠธ๋Š” **์˜๋„๋งŒ** ์•Œ๋ฆฌ๊ณ 
419
+ * ์ „์—ญ ํ•ด์„์€ ์•ฑ์ด ํ•œ๋‹ค.
420
+ */
335
421
  _onSelectAll(e) {
336
- if (e.target.checked) this.selectedIds = new Set(this.data.map((r, i) => this._rowId(r, i)));
337
- else this.selectedIds = /* @__PURE__ */ new Set();
422
+ const checked = e.target.checked;
423
+ const pageIds = this._pageRowIds();
424
+ const next = new Set(this.selectedIds);
425
+ for (const id of pageIds) if (checked) next.add(id);
426
+ else next.delete(id);
427
+ this.selectedIds = next;
338
428
  this._fireSelectionChange();
429
+ this.dispatchEvent(new CustomEvent("select-all", {
430
+ detail: {
431
+ checked,
432
+ pageRowIds: pageIds
433
+ },
434
+ bubbles: true,
435
+ composed: true
436
+ }));
339
437
  }
340
438
  _onRowSelect(rowId) {
341
439
  const next = new Set(this.selectedIds);
@@ -438,7 +536,7 @@ var URichTable = class URichTable extends LitElement {
438
536
  let newValue = this.editValue;
439
537
  if (col.type === "number") newValue = Number(newValue);
440
538
  if (col.required && !newValue && newValue !== 0) {
441
- this.validationErrors = new Map(this.validationErrors).set(`${rowIndex}-${colIndex}`, "ํ•„์ˆ˜ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค");
539
+ this.validationErrors = new Map(this.validationErrors).set(`${rowIndex}-${colIndex}`, Locale.getValue("valueMissing"));
442
540
  return;
443
541
  }
444
542
  if (col.validator) {
@@ -572,9 +670,18 @@ var URichTable = class URichTable extends LitElement {
572
670
  const value = this.data[rowIndex]?.[this.columns[colIndex]?.key];
573
671
  this._onCellDblClick(rowIndex, colIndex, value);
574
672
  }
673
+ /**
674
+ * โš **๋‘ ํ•„๋“œ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒƒ์„ ์„ผ๋‹ค.** `selectedRows` ๋Š” **ํ˜„์žฌ ํŽ˜์ด์ง€์˜ ํ–‰ ๊ฐ์ฒด**์ด๊ณ 
675
+ * `selectedIds` ๋Š” ํŽ˜์ด์ง€๋ฅผ ๊ฐ€๋กœ์ง€๋ฅด๋Š” **๋ˆ„์  ์‹๋ณ„์ž**๋‹ค. ์„œ๋ฒ„ ํŽ˜์ด์ง•์—์„œ ๋‘˜์˜ ๊ธธ์ด๊ฐ€
676
+ * ๋‹ค๋ฅธ ๊ฒƒ์ด ์ •์ƒ์ด๋ฉฐ, ๊ทธ ์ฐจ์ด๋ฅผ ๊ฐ์ถœ ๋ฐฉ๋ฒ•์€ ์—†๋‹ค โ€” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค๋ฅธ ํŽ˜์ด์ง€์˜ ํ–‰์„
677
+ * ๊ฐ–๊ณ  ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
678
+ */
575
679
  _fireSelectionChange() {
576
680
  this.dispatchEvent(new CustomEvent("selection-change", {
577
- detail: { selectedRows: this.getSelectedRows() },
681
+ detail: {
682
+ selectedRows: this.getSelectedRows(),
683
+ selectedIds: [...this.selectedIds]
684
+ },
578
685
  bubbles: true,
579
686
  composed: true
580
687
  }));
@@ -614,8 +721,11 @@ var URichTable = class URichTable extends LitElement {
614
721
  colIndex: newCol
615
722
  };
616
723
  }
724
+ /** `Ctrl`/`Cmd` + `A` โ€” ์ „์ฒด์„ ํƒ ์ฒดํฌ๋ฐ•์Šค์™€ ๊ฐ™์€ ๋ฒ”์œ„(ํ˜„์žฌ ํŽ˜์ด์ง€ ํ•ฉ์ง‘ํ•ฉ)์—ฌ์•ผ ํ•œ๋‹ค. */
617
725
  _selectAll() {
618
- this.selectedIds = new Set(this.data.map((r, i) => this._rowId(r, i)));
726
+ const next = new Set(this.selectedIds);
727
+ for (const id of this._pageRowIds()) next.add(id);
728
+ this.selectedIds = next;
619
729
  this._fireSelectionChange();
620
730
  }
621
731
  static define(tagName = "u-rich-table") {
@@ -31,8 +31,24 @@ export interface FilterState {
31
31
  [field: string]: string;
32
32
  }
33
33
  export interface RichTableEventMap {
34
+ /**
35
+ * โš ๋‘ ํ•„๋“œ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒƒ์„ ์„ผ๋‹ค โ€” `selectedRows` ๋Š” **ํ˜„์žฌ ํŽ˜์ด์ง€์˜ ํ–‰ ๊ฐ์ฒด**,
36
+ * `selectedIds` ๋Š” ํŽ˜์ด์ง€๋ฅผ ๊ฐ€๋กœ์ง€๋ฅด๋Š” **๋ˆ„์  ์‹๋ณ„์ž**๋‹ค. ์„œ๋ฒ„ ํŽ˜์ด์ง•์—์„œ ๊ธธ์ด๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ์ด ์ •์ƒ์ด๋‹ค.
37
+ */
34
38
  'selection-change': CustomEvent<{
35
39
  selectedRows: Record<string, unknown>[];
40
+ selectedIds: string[];
41
+ }>;
42
+ /**
43
+ * ์‚ฌ์šฉ์ž๊ฐ€ **์ „์ฒด์„ ํƒ ์ฒดํฌ๋ฐ•์Šค**๋ฅผ ์กฐ์ž‘ํ–ˆ๋‹ค. `selection-change` ์™€ ํ•จ๊ป˜ ๋ฐœ์ƒํ•œ๋‹ค.
44
+ *
45
+ * ์ด ์ด๋ฒคํŠธ๊ฐ€ ๋”ฐ๋กœ ์žˆ๋Š” ์ด์œ ๋Š” *"์„ธ ํ–‰์„ ๊ณจ๋ž๋‹ค"* ์™€ *"์ „์ฒด์„ ํƒ์„ ๋ˆŒ๋ €๋‹ค"* ๋ฅผ ๊ฐ€๋ฅด๊ธฐ ์œ„ํ•ด์„œ๋‹ค โ€”
46
+ * ์„œ๋ฒ„ ํŽ˜์ด์ง•์—์„œ ํ›„์ž๋Š” ์•ฑ์ด *"์กฐ๊ฑด์— ๋งž๋Š” ์ „์ฒด N๊ฑด"* ์„ ์ œ์•ˆํ•  ์ž๋ฆฌ๋‹ค.
47
+ * `pageRowIds` ๋Š” ์ด๋ฒˆ ์กฐ์ž‘์ด ๋”ํ•˜๊ฑฐ๋‚˜ ๋บ€ **ํ˜„์žฌ ํŽ˜์ด์ง€์˜** ์‹๋ณ„์ž๋‹ค.
48
+ */
49
+ 'select-all': CustomEvent<{
50
+ checked: boolean;
51
+ pageRowIds: string[];
36
52
  }>;
37
53
  'row-create': CustomEvent<{
38
54
  row: Record<string, unknown>;
package/dist/react.d.ts CHANGED
@@ -2,7 +2,6 @@ import { EventName } from '@lit/react';
2
2
  import { USimpleSheet } from './components/simple-sheet/USimpleSheet';
3
3
  import { UDataView } from './components/data-view/UDataView';
4
4
  import { URichTable } from './components/u-rich-table/URichTable';
5
- import { RichTableEventMap } from './components/u-rich-table/types';
6
5
  /** USimpleSheet React ๋ž˜ํผ โ€” `change` ์ด๋ฒคํŠธ๋Š” `onChange`๋กœ ๋…ธ์ถœ */
7
6
  export declare const USimpleSheetReact: import('@lit/react').ReactWebComponent<USimpleSheet, {
8
7
  onChange: EventName<CustomEvent<{
@@ -13,15 +12,44 @@ export declare const USimpleSheetReact: import('@lit/react').ReactWebComponent<U
13
12
  export declare const UDataViewReact: import('@lit/react').ReactWebComponent<UDataView, {}>;
14
13
  /** URichTable React ๋ž˜ํผ โ€” RichTableEventMap์˜ ๋ชจ๋“  ์ด๋ฒคํŠธ๋ฅผ onXxx๋กœ ๋…ธ์ถœ */
15
14
  export declare const URichTableReact: import('@lit/react').ReactWebComponent<URichTable, {
16
- onSelectionChange: EventName<RichTableEventMap["selection-change"]>;
17
- onRowCreate: EventName<RichTableEventMap["row-create"]>;
18
- onRowUpdate: EventName<RichTableEventMap["row-update"]>;
19
- onRowDelete: EventName<RichTableEventMap["row-delete"]>;
20
- onRowExpand: EventName<RichTableEventMap["row-expand"]>;
21
- onSortChange: EventName<RichTableEventMap["sort-change"]>;
22
- onFilterChange: EventName<RichTableEventMap["filter-change"]>;
23
- onPageChange: EventName<RichTableEventMap["page-change"]>;
24
- onPaste: EventName<RichTableEventMap["paste"]>;
15
+ readonly onSelectionChange: EventName<CustomEvent<{
16
+ selectedRows: Record<string, unknown>[];
17
+ selectedIds: string[];
18
+ }>>;
19
+ readonly onSelectAll: EventName<CustomEvent<{
20
+ checked: boolean;
21
+ pageRowIds: string[];
22
+ }>>;
23
+ readonly onRowCreate: EventName<CustomEvent<{
24
+ row: Record<string, unknown>;
25
+ }>>;
26
+ readonly onRowUpdate: EventName<CustomEvent<{
27
+ row: Record<string, unknown>;
28
+ field: string;
29
+ value: unknown;
30
+ oldValue: unknown;
31
+ }>>;
32
+ readonly onRowDelete: EventName<CustomEvent<{
33
+ row: Record<string, unknown>;
34
+ }>>;
35
+ readonly onRowExpand: EventName<CustomEvent<{
36
+ row: Record<string, unknown>;
37
+ expanded: boolean;
38
+ }>>;
39
+ readonly onSortChange: EventName<CustomEvent<{
40
+ field: string;
41
+ direction: "asc" | "desc" | null;
42
+ }>>;
43
+ readonly onFilterChange: EventName<CustomEvent<{
44
+ filters: import('./react').FilterState;
45
+ }>>;
46
+ readonly onPageChange: EventName<CustomEvent<{
47
+ page: number;
48
+ pageSize: number;
49
+ }>>;
50
+ readonly onPaste: EventName<CustomEvent<{
51
+ rows: Record<string, unknown>[];
52
+ }>>;
25
53
  }>;
26
54
  export { USimpleSheet, UDataView, URichTable };
27
55
  export type { SheetColumn } from './components/simple-sheet/USimpleSheet';
package/dist/react.js CHANGED
@@ -34,6 +34,7 @@ var URichTableReact = createComponent({
34
34
  react: React,
35
35
  events: {
36
36
  onSelectionChange: "selection-change",
37
+ onSelectAll: "select-all",
37
38
  onRowCreate: "row-create",
38
39
  onRowUpdate: "row-update",
39
40
  onRowDelete: "row-delete",
@@ -0,0 +1,25 @@
1
+ /**
2
+ * `@iyulab/data-components` ์˜ ํ™”๋ฉด ๋ฌธ์ž์—ด โ€” **์˜์–ด ๊ธฐ๋ณธ + ๋กœ์ผ€์ผ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ**.
3
+ *
4
+ * ## ์™œ ์ƒ๊ฒผ๋‚˜
5
+ *
6
+ * ํ‘œ ์ปดํฌ๋„ŒํŠธ์˜ ๊ธฐ๋ณธ ๋ฌธ๊ตฌ๊ฐ€ **ํ•œ๊ตญ์–ด ๋ฆฌํ„ฐ๋Ÿด**์ด์—ˆ๋‹ค(์‹ค์ธก 7๊ฑด). ์†Œ๋น„์ž๊ฐ€ `emptyMessage` ๋“ฑ์„
7
+ * ๋„˜๊ฒจ ๋ฎ์„ ์ˆ˜๋Š” ์žˆ์—ˆ์ง€๋งŒ, **๋ฎ์ง€ ์•Š์œผ๋ฉด ํ•œ๊ตญ์–ด๊ฐ€ ๋‚˜์˜จ๋‹ค** โ€” ๋กœ์ผ€์ผ ํ‘œ์ค€(์˜์–ด ๊ธฐ๋ณธ +
8
+ * ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ)์„ ์ฑ„ํƒํ•œ ๋ฆฌํฌ์—์„œ ๊ทธ๊ฒƒ์€ ๋ฏธ์ด์ฃผ๋‹ค.
9
+ *
10
+ * ## ๊ธฐ๋ณธ๊ฐ’์„ ยซ๋น„์›Œยป ๋‘๊ณ  ๋ Œ๋”์—์„œ ํ•ด์„ํ•œ๋‹ค
11
+ *
12
+ * ํ”„๋กœํผํ‹ฐ ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ๋ฌธ์ž์—ด์„ ๋ฐ•์œผ๋ฉด **์ƒ์„ฑ ์‹œ์ ์˜ ๋กœ์ผ€์ผ์— ๊ณ ์ •**๋œ๋‹ค โ€” `Locale.set()` ์„
13
+ * ๋‚˜์ค‘์— ๋ถ€๋ฅด๋ฉด ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ํ‘œ๋Š” ๋”ฐ๋ผ์˜ค์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ž˜์„œ ๊ธฐ๋ณธ๊ฐ’์€ ๋นˆ ๋ฌธ์ž์—ด์ด๊ณ ,
14
+ * ๋ Œ๋”๊ฐ€ `this.x || messages.text(...)` ๋กœ ํ•ด์„ํ•œ๋‹ค.
15
+ *
16
+ * โš **์†Œ๋น„์ž๊ฐ€ ๋ฎ๋Š” ๊ฒฝ๋กœ๋Š” ๊ทธ๋Œ€๋กœ๋‹ค** โ€” ๊ฐ’์„ ์ฃผ๋ฉด ๊ทธ ๊ฐ’์ด ์ด๊ธด๋‹ค.
17
+ *
18
+ * ## ๊ฒ€์ฆ ๋ฉ”์‹œ์ง€๋Š” ์—ฌ๊ธฐ ๋‘์ง€ ์•Š๋Š”๋‹ค
19
+ *
20
+ * `ํ•„์ˆ˜ ํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค` ๋Š” `@iyulab/components` ์˜ **๊ฒ€์ฆ ๋ฉ”์‹œ์ง€ ํ‚ค์…‹์— ์ด๋ฏธ ์žˆ๊ณ  14๋กœ์ผ€์ผ์ด
21
+ * ๋”ธ๋ ค ์˜จ๋‹ค**(`Locale.getValue('valueMissing')`). ๊ฐ™์€ ๋ฌธ์žฅ์„ ์ด ํ‘œ์— ๋ณต์ œํ•˜๋ฉด ๋‘ ๊ณณ์ด
22
+ * ๊ฐˆ๋ผ์ง„๋‹ค.
23
+ */
24
+ export type DataMessageKey = 'empty' | 'loading' | 'filterPlaceholder' | 'filterAll' | 'addRow' | 'pageInfo' | 'noMatch' | 'selected' | 'selectedAcrossPages' | 'rowsPerPage';
25
+ export declare const messages: import('@iyulab/components/dist/utilities/Locale.js').LocaleNamespace<DataMessageKey>;
@@ -0,0 +1,29 @@
1
+ import { Locale } from "@iyulab/components/dist/utilities/Locale.js";
2
+ //#region src/utilities/messages.ts
3
+ var messages = Locale.namespace("@iyulab/data-components");
4
+ messages.register("en", {
5
+ empty: "No data",
6
+ loading: "Loadingโ€ฆ",
7
+ filterPlaceholder: "Filterโ€ฆ",
8
+ filterAll: "All",
9
+ addRow: "+ New row",
10
+ pageInfo: "Showing {start}-{end} of {total}",
11
+ noMatch: "No matching item",
12
+ selected: "{count} selected",
13
+ selectedAcrossPages: "{count} selected ({onPage} on this page)",
14
+ rowsPerPage: "{size} rows"
15
+ });
16
+ messages.register("ko", {
17
+ empty: "๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค",
18
+ loading: "๋กœ๋”ฉ ์ค‘...",
19
+ filterPlaceholder: "ํ•„ํ„ฐ...",
20
+ filterAll: "์ „์ฒด",
21
+ addRow: "+ ์ƒˆ ํ–‰",
22
+ pageInfo: "์ „์ฒด {total}๊ฑด ์ค‘ {start}-{end} ํ‘œ์‹œ",
23
+ noMatch: "์ผ์น˜ํ•˜๋Š” ํ•ญ๋ชฉ ์—†์Œ",
24
+ selected: "{count}๊ฑด ์„ ํƒ๋จ",
25
+ selectedAcrossPages: "{count}๊ฑด ์„ ํƒ๋จ (์ด ํŽ˜์ด์ง€ {onPage}๊ฑด)",
26
+ rowsPerPage: "{size}ํ–‰"
27
+ });
28
+ //#endregion
29
+ export { messages };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@iyulab/data-components",
3
3
  "description": "iyulab data visualization components",
4
- "version": "0.10.0",
4
+ "version": "0.12.0",
5
5
  "keywords": [
6
6
  "iyulab",
7
7
  "web-components",
@@ -51,14 +51,15 @@
51
51
  ],
52
52
  "scripts": {
53
53
  "start": "vite",
54
- "build": "eslint && vite build",
54
+ "build": "npm run typecheck && eslint && vite build",
55
55
  "test": "vitest run",
56
56
  "test:watch": "vitest",
57
57
  "lint": "eslint src/",
58
- "lint:fix": "eslint src/ --fix"
58
+ "lint:fix": "eslint src/ --fix",
59
+ "typecheck": "tsc --noEmit"
59
60
  },
60
61
  "dependencies": {
61
- "@iyulab/components": "^1.18.0",
62
+ "@iyulab/components": "^1.23.0",
62
63
  "lit": "^3.3.3"
63
64
  },
64
65
  "peerDependencies": {