@threestarsoftware/tssgrid 0.1.18 → 0.1.20
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 +11 -0
- package/README.md +1 -0
- package/package.json +1 -1
- package/src/tssgrid.css +8 -2
- package/src/tssgrid.js +28 -2
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,17 @@
|
|
|
3
3
|
TssGrid の各リリースの変更点。日付は JST。形式は [Keep a Changelog](https://keepachangelog.com/ja/1.1.0/) 準拠(ゆるめ)。
|
|
4
4
|
数値は特記なき限り**自社調べ**(headless Chrome / Windows 11・環境差あり)。
|
|
5
5
|
|
|
6
|
+
## [0.1.20] - 2026-10-06
|
|
7
|
+
|
|
8
|
+
### 修正
|
|
9
|
+
- **チェックボックス列が全部 read-only の時、ヘッダの全選択チェックが ✓↔− で不安定・押しても無反応だったのを修正**(コア)— ヘッダ状態を非空セルの checked/total だけで決めて read-only を無視していたため、全 read-only でもデータ次第で ✓(全ON)↔ −(一部ON)に切り替わり、しかも全選択は read-only をスキップするのでクリックしても無反応だった。**非空セルが1つ以上ありその全部が read-only の列は、ヘッダを無効化(押せない)+ −(indeterminate)で安定表示**に。部分 read-only(操作できるセルが残る)・編集可の列は従来どおり(正確な状態+トグル可)。
|
|
10
|
+
- **read-only のピッカー列(カレンダー等のカスタムエディタ)/ドロップダウン列で、文字位置が編集可行とズレる不具合を修正**(コア・CSS)— read-only セルはアイコン(📅/▾)を消すと同時に `padding-right` を 20px/18px→6px に戻していたため、その14px分だけ文字がズレ、中央寄せ列では read-only 行と編集可行で位置が食い違っていた。ズレの原因はアイコン(`::after` は絶対配置の重ね描画=文字レイアウトに無関係)ではなく padding だったので、**アイコンは従来どおり出さないまま、`padding`(場所)だけ編集可行と同じに保つ**ことで文字位置を揃えた。`tg-haspicker`/`tg-dropdown` 両方。
|
|
11
|
+
|
|
12
|
+
## [0.1.19] - 2026-10-06
|
|
13
|
+
|
|
14
|
+
### 修正
|
|
15
|
+
- **`Ctrl+;`(今日)/ `Ctrl+:`(現在時刻)が、カレンダー等のピッカーを開いた編集中だと効かず、キーがブラウザ既定(環境により拡大など)に素通りしていたのを修正**(コア)— 従来は nav モードでしか処理していなかったため、date/time 列やカレンダー(`tss-calendar` 等のカスタムエディタ)の**ピッカーを開いている編集中**に押すとハンドラを素通りしていた。編集中でも **date/time/カスタムエディタ列なら横取り**し、`preventDefault`(ブラウザ既定への抜けを防止)→ピッカーを閉じて今日/現在時刻を挿入するように。テキスト(自由入力)編集中は横取りしない(打鍵・IME を壊さない)。**JIS で時刻は `Ctrl+:`**(`:` 専用キー)を使用(`Ctrl+Shift+;` は JIS では `+`=ブラウザ拡大)。ON/OFF は従来どおり `dateShortcuts`。
|
|
16
|
+
|
|
6
17
|
## [0.1.18] - 2026-10-05
|
|
7
18
|
|
|
8
19
|
### 修正
|
package/README.md
CHANGED
|
@@ -413,6 +413,7 @@ grid.removeShortcut('dup');
|
|
|
413
413
|
|
|
414
414
|
- いずれも `setValue`/検証を通り **Undo 1回**で戻せます(fill は**列の型に合わない値は貼り付けと同様に弾かれます**)。`readOnly` セルはスキップ。
|
|
415
415
|
- 無効化: `dateShortcuts: false`(`Ctrl+;`/`Ctrl+:`)・`fillShortcuts: false`(`Ctrl+D`/`Ctrl+R`)。独自に `addShortcut` で同じキーを登録すれば**そちらが優先**されます。
|
|
416
|
+
- `Ctrl+;`/`Ctrl+:` は **date/time/カレンダー等のピッカーを開いている編集中でも効きます**(ピッカーを閉じて今日/現在時刻を挿入。これによりキーがブラウザ既定に素通りするのも防止)。テキスト(自由入力)編集中は横取りしません。**JIS で時刻は `Ctrl+:`**(`:` 専用キー)を使ってください(`Ctrl+Shift+;` は JIS では `+` =ブラウザ拡大になります)。
|
|
416
417
|
- **入れる形式**: `date`/`time` 型の列は**列の仕組みに従う**(ISO 保存=`YYYY-MM-DD`/`HH:MM`、見た目は列の `format` で `/` でも自由)。**それ以外(テキスト等)の列は** `todayFormat` / `nowFormat` で形式を選べます(既定 `'YYYY-MM-DD'` / `'HH:MM'`。トークン `YYYY`/`MM`/`DD`・`HH`/`mm`、または `(d: Date) => string`)。例: `todayFormat: 'YYYY/MM/DD'`(スラッシュ区切り)。
|
|
417
418
|
|
|
418
419
|
**プラグイン**(軽量 base-plugin 相当。`init(grid)→{destroy?}` の薄い契約):
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@threestarsoftware/tssgrid",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.20",
|
|
4
4
|
"description": "軽量・ノービルド・日本語IME堅牢な編集グリッド(vanilla JS / 依存なし / MIT)。Excel ライクな入力画面を <script> タグ1本で。",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "ThreeStarSoftware (https://www.threestarsoftware.co.jp/)",
|
package/src/tssgrid.css
CHANGED
|
@@ -100,7 +100,9 @@
|
|
|
100
100
|
/* 読み取り専用セル: 淡色+既定カーソル(編集不可・全変更経路で拒否) */
|
|
101
101
|
.tssgrid .tg-table td.tg-readonly { background: var(--tg-readonly-bg); color: var(--tg-readonly-fg); cursor: default; }
|
|
102
102
|
.tssgrid .tg-table td.tg-readonly.sel { background: #e7edf5; }
|
|
103
|
-
|
|
103
|
+
/* 読取専用は ▾ を出さない。ただし padding(場所)は空けたまま=中央寄せ列でも文字位置がズレない
|
|
104
|
+
(アイコンは position:absolute の重ね描画なので、出す/出さないは文字レイアウトに無関係=ズレは padding 由来)。 */
|
|
105
|
+
.tssgrid .tg-table td.tg-readonly.tg-dropdown { padding-right: 18px; }
|
|
104
106
|
.tssgrid .tg-table td.tg-readonly.tg-dropdown::after { display: none; }
|
|
105
107
|
/* invalidMode:'keep' で検証 NG のセル: 値は残して赤く警告(色は変数で調整可) */
|
|
106
108
|
.tssgrid .tg-table td.tg-invalid { color: var(--tg-invalid-fg); background: var(--tg-invalid-bg); }
|
|
@@ -188,6 +190,8 @@
|
|
|
188
190
|
.tssgrid .tg-table thead th .tg-head-cb { display: inline-block; margin: 0 4px 0 0; vertical-align: middle; cursor: pointer; }
|
|
189
191
|
/* 見出し文字が無い(単独)=本体セルと同じく中央寄せ(右 4px を打ち消して列中央でチェックが縦に揃う) */
|
|
190
192
|
.tssgrid .tg-table thead th .tg-head-cb.tg-head-cb-solo { display: block; margin: 0 auto; }
|
|
193
|
+
/* 列が全部 readOnly=全選択で操作できるセルが無い時は無効(押せない・淡色の − で安定表示) */
|
|
194
|
+
.tssgrid .tg-table thead th .tg-head-cb:disabled { cursor: not-allowed; opacity: .5; }
|
|
191
195
|
|
|
192
196
|
/* ドロップダウン列: V(シェブロン)キャレットを常時表示。編集中の <select> と同じ SVG=サイズも一致 */
|
|
193
197
|
.tssgrid .tg-table td.tg-dropdown { position: relative; padding-right: 18px; cursor: pointer; }
|
|
@@ -203,7 +207,9 @@
|
|
|
203
207
|
content: attr(data-ico); position: absolute; right: 5px; top: 0; bottom: 0;
|
|
204
208
|
display: flex; align-items: center; font-size: 12px; color: #7d8a99; pointer-events: none;
|
|
205
209
|
}
|
|
206
|
-
|
|
210
|
+
/* 読取専用はアイコンを出さない。ただし padding(場所)は空けたまま=中央寄せ列でも文字位置がズレない
|
|
211
|
+
(アイコンは position:absolute の重ね描画なので、出す/出さないは文字レイアウトに無関係=ズレは padding 由来)。 */
|
|
212
|
+
.tssgrid .tg-table td.tg-readonly.tg-haspicker { padding-right: 20px; }
|
|
207
213
|
.tssgrid .tg-table td.tg-readonly.tg-haspicker::after { display: none; }
|
|
208
214
|
/* editor.icon:'▾'(=プルダウン相当のキャレット)はネイティブ dropdown と同じ SVG シェブロンで統一
|
|
209
215
|
(combo / autocomplete 等・文字グリフの三角ではなく tg-dropdown と揃った見た目に)。絵文字系(📅/🕐)は対象外。 */
|
package/src/tssgrid.js
CHANGED
|
@@ -1616,6 +1616,15 @@
|
|
|
1616
1616
|
}
|
|
1617
1617
|
return total === 0 ? 'none' : (checked === total ? 'all' : (checked === 0 ? 'none' : 'some'));
|
|
1618
1618
|
}
|
|
1619
|
+
// 非空セルが1つ以上あり、その全部が readOnly = 全選択で操作できるセルが無い(=ヘッダは無効化)。
|
|
1620
|
+
_columnAllReadOnly(c) {
|
|
1621
|
+
let nonBlank = 0, togglable = 0;
|
|
1622
|
+
for (let r = 0; r < this.ROWS; r++) {
|
|
1623
|
+
if (this._rowBlankExcept(r, c)) continue;
|
|
1624
|
+
nonBlank++; if (!this._isReadOnly(r, c)) togglable++;
|
|
1625
|
+
}
|
|
1626
|
+
return nonBlank > 0 && togglable === 0;
|
|
1627
|
+
}
|
|
1619
1628
|
// ヘッダの全選択チェックボックスの見た目を現在の列状態に同期(some は indeterminate)。
|
|
1620
1629
|
_syncHeaderCheckboxes() {
|
|
1621
1630
|
if (!this.colHeaders) return;
|
|
@@ -1623,8 +1632,12 @@
|
|
|
1623
1632
|
if (this.colType(c) !== 'checkbox' || this.colCfg(c).headerCheckbox === false) continue;
|
|
1624
1633
|
const cb = this.table.querySelector('thead th[data-c="' + c + '"] .tg-head-cb');
|
|
1625
1634
|
if (!cb) continue;
|
|
1626
|
-
|
|
1627
|
-
|
|
1635
|
+
if (this._columnAllReadOnly(c)) { // 全 readOnly=操作不可。安定して「− かつ無効(押せない)」に
|
|
1636
|
+
cb.disabled = true; cb.checked = false; cb.indeterminate = true;
|
|
1637
|
+
} else {
|
|
1638
|
+
const st = this._columnCheckState(c);
|
|
1639
|
+
cb.disabled = false; cb.checked = st === 'all'; cb.indeterminate = st === 'some';
|
|
1640
|
+
}
|
|
1628
1641
|
}
|
|
1629
1642
|
}
|
|
1630
1643
|
// 列 c の checkbox を全 ON/OFF(readOnly はスキップ)。1コマンドで履歴に積む=Undo 一発。
|
|
@@ -1639,6 +1652,7 @@
|
|
|
1639
1652
|
// ヘッダのチェックボックスクリック: 全 ON or 全 OFF をトグル(全部 ON なら OFF、それ以外は ON)。
|
|
1640
1653
|
_toggleColumnAll(c) {
|
|
1641
1654
|
if (this.colType(c) !== 'checkbox') return;
|
|
1655
|
+
if (this._columnAllReadOnly(c)) return; // 全 readOnly=ヘッダは無効(押しても何もしない)
|
|
1642
1656
|
this.setColumnChecked(c, this._columnCheckState(c) !== 'all');
|
|
1643
1657
|
}
|
|
1644
1658
|
// 列ストレッチ: 余白を埋めるよう col 幅を伸ばす(枠に幅制約がある時だけ効く)。colW は変えない。
|
|
@@ -3343,6 +3357,18 @@
|
|
|
3343
3357
|
// input ベース編集では「打ち始め」時に元値が input に入らないためネイティブ undo では元値に戻せない。
|
|
3344
3358
|
// ここで元値(this.data[r][c]=未確定)に戻す=Excel流。続けて Ctrl+Z すると nav の history.undo で前の確定操作へ連鎖。
|
|
3345
3359
|
const ctrl = e.ctrlKey || e.metaKey;
|
|
3360
|
+
// 日付/時刻ショートカットはカレンダー等(date/time/カスタムエディタ)の編集中でも効かせる。
|
|
3361
|
+
// これが無いと編集モードでは素通りして「ブラウザ既定」(環境により拡大など)に抜ける。
|
|
3362
|
+
// テキスト(自由入力)編集中は対象外=打鍵・IME を壊さない。
|
|
3363
|
+
if (this.dateShortcuts && ctrl && (e.key === ';' || e.key === ':')) {
|
|
3364
|
+
const t = this.colType(this.active.c);
|
|
3365
|
+
if (this.colCfg(this.active.c).editor || t === 'date' || t === 'time') {
|
|
3366
|
+
e.preventDefault();
|
|
3367
|
+
this.toNav(); // 開いているピッカー/inline エディタを閉じる
|
|
3368
|
+
this._insertDateTime(e.key === ':'); // 今日/現在時刻を挿入(検証/Undo を通る)
|
|
3369
|
+
return;
|
|
3370
|
+
}
|
|
3371
|
+
}
|
|
3346
3372
|
if (e.key === 'Escape' || (ctrl && !e.shiftKey && e.key.toLowerCase() === 'z')) {
|
|
3347
3373
|
e.preventDefault();
|
|
3348
3374
|
const r = this.active.r, c = this.active.c, v = this.data[r][c];
|