@operato/data-grist 10.8.1 → 10.10.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 +44 -0
- package/dist/src/configure/column-builder.js +17 -2
- package/dist/src/configure/column-builder.js.map +1 -1
- package/dist/src/configure/config-builder.js +1 -1
- package/dist/src/configure/config-builder.js.map +1 -1
- package/dist/src/data-card/data-card.d.ts +6 -0
- package/dist/src/data-card/data-card.js +12 -3
- package/dist/src/data-card/data-card.js.map +1 -1
- package/dist/src/data-grid/data-grid-body-style.js +12 -1
- package/dist/src/data-grid/data-grid-body-style.js.map +1 -1
- package/dist/src/data-grid/data-grid-body.d.ts +31 -0
- package/dist/src/data-grid/data-grid-body.js +141 -39
- package/dist/src/data-grid/data-grid-body.js.map +1 -1
- package/dist/src/data-grid/data-grid-field.d.ts +21 -0
- package/dist/src/data-grid/data-grid-field.js +326 -19
- package/dist/src/data-grid/data-grid-field.js.map +1 -1
- package/dist/src/data-grid/data-grid-footer.js +1 -1
- package/dist/src/data-grid/data-grid-footer.js.map +1 -1
- package/dist/src/data-grid/data-grid-header.d.ts +12 -1
- package/dist/src/data-grid/data-grid-header.js +97 -36
- package/dist/src/data-grid/data-grid-header.js.map +1 -1
- package/dist/src/data-grid/data-grid.d.ts +15 -1
- package/dist/src/data-grid/data-grid.js +83 -40
- package/dist/src/data-grid/data-grid.js.map +1 -1
- package/dist/src/data-grist.d.ts +32 -0
- package/dist/src/data-grist.js +86 -10
- package/dist/src/data-grist.js.map +1 -1
- package/dist/src/data-list/data-list.d.ts +6 -0
- package/dist/src/data-list/data-list.js +12 -3
- package/dist/src/data-list/data-list.js.map +1 -1
- package/dist/src/editors/ox-grist-editor-json5.d.ts +1 -0
- package/dist/src/editors/ox-grist-editor-json5.js +2 -0
- package/dist/src/editors/ox-grist-editor-json5.js.map +1 -1
- package/dist/src/editors/ox-grist-editor.d.ts +27 -0
- package/dist/src/editors/ox-grist-editor.js +61 -1
- package/dist/src/editors/ox-grist-editor.js.map +1 -1
- package/dist/src/editors/registry.d.ts +10 -0
- package/dist/src/editors/registry.js +16 -0
- package/dist/src/editors/registry.js.map +1 -1
- package/dist/src/filters/filter-input.js +15 -0
- package/dist/src/filters/filter-input.js.map +1 -1
- package/dist/src/filters/filter-range-date.js +9 -0
- package/dist/src/filters/filter-range-date.js.map +1 -1
- package/dist/src/filters/filter-range-number.js +9 -0
- package/dist/src/filters/filter-range-number.js.map +1 -1
- package/dist/src/gutters/gutter-row-selector.js +16 -0
- package/dist/src/gutters/gutter-row-selector.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/renderers/ox-grist-renderer-boolean.js +8 -0
- package/dist/src/renderers/ox-grist-renderer-boolean.js.map +1 -1
- package/dist/src/types.d.ts +11 -1
- package/dist/src/types.js.map +1 -1
- package/dist/src/utils/column-text.d.ts +18 -0
- package/dist/src/utils/column-text.js +37 -0
- package/dist/src/utils/column-text.js.map +1 -0
- package/dist/src/utils/index.d.ts +1 -0
- package/dist/src/utils/index.js +1 -0
- package/dist/src/utils/index.js.map +1 -1
- package/dist/test/accessible-name.test.d.ts +2 -0
- package/dist/test/accessible-name.test.js +324 -0
- package/dist/test/accessible-name.test.js.map +1 -0
- package/dist/test/row-hover-visible.test.js +28 -16
- package/dist/test/row-hover-visible.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +7 -6
- package/test/accessible-name.test.ts +408 -0
- package/test/row-hover-visible.test.ts +32 -16
- package/translations/en.json +20 -10
- package/translations/ja.json +19 -9
- package/translations/ko.json +19 -10
- package/translations/ms.json +19 -9
- package/translations/zh.json +19 -9
package/dist/src/data-grist.js
CHANGED
|
@@ -2,6 +2,7 @@ import { __decorate } from "tslib";
|
|
|
2
2
|
import './data-grid/data-grid.js';
|
|
3
3
|
import './data-list/data-list.js';
|
|
4
4
|
import './data-card/data-card.js';
|
|
5
|
+
import i18next from 'i18next';
|
|
5
6
|
import { css, html, LitElement } from 'lit';
|
|
6
7
|
import { customElement, property, query, queryAsync, state } from 'lit/decorators.js';
|
|
7
8
|
import isEmpty from 'lodash-es/isEmpty.js';
|
|
@@ -53,6 +54,13 @@ let DataGrist = class DataGrist extends LitElement {
|
|
|
53
54
|
this._data = ZERO_DATA; // copy data, dirty data
|
|
54
55
|
this._config = ZERO_CONFIG; // compiled configuration
|
|
55
56
|
this._showSpinner = false;
|
|
57
|
+
/**
|
|
58
|
+
* 한 번이라도 조회했는가. 빈 목록에 대한 안내를 낼지 이 값이 정한다.
|
|
59
|
+
*
|
|
60
|
+
* 조회 전에도 records 는 비어 있다. 그러나 그것은 「없다」가 아니라 「아직 모른다」이다.
|
|
61
|
+
* 둘을 같게 두면 확인하지 않은 사실을 화면이 단정하게 된다.
|
|
62
|
+
*/
|
|
63
|
+
this._fetched = false;
|
|
56
64
|
this.headroomAtTop = true;
|
|
57
65
|
this.lastLocation = {};
|
|
58
66
|
this.popstateEventHandler = ((e) => {
|
|
@@ -315,7 +323,7 @@ let DataGrist = class DataGrist extends LitElement {
|
|
|
315
323
|
* 그 변수들은 믿을 수 없다 — 미는 쪽(onTop · onNotTop)이 같은 변수에 **밀어 놓은 값을** 다시
|
|
316
324
|
* 담는다. 그래서 감출 때 되돌릴 값이 이미 오염돼 있다.
|
|
317
325
|
*
|
|
318
|
-
* [
|
|
326
|
+
* [확인함] 머리를 감춰도 표가 그대로였다. 2026-09-02
|
|
319
327
|
*
|
|
320
328
|
* 전 머리 78px margin-top 78px 표 시작 191
|
|
321
329
|
* 감춘 뒤 머리 0px margin-top 78px 표 시작 191 ← 안 움직인다
|
|
@@ -327,7 +335,20 @@ let DataGrist = class DataGrist extends LitElement {
|
|
|
327
335
|
}
|
|
328
336
|
}
|
|
329
337
|
render() {
|
|
330
|
-
|
|
338
|
+
/*
|
|
339
|
+
* ── 빈 목록에 대한 안내는 조회를 마친 뒤에만 낸다 ──────────────────────
|
|
340
|
+
*
|
|
341
|
+
* 조회 중에는 이미 내지 않는다(_showSpinner). 다만 **첫 조회가 시작되기 전**에도 records 는
|
|
342
|
+
* 비어 있고 스피너는 아직 뜨지 않았다. 그 한 프레임 동안 「아직 아무것도 없습니다」가 스친다.
|
|
343
|
+
* 확인하지 않은 사실을 화면이 단정하는 셈이다.
|
|
344
|
+
*
|
|
345
|
+
* [읽었음] _showSpinner 초기값 false · data-provider 는 조회를 시작할 때 showSpinner()
|
|
346
|
+
*
|
|
347
|
+
* 화면들이 저마다 같은 방어를 두고 있었다(lot-list 의 loaded 검사). 조회 여부는 이 부품이
|
|
348
|
+
* 가진 사실이므로 여기서 판단한다.
|
|
349
|
+
*/
|
|
350
|
+
const empty = this._fetched && !this._showSpinner && this._data.records.length == 0;
|
|
351
|
+
const emptyNote = empty ? this.noteWhenEmpty() : undefined;
|
|
331
352
|
return html `
|
|
332
353
|
<slot name="headroom"> </slot>
|
|
333
354
|
<div id="wrap" @keydown=${(e) => this.onKeydown(e)}>
|
|
@@ -335,12 +356,14 @@ let DataGrist = class DataGrist extends LitElement {
|
|
|
335
356
|
? html `
|
|
336
357
|
<ox-grid
|
|
337
358
|
id="grist"
|
|
359
|
+
.gridLabel=${this.gridLabel}
|
|
338
360
|
.config=${this.compiledConfig}
|
|
339
361
|
.data=${this._data}
|
|
340
362
|
.sorters=${this.sorters || []}
|
|
341
363
|
.filters=${this.filters || []}
|
|
342
364
|
.pagination=${this.pagination || {}}
|
|
343
365
|
?empty=${empty}
|
|
366
|
+
.emptyNote=${emptyNote}
|
|
344
367
|
>
|
|
345
368
|
<slot name="setting" slot="setting"> </slot>
|
|
346
369
|
</ox-grid>
|
|
@@ -354,6 +377,7 @@ let DataGrist = class DataGrist extends LitElement {
|
|
|
354
377
|
.sorters=${this.sorters || []}
|
|
355
378
|
.filters=${this.filters || []}
|
|
356
379
|
?empty=${empty}
|
|
380
|
+
.emptyNote=${emptyNote}
|
|
357
381
|
>
|
|
358
382
|
</ox-card>
|
|
359
383
|
`
|
|
@@ -365,6 +389,7 @@ let DataGrist = class DataGrist extends LitElement {
|
|
|
365
389
|
.sorters=${this.sorters || []}
|
|
366
390
|
.filters=${this.filters || []}
|
|
367
391
|
?empty=${empty}
|
|
392
|
+
.emptyNote=${emptyNote}
|
|
368
393
|
>
|
|
369
394
|
</ox-list>
|
|
370
395
|
`}
|
|
@@ -694,6 +719,8 @@ let DataGrist = class DataGrist extends LitElement {
|
|
|
694
719
|
* You can call this method to hide the spinner when loading or processing is finished.
|
|
695
720
|
*/
|
|
696
721
|
hideSpinner() {
|
|
722
|
+
/* 조회를 마쳤다. 이제 목록이 비었다는 것은 확인된 사실이다. */
|
|
723
|
+
this._fetched = true;
|
|
697
724
|
this._showSpinner = false;
|
|
698
725
|
}
|
|
699
726
|
/**
|
|
@@ -763,7 +790,7 @@ let DataGrist = class DataGrist extends LitElement {
|
|
|
763
790
|
* **인라인 값이 아니라 실제로 보이는지를 본다.**
|
|
764
791
|
*
|
|
765
792
|
* 전에는 `style.display` 를 읽었다. 아무도 감춘 적이 없으면 그 값은 빈 문자열이고,
|
|
766
|
-
* `'' !== 'none'` 이 참이라 **첫 번째 누름이 감추는 쪽으로** 갔다. 이
|
|
793
|
+
* `'' !== 'none'` 이 참이라 **첫 번째 누름이 감추는 쪽으로** 갔다. 이 버튼을 누르는 사람은
|
|
767
794
|
* 「걸러 보고 싶다」는 뜻인데 아무 일도 안 일어난 것처럼 보였다 — 안 보이던 영역을 한 번 더
|
|
768
795
|
* 감춘 것이다.
|
|
769
796
|
*/
|
|
@@ -788,6 +815,50 @@ let DataGrist = class DataGrist extends LitElement {
|
|
|
788
815
|
* @method
|
|
789
816
|
* @public
|
|
790
817
|
*/
|
|
818
|
+
/**
|
|
819
|
+
* 목록이 비었을 때 무슨 말을 하나. **판단은 여기서 한 번만** 한다.
|
|
820
|
+
*
|
|
821
|
+
* 모드가 셋이고(GRID · CARD · LIST) 셋 다 자기 자리에 안내를 그린다. 판단까지 각자 하면 세 벌이
|
|
822
|
+
* 되고, 실제로 그랬다 — 셋이 같은 문장을 하드코딩하고 있었다. 여기서 정해 내려보낸다.
|
|
823
|
+
*
|
|
824
|
+
* ── 빈 목록은 두 가지 다른 사실을 말해야 한다 ──────────────────────────────
|
|
825
|
+
*
|
|
826
|
+
* 아직 아무것도 없다 이 표에 만들어진 것이 없다
|
|
827
|
+
* 찾는 것이 없다 찾거나 걸러 본 결과가 없다
|
|
828
|
+
*
|
|
829
|
+
* 합치면 결함이 「고를 게 없다」로 보인다. 질의가 빈 배열을 내는데 화면이 「해당하는 것이
|
|
830
|
+
* 없습니다」라고 말하면 아무도 그것이 결함인 줄 모른다.
|
|
831
|
+
*
|
|
832
|
+
* 조건이 걸렸을 때는 **화면이 준 emptyNote 를 쓰지 않는다.** 그 말은 「아직 없다」를 위해 쓴
|
|
833
|
+
* 것이라 조건이 걸린 자리에서는 거짓이 된다.
|
|
834
|
+
*/
|
|
835
|
+
noteWhenEmpty() {
|
|
836
|
+
var _a, _b;
|
|
837
|
+
const conditioned = (this.filters || []).some(({ value }) => {
|
|
838
|
+
if (value === undefined || value === null)
|
|
839
|
+
return false;
|
|
840
|
+
if (typeof value === 'string')
|
|
841
|
+
return value.length > 0;
|
|
842
|
+
if (Array.isArray(value))
|
|
843
|
+
return value.length > 0;
|
|
844
|
+
return true;
|
|
845
|
+
});
|
|
846
|
+
if (conditioned) {
|
|
847
|
+
return {
|
|
848
|
+
icon: 'search_off',
|
|
849
|
+
title: i18next.t('text.grid-nothing-found', { defaultValue: 'nothing found' }),
|
|
850
|
+
description: i18next.t('text.grid-clear-search', {
|
|
851
|
+
defaultValue: 'clear the search or filters to see everything'
|
|
852
|
+
})
|
|
853
|
+
};
|
|
854
|
+
}
|
|
855
|
+
const given = (_a = this.compiledConfig) === null || _a === void 0 ? void 0 : _a.emptyNote;
|
|
856
|
+
return {
|
|
857
|
+
icon: given === null || given === void 0 ? void 0 : given.icon,
|
|
858
|
+
title: (_b = given === null || given === void 0 ? void 0 : given.title) !== null && _b !== void 0 ? _b : i18next.t('text.grid-no-records', { defaultValue: 'nothing to show' }),
|
|
859
|
+
description: given === null || given === void 0 ? void 0 : given.description
|
|
860
|
+
};
|
|
861
|
+
}
|
|
791
862
|
reset() {
|
|
792
863
|
var _a, _b;
|
|
793
864
|
// TODO tree 형태의 데이타로 _data를 만들 때, children, collapsed 등을 감안한다.
|
|
@@ -1062,13 +1133,13 @@ DataGrist.styles = [
|
|
|
1062
1133
|
SpinnerStyles,
|
|
1063
1134
|
css `
|
|
1064
1135
|
/*
|
|
1065
|
-
* ── 표의
|
|
1136
|
+
* ── 표의 겉모습. 한 곳에서 정한다 ──────────────────────────────
|
|
1066
1137
|
*
|
|
1067
1138
|
* 화면마다 --grid-* 토큰을 하나씩 덮어 모양을 바꾸지 않는다. 그 방식은 두 가지로 깨졌다.
|
|
1068
1139
|
*
|
|
1069
1140
|
* · 한 토큰이 두 뜻을 겸한다. --grid-record-focused-cell-border 는 「초점 표식」이면서
|
|
1070
1141
|
* 「줄을 나누는 선」이었다. 표식을 감추려고 none 을 주면 줄 선이 사라졌다
|
|
1071
|
-
* · 스무 개를 짝 맞춰 덮어야
|
|
1142
|
+
* · 스무 개를 짝 맞춰 덮어야 하나로 맞춰지고, 하나 빠지면 그 자리만 옛 모양으로 남는다
|
|
1072
1143
|
*
|
|
1073
1144
|
* 토큰은 shadow DOM 을 넘어 상속되므로 여기서 정하면 머리·칸·바닥까지 그대로 닿는다.
|
|
1074
1145
|
*
|
|
@@ -1099,7 +1170,7 @@ DataGrist.styles = [
|
|
|
1099
1170
|
* 머리와 몸의 여백은 **같은 값이다.** 1px 이라도 다르면 머리글과 첫 줄의 리듬이 어긋난다.
|
|
1100
1171
|
*
|
|
1101
1172
|
* 9px 에서 7px 로 내렸다. 한 줄 표는 40 → 36px, 세 줄 표는 74 → 70px 이 되고, 줄과 줄 사이는
|
|
1102
|
-
* 안 변한다 — 그것은 셀 여백이 아니라 .sub 의 margin-top 이다. [
|
|
1173
|
+
* 안 변한다 — 그것은 셀 여백이 아니라 .sub 의 margin-top 이다. [확인함] 2026-09-02
|
|
1103
1174
|
*
|
|
1104
1175
|
* 이 화면들이 하는 일은 훑고 고치는 것이라 한 화면에 줄이 많을수록 낫다.
|
|
1105
1176
|
*/
|
|
@@ -1127,7 +1198,6 @@ DataGrist.styles = [
|
|
|
1127
1198
|
--grid-header-text-transform: none;
|
|
1128
1199
|
--grid-header-letter-spacing: 0.01em;
|
|
1129
1200
|
--grid-header-sorter-size: 14px;
|
|
1130
|
-
--grid-header-mark-size: 14px;
|
|
1131
1201
|
/* 세로 선을 그리는 것이 폭 조절 손잡이다 — 감추면 둘이 함께 사라진다. */
|
|
1132
1202
|
--grid-header-splitter-display: none;
|
|
1133
1203
|
|
|
@@ -1152,7 +1222,7 @@ DataGrist.styles = [
|
|
|
1152
1222
|
* 표 바깥(surface-container) 240 242 244 바깥보다는 밝다
|
|
1153
1223
|
*
|
|
1154
1224
|
* 잉크를 얹는 방식으로도 해 봤는데, 겹치지 않을 만큼 진하게 하면(10%) 232 233 234 로 **바깥보다
|
|
1155
|
-
* 어두워져** 무겁게 느껴졌다. 옅게 하면(6%) 바깥과 정확히 겹쳤다. [
|
|
1225
|
+
* 어두워져** 무겁게 느껴졌다. 옅게 하면(6%) 바깥과 정확히 겹쳤다. [확인함] 2026-09-02
|
|
1156
1226
|
*
|
|
1157
1227
|
* ── 면 단계로는 어두운 모드에서 띠가 사라졌다 ────────────────────────
|
|
1158
1228
|
* 그때 「면 단계를 쓰면 어두운 모드에서 함께 뒤집힌다」고 적었다. **그게 안 됐다.**
|
|
@@ -1161,13 +1231,13 @@ DataGrist.styles = [
|
|
|
1161
1231
|
* 어두운 팔레트는 lowest(30 34 40)가 low(26 30 35)보다 **밝다** — 밝은 모드의 순서를 그대로
|
|
1162
1232
|
* 두었다. 줄은 lowest 를 쓰므로, low 를 얹으면 4단 어두워지는 것이 전부였다.
|
|
1163
1233
|
*
|
|
1164
|
-
* [
|
|
1234
|
+
* [확인함] 2026-09-04 · operato-plant 인원 화면(어두운 모드)
|
|
1165
1235
|
* 줄 rgb(30 34 40) · 띠 rgb(26 30 35) → 대비 1.048 보이지 않는다
|
|
1166
1236
|
*
|
|
1167
1237
|
* 그래서 **줄 자신의 색에서 만든다.** 그 줄의 잉크를 5% 섞는다 — 밝은 줄에서는 눌리고 어두운
|
|
1168
1238
|
* 줄에서는 들린다. 앱의 사다리 순서에 기대지 않으므로 어느 팔레트에서도 같은 방향이다.
|
|
1169
1239
|
*
|
|
1170
|
-
* [
|
|
1240
|
+
* [확인함] 5% 로 재 본 대비
|
|
1171
1241
|
* 밝은 모드 255 → 243 1.11 바깥(240)보다는 여전히 밝다
|
|
1172
1242
|
* 어두운 모드 30 → 40 1.14
|
|
1173
1243
|
*
|
|
@@ -1258,6 +1328,9 @@ DataGrist.styles = [
|
|
|
1258
1328
|
__decorate([
|
|
1259
1329
|
property()
|
|
1260
1330
|
], DataGrist.prototype, "mode", void 0);
|
|
1331
|
+
__decorate([
|
|
1332
|
+
property({ type: String, attribute: 'aria-label' })
|
|
1333
|
+
], DataGrist.prototype, "gridLabel", void 0);
|
|
1261
1334
|
__decorate([
|
|
1262
1335
|
property()
|
|
1263
1336
|
], DataGrist.prototype, "config", void 0);
|
|
@@ -1303,6 +1376,9 @@ __decorate([
|
|
|
1303
1376
|
__decorate([
|
|
1304
1377
|
state()
|
|
1305
1378
|
], DataGrist.prototype, "_showSpinner", void 0);
|
|
1379
|
+
__decorate([
|
|
1380
|
+
state()
|
|
1381
|
+
], DataGrist.prototype, "_fetched", void 0);
|
|
1306
1382
|
__decorate([
|
|
1307
1383
|
query('slot[name=headroom]')
|
|
1308
1384
|
], DataGrist.prototype, "head", void 0);
|