@gzmjs/table 0.1.5 → 0.1.8
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/dist/055-table/00-base.d.ts +2 -0
- package/dist/055-table/20-col.d.ts +6 -1
- package/dist/055-table/22-colgroup.d.ts +1 -0
- package/dist/055-table/51-check.d.ts +1 -0
- package/dist/055-table/62-table.d.ts +1 -0
- package/dist/table.es.js +13 -9
- package/dist/table.es.js.map +1 -1
- package/package.json +1 -1
|
@@ -42,6 +42,7 @@ export declare const texts: {
|
|
|
42
42
|
zh: {
|
|
43
43
|
readonly agg: "统计";
|
|
44
44
|
readonly noAgg: "无统计";
|
|
45
|
+
readonly menu: "选项菜单";
|
|
45
46
|
readonly sort: "行排序";
|
|
46
47
|
readonly noSort: "无排序";
|
|
47
48
|
readonly autoWidth: "自动宽度";
|
|
@@ -72,6 +73,7 @@ export declare const texts: {
|
|
|
72
73
|
export declare function getTexts($ele: TableCol | TableColGroup | TableColCheckbox): {
|
|
73
74
|
readonly agg: string;
|
|
74
75
|
readonly noAgg: string;
|
|
76
|
+
readonly menu: string;
|
|
75
77
|
readonly sort: string;
|
|
76
78
|
readonly noSort: string;
|
|
77
79
|
readonly autoWidth: string;
|
|
@@ -40,6 +40,10 @@ export interface TableColOptions extends M.ViewModel<TableCol> {
|
|
|
40
40
|
* 无论是否存在 aggs,都可以设置此属性。
|
|
41
41
|
*/
|
|
42
42
|
agg?: string;
|
|
43
|
+
/**
|
|
44
|
+
* 直接设置聚合值,但是仍然需要设置 agg。
|
|
45
|
+
*/
|
|
46
|
+
aggValue?: unknown;
|
|
43
47
|
/**
|
|
44
48
|
* 控制是否显示默认菜单
|
|
45
49
|
*/
|
|
@@ -116,7 +120,7 @@ export declare class TableCol extends M.ViewElement<TableColOptions> implements
|
|
|
116
120
|
* 这个元素由列生成,但是不会作为列的子元素
|
|
117
121
|
*/
|
|
118
122
|
get $agg(): HTMLElement;
|
|
119
|
-
set aggValue(v:
|
|
123
|
+
set aggValue(v: unknown);
|
|
120
124
|
$aggBtn?: HTMLElement;
|
|
121
125
|
/**
|
|
122
126
|
* model.aggs 中的属性设置,无需保存在成员中。只是检查按钮是否存在。
|
|
@@ -129,6 +133,7 @@ export declare class TableCol extends M.ViewElement<TableColOptions> implements
|
|
|
129
133
|
get T(): {
|
|
130
134
|
readonly agg: string;
|
|
131
135
|
readonly noAgg: string;
|
|
136
|
+
readonly menu: string;
|
|
132
137
|
readonly sort: string;
|
|
133
138
|
readonly noSort: string;
|
|
134
139
|
readonly autoWidth: string;
|
package/dist/table.es.js
CHANGED
|
@@ -128,9 +128,10 @@ const styleSheet = createStyleSheet({
|
|
|
128
128
|
[tableColTagName + "::before"]: `
|
|
129
129
|
content: attr(sort);
|
|
130
130
|
`,
|
|
131
|
-
/*
|
|
131
|
+
/* 列文本, cursor 指示点击排序 */
|
|
132
132
|
[tableColTagName + ">span"]: `
|
|
133
133
|
flex: 1 1 auto;
|
|
134
|
+
cursor: ns-resize;
|
|
134
135
|
margin-right: 0.25rem;
|
|
135
136
|
`,
|
|
136
137
|
/* 列按钮:菜单等。鼠标悬停时显示菜单按钮。 */
|
|
@@ -247,6 +248,7 @@ const styleSheet = createStyleSheet({
|
|
|
247
248
|
const zh = {
|
|
248
249
|
agg: "统计",
|
|
249
250
|
noAgg: "无统计",
|
|
251
|
+
menu: "选项菜单",
|
|
250
252
|
sort: "行排序",
|
|
251
253
|
noSort: "无排序",
|
|
252
254
|
autoWidth: "自动宽度",
|
|
@@ -1100,7 +1102,7 @@ class TableCol extends (_a$b = M.ViewElement, _key_dec = [B.strAttr], _label_dec
|
|
|
1100
1102
|
$list?.style.setProperty(`--gzm-word-break-${key}`, wordBreak);
|
|
1101
1103
|
}
|
|
1102
1104
|
_agg_set() {
|
|
1103
|
-
this.aggValue =
|
|
1105
|
+
this.aggValue = void 0;
|
|
1104
1106
|
__privateGet$1(this, _$p)?.notify({ colAgg: true, $col: this });
|
|
1105
1107
|
}
|
|
1106
1108
|
_hidden_set() {
|
|
@@ -1126,7 +1128,7 @@ class TableCol extends (_a$b = M.ViewElement, _key_dec = [B.strAttr], _label_dec
|
|
|
1126
1128
|
const agg = this.agg;
|
|
1127
1129
|
if (agg) {
|
|
1128
1130
|
$a.setAttribute("title", Reflect.get(this.T, agg));
|
|
1129
|
-
__privateMethod$1(this, _TableCol_instances, setCellData_fn).call(this, $a, v);
|
|
1131
|
+
__privateMethod$1(this, _TableCol_instances, setCellData_fn).call(this, $a, v instanceof M.ObjValue ? v : new M.ObjValue(v));
|
|
1130
1132
|
} else {
|
|
1131
1133
|
$a.removeAttribute("title");
|
|
1132
1134
|
$a.textContent = "";
|
|
@@ -1140,6 +1142,7 @@ class TableCol extends (_a$b = M.ViewElement, _key_dec = [B.strAttr], _label_dec
|
|
|
1140
1142
|
let $btn = this.$aggBtn;
|
|
1141
1143
|
if (!$btn) {
|
|
1142
1144
|
$btn = this.$aggBtn = B.createTxtBtn("𝚺");
|
|
1145
|
+
$btn.title = this.T.agg;
|
|
1143
1146
|
this.$menuBtn.before($btn);
|
|
1144
1147
|
}
|
|
1145
1148
|
} else {
|
|
@@ -1152,6 +1155,7 @@ class TableCol extends (_a$b = M.ViewElement, _key_dec = [B.strAttr], _label_dec
|
|
|
1152
1155
|
get $menuBtn() {
|
|
1153
1156
|
if (!__privateGet$1(this, _menuBtn)) {
|
|
1154
1157
|
__privateSet$1(this, _menuBtn, B.createTxtBtn("⋮"));
|
|
1158
|
+
__privateGet$1(this, _menuBtn).title = this.T.menu;
|
|
1155
1159
|
this.append(__privateGet$1(this, _menuBtn));
|
|
1156
1160
|
}
|
|
1157
1161
|
return __privateGet$1(this, _menuBtn);
|
|
@@ -2461,7 +2465,7 @@ class TableList extends (_a$1 = HTMLElement) {
|
|
|
2461
2465
|
}
|
|
2462
2466
|
#doCalcAgg($col, $t = this.$table) {
|
|
2463
2467
|
if ($t.autoAgg) {
|
|
2464
|
-
$col.aggValue
|
|
2468
|
+
$col.setModelProperty("aggValue", this.#calcAggValueFromDataSource($col));
|
|
2465
2469
|
} else {
|
|
2466
2470
|
$t.model?.columnAgg?.($col.model, $col);
|
|
2467
2471
|
}
|
|
@@ -2469,21 +2473,21 @@ class TableList extends (_a$1 = HTMLElement) {
|
|
|
2469
2473
|
#calcAggValueFromDataSource($col) {
|
|
2470
2474
|
const ds = this.$rows.modelList;
|
|
2471
2475
|
if (!ds || ds.length === 0) {
|
|
2472
|
-
return
|
|
2476
|
+
return 0;
|
|
2473
2477
|
}
|
|
2474
2478
|
const agg = $col.agg;
|
|
2475
2479
|
if (agg === "count") {
|
|
2476
|
-
return
|
|
2480
|
+
return ds.length;
|
|
2477
2481
|
}
|
|
2478
2482
|
const func = Reflect.get(this.$table, agg);
|
|
2479
2483
|
if (typeof func !== "function") {
|
|
2480
|
-
return
|
|
2484
|
+
return void 0;
|
|
2481
2485
|
}
|
|
2482
2486
|
const vm = $col.valueMember?.member[0];
|
|
2483
|
-
if (!vm) return
|
|
2487
|
+
if (!vm) return void 0;
|
|
2484
2488
|
const da = ds.map((r) => Reflect.get(r.data, vm));
|
|
2485
2489
|
const ret = func.call(this.$table, ...da);
|
|
2486
|
-
return
|
|
2490
|
+
return ret;
|
|
2487
2491
|
}
|
|
2488
2492
|
refreshAggs(ss = this.createSnapshot()) {
|
|
2489
2493
|
const $needAgg = this.#hideAggsIfNotNeeded(ss);
|
package/dist/table.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table.es.js","sources":["../src/055-table/00-base.ts","../src/055-table/10-cell.ts","../src/055-table/16-row.ts","../src/055-table/22-colgroup.ts","../src/055-table/05-colWidthSetter.ts","../src/055-table/20-col.ts","../src/055-table/35-snapshot.ts","../src/055-table/47-head-tail.ts","../src/055-table/51-check.ts","../src/055-table/52-serial.ts","../src/055-table/53-action.ts","../src/055-table/54-menu.ts","../src/055-table/17-rows.ts","../src/055-table/18-aggs.ts","../src/055-table/25-cols.ts","../src/055-table/48-col-head.ts","../src/055-table/48-col-tail.ts","../src/055-table/60-list.ts","../src/055-table/62-table.ts"],"sourcesContent":["import { createStyleSheet, createText, globalTexts, gzmHeader } from '@gzmjs/ui-basic';\r\nimport type { TableCol } from './20-col';\r\nimport type { TableColGroup } from './22-colgroup';\r\nimport type { TableColCheckbox } from './51-check';\r\nimport type { TableView } from './62-table';\r\n\r\n/**\r\n * Table 相关标签的层次结构\r\n */\r\nexport const tableViewTagName = 'GZM-TABLE';\r\n export const tableListTagName = 'GZM-TABLE-LIST';\r\n export const tableColStartTagName = 'GZM-TABLE-COL-START';\r\n export const tableColHeadTagName = 'GZM-TABLE-COL-HEAD';\r\n export const tableColMiddleTagName = 'GZM-TABLE-COL-MIDDLE';\r\n export const tableColsTagName = 'GZM-TABLE-COLS';\r\n export const tableColGroupTagName = 'GZM-TABLE-COL-GROUP';\r\n export const tableColTagName = 'GZM-TABLE-COL'; \r\n export const tableColEndTagName = 'GZM-TABLE-COL-END';\r\n export const tableColTailTagName = 'GZM-TABLE-COL-TAIL';\r\n\r\n export const tableRowsTagName = 'GZM-TABLE-ROWS';\r\n export const tableRowTagName = 'GZM-TABLE-ROW';\r\n export const tableRowStartTagName = 'GZM-TABLE-ROW-START';\r\n export const tableRowMiddleTagName = 'GZM-TABLE-ROW-MIDDLE';\r\n export const tableRowEndTagName = 'GZM-TABLE-ROW-END'\r\n export const tableCellTagName = 'GZM-TABLE-CELL';\r\n \r\n export const tableAggsTagName = 'GZM-TABLE-AGGS';\r\n export const tableAggStartTagName = 'GZM-TABLE-AGG-START';\r\n export const tableAggMiddleTagName = 'GZM-TABLE-AGG-MIDDLE';\r\n export const tableAggEndTagName = 'GZM-TABLE-AGG-END'\r\n export const tableAggTagName = 'GZM-TABLE-AGG';\r\n\r\n/**\r\n * 列的宽度设置\r\n */\r\nexport const tableColWidthSetterTagName = 'GZM-TABLE-COL-WIDTH-SETTER';\r\n\r\nexport const tableColCheckTagName = 'GZM-TABLE-COL-CHECK';\r\nexport const tableRowCheckTagName = 'GZM-TABLE-ROW-CHECK';\r\n\r\nexport const tableColSerialTagName = 'GZM-TABLE-COL-SERIAL';\r\nexport const tableRowSerialTagName = 'GZM-TABLE-ROW-SERIAL';\r\n\r\nexport const tableColActionTagName = 'GZM-TABLE-COL-ACTION';\r\nexport const tableRowActionTagName = 'GZM-TABLE-ROW-ACTION';\r\n\r\nexport const tableColMenuTagName = 'GZM-TABLE-COL-MENU';\r\nexport const tableRowMenuTagName = 'GZM-TABLE-ROW-MENU';\r\n\r\n/* 列的默认宽度是 auto,其有一个特性:只要有水平空间就一定会占满。如只有一列,且内容不多,但是 auto 会使这一列占满整个水平空间。\r\n 如果列和内容过多,出现水平滚动栏,max-content 也不会换行而 min-content 总是换行,所以 auto 还是最好的选择。\r\n 为了让 auto 不占据不必要的水平空间,使 table-list 和一个 div 并列,在列和内容不多的情况下,div 占满剩余的空间。\r\n\r\n 一开始使用 flex 布局, div.flex = auto,看上去不错,但是 flex 布局限制了 table-list 的高度。\r\n 在出现垂直滚动栏的情况下,导致固定列头不能固定在顶部(滚动一小段距离没有问题,但是当滚动的距离超过了 table-list 的高度时,固定列头会离开可视范围)\r\n\r\n 所以使用了 grid 布局,一共两列都是 auto。 形成了最终 2 层 grid 布局。第一层是 table-view,第二层是 table-list。\r\n*/\r\nexport const styleSheet = createStyleSheet({\r\n //确保 section 能够显示滚动栏\r\n ':host' : `\r\n overflow: hidden;\r\n display: block;\r\n `,\r\n //section 负责显示滚动栏\r\n ':host > section': `\r\n display: grid;\r\n grid-template-columns: auto auto;\r\n gap: 0.5rem;\r\n overflow: auto;\r\n max-height: 100%;\r\n\r\n --grid-row-serial: 0; /*行号从 1 开始*/\r\n counter-reset: row-serial var(--grid-row-serial);\r\n `,\r\n [tableListTagName]: `\r\n display: grid;\r\n grid-auto-rows: max-content;/*每一行的高度都自动*/\r\n gap: 0px;\r\n\r\n /*3个span加在一起应该等于可见【列头+列+列尾】的数量*/\r\n --grid-start-span: 0;\r\n --grid-middle-span: 0;\r\n --grid-end-span: 0;\r\n\r\n /*列部分占用的行的数量*/\r\n --grid-col-end: 0;\r\n `,\r\n /*下面 3 个占据了 grid-list 的上半部分。利用 subgrid 使其中元素占用 grid-list 的列。*/\r\n [`${tableColStartTagName}, ${tableColMiddleTagName}, ${tableColEndTagName}`]: `\r\n position: sticky;\r\n top: 0px;\r\n\r\n display: grid;\r\n grid-template-columns: subgrid;\r\n grid-template-rows: subgrid;\r\n grid-row-start: 1;\r\n grid-row-end: var(--grid-col-end);\r\n `,\r\n /*下面 3 个固定在左侧 */\r\n [`${tableColStartTagName}, ${tableRowStartTagName}, ${tableAggStartTagName}`]: `\r\n left: 0px;\r\n grid-column-end: span var(--grid-start-span);\r\n `,\r\n [`${tableListTagName}[no-start] ${tableColStartTagName}, ${tableListTagName}[no-start] ${tableRowStartTagName}, ${tableListTagName}[no-start] ${tableAggStartTagName}`]: `\r\n display: none;\r\n `,\r\n /*下面 3 个固定在右侧 */\r\n [`${tableColEndTagName}, ${tableRowEndTagName}, ${tableAggEndTagName}`]: `\r\n right: 0px;\r\n grid-column-end: span var(--grid-end-span);\r\n `,\r\n [`${tableListTagName}[no-end] ${tableColEndTagName}, ${tableListTagName}[no-end] ${tableRowEndTagName}, ${tableListTagName}[no-end] ${tableAggEndTagName}`]: `\r\n display: none;\r\n `,\r\n /* 中间的 上中下 3 个元素, 无 sticky,只设置宽度 */\r\n [`${tableColMiddleTagName}, ${tableRowMiddleTagName}, ${tableAggMiddleTagName}`]: `\r\n grid-column-end: span var(--grid-middle-span);\r\n `,\r\n /* 用来组织子元素的容器 */\r\n [`${tableColHeadTagName}, ${tableColTailTagName}, ${tableColsTagName}, ${tableColGroupTagName}, ${tableRowsTagName}, ${tableRowTagName}, ${tableAggsTagName}`]: `\r\n display: contents;\r\n `,\r\n /* 所有的列头和列尾,所有的列头和尾都只有一个元素 */\r\n [`${tableColHeadTagName} > *, ${tableColTailTagName} > *`]: `\r\n grid-row-start: 1;\r\n grid-row-end: var(--grid-col-end);\r\n text-align: center;\r\n padding: 0.25rem 0.5rem;\r\n `,\r\n /* 不可滚动内容要求在 可滚动内容 的上面 */\r\n [`${tableColStartTagName}, ${tableColEndTagName}`]: `\r\n z-index: 40;\r\n `,\r\n\r\n /* COL */\r\n [tableColTagName]: `\r\n display: flex;\r\n align-items: flex-end; /*1-col会跨行,这个使文本等靠底部显示。2-文本占用最大的地方,菜单⋮靠右*/\r\n padding: 0.25rem 0.5rem;\r\n\r\n position: sticky;\r\n top: 0px;\r\n z-index: 30;\r\n\r\n grid-row-end: var(--grid-col-end);\r\n\r\n white-space: nowrap;\r\n ` + gzmHeader,\r\n /* 列排序 */\r\n [tableColTagName + '::before']: `\r\n content: attr(sort);\r\n `,\r\n /* 列文本 */\r\n [tableColTagName + '>span']: `\r\n flex: 1 1 auto;\r\n margin-right: 0.25rem;\r\n `,\r\n /* 列按钮:菜单等。鼠标悬停时显示菜单按钮。 */\r\n [tableColTagName + '>.gzm-txt-btn']: `\r\n visibility: hidden;\r\n `,\r\n [tableColTagName + ':hover >.gzm-txt-btn']: `\r\n visibility: visible;\r\n `,\r\n\r\n /* COL-GROUP */\r\n /*不能换行,div 高度必须保持不变*/\r\n [tableColGroupTagName + '>div']: `\r\n display: flex;\r\n gap: 0.25rem;\r\n padding: 0.25rem 0.5rem;\r\n\r\n position: sticky;\r\n top: 0px;\r\n z-index: 30;\r\n\r\n white-space: nowrap;\r\n ` + gzmHeader,\r\n [tableColGroupTagName + '>div >span']: `\r\n flex: 1 1 auto;\r\n `,\r\n /* 列组按钮:菜单等。鼠标悬停时显示菜单按钮。 */\r\n [tableColGroupTagName + '>div >.gzm-txt-btn']: `\r\n visibility: hidden;\r\n `,\r\n [tableColGroupTagName + '>div:hover >.gzm-txt-btn']: `\r\n visibility: visible;\r\n `,\r\n\r\n /* ROW */\r\n [`${tableRowTagName}:hover >* >${tableCellTagName}`]: `\r\n background: var(--gzm-h-btn-background);\r\n border: var(--gzm-h-btn-border);\r\n color: var(--gzm-h-btn-txt-color);\r\n `,\r\n [`${tableRowTagName}:active >* >${tableCellTagName}, ${tableRowTagName}[active] >* >${tableCellTagName}`]: `\r\n color: var(--gzm-a-btn-txt-color) !important;\r\n background: var(--gzm-a-btn-background) !important;\r\n border: var(--gzm-a-btn-border) !important;\r\n `,\r\n [`${tableRowStartTagName}, ${tableRowMiddleTagName}, ${tableRowEndTagName}`]: `\r\n display: grid;\r\n grid-template-columns: subgrid;\r\n grid-template-rows: subgrid;\r\n `,\r\n /*需要设置背景颜色,否则与可滚动内容字符重叠*/\r\n [`${tableRowStartTagName}, ${tableRowEndTagName}`]: `\r\n position: sticky;\r\n z-index: 20;\r\n background-color: var(--gzm-background-color);\r\n `,\r\n\r\n /* CELL */\r\n [tableCellTagName]: `\r\n padding: 0.25rem 0.5rem;\r\n border: var(--gzm-header-border);\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n `,\r\n [tableCellTagName + '>a']: `\r\n text-decoration: revert;\r\n `,\r\n\r\n /* AGGs */\r\n [`${tableAggStartTagName}, ${tableAggMiddleTagName}, ${tableAggEndTagName}`]: `\r\n display: grid;\r\n grid-template-columns: subgrid;\r\n grid-template-rows: subgrid;\r\n\r\n position: sticky;\r\n bottom: 0px;\r\n `,\r\n [tableAggTagName]: `\r\n grid-row-end: -1;\r\n `,\r\n /*需要聚合的字段一定会设置聚合的名称*/\r\n [tableAggTagName + '[title]']: `\r\n padding: 0.25rem 0.5rem;\r\n white-space: nowrap;\r\n z-index: 10;\r\n ` + gzmHeader,\r\n [`${tableAggStartTagName}, ${tableAggEndTagName}`]: `\r\n z-index: 30;\r\n `,\r\n\r\n /* HEAD, TAIL */\r\n [`${tableColCheckTagName}, ${tableColSerialTagName}, ${tableColMenuTagName}, ${tableColActionTagName}`]: `\r\n display: flex;\r\n align-items: flex-end;\r\n ` + gzmHeader,\r\n\r\n [`${tableColCheckTagName}, ${tableRowCheckTagName}`]: `\r\n padding: 0.25rem 0.5rem;\r\n text-align: center;\r\n justify-content: center;\r\n ` + gzmHeader,\r\n\r\n [`${tableColSerialTagName}, ${tableRowSerialTagName}`]: `\r\n padding: 0.25rem 0.5rem;\r\n text-align: right; /* row 靠右对齐 */\r\n justify-content: flex-end; /* col 靠右对齐 */\r\n ` + gzmHeader,\r\n [tableRowSerialTagName + '::after']: `\r\n counter-increment: row-serial; /*reset 在 :host 中*/\r\n content: counter(row-serial);\r\n `,\r\n\r\n [tableRowMenuTagName]: `\r\n padding: 0.25rem 0.5rem;\r\n text-align: center;\r\n ` + gzmHeader,\r\n \r\n [tableRowActionTagName]: `\r\n padding: 0.25rem 0.5rem;\r\n border: var(--gzm-header-border);\r\n `,\r\n});\r\n\r\nconst zh = {\r\n agg: '统计',\r\n noAgg: '无统计',\r\n\r\n sort: '行排序',\r\n noSort: '无排序',\r\n\r\n autoWidth: '自动宽度',\r\n minWidth: '最小宽度',\r\n maxWidth: '最大宽度',\r\n pxWidth: '指定宽度',\r\n\r\n textWrap: '文本换行',\r\n autoWrap: '自动换行',\r\n noWrap: '禁止换行',\r\n mustWrap: '强制换行',\r\n\r\n textAlign: '文本对齐',\r\n startAlign: '左对齐',\r\n endAlign: '右对齐',\r\n centerAlign: '居中对齐',\r\n justifyAlign: '两侧对齐',\r\n\r\n //CAF.Scaffolding.FieldAggregation 按道理不应该放在这里,偷懒了!\r\n COUNT: '计数',\r\n MAX: '最大值',\r\n MIN: '最小值',\r\n AVG: '平均值',\r\n SUM: '合计',\r\n STDDEV_POP: '总体标准差',\r\n STDDEV_SAMP: '样本标准差',\r\n VAR_POP: '总体方差',\r\n VAR_SAMP: '样本方差',\r\n\r\n toggleCheck: '全选 / 全不选',\r\n} as const;\r\nexport const texts = {zh};\r\n\r\nconst defaultTexts = createText(texts, globalTexts);\r\nexport function getTexts($ele: TableCol | TableColGroup | TableColCheckbox) {\r\n if ($ele.isConnected) {\r\n return (($ele.getRootNode() as ShadowRoot).host as TableView).T;\r\n }\r\n return defaultTexts;\r\n}","import {defineElement, strAttr} from '@gzmjs/ui-basic';\r\nimport * as TB from './00-base';\r\nimport type { TableRow } from './16-row';\r\n\r\n@defineElement({tagName: TB.tableCellTagName})\r\nexport class TableCell extends HTMLElement {\r\n // #region 属性\r\n /**\r\n * 和 table-col.key 进行匹配\r\n */\r\n @strAttr\r\n accessor colKey: string | undefined;\r\n // #endregion\r\n\r\n get $row(): TableRow | null {\r\n return this.closest<TableRow>(TB.tableRowTagName);\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [TB.tableCellTagName]: TableCell;\r\n }\r\n}\r\n","import {boolAttr, defineElement, type AttributeHandlers} from '@gzmjs/ui-basic';\r\nimport { handleModelEvent, type ModelEvent, type ModelItemUpdateEvent, type ViewModel, ViewElement, ModelEventHandler } from '@gzmjs/mvvm';\r\nimport * as TB from './00-base';\r\nimport * as TC from './10-cell';\r\nimport type { Snapshot } from './35-snapshot';\r\nimport type { TableColHeadOrTail } from './46-tht-options';\r\nimport type { TableCol } from './20-col';\r\n\r\nexport interface TableRowOptions extends ViewModel<TableRow> {\r\n //实际的数据\r\n data: object;\r\n\r\n active?: boolean;//是否被选中\r\n checked?: boolean;//与行头的 checkbox 相关\r\n \r\n afterActiveChanged?: ($row: TableRow) => void;\r\n}\r\nconst mutableAttributes = ['active'] as const;\r\n@defineElement({tagName: TB.tableRowTagName, mutableAttributes})\r\nexport class TableRow extends ViewElement<TableRowOptions> implements AttributeHandlers<typeof mutableAttributes[number]> {\r\n // #region 子元素\r\n readonly $start: HTMLElement = document.createElement(TB.tableRowStartTagName);\r\n readonly $middle: HTMLElement = document.createElement(TB.tableRowMiddleTagName);\r\n readonly $end: HTMLElement = document.createElement(TB.tableRowEndTagName);\r\n\r\n public setViewProperty(p: string, v: unknown): boolean {\r\n if (p === 'active' && v && !this.active) {\r\n this.#setActive();\r\n return true;\r\n }\r\n return super.setViewProperty(p, v);\r\n }\r\n #setActive(): void {\r\n if (!this.isConnected) {\r\n return;//还未加入 dom,在 connectedCallback() 中处理。\r\n }\r\n //只能选中一个,所以模拟点击的情况,由 tabs 去做切换。\r\n this.dispatchEvent(new MouseEvent('click', {bubbles: true}));\r\n }\r\n connectedCallback() {\r\n if (this.childElementCount === 0) {\r\n this.append(this.$start, this.$middle, this.$end);\r\n }\r\n if (this.model?.active && !this.active) {\r\n this.#setActive();\r\n }\r\n }\r\n // #endregion\r\n\r\n // #region 数据展示\r\n [handleModelEvent](source: unknown, evt: ModelEvent): boolean {\r\n return new RowModelEventHandler(this, source).handle(evt);\r\n }\r\n refresh(ss: Snapshot, refreshCellData = false) {\r\n this.#refresh(ss.$startColumns, this.$start, refreshCellData); \r\n this.#refresh(ss.$middleColumns, this.$middle, refreshCellData); \r\n this.#refresh(ss.$endColumns, this.$end, refreshCellData);\r\n\r\n this.#refreshHead(ss.$columnHeads, refreshCellData);\r\n this.#refreshTail(ss.$columnTails, refreshCellData);\r\n }\r\n #refreshHead($heads: TableColHeadOrTail[], refreshCellData = false) {\r\n let $lastHead: HTMLElement | undefined;\r\n const $start = this.$start;\r\n\r\n for (let i=0; i<$heads.length; i++) {\r\n const $h = $heads[i]!;\r\n const $head = $h.findInRow(this) || $h.createInRow();\r\n $head.hidden = !$h.visible;\r\n\r\n if (i === 0) {\r\n const $fec = $start.firstElementChild;\r\n if (!$fec) {\r\n $start.prepend($head);\r\n }\r\n else if ($fec === $head) {\r\n //就应该是这样!\r\n }\r\n else {\r\n $fec.before($head);\r\n } \r\n }\r\n else if ($lastHead?.nextElementSibling !== $head) {\r\n $lastHead?.after($head);\r\n }\r\n $lastHead = $head;\r\n\r\n if ($h.dataAware && refreshCellData) {\r\n $h.refresh(this, $head);\r\n }\r\n }\r\n }\r\n #refreshTail($tails: TableColHeadOrTail[], refreshCellData = false) {\r\n let $lastTail: HTMLElement | undefined;\r\n const $end = this.$end;\r\n\r\n for (let i=$tails.length-1; i>=0; i--) {\r\n const $t = $tails[i]!;\r\n const $tail = $t.findInRow(this) || $t.createInRow();\r\n $tail.hidden = !$t.visible;\r\n\r\n if (i === $tails.length - 1) {\r\n const $lec = $end.lastElementChild; //https://devdocs.io/dom/element/lastelementchild\r\n if (!$lec) {\r\n $end.append($tail);\r\n }\r\n else if ($lec === $tail) {\r\n //就应该是这样!\r\n }\r\n else {\r\n $lec.after($tail);\r\n }\r\n }\r\n else if ($lastTail?.previousElementSibling !== $tail) {\r\n $lastTail?.before($tail);\r\n }\r\n $lastTail = $tail;\r\n\r\n if ($t.dataAware && refreshCellData) {\r\n $t.refresh(this, $tail);\r\n }\r\n }\r\n }\r\n /**\r\n * 同时处理单元格和列的【数量】和【次序】,要能够处理:\r\n * 1 - 在 columns 的中间插入一个新的 column 这种情况。\r\n * 2 - 在 columns 中删除一个 column 的情况。\r\n * 3 - columns 中 2 列交换位置的情况。\r\n */\r\n #refresh($columns: TableCol[], $cellParent: HTMLElement, refreshCellData: boolean) {\r\n const $cells = Array.from($cellParent.querySelectorAll(TB.tableCellTagName)) as TC.TableCell[];\r\n const di = this.model!.data;\r\n let needInsert = false; //当下面的 for 循环中出现了交换列,或者新增 cell,但是无法知道插入位置的情况。\r\n\r\n for (let i=0; i<$columns.length; i++) {\r\n const $col = $columns[i]!;\r\n let $cell: TC.TableCell | undefined;\r\n\r\n if (i >= $cells.length) {\r\n //添加在 columns 后面的列,或者这是一个新的 row\r\n $cell = $col.createCell(di);\r\n $cells.push($cell);\r\n needInsert = true;\r\n }\r\n else {\r\n const j = this.#findColumnCell(i, $col.key!, $cells);\r\n if (j === i) {\r\n //说明这个位置 j 的 cell 本来就对应 col,只需要更新一下内容.\r\n $cell = $cells[j]!;\r\n\r\n if (refreshCellData) {\r\n $col._setCellData($cell, di);\r\n }\r\n }\r\n else if (j > i) {\r\n //3 - 需要把 $cell 的位置从 j 前移到 i\r\n $cell = $cells.splice(j, 1)[0]!;\r\n $cells.splice(i, 0, $cell);\r\n needInsert = true;\r\n }\r\n else {\r\n //没有找到,新增。这应该就是 1 - 在 columns 中间插入一个 col 的情况\r\n $cell = $col.createCell(di);\r\n $cells.splice(i, 0, $cell);\r\n needInsert = true;\r\n }\r\n }\r\n $cell.hidden = !$col.visible;\r\n }\r\n\r\n if ($cells.length > $columns.length) {\r\n //2 - 多出来的部分就是要删除的\r\n const $toDel = $cells.splice($columns.length, $cells.length - $columns.length);\r\n $toDel.forEach($x => $x.remove());\r\n }\r\n\r\n if (needInsert) {\r\n //处理 cells 中没有加入 dom 的元素\r\n const $df = document.createDocumentFragment();\r\n $df.append(...$cells);\r\n void ($cellParent === this.$end ? $cellParent.prepend($df) : $cellParent.append($df));\r\n }\r\n }\r\n /**\r\n * 从 i 开始在 cells 中查找 col 对应的 cell。\r\n * 如果上一次 refresh() 之后 columns 和 cells 都没有任何改变,那么第一次循环 j===i 时就能够找到。\r\n */\r\n #findColumnCell(i: number, colKey: string, $cells: TC.TableCell[]) {\r\n for (let j=i; j<$cells.length; j++) {\r\n const $cell = $cells[j]!;\r\n if ($cell.colKey === colKey) {\r\n return j;\r\n }\r\n }\r\n return -1;\r\n }\r\n // #endregion\r\n\r\n // #region 属性\r\n @boolAttr\r\n accessor active: boolean = false;\r\n\r\n _active_set() {\r\n this.model?.afterActiveChanged?.(this);\r\n }\r\n\r\n get checked(): boolean {\r\n const $rc = this.querySelector(TB.tableRowCheckTagName);\r\n if (!$rc) return false;\r\n return $rc.$chk.checked;\r\n }\r\n set checked(v: boolean) {\r\n const $rc = this.querySelector(TB.tableRowCheckTagName);\r\n if ($rc) {\r\n $rc.$chk.checked = v;\r\n }\r\n }\r\n // #endregion\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [TB.tableRowTagName]: TableRow;\r\n }\r\n}\r\n\r\n/**\r\n * 为了配合 DataListEventHandler 对 TableView.dataSource 事件的处理。\r\n * 当 TableRowOptions.data 被修改时,DataListEventHandler 会调用 TableRow[handleModelEvent]。\r\n * 如果 TableRow 类本身也有 data 属性,那么就不需要这个类了。\r\n * 可以在 set data() 中来刷新显示,就好像 ListView.data 属性一样。\r\n * 但是 TableRow 的刷新比较复杂,需要额外的 TableCol 等的信息,只能在 TableList 中执行。\r\n */\r\nclass RowModelEventHandler extends ModelEventHandler<TableRowOptions, TableRow> {\r\n public handle(arg: ModelEvent): boolean {\r\n const ret = super.handle(arg);\r\n if (!ret && arg.type === 'item-update') {\r\n const iu = arg as ModelItemUpdateEvent<TableRowOptions>;\r\n if ('data' in iu.updated) {\r\n const $list = this.$view.closest(TB.tableListTagName);\r\n if ($list) {\r\n $list.getRowRefreshFunc()(this.$view, true);\r\n return true;\r\n }\r\n }\r\n }\r\n return ret;\r\n }\r\n}","import * as B from '@gzmjs/ui-basic';\r\nimport {type MiOptions, createMenu} from '@gzmjs/menu';\r\nimport * as TB from './00-base';\r\nimport {TableCol, type ColNoticeReceiver, type NoticeOfCol} from './20-col';\r\n\r\nconst mutableAttributes = ['hidden'] as const;\r\n@B.defineElement({tagName: TB.tableColGroupTagName, mutableAttributes})\r\nexport class TableColGroup extends HTMLElement implements ColNoticeReceiver, B.AttributeHandlers<typeof mutableAttributes[number]> {\r\n // #region 子元素\r\n constructor() {\r\n super();\r\n this.$lbl = document.createElement('span');\r\n this.$menu = B.createTxtBtn('⋮');\r\n\r\n this.$div = document.createElement('div');\r\n this.$div.append(this.$lbl, this.$menu);\r\n }\r\n readonly $div: HTMLDivElement;\r\n readonly $lbl: HTMLElement;\r\n readonly $menu: HTMLElement;\r\n\r\n /**\r\n * \r\n * @param {Number} start \r\n * @returns 所有下级可见列的数量\r\n */\r\n setRow(start: number): number {\r\n if (this.hidden) {\r\n //传入的 end 是根据可见列最大的 tier 来计算的。如果此 group.hidden 但是很“深”,会导致 start>end。\r\n throw new Error('call group.setRow() when not hidden');\r\n }\r\n\r\n const $cols = this.$columns;\r\n const $gs = this.$groups;\r\n if ($cols.length === 0 && $gs.length === 0) {\r\n this.#$p = void 0; //防止其通知上级,因为 setRow() 被调用的时候就是上级在布局。\r\n this.remove();\r\n return 0;\r\n }\r\n\r\n this.$div.style.gridRowStart = start.toString(); //div 只占据一行\r\n\r\n start++;\r\n let colVisible = 0; //记录下级的可见列有多少\r\n\r\n for (const $col of $cols) {\r\n if ($col.hidden) {\r\n //不用判断所属 group.visible,因为上级调用 setRow() 时已经判断过了。\r\n }\r\n else {\r\n $col.setRow(start);\r\n colVisible++;\r\n }\r\n }\r\n\r\n for (const $group of $gs) {\r\n if ($group.hidden) {\r\n //不用判断所属 group.visible,因为上级调用 setRow() 时已经判断过了。\r\n }\r\n else {\r\n colVisible += $group.setRow(start);\r\n }\r\n }\r\n if (colVisible === 0) {\r\n this.hidden = true;\r\n return 0;\r\n }\r\n this.$div.style.gridColumnEnd = 'span ' + colVisible;\r\n return colVisible;\r\n }\r\n /**\r\n * 只属于这个 group 的列\r\n */\r\n get $columns(): TableCol[] {\r\n const ret: TableCol[] = []\r\n for (const $c of this.children) {\r\n if ($c instanceof TableCol) {\r\n ret.push($c);\r\n }\r\n }\r\n return ret;\r\n }\r\n /**\r\n * 只属于这个 group 的下级 group\r\n */\r\n get $groups(): TableColGroup[] {\r\n const ret: TableColGroup[] = [];\r\n for (const $c of this.children) {\r\n if ($c instanceof TableColGroup) {\r\n ret.push($c);\r\n }\r\n }\r\n return ret;\r\n }\r\n /**\r\n * 当前列组是否显示\r\n */\r\n get visible(): boolean {\r\n if (this.hidden) {\r\n return false;\r\n }\r\n if (!this.isConnected) {\r\n return false;\r\n }\r\n if (this.#$p instanceof TableColGroup) {\r\n return this.#$p.visible;\r\n }\r\n return true; //#$p 是 table-cols\r\n }\r\n /**\r\n * 当直属于 table-cols,返回 1。\r\n * grid-row-start 的值也是从 1 开始。\r\n */\r\n get tier(): number {\r\n if (this.#$p instanceof TableColGroup) {\r\n return this.#$p.tier + 1;\r\n }\r\n return 1;\r\n }\r\n // #endregion\r\n\r\n // #region 上级元素\r\n connectedCallback() {\r\n if (this.#$p === this.parentElement) return;\r\n this.prepend(this.$div);\r\n this.#$p = this.parentElement as ColGroupNoticeReceiver;\r\n this.#$p.notify({groupAdd:true,$group:this});\r\n }\r\n #$p?: ColGroupNoticeReceiver; //为了 disconnected\r\n\r\n disconnectedCallback() {\r\n if (this.#$p && !this.parentElement) {//不是随着上级一起删除,要通知上级!\r\n this.#$p.notify({groupDel:true,$group:this});\r\n this.#$p = void 0;\r\n }\r\n }\r\n // #endregion\r\n \r\n // #region ColNoticeReceiver\r\n notify(n: NoticeOfColGroup | NoticeOfCol) {\r\n if ('colAdd' in n && n.colAdd) {\r\n if (!n.$col.hidden && this.hidden) this.hidden = false;//group 原来 hidden,加入一个不 hidden 的列,那么就不能再 hidden。\r\n }\r\n this.#$p?.notify(n);\r\n }\r\n // #endregion\r\n\r\n // #region 属性\r\n get label(): string {return this.$lbl.textContent;}\r\n set label(v: string) {this.$lbl.textContent = v;}\r\n\r\n _hidden_set() {\r\n //因为 col 和 col.agg 都是子元素,一起被隐藏了。无需额外处理。\r\n this.notify({groupHide:true,$group:this});\r\n }\r\n // #endregion\r\n\r\n // #region 组菜单\r\n handleClick(e: MouseEvent) {\r\n if (e.target === this.$menu) {\r\n this.#showMenu();\r\n }\r\n }\r\n #showMenu() {\r\n const mis: MiOptions[] = [\r\n {\r\n tag: 'click',\r\n label: this.T.hide, \r\n group: 'action',\r\n onclick: () => {\r\n this.hidden = true;\r\n }\r\n },/* 无法与 table-cols.modelList 同步,所以删除此功能\r\n {\r\n label: T.del!(),\r\n group: 'action',\r\n onclick: () => {\r\n this.remove();\r\n }\r\n },*/\r\n ];\r\n //显示每一列,允许隐藏/显示列\r\n for (const $col of this.$columns) {\r\n const colItem: MiOptions = {\r\n tag: 'check',\r\n group: 'table-col',\r\n label: $col.label ?? '',\r\n checked: !$col.hidden,\r\n onclick() {\r\n $col.setModelProperty('hidden', !$col.hidden);\r\n }\r\n };\r\n mis.push(colItem);\r\n }\r\n const $sm = createMenu(...mis);\r\n $sm.show(this.$menu, B.xy.rightBottom, B.xy.rightTop);\r\n }\r\n // #endregion\r\n\r\n get T() { return TB.getTexts(this); };\r\n}\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [TB.tableColGroupTagName]: TableColGroup;\r\n }\r\n}\r\n\r\n// #region 通知上级\r\nexport interface NoticeOfColGroup {\r\n groupAdd?: boolean;\r\n groupDel?: boolean;\r\n groupHide?: boolean;\r\n\r\n $group: TableColGroup;\r\n}\r\nexport interface ColGroupNoticeReceiver extends HTMLElement {\r\n notify: (msg: NoticeOfColGroup | NoticeOfCol) => void;\r\n}\r\n// #endregion","import { CornerHelper, xy, defineElement } from \"@gzmjs/ui-basic\";\r\nimport { tableColWidthSetterTagName } from \"./00-base\";\r\nimport type { TableCol } from \"./20-col\";\r\n\r\n@defineElement({tagName: tableColWidthSetterTagName})\r\nclass TableColWidthSetter extends HTMLElement {\r\n connectedCallback() {\r\n this.style.border = 'var(--gzm-header-border)'; \r\n this.style.background = 'var(--gzm-a-btn-background)';\r\n }\r\n\r\n get $range(): HTMLInputElement {\r\n if (!this.#range) {\r\n this.#range = document.createElement('input');\r\n this.#range.type = 'range';\r\n this.append(this.#range);\r\n }\r\n return this.#range;\r\n }\r\n #range?: HTMLInputElement;\r\n\r\n public show($col: TableCol) {\r\n this.#calcSize($col);\r\n this.$range.onchange = (e: Event) => {\r\n const $t = e.target as HTMLInputElement;\r\n console.debug('table column width range value = ' + $t.value);\r\n $col.width = $t.value + 'px';\r\n this.remove();\r\n }\r\n\r\n this.setAttribute('popover', 'auto');\r\n new CornerHelper(this, xy.leftTop, $col, xy.leftBottom).pos();\r\n }\r\n\r\n #calcSize($col: TableCol) { \r\n const root = $col.getRootNode() as ShadowRoot;\r\n const $table = root.host as HTMLElement;\r\n\r\n const colRect = $col.getBoundingClientRect();\r\n const gridRect = $table.getBoundingClientRect();\r\n \r\n const colRight2gridRight = Math.floor(gridRect.right - colRect.right); //col 右边框到 grid 右边框的距离\r\n const colRightEmptyWidth = colRight2gridRight - (gridRect.width - $table.clientWidth); /*去掉垂直滚动栏*/\r\n const max = Math.floor(colRect.width + colRightEmptyWidth); //range 的长度应该等于 col 本身的长度加上右侧的空间。\r\n\r\n const $r = this.$range;\r\n $r.style.width = max + 'px'; \r\n $r.max = max.toString();\r\n $r.value = colRect.width.toString();\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [tableColWidthSetterTagName]: TableColWidthSetter;\r\n }\r\n}\r\n","import * as B from '@gzmjs/ui-basic';\r\nimport * as M from '@gzmjs/mvvm';\r\nimport {type MiOptions, createMenu, createMenuWithModel} from '@gzmjs/menu';\r\nimport '@gzmjs/tooltip';\r\nimport * as TB from './00-base';\r\nimport type { TableCell } from './10-cell';\r\nimport { TableColGroup } from './22-colgroup';\r\nimport './05-colWidthSetter';\r\n\r\nexport const sortAsc = '↑'; //▲ 可以直接用于CSS ::before content\r\nexport const sortDesc = '↓'; //▼ https://www.compart.com/en/unicode/U+25BC\r\nconst tableColSort = ['', sortAsc, sortDesc] as const;\r\nexport type TableColSort = typeof tableColSort[number];\r\nfunction isAscSort(s: TableColSort) {return s === sortAsc;}\r\n//function isDescSort(s: TableColSort) {return s === sortDesc;} 用不到\r\n\r\nconst tableColAlign = ['start', 'end', 'center', 'justify'] as const; //css:text-align\r\nexport type TableColAlign = typeof tableColAlign[number];\r\n\r\nexport const TableColAggs = ['count','min','max','sum','avg'] as const;\r\n\r\nexport interface TableColumnBtn {\r\n /**\r\n * 应该是 unicode 字符,且同一列中必须唯一。\r\n */\r\n icon: string;\r\n title: string;\r\n onclick: ($col: TableCol, $btn: HTMLElement) => void;\r\n}\r\nexport interface TableColOptions extends M.ViewModel<TableCol> {\r\n label: string;\r\n\r\n /**\r\n * 分组,多级组用 / 分开\r\n */\r\n group?: string;\r\n \r\n title?: string;\r\n width?: string; //默认 auto\r\n sort?: TableColSort;//无需处理set,通过css来显示箭头\r\n align?: TableColAlign;\r\n wrap?: boolean;\r\n\r\n /**\r\n * boolean 类型显示的内容\r\n * listSource = createBoolTextList()\r\n */\r\n //trueText?: string;\r\n //falseText?: string;\r\n\r\n /**\r\n * 定义了所有允许的聚合操作,如果不为空那么需要显示下拉菜单。\r\n */\r\n aggs?: string[];\r\n\r\n /**\r\n * 无论是否存在 aggs,都可以设置此属性。\r\n */\r\n agg?: string;\r\n\r\n /**\r\n * 控制是否显示默认菜单\r\n */\r\n noMenu?: boolean;\r\n\r\n /**\r\n * 列 label 之后的其他按钮\r\n */\r\n btns?: TableColumnBtn[];\r\n\r\n /**\r\n * 需要显示的字段\r\n */\r\n valueMember: M.ObjMember | string | string[];\r\n listSource?: M.ListSource<object>;\r\n\r\n /**\r\n * 对单元格内容的干涉,$cell 中已经有了内容\r\n */\r\n setCellContent?: (ctx: {$cell: TableCell, $col: TableCol, dataItem: object, dataValue: M.ObjValue}) => void;\r\n\r\n /**\r\n * 列菜单显示之前,可以修改菜单项\r\n */\r\n beforeMenuShow?: (mis: MiOptions[], vm: TableColOptions) => void;\r\n}\r\nexport function createBoolTextList(trueText: string, falseText: string) {\r\n return new M.ListSource([{v:true,d:trueText},{v:false,d:falseText}], 'v', 'd');\r\n}\r\n\r\nconst mutableAttributes = ['key', 'label', 'width', 'hidden', 'sort', 'agg', 'align'] as const;\r\n\r\n@B.defineElement({tagName: TB.tableColTagName, mutableAttributes})\r\nexport class TableCol extends M.ViewElement<TableColOptions> implements B.AttributeHandlers<typeof mutableAttributes[number]> {\r\n\r\n // #region 子元素\r\n get $lbl(): HTMLElement {\r\n if (!this.#lbl) {\r\n this.#lbl = document.createElement('span');\r\n this.prepend(this.#lbl);\r\n }\r\n return this.#lbl;\r\n }\r\n #lbl?: HTMLElement;\r\n\r\n /**\r\n * $lbl 之后允许有多个按钮,最后两个是 agg 按钮和 menu 按钮,但有可能不生成。\r\n * btns 按钮在 $lbl 和 agg 按钮之间\r\n */\r\n set btns(v: TableColumnBtn[]) {\r\n let $bs = this.$btns;\r\n if (!v || !v.length) {\r\n //清空\r\n $bs?.forEach($b => $b.remove());\r\n return;\r\n }\r\n\r\n const $df = document.createDocumentFragment();\r\n for (const b of v) {\r\n let $btn = $bs?.find($b => $b.textContent === b.icon);\r\n if (!$btn) {\r\n $btn = B.createTxtBtn(b.icon);\r\n $btn.title = b.title;\r\n }\r\n $df.appendChild($btn);\r\n }\r\n $bs = this.$btns = Array.from($df.children) as HTMLElement[];\r\n this.$lbl.after(...$bs);\r\n }\r\n $btns?: HTMLElement[]; //生成的按钮数组\r\n // #endregion\r\n\r\n // #region 上级元素\r\n connectedCallback() {\r\n if (this.#$p === this.parentElement) return;\r\n this.#$p = this.parentElement as ColParentElement;\r\n this.#$p.notify({colAdd:true,$col:this});\r\n\r\n void this.$menuBtn; //确保生成\r\n //console.debug(`grid column ${this.label} connected.\\n`);\r\n }\r\n #$p?: ColParentElement;//父元素, disconnectedCallback 的时候有用。\r\n\r\n disconnectedCallback() {\r\n if (!this.parentElement && this.#$p) {\r\n //单独被删除,需要通知上级\r\n this.$agg.remove();\r\n this.#$p.notify({colDel:true,$col:this});\r\n this.#$p = void 0;\r\n //console.debug(`grid column ${this.label} disconnected.\\n`);\r\n }\r\n }\r\n get visible(): boolean {\r\n if (this.hidden) {\r\n return false;\r\n }\r\n const $p = this.#$p;\r\n if (!$p) {\r\n return false;\r\n }\r\n if ($p instanceof TableColGroup) {\r\n return $p.visible;\r\n }\r\n return true; //p 是 grid-cols\r\n }\r\n /**\r\n * 如果没有任何 group,那么每一列都应该调用 setRow(1)\r\n */\r\n setRow(start: number) {\r\n this.style.gridRowStart = start.toString();\r\n /*this.style.gridRowEnd = end;*///所有的 end 都统一是 --grid-col-end\r\n }\r\n // #endregion\r\n\r\n // #region 数据展示\r\n get valueMember(): M.ObjMember | undefined {return this.#vm;}\r\n set valueMember(v: M.ObjMember | string | string[]) {\r\n if (!(v instanceof M.ObjMember)) {\r\n v = new M.ObjMember(v);\r\n }\r\n this.#vm = v;\r\n this.#$p?.notify({colRefresh:true,$col:this});\r\n }\r\n #vm?: M.ObjMember;\r\n\r\n set listSource(_: unknown) {\r\n this.#$p?.notify({colRefresh:true,$col:this});\r\n }\r\n\r\n createCell(dataItem: object): TableCell {\r\n const ret = document.createElement(TB.tableCellTagName);\r\n ret.colKey = this.key;\r\n ret.hidden = this.hidden; //hidden 将不占用 grid\r\n this.#setCellStyle(ret);\r\n this._setCellData(ret, dataItem);\r\n return ret;\r\n }\r\n _setCellData($cell: TableCell, dataItem: object = $cell.$row!.model!.data): void {\r\n $cell.textContent = '';\r\n if (!dataItem) return;\r\n\r\n const dv = this.valueMember?.getObjValue(dataItem) ?? new M.ObjValue(void 0);\r\n this.#setCellData($cell, dv);\r\n this.#createCellLink($cell, dataItem, dv);\r\n }\r\n #setCellData($cell: HTMLElement, dv: M.ObjValue) {\r\n dv = this.#getDisplayFromList(dv) || dv;\r\n $cell.textContent = dv.toString(this);\r\n }\r\n #createCellLink($cell: TableCell, dataItem: object, dataValue: M.ObjValue) {\r\n this.model?.setCellContent?.({\r\n $cell, \r\n $col: this,\r\n dataItem, \r\n dataValue\r\n });\r\n };\r\n #getDisplayFromList(dv: M.ObjValue): M.ObjValue | undefined {\r\n const ls = this.model?.listSource;\r\n return ls?.getListDisplay(dv);\r\n }\r\n\r\n #setCellStyle($cell: HTMLElement) {\r\n const key = this.key;\r\n $cell.style.textAlign = `var(--gzm-text-align-${key}, start)`;\r\n $cell.style.whiteSpace = `var(--gzm-white-space-${key}, normal)`; //https://devdocs.io/css/white-space\r\n $cell.style.wordBreak = `var(--gzm-word-break-${key}, normal)`; //https://devdocs.io/css/word-break\r\n }\r\n // #endregion\r\n\r\n // #region 属性\r\n @B.strAttr\r\n accessor key: string | undefined;\r\n\r\n _key_set() {\r\n this.#setCellStyle(this.$agg);\r\n\r\n const a = this.align;\r\n if (a !== tableColAlign[0]) {\r\n this._align_set(a);\r\n }\r\n\r\n this._wrap_set(this.wrap);\r\n }\r\n\r\n @B.strAttr\r\n accessor label: string | undefined;\r\n\r\n _label_set(nv: string | null) {\r\n this.$lbl.textContent = nv;\r\n }\r\n\r\n get title() {\r\n return this.$lbl.title;\r\n }\r\n set title(v: string) {\r\n this.$lbl.title = v ?? '';\r\n }\r\n\r\n @B.strAttr\r\n accessor width: string = 'auto';\r\n\r\n _width_set() {\r\n this.#$p?.notify({colWidth:true,$col:this});\r\n }\r\n\r\n @B.strAttr\r\n accessor sort: TableColSort = tableColSort[0];\r\n\r\n _sort_set() {\r\n this.#$p?.notify({colSort:true,$col:this});\r\n }\r\n\r\n get isAscSort(): boolean {return isAscSort(this.sort as TableColSort);}\r\n\r\n @B.strAttr\r\n accessor align: TableColAlign = tableColAlign[0];\r\n\r\n _align_set(nv: string | null) {\r\n const key = this.key;\r\n const $list = this.closest(TB.tableListTagName) as HTMLElement;\r\n $list?.style.setProperty(`--gzm-text-align-${key}`, nv);\r\n }\r\n\r\n //因为 attribute 中的 bool 属性无法实现 3 种状态,所以这里没有使用 attribute。\r\n get wrap(): boolean | undefined {return this.#wrap;}\r\n set wrap(v: boolean | undefined) {this.#wrap = v; this._wrap_set(v);}\r\n #wrap?: boolean;\r\n\r\n _wrap_set(nv: boolean | undefined) {\r\n let whiteSpace = 'normal';\r\n let wordBreak = 'normal';\r\n switch (nv) {\r\n case true:\r\n wordBreak = 'break-all'; //url,email 不会自动换行,必须强制。\r\n break;\r\n case false:\r\n whiteSpace = 'nowrap'; //中文文本自动换行,必须禁止才不会换行!\r\n break;\r\n }\r\n const key = this.key;\r\n const $list = this.closest(TB.tableListTagName) as HTMLElement;\r\n $list?.style.setProperty(`--gzm-white-space-${key}`, whiteSpace);\r\n $list?.style.setProperty(`--gzm-word-break-${key}`, wordBreak);\r\n }\r\n\r\n @B.strAttr\r\n accessor agg: string | undefined;\r\n\r\n _agg_set() {\r\n this.aggValue = new M.ObjValue(void 0); //col没有数据,不负责计算,先清空。\r\n this.#$p?.notify({colAgg:true,$col:this});\r\n }\r\n\r\n _hidden_set() {\r\n this.$agg.hidden = this.hidden;\r\n this.#$p?.notify({colHide:true,$col:this});\r\n console.debug(`grid column ${this.label} hidden = ${this.hidden}.\\n`);\r\n }\r\n // #endregion\r\n\r\n // #region 聚合\r\n /**\r\n * 这个元素由列生成,但是不会作为列的子元素\r\n */\r\n get $agg(): HTMLElement {\r\n if (!this.#agg) {\r\n const $agg = this.#agg = document.createElement(TB.tableAggTagName);\r\n $agg.hidden = this.hidden;\r\n }\r\n return this.#agg;\r\n }\r\n #agg?: HTMLElement;\r\n\r\n set aggValue(v: M.ObjValue) {\r\n const $a = this.$agg;\r\n const agg = this.agg;\r\n if (agg) {\r\n $a.setAttribute('title', Reflect.get(this.T, agg));//匹配样式显示\r\n this.#setCellData($a, v);\r\n }\r\n else {\r\n //base 中的样式定义只有 title 才有背景,所以移除 title 并且清空内容,虽然元素未隐藏,但是已经看不出来了。\r\n $a.removeAttribute('title');\r\n $a.textContent = '';\r\n //$a.hidden = true; 因为是 grid 布局,所以不能隐藏(后面的元素会占据其位置)\r\n }\r\n }\r\n\r\n $aggBtn?: HTMLElement;\r\n\r\n /**\r\n * model.aggs 中的属性设置,无需保存在成员中。只是检查按钮是否存在。\r\n */\r\n set aggs(v: string[] | undefined) {\r\n if (v && v.length) {\r\n let $btn = this.$aggBtn;\r\n if (!$btn) {\r\n $btn = this.$aggBtn = B.createTxtBtn('𝚺'); //Σ\r\n this.$menuBtn.before($btn);//倒数第2个,最后的是 $menuBtn\r\n }\r\n }\r\n else {\r\n this.$aggBtn?.remove();\r\n this.$aggBtn = void 0;\r\n }\r\n }\r\n\r\n #showAggMenu() {\r\n const mis = this.#createAggMenu();\r\n if (!mis || !mis.length) {\r\n this.$aggBtn?.showTooltip({\r\n render: ($tt) => {\r\n $tt.textContent = this.T.noMenuSet;\r\n },\r\n })\r\n return;\r\n }\r\n const $m = createMenuWithModel({\r\n modelList: mis,\r\n itemClick: (item) => {\r\n this.setModelProperty('agg', item.id);\r\n },\r\n });\r\n $m.show(this.$aggBtn!, B.xy.rightBottom, B.xy.rightTop);\r\n }\r\n\r\n #createAggMenu(): MiOptions[] {\r\n let aggs = this.model?.aggs;\r\n if (!aggs || !aggs.length) {\r\n return [];\r\n }\r\n\r\n const ta = this.agg ?? '';\r\n if (ta && !aggs.includes(ta)) {\r\n aggs = [ta, ...aggs];\r\n }\r\n aggs = ['', ...aggs];\r\n\r\n const T = this.T;\r\n const items: MiOptions[] = aggs.map(a => {\r\n return {\r\n tag: 'radio',\r\n id: a,\r\n label: a ? Reflect.get(T, a) : T.noAgg, //todo: 不属于 T 的怎么办?\r\n checked: ta === a,\r\n };\r\n });\r\n return items;\r\n }\r\n // #endregion\r\n\r\n // #region 菜单\r\n get $menuBtn(): HTMLElement {\r\n if (!this.#menuBtn) {\r\n this.#menuBtn = B.createTxtBtn('⋮');\r\n this.append(this.#menuBtn);\r\n }\r\n return this.#menuBtn;\r\n }\r\n #menuBtn?: HTMLElement;\r\n\r\n get noMenu(): boolean {return this.$menuBtn.hidden;};\r\n set noMenu(b: boolean) {this.$menuBtn.hidden = b;}\r\n\r\n #showMenu() {\r\n const mis = this.#createMenu();\r\n if (!mis || !mis.length) {\r\n this.$menuBtn.showTooltip({\r\n render: ($tt) => {\r\n $tt.textContent = this.T.noMenuSet;\r\n },\r\n })\r\n return;\r\n }\r\n const $m = createMenu(...mis);\r\n $m.show(this.$menuBtn, B.xy.rightBottom, B.xy.rightTop);\r\n }\r\n #createMenu(): MiOptions[] {\r\n const T = this.T;\r\n //const delItem: MiOptions = {tag:'click',label:T.del!(),group:'c',onclick:()=>this.remove()}; 因为无法与 table-cols.modelList 联动,所以不提供删除功能。\r\n const hideItem: MiOptions = {tag:'click',label: T.hide,group:'c',onclick:()=>this.setModelProperty('hidden', true)};\r\n const alignItem: MiOptions = {tag:'menu',label:T.textAlign,subItems:this.#createAlignMenu(),group:'m'};\r\n const wrapItem: MiOptions = {tag:'menu',label:T.textWrap,subItems:this.#createWrapMenu(),group:'m'};\r\n const sortItem: MiOptions = {tag:'menu',label:T.sort,subItems:this.#createSortMenu(),group:'m'};\r\n const autoWidthItem: MiOptions = {tag:'radio',label:T.autoWidth,group:'width',onclick:()=>this.setModelProperty('width', 'auto')};\r\n const minItem: MiOptions = {tag:'radio',label:T.minWidth,group:'width',onclick:()=>this.setModelProperty('width', 'min-content')};\r\n const maxItem: MiOptions = {tag:'radio',label:T.maxWidth,group:'width',onclick:()=>this.setModelProperty('width', 'max-content')};\r\n const pxItem: MiOptions = {tag:'radio',label:T.pxWidth,group:'width',onclick:()=>this.#showWidthPopup()};\r\n\r\n switch (this.width) {\r\n case 'min-content':\r\n //https://devdocs.io/css/min-content\r\n //只对英文文本有效,宽度将由最长的单词决定。对于中文文本没有意义,因为字符宽度一致。\r\n //对于不换行的文本也没有意义,如 url, email 等。效果等同于 max-content\r\n minItem.checked = true;\r\n break;\r\n case 'max-content':\r\n //https://devdocs.io/css/max-content\r\n //对于不换行的文本,如 url, email 或者 white-space:nowrap; 效果等同于 min-content\r\n maxItem.checked = true;\r\n break;\r\n case 'auto':\r\n autoWidthItem.checked = true;\r\n break;\r\n default:\r\n {\r\n const regex = /^\\d+(\\.\\d+)?px$/;\r\n if (regex.test(this.width)) {\r\n pxItem.checked = true;\r\n }\r\n }\r\n break;\r\n }\r\n const menuItems = [hideItem, alignItem, wrapItem, sortItem, autoWidthItem, minItem, maxItem, pxItem];\r\n this.model?.beforeMenuShow?.(menuItems, this.model);\r\n return menuItems;\r\n }\r\n #createWrapMenu() {\r\n const T = this.T;\r\n const Ts = [\r\n T.autoWrap,\r\n T.mustWrap,//url,email 这类字符串不换行,强制其换行。\r\n T.noWrap,//中文文本会自动换行,强制其不换行。\r\n ];\r\n\r\n const tw = this.wrap;\r\n const tableColWrap = [void 0, true, false];\r\n const items: MiOptions[] = tableColWrap.map((w,i) => {\r\n return {\r\n tag: 'radio',\r\n label: Ts[i]!,\r\n checked: tw === w,\r\n onclick: () => {\r\n this.setModelProperty('wrap', w);\r\n }\r\n };\r\n });\r\n return items;\r\n }\r\n #createSortMenu() {\r\n const T = this.T;\r\n const Ts = [\r\n T.noSort,\r\n T.asc,\r\n T.desc,\r\n ];\r\n\r\n const ta = this.sort;\r\n const items: MiOptions[] = tableColSort.map((s,i) => {\r\n return {\r\n tag: 'radio',\r\n label: Ts[i]!,\r\n checked: ta === s,\r\n onclick: () => {\r\n this.setModelProperty('sort', s);\r\n }\r\n };\r\n });\r\n return items;\r\n }\r\n #createAlignMenu() {\r\n const T = this.T;\r\n const Ts = [\r\n T.startAlign,\r\n T.endAlign,\r\n T.centerAlign,\r\n T.justifyAlign\r\n ];\r\n const ta = this.align;\r\n const items: MiOptions[] = tableColAlign.map((a,i) => {\r\n return {\r\n tag: 'radio',\r\n label: Ts[i]!,\r\n checked: ta === a,\r\n onclick: () => {\r\n this.setModelProperty('align', a);\r\n }\r\n };\r\n });\r\n return items;\r\n }\r\n #showWidthPopup() {\r\n const $setter = document.createElement(TB.tableColWidthSetterTagName);\r\n $setter.show(this);\r\n }\r\n // #endregion\r\n\r\n // #region 鼠标点击\r\n handleClick(e: MouseEvent) {\r\n const $t = e.target as HTMLElement;\r\n if ($t === this.$aggBtn) {\r\n this.#showAggMenu();\r\n }\r\n else if ($t === this.$menuBtn) {\r\n this.#showMenu();\r\n }\r\n else if (e.target === this.$lbl) {\r\n this.#sort();\r\n }\r\n else if (this.$btns?.includes($t)) {\r\n const i = this.$btns.indexOf($t);\r\n const func = this.model?.btns?.[i]?.onclick;\r\n func?.(this, $t);\r\n }\r\n }\r\n\r\n #sort() {\r\n let s = this.sort as TableColSort;\r\n const i = tableColSort.indexOf(s);\r\n \r\n s = tableColSort[i + 1] ?? tableColSort[0];\r\n this.setModelProperty('sort', s);\r\n }\r\n // #endregion\r\n\r\n get T() { return TB.getTexts(this); };\r\n}\r\n\r\n// #region 通知上级\r\nexport interface NoticeOfCol {\r\n colAdd?: boolean; \r\n colDel?: boolean;\r\n colWidth?: boolean;\r\n colSort?: boolean;\r\n colAgg?: boolean;\r\n colHide?: boolean;\r\n colRefresh?: boolean;\r\n\r\n $col: TableCol;\r\n}\r\nexport interface ColNoticeReceiver {\r\n notify: (msg: NoticeOfCol) => void;\r\n}\r\ntype ColParentElement = HTMLElement & ColNoticeReceiver;\r\n// #endregion","import type { TableList } from \"./60-list\";\r\nimport type { TableRow } from \"./16-row\";\r\nimport { TableCol } from \"./20-col\";\r\nimport { TableColGroup } from \"./22-colgroup\";\r\nimport * as TB from './00-base';\r\nimport type {TableColHeadOrTail} from './46-tht-options';\r\n\r\nexport class Snapshot {\r\n constructor($t: TableList) {\r\n this.$t = $t;\r\n }\r\n $t: TableList;\r\n\r\n // #region 列\r\n get $startColumns(): TableCol[] {\r\n return this.#startCols ??= Array.from(this.$t.$colStartCols.querySelectorAll(TB.tableColTagName));\r\n }\r\n #startCols?: TableCol[];\r\n\r\n get $startColumnsVisible(): TableCol[] {\r\n return this.#startColsVisible ??= this.$startColumns.filter($c => $c.visible);\r\n }\r\n #startColsVisible?: TableCol[];\r\n\r\n get $middleColumns(): TableCol[] {\r\n return this.#middleCols ??= Array.from(this.$t.$colMiddleCols.querySelectorAll(TB.tableColTagName));\r\n }\r\n #middleCols?: TableCol[];\r\n\r\n get $middleColumnsVisible(): TableCol[] {\r\n return this.#middleColsVisible ??= this.$middleColumns.filter($c => $c.visible);\r\n }\r\n #middleColsVisible?: TableCol[];\r\n\r\n get $endColumns(): TableCol[] {\r\n return this.#endCols ??= Array.from(this.$t.$colEndCols.querySelectorAll(TB.tableColTagName));\r\n }\r\n #endCols?: TableCol[];\r\n\r\n get $endColumnsVisible(): TableCol[] {\r\n return this.#endColsVisible ??= this.$endColumns.filter($c => $c.visible);\r\n }\r\n #endColsVisible?: TableCol[];\r\n\r\n get $columns(): TableCol[] {\r\n return this.#cols ??= Array.from(this.$t.querySelectorAll(TB.tableColTagName));\r\n }\r\n #cols?: TableCol[];\r\n\r\n get $columnsVisible(): TableCol[] {\r\n return this.#colsVisible ??= this.$columns.filter(c => c.visible);\r\n }\r\n #colsVisible?: TableCol[];\r\n\r\n get $columnsNeedAgg(): TableCol[] {\r\n return this.#colsNeedAgg ??= this.$columnsVisible.filter(c => c.agg);\r\n }\r\n #colsNeedAgg?: TableCol[];\r\n\r\n get $columnsWantSort(): TableCol[] {\r\n return this.#colsWantSort ??= this.$columnsVisible.filter(c => c.sort);\r\n }\r\n #colsWantSort?: TableCol[];\r\n // #endregion\r\n\r\n // #region 头和尾\r\n get $columnHeads(): TableColHeadOrTail[] {\r\n return this.#colHeads ??= Array.from(this.$t.$colHead.children) as TableColHeadOrTail[];\r\n }\r\n #colHeads?: TableColHeadOrTail[];\r\n\r\n get $columnHeadsVisible(): TableColHeadOrTail[] {\r\n return this.#colHeadsVisible ??= this.$columnHeads.filter($c => !$c.hidden);\r\n }\r\n #colHeadsVisible?: TableColHeadOrTail[];\r\n\r\n get $columnTails(): TableColHeadOrTail[] {\r\n return this.#colTails ??= Array.from(this.$t.$colTail.children) as TableColHeadOrTail[];\r\n }\r\n #colTails?: TableColHeadOrTail[];\r\n\r\n get $columnTailsVisible(): TableColHeadOrTail[] {\r\n return this.#colTailsVisible ??= this.$columnTails.filter($c => !$c.hidden);\r\n }\r\n #colTailsVisible?: TableColHeadOrTail[];\r\n // #endregion\r\n\r\n // #region 行\r\n get $rows(): TableRow[] {\r\n return this.#rows ??= Array.from(this.$t.$rows.querySelectorAll(TB.tableRowTagName));\r\n }\r\n #rows?: TableRow[];\r\n\r\n get $rowsActive(): TableRow[] {\r\n return this.#rowsActive ??= this.$rows.filter($row => $row.active);\r\n }\r\n #rowsActive?: TableRow[];\r\n // #endregion\r\n\r\n // #region 列组\r\n /**\r\n * 顶层 column 和 group\r\n */\r\n get $visibleTopColumnsAndGroups(): (TableCol | TableColGroup)[] {\r\n if (!this.#visibleTopColsAndGroups) {\r\n this.#visibleTopColsAndGroups = [];\r\n const tmp = this.#visibleTopColsAndGroups;\r\n const $colss = [this.$t.$colStartCols, this.$t.$colMiddleCols, this.$t.$colEndCols];//所有的col和colGroup都在cols中。\r\n for (const $cols of $colss) {\r\n for (const $c of $cols.children) {\r\n if ($c instanceof TableCol && $c.visible) {\r\n tmp.push($c);\r\n }\r\n else if ($c instanceof TableColGroup && $c.visible) {\r\n tmp.push($c);\r\n }\r\n }\r\n }\r\n }\r\n return this.#visibleTopColsAndGroups;\r\n }\r\n #visibleTopColsAndGroups?: (TableCol | TableColGroup)[];\r\n\r\n /**\r\n * 所有可见列所属的 group 的最大 level\r\n */\r\n get groupsMaxTier(): number {\r\n if (this.#maxTier === undefined) {\r\n const tiers = this.$columnsVisible.map($c => $c.parentElement).filter($c => $c instanceof TableColGroup).map(c => c.tier);\r\n if (tiers.length === 0) {\r\n this.#maxTier = 0;\r\n }\r\n else {\r\n this.#maxTier = Math.max(...tiers);\r\n }\r\n }\r\n return this.#maxTier;\r\n }\r\n #maxTier?: number;\r\n // #endregion\r\n}\r\n","import * as M from '@gzmjs/mvvm';\r\nimport * as TB from './00-base';\r\nimport * as TR from './16-row';\r\nimport * as THT from './46-tht-options';\r\n\r\n/**\r\n * 这是一个基类\r\n */\r\nexport abstract class TableColHeadTailBase<T extends M.ViewModel<M.ViewElement<T>>> extends M.ViewElement<T> implements THT.TableColHeadOrTail {\r\n // #region 子元素\r\n protected _createUI(): void {}\r\n\r\n get $agg(): HTMLElement {\r\n return this.#agg ??= document.createElement(TB.tableAggTagName);\r\n }\r\n #agg?: HTMLElement; \r\n // #endregion\r\n\r\n // #region 父元素\r\n connectedCallback() {\r\n if (this.$p === this.parentElement) return;\r\n this.#checkUnique();\r\n this._createUI();\r\n\r\n this.$p = this.parentElement as HTMLElement & THT.TableHeadTailBridge;\r\n this.$p.notifyConnected(this);\r\n //console.debug(`grid fixed ${this.tagName} connected.\\n`); \r\n }\r\n $p?: HTMLElement & THT.TableHeadTailBridge;//父元素,在 disconnectedCallback() 中使用\r\n\r\n disconnectedCallback() {\r\n if (!this.parentElement && this.$p) {\r\n this._clear();\r\n this.$agg.remove();\r\n this.$p.notifyDisconnected(this);\r\n this.$p = void 0;\r\n }\r\n }\r\n /**\r\n * 为了简化一种只允许在 grid 存在一个\r\n * 否则 findInRow() 就会非常复杂!\r\n */ \r\n #checkUnique() {\r\n const root = this.getRootNode() as ShadowRoot; \r\n if (root.querySelectorAll(this.tagName).length > 1) {\r\n throw new Error(`grid already has ${this.tagName}`);\r\n }\r\n }\r\n \r\n protected _clear() {}\r\n // #endregion\r\n\r\n // #region 属性\r\n get width() {\r\n return '36px';\r\n }\r\n get visible() {\r\n const $p = this.$p;\r\n if (!$p) return false;\r\n return !(this.hidden || $p.hidden);\r\n } \r\n get dataAware() {\r\n return false; //数据相关的,默认false,即无论行绑定什么数据都无所谓。 \r\n }\r\n _hidden_set() {\r\n this.$agg.hidden = this.hidden;\r\n this.$p?.notifyHide(this);\r\n }\r\n // #endregion\r\n\r\n // #region 行\r\n createInRow(): HTMLElement {\r\n return document.createElement(this.rowTagName);\r\n }\r\n /**\r\n * dataAware = true 时会被调用,由子类重写。\r\n */\r\n refresh($row: TR.TableRow, $headOrTail: HTMLElement | null): void {\r\n void $row;\r\n void $headOrTail;\r\n }\r\n\r\n findInRow<InRow extends HTMLElement>($row: TR.TableRow): InRow | null {\r\n return $row.querySelector<InRow>(this.rowTagName);\r\n }\r\n getAllInRow<InRow extends HTMLElement>(): InRow[] {\r\n const root = this.getRootNode();\r\n if (!root) return [];\r\n return Array.from((root as ShadowRoot).querySelectorAll(this.rowTagName));\r\n }\r\n\r\n abstract get rowTagName(): string;\r\n // #endregion\r\n}\r\n","import * as B from '@gzmjs/ui-basic';\r\nimport * as M from '@gzmjs/mvvm';\r\nimport * as TB from './00-base';\r\nimport * as THT from './47-head-tail';\r\nimport type { TableRow } from './16-row';\r\nimport type { TableList } from './60-list';\r\n\r\nexport interface TableColCheckOptions extends M.ViewModel<TableColCheckbox> {\r\n readonly tagName: typeof TB.tableColCheckTagName;\r\n\r\n rowsCheckChanged?: (checked: boolean) => void;\r\n rowCheckChanged?: ($row: TableRow, checked: boolean) => void;\r\n}\r\nconst mutableAttributes = ['hidden'] as const;\r\n@B.defineElement({tagName:TB.tableColCheckTagName, mutableAttributes})\r\nexport class TableColCheckbox extends THT.TableColHeadTailBase<TableColCheckOptions> implements B.AttributeHandlers<typeof mutableAttributes[number]> {\r\n $chk?: HTMLInputElement;\r\n\r\n _createUI() {\r\n const root = this.getRootNode() as ShadowRoot;\r\n root.addEventListener('change', this.#changeHandler);\r\n\r\n if (!this.$chk) {\r\n const $chk = this.$chk = document.createElement('input');\r\n $chk.type = 'checkbox';\r\n $chk.name = '0';//没有意义,为了让 edge 不警告\r\n\r\n //label 的作用是为了让 checkbox 与旁边列的文字对齐\r\n const lbl = document.createElement('label');\r\n lbl.title = this.T.toggleCheck;\r\n lbl.append($chk);\r\n this.append(lbl);\r\n }\r\n }\r\n\r\n #changeHandler = (e: Event) => {\r\n const $et = e.target as HTMLInputElement;\r\n const checked = $et.checked;\r\n\r\n const $col = $et.closest(TB.tableColCheckTagName)\r\n if ($col) {\r\n const $tl = $col.closest(TB.tableListTagName) as TableList;\r\n if ($tl) {\r\n $tl.createSnapshot().$rows.forEach($row => $row.setModelProperty('checked', checked));\r\n this.model?.rowsCheckChanged?.(checked);\r\n }\r\n return;\r\n }\r\n\r\n const $rc = $et.closest(TB.tableRowCheckTagName) as TableRowCheckbox;\r\n if ($rc) {\r\n const $row = $rc.closest(TB.tableRowTagName) as TableRow;\r\n if ($row) {\r\n $row.setModelProperty('checked', checked);\r\n this.model?.rowCheckChanged?.($row, checked);\r\n }\r\n }\r\n };\r\n\r\n protected _clear() {\r\n const root = this.$p?.getRootNode() as ShadowRoot;\r\n root?.removeEventListener('change', this.#changeHandler);\r\n }\r\n\r\n get rowTagName() {\r\n return TB.tableRowCheckTagName;\r\n }\r\n\r\n get T() { return TB.getTexts(this); };\r\n}\r\n\r\n/**\r\n * 由 grid-col-check 为每一行生成\r\n */\r\n@B.defineElement({tagName: TB.tableRowCheckTagName})\r\nexport class TableRowCheckbox extends HTMLElement {\r\n constructor() {\r\n super()\r\n \r\n const $chk = this.$chk = document.createElement('input'); \r\n $chk.type = 'checkbox';\r\n $chk.name = '1';//没有意义,为了让 edge 不警告\r\n }\r\n readonly $chk: HTMLInputElement;\r\n\r\n connectedCallback() {\r\n this.append(this.$chk);\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [TB.tableColCheckTagName]: TableColCheckbox;\r\n [TB.tableRowCheckTagName]: TableRowCheckbox;\r\n }\r\n}\r\n","import * as B from '@gzmjs/ui-basic';\r\nimport * as M from '@gzmjs/mvvm';\r\nimport * as TB from './00-base';\r\nimport * as THT from './47-head-tail';\r\n\r\nexport interface TableColSerialNoOptions extends M.ViewModel<TableColSerialNo> {\r\n readonly tagName: typeof TB.tableColSerialTagName;\r\n}\r\nconst mutableAttributes = ['hidden'] as const;\r\n/**\r\n * 列头显示行号,意义不大,因为宽度必须固定,当行数太大的时候会显示不下!\r\n */\r\n@B.defineElement({tagName: TB.tableColSerialTagName, mutableAttributes})\r\nclass TableColSerialNo extends THT.TableColHeadTailBase<TableColSerialNoOptions> implements B.AttributeHandlers<typeof mutableAttributes[number]> {\r\n\r\n get rowTagName() {\r\n return TB.tableRowSerialTagName;\r\n }\r\n _createUI() {\r\n this.textContent = '#';\r\n }\r\n get width() {\r\n return 'minmax(36px, auto)';\r\n }\r\n}\r\n/**\r\n * 没有任何功能,就不用定义一个类了\r\n *//*\r\n@ELE.defineElement({tagName: TB.tableRowSerialTagName})\r\nclass TableRowSerialNo extends HTMLElement {\r\n}*/","import * as B from '@gzmjs/ui-basic';\r\nimport * as M from '@gzmjs/mvvm';\r\nimport * as TB from './00-base';\r\nimport * as THT from './47-head-tail';\r\nimport type { TableList } from './60-list';\r\nimport type { TableRow } from './16-row';\r\n\r\nexport interface TableColActionOptions extends M.ViewModel<TableColAction> {\r\n readonly tagName: typeof TB.tableColActionTagName;\r\n label?: string;\r\n \r\n actions: Record<string, (ctx: {$row: TableRow, $rowAction: TableRowAction, $btn: HTMLButtonElement}) => void>;\r\n\r\n rowActionConfig?: ($row: TableRow, $rowAction: TableRowAction, btns: Record<string, HTMLButtonElement>) => void;\r\n}\r\nconst mutableAttributes = ['hidden'] as const;\r\n/**\r\n * 按钮操作列\r\n */\r\n@B.defineElement({tagName: TB.tableColActionTagName, mutableAttributes})\r\nclass TableColAction extends THT.TableColHeadTailBase<TableColActionOptions> implements B.AttributeHandlers<typeof mutableAttributes[number]> {\r\n get rowTagName() {\r\n return TB.tableRowActionTagName;\r\n }\r\n\r\n createInRow(): HTMLElement {\r\n const $ret = super.createInRow() as TableRowAction;\r\n const acts = this.actions;\r\n if (acts) {\r\n for (const action in acts) {\r\n const $btn = B.createTxtBtn(action);\r\n $ret.append($btn);\r\n $ret.btns[action] = $btn;\r\n }\r\n }\r\n return $ret;\r\n }\r\n\r\n refresh($row: TableRow, $headOrTail = this.findInRow<HTMLElement>($row)) {//只有 dataAware = true 时才会被调用\r\n if (!$headOrTail) return;\r\n const $inRow = $headOrTail as TableRowAction;\r\n this.model?.rowActionConfig?.($row, $inRow, $inRow.btns);\r\n }\r\n\r\n // #region 属性\r\n get width() {\r\n return 'auto';\r\n }\r\n get dataAware() {\r\n return true; //数据改变可能导致按钮显示发生变化!导致 refresh 函数被调用\r\n }\r\n\r\n actions?: Record<string, (ctx: {$row: TableRow, $rowAction: TableRowAction, $btn: HTMLButtonElement}) => void>;\r\n\r\n get label(): string {return this.textContent;}\r\n set label(v: string) {this.textContent = v;}\r\n // #endregion\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [TB.tableColActionTagName]: TableColAction;\r\n }\r\n}\r\n\r\n/**\r\n * 由 grid-col-action 为每一行生成\r\n */\r\n@B.defineElement({tagName: TB.tableRowActionTagName})\r\nclass TableRowAction extends HTMLElement {\r\n /**\r\n * 为了在 GridColAction.refresh() 中触发事件用,从功能上来说没有必要定义这个属性,可以临时生成 btns 对象。\r\n * 但是在触发事件时读取 button.innerText,导致在 _createRowsFromDataSource() 中调用时回流。\r\n * 因为按钮刚刚生成还未绘制,读取 innerText 就会回流,所以要避免读取 innerText。\r\n * 于是就在这里定义了这个属性。\r\n */\r\n readonly btns: Record<string, HTMLButtonElement> = {};\r\n\r\n handleClick(e: MouseEvent, $list: TableList) {\r\n const $btn = e.target as HTMLButtonElement;\r\n if (!B.isTxtBtn($btn)) return;\r\n\r\n const $row = this.closest(TB.tableRowTagName);\r\n if (!$row) return;\r\n\r\n const $ht = $list.querySelector(TB.tableColActionTagName);\r\n if (!$ht) return;\r\n\r\n const acts = $ht.model?.actions;\r\n if (!acts) return;\r\n\r\n const action = $btn.textContent;\r\n const func = acts[action];\r\n func?.({\r\n $row, \r\n $rowAction: this, \r\n $btn\r\n });\r\n }\r\n}","import * as B from '@gzmjs/ui-basic';\r\nimport * as M from '@gzmjs/mvvm';\r\nimport * as TB from './00-base';\r\nimport * as THT from './47-head-tail';\r\nimport type { TableList } from './60-list';\r\nimport type { TableRow } from './16-row';\r\n\r\nexport interface TableColMenuOptions extends M.ViewModel<TableColMenu> {\r\n readonly tagName: typeof TB.tableColMenuTagName;\r\n rowMenuClick?: ($row: TableRow, $ht: TableRowMenu, $btn: HTMLElement) => void;\r\n}\r\nconst mutableAttributes = ['hidden'] as const;\r\n/**\r\n * 在每一行显示一个菜单按钮,点击后弹出菜单\r\n */\r\n@B.defineElement({tagName:TB.tableColMenuTagName, mutableAttributes})\r\nclass TableColMenu extends THT.TableColHeadTailBase<TableColMenuOptions> implements B.AttributeHandlers<typeof mutableAttributes[number]> {\r\n get rowTagName() {\r\n return TB.tableRowMenuTagName;\r\n }\r\n createInRow() {\r\n const $btn = B.createTxtBtn('⋮');\r\n const $ret = super.createInRow();\r\n $ret.append($btn);\r\n return $ret;\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [TB.tableColMenuTagName]: TableColMenu;\r\n }\r\n}\r\n\r\n@B.defineElement({tagName: TB.tableRowMenuTagName})\r\nclass TableRowMenu extends HTMLElement {\r\n handleClick(e: MouseEvent, $list: TableList): void {\r\n const $btn = e.target as HTMLElement;\r\n if (!B.isTxtBtn($btn)) return;\r\n\r\n const $row = this.closest(TB.tableRowTagName);\r\n if (!$row) {\r\n return;\r\n }\r\n\r\n const $cm = $list.querySelector(TB.tableColMenuTagName);\r\n if (!$cm) {\r\n return;\r\n }\r\n\r\n $cm.model?.rowMenuClick?.($row, this, $btn);\r\n }\r\n}","import {defineElement} from '@gzmjs/ui-basic';\r\nimport * as M from '@gzmjs/mvvm';\r\nimport * as TB from './00-base';\r\nimport * as TR from './16-row';\r\nimport type { Snapshot } from './35-snapshot';\r\nimport type { TableCol } from './20-col';\r\nimport type { TableList } from './60-list';\r\n\r\ninterface TableRowsOptions extends M.ViewListModel<TR.TableRowOptions, TR.TableRow, TableRows> {\r\n tagName?: typeof TB.tableRowsTagName;\r\n}\r\n\r\n@defineElement({tagName: TB.tableRowsTagName})\r\nexport class TableRows extends M.ViewListElement<TR.TableRowOptions, TR.TableRow, TableRowsOptions> {\r\n // #region ViewListElement\r\n protected _getViewItemTagName(): string {\r\n return TB.tableRowTagName;\r\n }\r\n public [M.handleModelEvent](source: unknown, evt: M.ModelEvent): boolean {\r\n if (source === this.modelList) {\r\n return new RowsModelListEventHandler(this, source).handle(evt);\r\n }\r\n return super[M.handleModelEvent](source, evt);\r\n }\r\n // #endregion\r\n\r\n /**\r\n * 根据数据源排序\r\n */\r\n sortDataSource(ss: Snapshot): boolean {\r\n const ds = this.modelList;\r\n if (!ds || ds.length === 0) {\r\n return false;\r\n }\r\n const $cols = ss.$columnsWantSort;\r\n if ($cols.length === 0) {\r\n return false;\r\n }\r\n \r\n const func = getSortFunc($cols); \r\n ds.sort(func);\r\n\r\n if (M.modelEventPaused in ds) {\r\n //上面的排序触发事件。\r\n }\r\n else {\r\n //手工触发事件\r\n const ev = new M.ModelListSortEvent<TR.TableRowOptions>(ds);\r\n this[M.handleModelEvent](ds, ev);\r\n }\r\n\r\n return true;\r\n }\r\n}\r\n\r\nclass RowsModelListEventHandler extends M.ModelListEventHandler<TR.TableRowOptions, TR.TableRow, TableRowsOptions> {\r\n constructor($rows: TableRows, source: unknown) {\r\n super($rows, source);\r\n this.$rows = $rows;\r\n this.$list = $rows.parentElement as TableList;\r\n this.#ss = this.$list.createSnapshot();\r\n }\r\n readonly $rows: TableRows;\r\n readonly $list: TableList;\r\n #ss: Snapshot;\r\n #refreshFunc?: ($r: TR.TableRow, rd: boolean) => void;\r\n\r\n private refreshRow($row: TR.TableRow): void {\r\n const rf = (this.#refreshFunc ??= this.$list.getRowRefreshFunc(this.#ss));\r\n rf($row, true);\r\n }\r\n private sortItem(item: TR.TableRowOptions) {\r\n const $cols = this.#ss.$columnsWantSort;\r\n if ($cols.length === 0) return;\r\n\r\n //sortItem 在 proxy 中实现\r\n const ml = this.$vl.modelList;\r\n if ('sortItem' in ml && typeof(ml.sortItem) === 'function') {\r\n const func = getSortFunc($cols);\r\n ml.sortItem(item, func);\r\n }\r\n }\r\n\r\n protected _createEleItem(item: TR.TableRowOptions) : TR.TableRow {\r\n const $ret = super._createEleItem(item);\r\n this.refreshRow($ret);\r\n return $ret;\r\n }\r\n protected _refresh($row: TR.TableRow) : void {\r\n this.refreshRow($row);\r\n }\r\n\r\n protected _insert(arg: M.ModelItemsInsertEvent<TR.TableRowOptions>): boolean {\r\n const ret = super._insert(arg);\r\n this.$list.refreshAggs(this.#ss);\r\n arg.items.forEach(item => this.sortItem(item));\r\n return ret;\r\n }\r\n protected _update(arg: M.ModelItemUpdateEvent<TR.TableRowOptions>): boolean {\r\n const ret = super._update(arg);\r\n this.$list.refreshAggs(this.#ss); \r\n this.sortItem(arg.item);\r\n return ret;\r\n }\r\n protected _delete(arg: M.ModelItemsDeleteEvent<TR.TableRowOptions>): boolean {\r\n const ret = super._delete(arg);\r\n this.$list.refreshAggs(this.#ss);\r\n return ret;\r\n }\r\n protected _replace(arg: M.ModelItemReplaceEvent<TR.TableRowOptions>): boolean {\r\n const ret = super._replace(arg);\r\n this.$list.refreshAggs(this.#ss);\r\n this.sortItem(arg.item);\r\n return ret;\r\n }\r\n protected _reset(arg: M.ModelListResetEvent<TR.TableRowOptions>): boolean {\r\n const ret = super._reset(arg);\r\n this.$list.refreshAggs(this.#ss);\r\n if (this.$list.$table.autoSort) {\r\n this.$rows.sortDataSource(this.#ss)\r\n }\r\n return ret;\r\n }\r\n protected _sort(arg: M.ModelListSortEvent<TR.TableRowOptions>): boolean {\r\n return super._sort(arg);\r\n }\r\n}\r\n\r\nfunction getSortFunc($cols: TableCol[]) {\r\n //把所有列中的 valueMember 放到一个一维数组中。\r\n const vms = $cols.flatMap($c => $c.valueMember?.member);\r\n if (vms.length === 0) {\r\n //没有任何排序字段,返回一个恒等函数。\r\n return () => 0;\r\n }\r\n \r\n //与 vms 一一对应,每一个 vm 字段采用的是正序还是倒序, 1 是正序,-1 是倒序。\r\n const ads = $cols.flatMap($c => {\r\n const ad = $c.isAscSort ? 1 : -1;\r\n return Array.from({length: $c.valueMember?.length ?? 0}, () => ad);\r\n });\r\n \r\n return (r1: TR.TableRowOptions, r2: TR.TableRowOptions) => {\r\n for (let i = 0; i < vms.length; i++) {\r\n const vm = vms[i]!;\r\n const ad = ads[i]!;\r\n\r\n const v1 = Reflect.get(r1.data, vm);\r\n const v2 = Reflect.get(r2.data, vm);\r\n if (v1 < v2) {\r\n return -1 * ad;\r\n }\r\n else if (v1 > v2) {\r\n return 1 * ad;\r\n }\r\n //相等,进入 for 的下一次循环,也就是下一个字段\r\n }\r\n return 0;\r\n };\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [TB.tableRowsTagName]: TableRows;\r\n }\r\n}","import {defineElement} from '@gzmjs/ui-basic';\r\nimport * as TB from './00-base';\r\nimport type { Snapshot } from './35-snapshot';\r\n\r\n@defineElement({tagName: TB.tableAggsTagName})\r\nexport class TableAggs extends HTMLElement {\r\n // #region 子元素\r\n constructor() {\r\n super();\r\n this.$start = document.createElement(TB.tableAggStartTagName);\r\n this.$middle = document.createElement(TB.tableAggMiddleTagName);\r\n this.$end = document.createElement(TB.tableAggEndTagName);\r\n }\r\n readonly $start: HTMLElement;\r\n readonly $middle: HTMLElement;\r\n readonly $end: HTMLElement;\r\n\r\n get $grid() {\r\n const ret = this.parentElement?.parentElement;//直接上级是 grid-list,然后才是 grid-view\r\n if (ret?.tagName === TB.tableViewTagName) {\r\n return ret;\r\n }\r\n return null;\r\n }\r\n connectedCallback() {\r\n if (this.childElementCount > 0) return; //已经有子元素了,说明已经连接过了。\r\n this.append(this.$start, this.$middle, this.$end);\r\n }\r\n // #endregion\r\n\r\n // #region 数据展示\r\n refresh(ss: Snapshot) {\r\n let $aggs = [...ss.$columnHeads, ...ss.$startColumns].map($x => $x.$agg);\r\n this.$start.innerHTML = '';\r\n this.$start.append(...$aggs);\r\n\r\n this.$middle.innerHTML = '';\r\n this.$middle.append(...ss.$middleColumns.map($x => $x.$agg));\r\n\r\n $aggs = [...ss.$endColumns, ...ss.$columnTails].map($x => $x.$agg);\r\n this.$end.innerHTML = '';\r\n this.$end.append(...$aggs);\r\n }\r\n // #endregion\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [TB.tableAggsTagName]: TableAggs;\r\n }\r\n}","import * as B from '@gzmjs/ui-basic';\r\nimport * as M from '@gzmjs/mvvm';\r\nimport * as TB from './00-base';\r\nimport * as TC from './20-col';\r\nimport * as TG from './22-colgroup';\r\nimport type { TableList } from './60-list';\r\n\r\ninterface TcsOptions extends M.ViewListModel<TC.TableColOptions, TC.TableCol, TableCols> {\r\n tagName?: typeof TB.tableColsTagName\r\n}\r\n\r\n@B.defineElement({tagName: TB.tableColsTagName})\r\nexport class TableCols extends M.ViewGroupElement<TC.TableColOptions, TC.TableCol, TcsOptions> implements TG.ColGroupNoticeReceiver {\r\n\r\n // #region ViewGroupElement\r\n public [M.handleModelEvent](source: unknown, evt: M.ModelEvent): boolean {\r\n const $l = this.closest(TB.tableListTagName) as TableList;\r\n const old = $l.colLayoutPaused;\r\n $l.colLayoutPaused = true;\r\n const ret = super[M.handleModelEvent](source, evt);\r\n $l.colLayoutPaused = old;\r\n return ret;\r\n }\r\n\r\n protected _getViewItemTagName(): string {\r\n return TB.tableColTagName;\r\n }\r\n\r\n protected readonly groupElementTagName: string = TB.tableColGroupTagName;\r\n\r\n /**\r\n * 同时还实现了生成 group 元素的功能\r\n * 无需重写 _createGroupElement 和 _putGroupElement\r\n */\r\n protected _tryGetGroupElement(vm: TC.TableColOptions): HTMLElement | null {\r\n const group = this.getGroupValueFromModel(vm);\r\n if (!group) return this; //没有上级 group,这个就是上级元素。\r\n\r\n const groupChain = this.#getGroupByLabel(group);\r\n groupChain.forEach((gc, i) => {\r\n let $g = gc.$group;\r\n if (!$g) {\r\n $g = gc.$group = document.createElement(TB.tableColGroupTagName);\r\n $g.label = gc.label;\r\n if (i === 0) {\r\n this.append($g);\r\n }\r\n else {\r\n groupChain[i-1]!.$group!.append($g);\r\n }\r\n }\r\n });\r\n return groupChain.pop()!.$group!;\r\n }\r\n\r\n #getGroupByLabel(group: string) {\r\n const sa = group.split('/');\r\n const ret: {label: string, $group?: TG.TableColGroup}[] = sa.map(s => {\r\n return {\r\n label: s,\r\n $group: void 0\r\n };\r\n });\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n let $p: HTMLElement = this;\r\n for (const r of ret) {\r\n let found = false;\r\n for (const $c of $p.children) {\r\n if ($c instanceof TG.TableColGroup) {\r\n if ($c.label === r.label) {\r\n found = true;\r\n $p = r.$group = $c;\r\n break;\r\n }\r\n }\r\n }\r\n if (!found) {\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n // #endregion\r\n\r\n // #region ColGroupNoticeReceiver\r\n notify(n: TC.NoticeOfCol | TG.NoticeOfColGroup) {\r\n const $list = this.closest(TB.tableListTagName) as TG.ColGroupNoticeReceiver\r\n $list?.notify(n);\r\n }\r\n // #endregion\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [TB.tableColsTagName]: TableCols;\r\n }\r\n}","import * as B from '@gzmjs/ui-basic';\r\nimport * as M from '@gzmjs/mvvm';\r\nimport * as TB from './00-base';\r\nimport * as THT from './46-tht-options';\r\nimport {TableColHeadTailBase} from './47-head-tail';\r\nimport type { TableList } from './60-list';\r\n\r\nexport interface TableColHeadOptions extends M.ViewListModel<THT.ThtOptions, TableColHeadTailBase<THT.ThtOptions>, TableColHead> {\r\n tagName?: typeof TB.tableColHeadTagName;\r\n}\r\n\r\n@B.defineElement({tagName:TB.tableColHeadTagName})\r\nexport class TableColHead extends M.ViewListElement<THT.ThtOptions, TableColHeadTailBase<THT.ThtOptions>, TableColHeadOptions> implements THT.TableHeadTailBridge {\r\n\r\n // #region ViewListElement\r\n public [M.handleModelEvent](source: unknown, evt: M.ModelEvent): boolean {\r\n const $l = this.closest(TB.tableListTagName) as TableList;\r\n const old = $l.colLayoutPaused;\r\n $l.colLayoutPaused = true;\r\n const ret = super[M.handleModelEvent](source, evt);\r\n $l.colLayoutPaused = old;\r\n return ret;\r\n }\r\n\r\n protected _getViewItemTagName(options: THT.ThtOptions): string {return options.tagName;}\r\n // #endregion\r\n \r\n get $list(): Element & THT.TableHeadTailNoticeReceiver | null {\r\n return this.closest(TB.tableListTagName) as Element & THT.TableHeadTailNoticeReceiver;\r\n }\r\n\r\n // #region TableHeadTailBridge\r\n notifyHide($child: THT.TableColHeadOrTail) {\r\n this.$list?.notify({headHide:true,$head:$child});\r\n }\r\n notifyConnected($child: THT.TableColHeadOrTail) {\r\n this.$list?.notify({headAdd:true,$head:$child});\r\n }\r\n notifyDisconnected($child: THT.TableColHeadOrTail) {\r\n this.$list?.notify({headDel:true,$head:$child});\r\n }\r\n // #endregion\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [TB.tableColHeadTagName]: TableColHead;\r\n }\r\n}","import * as B from '@gzmjs/ui-basic';\r\nimport * as M from '@gzmjs/mvvm';\r\nimport * as TB from './00-base';\r\nimport * as THT from './46-tht-options';\r\nimport {TableColHeadTailBase} from './47-head-tail';\r\nimport type { TableList } from './60-list';\r\n\r\nexport interface TableColTailOptions extends M.ViewListModel<THT.ThtOptions, TableColHeadTailBase<THT.ThtOptions>, TableColTail> {\r\n tagName?: typeof TB.tableColTailTagName;\r\n}\r\n\r\n@B.defineElement({tagName:TB.tableColTailTagName})\r\nexport class TableColTail extends M.ViewListElement<THT.ThtOptions, TableColHeadTailBase<THT.ThtOptions>, TableColTailOptions> implements THT.TableHeadTailBridge {\r\n \r\n // #region ViewListElement\r\n public [M.handleModelEvent](source: unknown, evt: M.ModelEvent): boolean {\r\n const $l = this.closest(TB.tableListTagName) as TableList;\r\n const old = $l.colLayoutPaused;\r\n $l.colLayoutPaused = true;\r\n const ret = super[M.handleModelEvent](source, evt);\r\n $l.colLayoutPaused = old;\r\n return ret;\r\n }\r\n\r\n protected _getViewItemTagName(options: THT.ThtOptions): string {return options.tagName;}\r\n // #endregion\r\n\r\n get $list(): Element & THT.TableHeadTailNoticeReceiver | null {\r\n return this.closest(TB.tableListTagName) as Element & THT.TableHeadTailNoticeReceiver;\r\n }\r\n \r\n // #region TableHeadTailBridge\r\n notifyHide($child: THT.TableColHeadOrTail) {\r\n this.$list?.notify({tailHide:true,$tail:$child});\r\n }\r\n notifyConnected($child: THT.TableColHeadOrTail) {\r\n this.$list?.notify({tailAdd:true,$tail:$child});\r\n }\r\n notifyDisconnected($child: THT.TableColHeadOrTail) {\r\n this.$list?.notify({tailDel:true,$tail:$child});\r\n }\r\n // #endregion\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [TB.tableColTailTagName]: TableColTail;\r\n }\r\n}","import * as B from '@gzmjs/ui-basic';\r\nimport * as M from '@gzmjs/mvvm';\r\nimport * as TB from './00-base';\r\nimport { TableCol, type NoticeOfCol } from './20-col';\r\nimport { TableCell } from './10-cell';\r\nimport { Snapshot } from './35-snapshot';\r\nimport { TableRow } from './16-row';\r\nimport type { TableView } from './62-table';\r\nimport type { NoticeOfColGroup } from './22-colgroup';\r\nimport type { NoticeOfHead, NoticeOfTail, TableColHeadOrTail } from './46-tht-options';\r\n\r\n// 必须 import 才能正常测试\r\nimport './17-rows';\r\nimport './18-aggs';\r\nimport './25-cols';\r\nimport './48-col-head';\r\nimport './48-col-tail';\r\n\r\n@B.defineElement({tagName: TB.tableListTagName})\r\nexport class TableList extends HTMLElement {\r\n // #region 布局\r\n readonly $colStart = document.createElement(TB.tableColStartTagName);\r\n readonly $colMiddle = document.createElement(TB.tableColMiddleTagName);\r\n readonly $colEnd = document.createElement(TB.tableColEndTagName);\r\n\r\n readonly $colHead = document.createElement(TB.tableColHeadTagName);\r\n readonly $colTail = document.createElement(TB.tableColTailTagName);\r\n\r\n readonly $colStartCols = document.createElement(TB.tableColsTagName);\r\n readonly $colMiddleCols = document.createElement(TB.tableColsTagName);\r\n readonly $colEndCols = document.createElement(TB.tableColsTagName);\r\n\r\n readonly $rows = document.createElement(TB.tableRowsTagName);\r\n\r\n readonly $aggs = document.createElement(TB.tableAggsTagName);\r\n\r\n initLayout() {\r\n this.append(this.$colStart, this.$colMiddle, this.$colEnd, this.$rows, this.$aggs);\r\n\r\n //列\r\n this.$colStart.append(this.$colHead, this.$colStartCols);\r\n this.$colMiddle.append(this.$colMiddleCols);\r\n this.$colEnd.append(this.$colEndCols, this.$colTail);\r\n }\r\n // #endregion\r\n\r\n createSnapshot() {\r\n return new Snapshot(this);\r\n }\r\n getCellsByColKey(colKey: string): TableCell[] {\r\n return Array.from(this.querySelectorAll(`${TB.tableCellTagName}[col-key='${colKey}']`));\r\n }\r\n\r\n // #region 属性\r\n get $table(): TableView {return (this.getRootNode() as ShadowRoot).host as TableView;}\r\n // #endregion\r\n\r\n // #region 排序\r\n sortRows(ss = this.createSnapshot()) {\r\n const $t = this.$table;\r\n if ($t.autoSort) {\r\n this.$rows.sortDataSource(ss);\r\n }\r\n else {\r\n $t.model?.columnSort?.(ss.$columnsWantSort.map(x => x.model!), ss.$columnsWantSort);\r\n }\r\n }\r\n // #endregion\r\n\r\n // #region 聚合\r\n _calcAgg($col: TableCol) {\r\n const agg = $col.agg;\r\n if (agg) {\r\n this.showAggs(true);\r\n this.#doCalcAgg($col);\r\n }\r\n else {\r\n this.#hideAggsIfNotNeeded();\r\n }\r\n }\r\n showAggs(b: boolean) {\r\n this.$aggs.hidden = !b; //true - 要显示\r\n }\r\n #hideAggsIfNotNeeded(ss = this.createSnapshot()) {\r\n const $cols = ss.$columnsNeedAgg;\r\n if ($cols.length === 0 || !this.$rows.childElementCount) { //如果一行也没有就不要显示\r\n this.showAggs(false);\r\n return false; //说明没有 agg 需要计算\r\n }\r\n return $cols;\r\n }\r\n #doCalcAgg($col: TableCol, $t = this.$table) {\r\n if ($t.autoAgg) {\r\n $col.aggValue = this.#calcAggValueFromDataSource($col);\r\n }\r\n else {\r\n $t.model?.columnAgg?.($col.model!, $col);\r\n }\r\n }\r\n #calcAggValueFromDataSource($col: TableCol): M.ObjValue {\r\n const ds = this.$rows.modelList;\r\n if (!ds || ds.length === 0) {\r\n return new M.ObjValue(0);\r\n }\r\n\r\n const agg = $col.agg!;\r\n if (agg === 'count') {\r\n return new M.ObjValue(ds.length);\r\n }\r\n\r\n const func = Reflect.get(this.$table, agg);\r\n if (typeof func !== 'function') {\r\n return new M.ObjValue(void 0);\r\n }\r\n\r\n const vm = $col.valueMember?.member[0];\r\n if (!vm) return new M.ObjValue(void 0);\r\n\r\n const da = ds.map(r => Reflect.get(r.data, vm));\r\n const ret = func.call(this.$table, ...da);\r\n return new M.ObjValue(ret);\r\n }\r\n \r\n refreshAggs(ss = this.createSnapshot()) {\r\n const $needAgg = this.#hideAggsIfNotNeeded(ss);\r\n if (!$needAgg) {\r\n return;\r\n }\r\n this.showAggs(true);\r\n $needAgg.forEach($c => this.#doCalcAgg($c));\r\n }\r\n // #endregion\r\n\r\n // #region 通知\r\n #colId = 0;\r\n notify(n: NoticeOfCol | NoticeOfColGroup | NoticeOfHead | NoticeOfTail) {\r\n if ('colAdd' in n && n.colAdd) {\r\n if (n.$col.key) {\r\n //服务器端生成的 html 可能自带 key。\r\n }\r\n else {\r\n n.$col.key = (++this.#colId).toString(); //这个 id 与 css grid 布局中的列无关。\r\n }\r\n }\r\n else if ('colSort' in n && n.colSort) {\r\n let doSort = true;\r\n if (!this.$table.multiSort && n.$col.sort) {\r\n this.createSnapshot().$columnsWantSort.forEach($c => {\r\n if ($c !== n.$col) {\r\n $c.sort = '';\r\n doSort = false; //$c.sort='' 也会导致 _notify 被调用,但不满足上面的 n.$col.sort 条件。\r\n }\r\n });\r\n }\r\n if (!doSort) return;\r\n console.debug(`grid column ${n.$col.label} sort ${n.$col.sort}`);\r\n }\r\n this.#columnsMovement.push(n);\r\n if (this.colLayoutPaused) return;\r\n this.#layoutCols();\r\n }\r\n refreshAll() {\r\n this.#columnsMovement.push({all:true}); \r\n if (this.colLayoutPaused) return;\r\n this.#layoutCols();\r\n }\r\n\r\n get colLayoutPaused() {\r\n return this.#colLayoutPaused;\r\n }\r\n set colLayoutPaused(b: boolean) {\r\n b = !!b;\r\n if (!b) {\r\n this.#layoutCols();\r\n }\r\n /* 要等 #layoutCols() 执行完毕,因为 #layoutCols() 过程中可能又会添加入新的 #columnsMovement!\r\n 例如 col-group.setRow() 中会 this.hidden = true。这么做可以防止重入 #layoutCols() */\r\n this.#colLayoutPaused = b;\r\n }\r\n #colLayoutPaused = false;\r\n\r\n /**\r\n * 用来处理 #columnsMovement 中需要单独处理的事件。\r\n * 如列的删除,需要删除所有对应的单元格;列的隐藏,需要隐藏所有对应的单元格。\r\n * 组的删除和隐藏,因为涉及到多个列,所以不在这里处理。\r\n */\r\n #beforeLayout(cms: LayoutNotice[]): NoticeFlags {\r\n const ret: NoticeFlags = {};\r\n for (let i=0; i<cms.length; i++) {\r\n const m = cms[i];\r\n if (!m) continue;\r\n\r\n if ('colDel' in m && m.colDel) {\r\n this.#delColCells(m.$col);\r\n }\r\n else if ('colHide' in m && m.colHide) {\r\n this.#hiddenColCells(m.$col);\r\n }\r\n else if ('colRefresh' in m && m.colRefresh) {\r\n this.#colRefresh(m.$col);\r\n }\r\n else if ('colSort' in m && m.colSort) {\r\n this.sortRows();\r\n }\r\n else if ('colAgg' in m && m.colAgg) {\r\n this._calcAgg(m.$col);\r\n }\r\n else if ('headDel' in m && m.headDel) {\r\n //refreshRows() 无法删除每一行中对应的单元格\r\n this.#delHeadCells(m.$head);\r\n }\r\n else if ('tailDel' in m && m.tailDel) {\r\n //refreshRows() 无法删除每一行中对应的单元格\r\n this.#delTailCells(m.$tail);\r\n }\r\n Object.assign(ret, m);//用来记录 colAdd 之类的属性, $col、$group 之类的属性无所谓(可以互相覆盖)\r\n }\r\n return ret;\r\n }\r\n #afterLayout(): void {\r\n if (this.#columnsMovement.length > 0) {\r\n this.#layoutCols();\r\n }\r\n }\r\n /**\r\n * 用来记录 colLayoutPaused 期间发生的布局改变事件\r\n */\r\n #columnsMovement: LayoutNotice[] = [];\r\n\r\n #layoutCols(): void {\r\n const ss = this.createSnapshot();\r\n const cms = this.#columnsMovement;\r\n this.#columnsMovement = []; //#layoutCols 调用过程中可能会产生新的事件进入 #columnMovement\r\n const cm = this.#beforeLayout(cms);\r\n \r\n //cm 中一共 18 种情况\r\n //以下 14 个都是影响【列数】\r\n const col = cm.colAdd || cm.colDel || cm.colHide;\r\n const group = cm.groupAdd || cm.groupDel || cm.groupHide;\r\n const head = cm.headAdd || cm.headDel || cm.headHide;\r\n const tail = cm.tailAdd || cm.tailDel || cm.tailHide;\r\n\r\n if (cm.all) {\r\n this.#refreshColumns();\r\n }\r\n if (cm.all || col || group || head || tail || cm.colWidth) {\r\n this._setColumnsTemplate(ss);\r\n }\r\n if (cm.all || col || group) {\r\n this._layoutColumnGroup(ss)\r\n }\r\n if (cm.all || cm.colAdd || group || cm.headAdd || cm.tailAdd) {\r\n //head/tail 中记录了自己的 $agg,在 hidden 和 del 时直接就处理了,无需刷新。\r\n //col 中记录自己的 $agg,在 hidden 和 del 时直接就处理了,无需刷新。\r\n //group 中除了 groupAdd 之外都需要调用 refresh(),不过 groupAdd 会伴随 colAdd 事件,这里就不单独处理了。\r\n this.$aggs.refresh(ss);\r\n }\r\n if (cm.all || col || group || head || tail || cm.colWidth) {\r\n //影响 _stickHeads/Tails 就会影响固定行头和行尾,所以需要刷新\r\n this.#refreshRows(ss);\r\n }\r\n this.#afterLayout();\r\n }\r\n // #endregion\r\n\r\n // #region 布局变化\r\n #hiddenColCells($col: TableCol) {\r\n const hidden = !$col.visible;\r\n const $cells = this.getCellsByColKey($col.key!);\r\n $cells.forEach($cell => $cell.hidden = hidden);\r\n }\r\n #delColCells($col: TableCol) {\r\n const $cells = this.getCellsByColKey($col.key!);\r\n $cells.forEach($cell => $cell.remove());\r\n }\r\n #colRefresh($col: TableCol) {\r\n const $cells = this.getCellsByColKey($col.key!);\r\n $cells.forEach($cell => $col._setCellData($cell));\r\n }\r\n #delHeadCells($head: TableColHeadOrTail) {\r\n $head.getAllInRow().forEach($h => $h.remove());\r\n }\r\n #delTailCells($tail: TableColHeadOrTail) {\r\n $tail.getAllInRow().forEach($t => $t.remove());\r\n }\r\n _setColumnsTemplate(ss = this.createSnapshot()) {\r\n const $heads = ss.$columnHeadsVisible;\r\n let startSpan = $heads.length;\r\n\r\n const $startCols = ss.$startColumnsVisible;\r\n startSpan += $startCols.length;\r\n\r\n const $middleCols = ss.$middleColumnsVisible;\r\n const middleSpan = $middleCols.length;\r\n\r\n const $endCols = ss.$endColumnsVisible;\r\n let endSpan = $endCols.length;\r\n\r\n const $tails = ss.$columnTailsVisible;\r\n endSpan += $tails.length;\r\n\r\n const str = [...$heads, ...$startCols, ...$middleCols, ...$endCols, ...$tails].map($c => $c.width).join(' ');\r\n this.style.gridTemplateColumns = str;\r\n this.style.setProperty('--grid-start-span', startSpan.toString());\r\n this.style.setProperty('--grid-middle-span', middleSpan.toString());\r\n this.style.setProperty('--grid-end-span', endSpan.toString());\r\n \r\n void (startSpan ? this.removeAttribute('no-start') : this.setAttribute('no-start', ''));\r\n void (endSpan ? this.removeAttribute('no-end') : this.setAttribute('no-end', ''));\r\n console.debug('grid column layout - ' + str + ' - startSpan = ' + startSpan + ', middleSpan = ' + middleSpan + ', endSpan = ' + endSpan);\r\n }\r\n _layoutColumnGroup(ss = this.createSnapshot()) {\r\n //+1 因为 tier 是根据 group 计算的,而 group 下还有 column。 \r\n //+1 因为 css 中 start 从 1 开始。\r\n const end = ss.groupsMaxTier + 1 + 1;\r\n this.style.setProperty('--grid-col-end', end.toString());\r\n\r\n ss.$visibleTopColumnsAndGroups.forEach($cg => $cg.setRow(1)); //group 由其自己逐层设置\r\n console.debug('--grid-col-end = ' + end);\r\n }\r\n #refreshRows(ss = this.createSnapshot()) {\r\n const begin = new Date().valueOf();\r\n const refresh = this.getRowRefreshFunc(ss);\r\n\r\n const $rows = ss.$rows;\r\n $rows.forEach($row => {\r\n //refresh() 时 cells 数量可能会变动,导致 grid 重新布局。为了提高效率将其隐藏,但测试下来效果不明显。\r\n //row.hidden = true;\r\n refresh($row);\r\n //row.hidden = false;\r\n });\r\n const interval = new Date().valueOf() - begin;\r\n console.debug(`grid refresh ${$rows.length} rows for ${interval} ms`);\r\n }\r\n\r\n getRowRefreshFunc(ss = this.createSnapshot()) {\r\n return ($row: TableRow, refreshCellData = false) => {\r\n $row.refresh(ss, refreshCellData);\r\n };\r\n }\r\n\r\n #refreshColumns() {\r\n this.colLayoutPaused = true;\r\n\r\n //强迫 cols 重新生成所有的列\r\n // eslint-disable-next-line no-self-assign\r\n this.$colStartCols.modelList = this.$colStartCols.modelList;\r\n // eslint-disable-next-line no-self-assign\r\n this.$colMiddleCols.modelList = this.$colMiddleCols.modelList;\r\n // eslint-disable-next-line no-self-assign\r\n this.$colEndCols.modelList = this.$colEndCols.modelList;\r\n \r\n this.colLayoutPaused = false;\r\n }\r\n // #endregion\r\n}\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [TB.tableListTagName]: TableList;\r\n }\r\n}\r\n\r\ntype LayoutNotice = NoticeOfCol | NoticeOfColGroup | NoticeOfHead | NoticeOfTail | {all: true};\r\ninterface NoticeFlags extends Omit<NoticeOfCol & NoticeOfColGroup & NoticeOfHead & NoticeOfTail, '$col' | '$group' | '$head' | '$tail'> {\r\n all?: boolean;\r\n}\r\n//type test = keyof NoticeFlags; 用来测试 NoticeFlags 中的属性","import * as B from '@gzmjs/ui-basic';\r\nimport * as M from '@gzmjs/mvvm';\r\nimport * as TB from './00-base';\r\nimport { TableList } from './60-list';\r\nimport type { ThtOptions } from './46-tht-options';\r\nimport type { TableCol, TableColOptions } from './20-col';\r\nimport { TableRow } from './16-row';\r\nimport { TableCell } from './10-cell';\r\n\r\nexport interface TableViewOptions extends M.ViewModel<TableView> {\r\n /**\r\n * 多行 active\r\n */\r\n multiple?: boolean;\r\n\r\n /**\r\n * 允许多个字段排序\r\n */\r\n multiSort?: boolean;\r\n /**\r\n * 自动根据表格中的内容排序\r\n */\r\n autoSort?: boolean;\r\n /**\r\n * !autoSort,此函数才会被调用\r\n * @param $columnsWantSort 需要排序的字段\r\n * @returns \r\n */\r\n columnSort?: (colsWantSort: TableColOptions[], $colsWantSort: TableCol[]) => void;\r\n\r\n /**\r\n * 自动根据表格中的内容聚合\r\n */\r\n autoAgg?: boolean;\r\n /**\r\n * !autoAgg,此函数才会被调用\r\n * @param $col 要聚合的列\r\n * @returns \r\n */\r\n columnAgg?: (col: TableColOptions, $col: TableCol) => void;\r\n\r\n heads?: ThtOptions[];\r\n tails?: ThtOptions[];\r\n\r\n colsStart?: TableColOptions[];\r\n colsMiddle?: TableColOptions[];\r\n colsEnd?: TableColOptions[];\r\n\r\n /**\r\n * 这个属性放在最后,确保所有的列都先生成。\r\n */\r\n dataSource?: object[];\r\n}\r\n\r\nconst mutableAttributes = ['multiple', 'auto-sort', 'auto-agg'] as const;\r\n\r\n@B.defineElement({tagName: TB.tableViewTagName, mutableAttributes})\r\nexport class TableView extends M.ViewElement<TableViewOptions> implements B.AttributeHandlers<typeof mutableAttributes[number]> {\r\n constructor() {\r\n super();\r\n\r\n const $l = this.$list = document.createElement(TB.tableListTagName);\r\n $l.initLayout();\r\n $l.onclick = this.#clickHandler;\r\n\r\n const $section = document.createElement('section');\r\n $section.append($l, document.createElement('div'));\r\n\r\n const $root = this.attachShadow({mode: 'closed'});\r\n $root.adoptedStyleSheets = [B.baseStyle, B.utilityStyle, TB.styleSheet];\r\n $root.append($section);\r\n }\r\n readonly $list: TableList;\r\n \r\n // #region click\r\n #clickHandler = (e: Event) => {\r\n const $cp = e.composedPath() as Element[]; //https://devdocs.io/dom/event/composedpath\r\n const $ge = $cp.find($c => $c.tagName.startsWith('GZM-TABLE-'));\r\n if (!$ge) return;\r\n\r\n if ($ge instanceof TableCell) {\r\n const $row = $ge.closest<TableRow>(TB.tableRowTagName);\r\n if ($row) {\r\n this.#switchActiveRow($row);\r\n }\r\n }\r\n else if ($ge instanceof TableRow) {\r\n this.#switchActiveRow($ge);\r\n }\r\n else {\r\n if ('handleClick' in $ge && typeof $ge.handleClick === 'function') {\r\n $ge.handleClick(e, this.$list);\r\n }\r\n }\r\n };\r\n #switchActiveRow($row: TableRow) {\r\n if ($row.active) {\r\n $row.setModelProperty('active', false);\r\n return;\r\n }\r\n if (this.multiple) {\r\n //多选\r\n $row.setModelProperty('active', true);\r\n return;\r\n }\r\n const ss = this.$list.createSnapshot();\r\n ss.$rowsActive.forEach($row => $row.setModelProperty('active', false));\r\n $row.setModelProperty('active', true);\r\n }\r\n // #endregion\r\n\r\n // #region models\r\n /**\r\n * 设置 model 会导致此函数被调用来设置各个属性,所以需要控制 colLayoutPaused;\r\n */\r\n public [M.handleModelEvent](source: unknown, evt: M.ModelEvent): boolean {\r\n if (source === this.dataSource) {\r\n return new M.DataListEventHandler(this.dataSource!, this.$list.$rows.modelList, 'data').handle(evt);\r\n }\r\n \r\n const $l = this.$list;\r\n const old = $l.colLayoutPaused;\r\n $l.colLayoutPaused = true;\r\n const ret = super[M.handleModelEvent](source, evt);\r\n $l.colLayoutPaused = old;\r\n return ret;\r\n }\r\n \r\n get heads(): ThtOptions[] {return this.$list.$colHead.modelList;}\r\n set heads(v: ThtOptions[]) {\r\n this.$list.$colHead.modelList = v;\r\n }\r\n\r\n get tails(): ThtOptions[] {return this.$list.$colTail.modelList;}\r\n set tails(v: ThtOptions[]) {\r\n this.$list.$colTail.modelList = v;\r\n }\r\n\r\n get colsStart(): TableColOptions[] {return this.$list.$colStartCols.modelList;}\r\n set colsStart(v: TableColOptions[]) {\r\n this.$list.$colStartCols.modelList = v;\r\n }\r\n\r\n get colsMiddle(): TableColOptions[] {return this.$list.$colMiddleCols.modelList;}\r\n set colsMiddle(v: TableColOptions[]) {\r\n this.$list.$colMiddleCols.modelList = v;\r\n }\r\n\r\n get colsEnd(): TableColOptions[] {return this.$list.$colEndCols.modelList;}\r\n set colsEnd(v: TableColOptions[]) {\r\n this.$list.$colEndCols.modelList = v;\r\n }\r\n\r\n get dataSource() {return this.#ds;}\r\n set dataSource(ds: object[] | undefined) {\r\n const old = this.#ds;\r\n if (old) {\r\n (old as M.ModelList)[M.offModelEvent]?.(this);\r\n }\r\n this.#ds = ds;\r\n if (ds) {\r\n (ds as M.ModelList)[M.onModelEvent]?.(this);\r\n const ml = new M.DataListEventHandler(ds, this.$list.$rows.modelList, 'data').createModelList();\r\n this.$list.$rows.setModelProperty('modelList', M.createViewModel(ml));\r\n }\r\n else {\r\n this.$list.$rows.setModelProperty('modelList', []);\r\n }\r\n }\r\n #ds?: object[];\r\n // #endregion\r\n\r\n // #region 对外方法\r\n /**\r\n * @returns 选中的行的数据\r\n */\r\n getActiveModels() {\r\n return this.getActiveRows().map($row => $row.model);\r\n }\r\n getActiveRows(): TableRow[] {\r\n return this.$list.createSnapshot().$rowsActive;\r\n } \r\n getCheckedRows(): TableRow[] {\r\n const $chks = this.$list.querySelectorAll(`${TB.tableRowCheckTagName} input[type=\"checkbox\"]:checked`);\r\n const $rows = Array.from($chks).map($x => $x.closest(TB.tableRowTagName) as TableRow);\r\n return $rows;\r\n }\r\n getCheckedModels() {\r\n return this.getCheckedRows().map($row => $row.model);\r\n }\r\n // #endregion\r\n\r\n // #region 属性\r\n @B.boolAttr\r\n accessor multiple: boolean = false;\r\n\r\n _multiple_set() {\r\n if (this.multiple) return;\r\n\r\n const $rs = this.$list.createSnapshot().$rowsActive;\r\n for (let i=1; i<$rs.length; i++) {\r\n $rs[i]?.setModelProperty('active', false); //第一行仍然 active,其他去 active。\r\n }\r\n }\r\n\r\n @B.boolAttr\r\n accessor multiSort: boolean = false;\r\n\r\n @B.boolAttr\r\n accessor autoSort: boolean = false;\r\n\r\n _auto_sort_set() {\r\n this.$list.sortRows();\r\n }\r\n\r\n @B.boolAttr\r\n accessor autoAgg: boolean = false;\r\n\r\n _auto_agg_set() {\r\n this.$list.refreshAggs();\r\n }\r\n // #endregion\r\n\r\n // #region 默认聚合函数 autoAgg 时调用,60-list #calcAggValueFromDataSource() 中使用\r\n count(... args: unknown[]): number {\r\n return args.length;\r\n }\r\n sum(... args: number[]): number | undefined {\r\n if (args.length === 0) return 0;\r\n args = this.#num(...args);\r\n if (args.length === 0) return void 0\r\n return args.reduce((p, c) => p + c, 0);\r\n }\r\n avg(... args: number[]): number | undefined {\r\n if (args.length === 0) return 0;\r\n const sum = this.sum(...args);\r\n return sum === void 0 ? sum : sum / args.length;\r\n }\r\n min(... args: unknown[]): unknown {\r\n if (args.length === 0) return 0;\r\n const nums = this.#num(...args);\r\n if (nums.length === args.length) {\r\n return Math.min(...nums);\r\n }\r\n return args.reduce((min, current) => {\r\n // 比较当前累积的最小值和当前元素,返回更小的那个\r\n try {\r\n return compare(current, min) < 0 ? current : min;\r\n }\r\n catch(e) {\r\n console.warn(e, min, current);\r\n }\r\n return min;\r\n }, args[0]);\r\n }\r\n max(... args: unknown[]): unknown {\r\n if (args.length === 0) return 0;\r\n const nums = this.#num(...args);\r\n if (nums.length === args.length) {\r\n return Math.max(...nums);\r\n }\r\n return args.reduce((max, current) => {\r\n // 比较当前累积的最小值和当前元素,返回更小的那个\r\n try {\r\n return compare(current, max) > 0 ? current : max;\r\n }\r\n catch(e) {\r\n console.warn(e, max, current);\r\n }\r\n return max;\r\n }, args[0]);\r\n }\r\n #num(... args: unknown[]): number[] {\r\n args = args.flatMap(n => n).map(n => Number(n)).filter(n => !Number.isNaN(n));\r\n return args as number[];\r\n }\r\n // #endregion\r\n\r\n readonly T = B.createText(TB.texts, B.globalTexts).bindHtmlElement(this);\r\n}\r\n\r\nfunction compare(a: unknown, b: unknown): number {\r\n if (a === b) {\r\n return 0;\r\n }\r\n if (Array.isArray(a) && Array.isArray(b)) {\r\n const l = Math.max(a.length, b.length);\r\n for (let i = 0; i < l; i++) {\r\n const ret = compare(a[i], b[i]);\r\n if (ret !== 0) {\r\n return ret;\r\n }\r\n }\r\n return 0;\r\n }\r\n //这里 a,b 是否数字不重要,重要的是让 js 自行去处理转换。\r\n return (a as number) < (b as number) ? -1 : 1;\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [TB.tableViewTagName]: TableView;\r\n }\r\n}\r\n"],"names":["_a","_init","TB.tableCellTagName","__privateAdd","__runInitializers","TB.tableRowTagName","__decoratorStart","__decorateElement","_b","mutableAttributes","__publicField","TB.tableRowStartTagName","TB.tableRowMiddleTagName","TB.tableRowEndTagName","__privateMethod","TB.tableRowCheckTagName","TB.tableListTagName","TB.tableColGroupTagName","_TableColGroup","TB.getTexts","_agg","TB.tableColTagName","__privateGet","__privateSet","TB.tableAggTagName","TB.tableColWidthSetterTagName","TB.tableColCheckTagName","TB.tableColSerialTagName","TB.tableRowSerialTagName","TB.tableColActionTagName","TB.tableRowActionTagName","TB.tableColMenuTagName","TB.tableRowMenuTagName","TB.tableRowsTagName","TB.tableAggsTagName","TB.tableAggStartTagName","TB.tableAggMiddleTagName","TB.tableAggEndTagName","TB.tableViewTagName","TB.tableColsTagName","TG.TableColGroup","TB.tableColHeadTagName","TB.tableColTailTagName","TB.tableColStartTagName","TB.tableColMiddleTagName","TB.tableColEndTagName","TB.texts","TB.styleSheet","$row"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"table.es.js","sources":["../src/055-table/00-base.ts","../src/055-table/10-cell.ts","../src/055-table/16-row.ts","../src/055-table/22-colgroup.ts","../src/055-table/05-colWidthSetter.ts","../src/055-table/20-col.ts","../src/055-table/35-snapshot.ts","../src/055-table/47-head-tail.ts","../src/055-table/51-check.ts","../src/055-table/52-serial.ts","../src/055-table/53-action.ts","../src/055-table/54-menu.ts","../src/055-table/17-rows.ts","../src/055-table/18-aggs.ts","../src/055-table/25-cols.ts","../src/055-table/48-col-head.ts","../src/055-table/48-col-tail.ts","../src/055-table/60-list.ts","../src/055-table/62-table.ts"],"sourcesContent":["import { createStyleSheet, createText, globalTexts, gzmHeader } from '@gzmjs/ui-basic';\r\nimport type { TableCol } from './20-col';\r\nimport type { TableColGroup } from './22-colgroup';\r\nimport type { TableColCheckbox } from './51-check';\r\nimport type { TableView } from './62-table';\r\n\r\n/**\r\n * Table 相关标签的层次结构\r\n */\r\nexport const tableViewTagName = 'GZM-TABLE';\r\n export const tableListTagName = 'GZM-TABLE-LIST';\r\n export const tableColStartTagName = 'GZM-TABLE-COL-START';\r\n export const tableColHeadTagName = 'GZM-TABLE-COL-HEAD';\r\n export const tableColMiddleTagName = 'GZM-TABLE-COL-MIDDLE';\r\n export const tableColsTagName = 'GZM-TABLE-COLS';\r\n export const tableColGroupTagName = 'GZM-TABLE-COL-GROUP';\r\n export const tableColTagName = 'GZM-TABLE-COL'; \r\n export const tableColEndTagName = 'GZM-TABLE-COL-END';\r\n export const tableColTailTagName = 'GZM-TABLE-COL-TAIL';\r\n\r\n export const tableRowsTagName = 'GZM-TABLE-ROWS';\r\n export const tableRowTagName = 'GZM-TABLE-ROW';\r\n export const tableRowStartTagName = 'GZM-TABLE-ROW-START';\r\n export const tableRowMiddleTagName = 'GZM-TABLE-ROW-MIDDLE';\r\n export const tableRowEndTagName = 'GZM-TABLE-ROW-END'\r\n export const tableCellTagName = 'GZM-TABLE-CELL';\r\n \r\n export const tableAggsTagName = 'GZM-TABLE-AGGS';\r\n export const tableAggStartTagName = 'GZM-TABLE-AGG-START';\r\n export const tableAggMiddleTagName = 'GZM-TABLE-AGG-MIDDLE';\r\n export const tableAggEndTagName = 'GZM-TABLE-AGG-END'\r\n export const tableAggTagName = 'GZM-TABLE-AGG';\r\n\r\n/**\r\n * 列的宽度设置\r\n */\r\nexport const tableColWidthSetterTagName = 'GZM-TABLE-COL-WIDTH-SETTER';\r\n\r\nexport const tableColCheckTagName = 'GZM-TABLE-COL-CHECK';\r\nexport const tableRowCheckTagName = 'GZM-TABLE-ROW-CHECK';\r\n\r\nexport const tableColSerialTagName = 'GZM-TABLE-COL-SERIAL';\r\nexport const tableRowSerialTagName = 'GZM-TABLE-ROW-SERIAL';\r\n\r\nexport const tableColActionTagName = 'GZM-TABLE-COL-ACTION';\r\nexport const tableRowActionTagName = 'GZM-TABLE-ROW-ACTION';\r\n\r\nexport const tableColMenuTagName = 'GZM-TABLE-COL-MENU';\r\nexport const tableRowMenuTagName = 'GZM-TABLE-ROW-MENU';\r\n\r\n/* 列的默认宽度是 auto,其有一个特性:只要有水平空间就一定会占满。如只有一列,且内容不多,但是 auto 会使这一列占满整个水平空间。\r\n 如果列和内容过多,出现水平滚动栏,max-content 也不会换行而 min-content 总是换行,所以 auto 还是最好的选择。\r\n 为了让 auto 不占据不必要的水平空间,使 table-list 和一个 div 并列,在列和内容不多的情况下,div 占满剩余的空间。\r\n\r\n 一开始使用 flex 布局, div.flex = auto,看上去不错,但是 flex 布局限制了 table-list 的高度。\r\n 在出现垂直滚动栏的情况下,导致固定列头不能固定在顶部(滚动一小段距离没有问题,但是当滚动的距离超过了 table-list 的高度时,固定列头会离开可视范围)\r\n\r\n 所以使用了 grid 布局,一共两列都是 auto。 形成了最终 2 层 grid 布局。第一层是 table-view,第二层是 table-list。\r\n*/\r\nexport const styleSheet = createStyleSheet({\r\n //确保 section 能够显示滚动栏\r\n ':host' : `\r\n overflow: hidden;\r\n display: block;\r\n `,\r\n //section 负责显示滚动栏\r\n ':host > section': `\r\n display: grid;\r\n grid-template-columns: auto auto;\r\n gap: 0.5rem;\r\n overflow: auto;\r\n max-height: 100%;\r\n\r\n --grid-row-serial: 0; /*行号从 1 开始*/\r\n counter-reset: row-serial var(--grid-row-serial);\r\n `,\r\n [tableListTagName]: `\r\n display: grid;\r\n grid-auto-rows: max-content;/*每一行的高度都自动*/\r\n gap: 0px;\r\n\r\n /*3个span加在一起应该等于可见【列头+列+列尾】的数量*/\r\n --grid-start-span: 0;\r\n --grid-middle-span: 0;\r\n --grid-end-span: 0;\r\n\r\n /*列部分占用的行的数量*/\r\n --grid-col-end: 0;\r\n `,\r\n /*下面 3 个占据了 grid-list 的上半部分。利用 subgrid 使其中元素占用 grid-list 的列。*/\r\n [`${tableColStartTagName}, ${tableColMiddleTagName}, ${tableColEndTagName}`]: `\r\n position: sticky;\r\n top: 0px;\r\n\r\n display: grid;\r\n grid-template-columns: subgrid;\r\n grid-template-rows: subgrid;\r\n grid-row-start: 1;\r\n grid-row-end: var(--grid-col-end);\r\n `,\r\n /*下面 3 个固定在左侧 */\r\n [`${tableColStartTagName}, ${tableRowStartTagName}, ${tableAggStartTagName}`]: `\r\n left: 0px;\r\n grid-column-end: span var(--grid-start-span);\r\n `,\r\n [`${tableListTagName}[no-start] ${tableColStartTagName}, ${tableListTagName}[no-start] ${tableRowStartTagName}, ${tableListTagName}[no-start] ${tableAggStartTagName}`]: `\r\n display: none;\r\n `,\r\n /*下面 3 个固定在右侧 */\r\n [`${tableColEndTagName}, ${tableRowEndTagName}, ${tableAggEndTagName}`]: `\r\n right: 0px;\r\n grid-column-end: span var(--grid-end-span);\r\n `,\r\n [`${tableListTagName}[no-end] ${tableColEndTagName}, ${tableListTagName}[no-end] ${tableRowEndTagName}, ${tableListTagName}[no-end] ${tableAggEndTagName}`]: `\r\n display: none;\r\n `,\r\n /* 中间的 上中下 3 个元素, 无 sticky,只设置宽度 */\r\n [`${tableColMiddleTagName}, ${tableRowMiddleTagName}, ${tableAggMiddleTagName}`]: `\r\n grid-column-end: span var(--grid-middle-span);\r\n `,\r\n /* 用来组织子元素的容器 */\r\n [`${tableColHeadTagName}, ${tableColTailTagName}, ${tableColsTagName}, ${tableColGroupTagName}, ${tableRowsTagName}, ${tableRowTagName}, ${tableAggsTagName}`]: `\r\n display: contents;\r\n `,\r\n /* 所有的列头和列尾,所有的列头和尾都只有一个元素 */\r\n [`${tableColHeadTagName} > *, ${tableColTailTagName} > *`]: `\r\n grid-row-start: 1;\r\n grid-row-end: var(--grid-col-end);\r\n text-align: center;\r\n padding: 0.25rem 0.5rem;\r\n `,\r\n /* 不可滚动内容要求在 可滚动内容 的上面 */\r\n [`${tableColStartTagName}, ${tableColEndTagName}`]: `\r\n z-index: 40;\r\n `,\r\n\r\n /* COL */\r\n [tableColTagName]: `\r\n display: flex;\r\n align-items: flex-end; /*1-col会跨行,这个使文本等靠底部显示。2-文本占用最大的地方,菜单⋮靠右*/\r\n padding: 0.25rem 0.5rem;\r\n\r\n position: sticky;\r\n top: 0px;\r\n z-index: 30;\r\n\r\n grid-row-end: var(--grid-col-end);\r\n\r\n white-space: nowrap;\r\n ` + gzmHeader,\r\n /* 列排序 */\r\n [tableColTagName + '::before']: `\r\n content: attr(sort);\r\n `,\r\n /* 列文本, cursor 指示点击排序 */\r\n [tableColTagName + '>span']: `\r\n flex: 1 1 auto;\r\n cursor: ns-resize;\r\n margin-right: 0.25rem;\r\n `,\r\n /* 列按钮:菜单等。鼠标悬停时显示菜单按钮。 */\r\n [tableColTagName + '>.gzm-txt-btn']: `\r\n visibility: hidden;\r\n `,\r\n [tableColTagName + ':hover >.gzm-txt-btn']: `\r\n visibility: visible;\r\n `,\r\n\r\n /* COL-GROUP */\r\n /*不能换行,div 高度必须保持不变*/\r\n [tableColGroupTagName + '>div']: `\r\n display: flex;\r\n gap: 0.25rem;\r\n padding: 0.25rem 0.5rem;\r\n\r\n position: sticky;\r\n top: 0px;\r\n z-index: 30;\r\n\r\n white-space: nowrap;\r\n ` + gzmHeader,\r\n [tableColGroupTagName + '>div >span']: `\r\n flex: 1 1 auto;\r\n `,\r\n /* 列组按钮:菜单等。鼠标悬停时显示菜单按钮。 */\r\n [tableColGroupTagName + '>div >.gzm-txt-btn']: `\r\n visibility: hidden;\r\n `,\r\n [tableColGroupTagName + '>div:hover >.gzm-txt-btn']: `\r\n visibility: visible;\r\n `,\r\n\r\n /* ROW */\r\n [`${tableRowTagName}:hover >* >${tableCellTagName}`]: `\r\n background: var(--gzm-h-btn-background);\r\n border: var(--gzm-h-btn-border);\r\n color: var(--gzm-h-btn-txt-color);\r\n `,\r\n [`${tableRowTagName}:active >* >${tableCellTagName}, ${tableRowTagName}[active] >* >${tableCellTagName}`]: `\r\n color: var(--gzm-a-btn-txt-color) !important;\r\n background: var(--gzm-a-btn-background) !important;\r\n border: var(--gzm-a-btn-border) !important;\r\n `,\r\n [`${tableRowStartTagName}, ${tableRowMiddleTagName}, ${tableRowEndTagName}`]: `\r\n display: grid;\r\n grid-template-columns: subgrid;\r\n grid-template-rows: subgrid;\r\n `,\r\n /*需要设置背景颜色,否则与可滚动内容字符重叠*/\r\n [`${tableRowStartTagName}, ${tableRowEndTagName}`]: `\r\n position: sticky;\r\n z-index: 20;\r\n background-color: var(--gzm-background-color);\r\n `,\r\n\r\n /* CELL */\r\n [tableCellTagName]: `\r\n padding: 0.25rem 0.5rem;\r\n border: var(--gzm-header-border);\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n `,\r\n [tableCellTagName + '>a']: `\r\n text-decoration: revert;\r\n `,\r\n\r\n /* AGGs */\r\n [`${tableAggStartTagName}, ${tableAggMiddleTagName}, ${tableAggEndTagName}`]: `\r\n display: grid;\r\n grid-template-columns: subgrid;\r\n grid-template-rows: subgrid;\r\n\r\n position: sticky;\r\n bottom: 0px;\r\n `,\r\n [tableAggTagName]: `\r\n grid-row-end: -1;\r\n `,\r\n /*需要聚合的字段一定会设置聚合的名称*/\r\n [tableAggTagName + '[title]']: `\r\n padding: 0.25rem 0.5rem;\r\n white-space: nowrap;\r\n z-index: 10;\r\n ` + gzmHeader,\r\n [`${tableAggStartTagName}, ${tableAggEndTagName}`]: `\r\n z-index: 30;\r\n `,\r\n\r\n /* HEAD, TAIL */\r\n [`${tableColCheckTagName}, ${tableColSerialTagName}, ${tableColMenuTagName}, ${tableColActionTagName}`]: `\r\n display: flex;\r\n align-items: flex-end;\r\n ` + gzmHeader,\r\n\r\n [`${tableColCheckTagName}, ${tableRowCheckTagName}`]: `\r\n padding: 0.25rem 0.5rem;\r\n text-align: center;\r\n justify-content: center;\r\n ` + gzmHeader,\r\n\r\n [`${tableColSerialTagName}, ${tableRowSerialTagName}`]: `\r\n padding: 0.25rem 0.5rem;\r\n text-align: right; /* row 靠右对齐 */\r\n justify-content: flex-end; /* col 靠右对齐 */\r\n ` + gzmHeader,\r\n [tableRowSerialTagName + '::after']: `\r\n counter-increment: row-serial; /*reset 在 :host 中*/\r\n content: counter(row-serial);\r\n `,\r\n\r\n [tableRowMenuTagName]: `\r\n padding: 0.25rem 0.5rem;\r\n text-align: center;\r\n ` + gzmHeader,\r\n \r\n [tableRowActionTagName]: `\r\n padding: 0.25rem 0.5rem;\r\n border: var(--gzm-header-border);\r\n `,\r\n});\r\n\r\nconst zh = {\r\n agg: '统计',\r\n noAgg: '无统计',\r\n\r\n menu: '选项菜单',\r\n\r\n sort: '行排序',\r\n noSort: '无排序',\r\n\r\n autoWidth: '自动宽度',\r\n minWidth: '最小宽度',\r\n maxWidth: '最大宽度',\r\n pxWidth: '指定宽度',\r\n\r\n textWrap: '文本换行',\r\n autoWrap: '自动换行',\r\n noWrap: '禁止换行',\r\n mustWrap: '强制换行',\r\n\r\n textAlign: '文本对齐',\r\n startAlign: '左对齐',\r\n endAlign: '右对齐',\r\n centerAlign: '居中对齐',\r\n justifyAlign: '两侧对齐',\r\n\r\n //CAF.Scaffolding.FieldAggregation 按道理不应该放在这里,偷懒了!\r\n COUNT: '计数',\r\n MAX: '最大值',\r\n MIN: '最小值',\r\n AVG: '平均值',\r\n SUM: '合计',\r\n STDDEV_POP: '总体标准差',\r\n STDDEV_SAMP: '样本标准差',\r\n VAR_POP: '总体方差',\r\n VAR_SAMP: '样本方差',\r\n\r\n toggleCheck: '全选 / 全不选',\r\n} as const;\r\nexport const texts = {zh};\r\n\r\nconst defaultTexts = createText(texts, globalTexts);\r\nexport function getTexts($ele: TableCol | TableColGroup | TableColCheckbox) {\r\n if ($ele.isConnected) {\r\n return (($ele.getRootNode() as ShadowRoot).host as TableView).T;\r\n }\r\n return defaultTexts;\r\n}","import {defineElement, strAttr} from '@gzmjs/ui-basic';\r\nimport * as TB from './00-base';\r\nimport type { TableRow } from './16-row';\r\n\r\n@defineElement({tagName: TB.tableCellTagName})\r\nexport class TableCell extends HTMLElement {\r\n // #region 属性\r\n /**\r\n * 和 table-col.key 进行匹配\r\n */\r\n @strAttr\r\n accessor colKey: string | undefined;\r\n // #endregion\r\n\r\n get $row(): TableRow | null {\r\n return this.closest<TableRow>(TB.tableRowTagName);\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [TB.tableCellTagName]: TableCell;\r\n }\r\n}\r\n","import {boolAttr, defineElement, type AttributeHandlers} from '@gzmjs/ui-basic';\r\nimport { handleModelEvent, type ModelEvent, type ModelItemUpdateEvent, type ViewModel, ViewElement, ModelEventHandler } from '@gzmjs/mvvm';\r\nimport * as TB from './00-base';\r\nimport * as TC from './10-cell';\r\nimport type { Snapshot } from './35-snapshot';\r\nimport type { TableColHeadOrTail } from './46-tht-options';\r\nimport type { TableCol } from './20-col';\r\n\r\nexport interface TableRowOptions extends ViewModel<TableRow> {\r\n //实际的数据\r\n data: object;\r\n\r\n active?: boolean;//是否被选中\r\n checked?: boolean;//与行头的 checkbox 相关\r\n \r\n afterActiveChanged?: ($row: TableRow) => void;\r\n}\r\nconst mutableAttributes = ['active'] as const;\r\n@defineElement({tagName: TB.tableRowTagName, mutableAttributes})\r\nexport class TableRow extends ViewElement<TableRowOptions> implements AttributeHandlers<typeof mutableAttributes[number]> {\r\n // #region 子元素\r\n readonly $start: HTMLElement = document.createElement(TB.tableRowStartTagName);\r\n readonly $middle: HTMLElement = document.createElement(TB.tableRowMiddleTagName);\r\n readonly $end: HTMLElement = document.createElement(TB.tableRowEndTagName);\r\n\r\n public setViewProperty(p: string, v: unknown): boolean {\r\n if (p === 'active' && v && !this.active) {\r\n this.#setActive();\r\n return true;\r\n }\r\n return super.setViewProperty(p, v);\r\n }\r\n #setActive(): void {\r\n if (!this.isConnected) {\r\n return;//还未加入 dom,在 connectedCallback() 中处理。\r\n }\r\n //只能选中一个,所以模拟点击的情况,由 tabs 去做切换。\r\n this.dispatchEvent(new MouseEvent('click', {bubbles: true}));\r\n }\r\n connectedCallback() {\r\n if (this.childElementCount === 0) {\r\n this.append(this.$start, this.$middle, this.$end);\r\n }\r\n if (this.model?.active && !this.active) {\r\n this.#setActive();\r\n }\r\n }\r\n // #endregion\r\n\r\n // #region 数据展示\r\n [handleModelEvent](source: unknown, evt: ModelEvent): boolean {\r\n return new RowModelEventHandler(this, source).handle(evt);\r\n }\r\n refresh(ss: Snapshot, refreshCellData = false) {\r\n this.#refresh(ss.$startColumns, this.$start, refreshCellData); \r\n this.#refresh(ss.$middleColumns, this.$middle, refreshCellData); \r\n this.#refresh(ss.$endColumns, this.$end, refreshCellData);\r\n\r\n this.#refreshHead(ss.$columnHeads, refreshCellData);\r\n this.#refreshTail(ss.$columnTails, refreshCellData);\r\n }\r\n #refreshHead($heads: TableColHeadOrTail[], refreshCellData = false) {\r\n let $lastHead: HTMLElement | undefined;\r\n const $start = this.$start;\r\n\r\n for (let i=0; i<$heads.length; i++) {\r\n const $h = $heads[i]!;\r\n const $head = $h.findInRow(this) || $h.createInRow();\r\n $head.hidden = !$h.visible;\r\n\r\n if (i === 0) {\r\n const $fec = $start.firstElementChild;\r\n if (!$fec) {\r\n $start.prepend($head);\r\n }\r\n else if ($fec === $head) {\r\n //就应该是这样!\r\n }\r\n else {\r\n $fec.before($head);\r\n } \r\n }\r\n else if ($lastHead?.nextElementSibling !== $head) {\r\n $lastHead?.after($head);\r\n }\r\n $lastHead = $head;\r\n\r\n if ($h.dataAware && refreshCellData) {\r\n $h.refresh(this, $head);\r\n }\r\n }\r\n }\r\n #refreshTail($tails: TableColHeadOrTail[], refreshCellData = false) {\r\n let $lastTail: HTMLElement | undefined;\r\n const $end = this.$end;\r\n\r\n for (let i=$tails.length-1; i>=0; i--) {\r\n const $t = $tails[i]!;\r\n const $tail = $t.findInRow(this) || $t.createInRow();\r\n $tail.hidden = !$t.visible;\r\n\r\n if (i === $tails.length - 1) {\r\n const $lec = $end.lastElementChild; //https://devdocs.io/dom/element/lastelementchild\r\n if (!$lec) {\r\n $end.append($tail);\r\n }\r\n else if ($lec === $tail) {\r\n //就应该是这样!\r\n }\r\n else {\r\n $lec.after($tail);\r\n }\r\n }\r\n else if ($lastTail?.previousElementSibling !== $tail) {\r\n $lastTail?.before($tail);\r\n }\r\n $lastTail = $tail;\r\n\r\n if ($t.dataAware && refreshCellData) {\r\n $t.refresh(this, $tail);\r\n }\r\n }\r\n }\r\n /**\r\n * 同时处理单元格和列的【数量】和【次序】,要能够处理:\r\n * 1 - 在 columns 的中间插入一个新的 column 这种情况。\r\n * 2 - 在 columns 中删除一个 column 的情况。\r\n * 3 - columns 中 2 列交换位置的情况。\r\n */\r\n #refresh($columns: TableCol[], $cellParent: HTMLElement, refreshCellData: boolean) {\r\n const $cells = Array.from($cellParent.querySelectorAll(TB.tableCellTagName)) as TC.TableCell[];\r\n const di = this.model!.data;\r\n let needInsert = false; //当下面的 for 循环中出现了交换列,或者新增 cell,但是无法知道插入位置的情况。\r\n\r\n for (let i=0; i<$columns.length; i++) {\r\n const $col = $columns[i]!;\r\n let $cell: TC.TableCell | undefined;\r\n\r\n if (i >= $cells.length) {\r\n //添加在 columns 后面的列,或者这是一个新的 row\r\n $cell = $col.createCell(di);\r\n $cells.push($cell);\r\n needInsert = true;\r\n }\r\n else {\r\n const j = this.#findColumnCell(i, $col.key!, $cells);\r\n if (j === i) {\r\n //说明这个位置 j 的 cell 本来就对应 col,只需要更新一下内容.\r\n $cell = $cells[j]!;\r\n\r\n if (refreshCellData) {\r\n $col._setCellData($cell, di);\r\n }\r\n }\r\n else if (j > i) {\r\n //3 - 需要把 $cell 的位置从 j 前移到 i\r\n $cell = $cells.splice(j, 1)[0]!;\r\n $cells.splice(i, 0, $cell);\r\n needInsert = true;\r\n }\r\n else {\r\n //没有找到,新增。这应该就是 1 - 在 columns 中间插入一个 col 的情况\r\n $cell = $col.createCell(di);\r\n $cells.splice(i, 0, $cell);\r\n needInsert = true;\r\n }\r\n }\r\n $cell.hidden = !$col.visible;\r\n }\r\n\r\n if ($cells.length > $columns.length) {\r\n //2 - 多出来的部分就是要删除的\r\n const $toDel = $cells.splice($columns.length, $cells.length - $columns.length);\r\n $toDel.forEach($x => $x.remove());\r\n }\r\n\r\n if (needInsert) {\r\n //处理 cells 中没有加入 dom 的元素\r\n const $df = document.createDocumentFragment();\r\n $df.append(...$cells);\r\n void ($cellParent === this.$end ? $cellParent.prepend($df) : $cellParent.append($df));\r\n }\r\n }\r\n /**\r\n * 从 i 开始在 cells 中查找 col 对应的 cell。\r\n * 如果上一次 refresh() 之后 columns 和 cells 都没有任何改变,那么第一次循环 j===i 时就能够找到。\r\n */\r\n #findColumnCell(i: number, colKey: string, $cells: TC.TableCell[]) {\r\n for (let j=i; j<$cells.length; j++) {\r\n const $cell = $cells[j]!;\r\n if ($cell.colKey === colKey) {\r\n return j;\r\n }\r\n }\r\n return -1;\r\n }\r\n // #endregion\r\n\r\n // #region 属性\r\n @boolAttr\r\n accessor active: boolean = false;\r\n\r\n _active_set() {\r\n this.model?.afterActiveChanged?.(this);\r\n }\r\n\r\n get checked(): boolean {\r\n const $rc = this.querySelector(TB.tableRowCheckTagName);\r\n if (!$rc) return false;\r\n return $rc.$chk.checked;\r\n }\r\n set checked(v: boolean) {\r\n const $rc = this.querySelector(TB.tableRowCheckTagName);\r\n if ($rc) {\r\n $rc.$chk.checked = v;\r\n }\r\n }\r\n // #endregion\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [TB.tableRowTagName]: TableRow;\r\n }\r\n}\r\n\r\n/**\r\n * 为了配合 DataListEventHandler 对 TableView.dataSource 事件的处理。\r\n * 当 TableRowOptions.data 被修改时,DataListEventHandler 会调用 TableRow[handleModelEvent]。\r\n * 如果 TableRow 类本身也有 data 属性,那么就不需要这个类了。\r\n * 可以在 set data() 中来刷新显示,就好像 ListView.data 属性一样。\r\n * 但是 TableRow 的刷新比较复杂,需要额外的 TableCol 等的信息,只能在 TableList 中执行。\r\n */\r\nclass RowModelEventHandler extends ModelEventHandler<TableRowOptions, TableRow> {\r\n public handle(arg: ModelEvent): boolean {\r\n const ret = super.handle(arg);\r\n if (!ret && arg.type === 'item-update') {\r\n const iu = arg as ModelItemUpdateEvent<TableRowOptions>;\r\n if ('data' in iu.updated) {\r\n const $list = this.$view.closest(TB.tableListTagName);\r\n if ($list) {\r\n $list.getRowRefreshFunc()(this.$view, true);\r\n return true;\r\n }\r\n }\r\n }\r\n return ret;\r\n }\r\n}","import * as B from '@gzmjs/ui-basic';\r\nimport {type MiOptions, createMenu} from '@gzmjs/menu';\r\nimport * as TB from './00-base';\r\nimport {TableCol, type ColNoticeReceiver, type NoticeOfCol} from './20-col';\r\n\r\nconst mutableAttributes = ['hidden'] as const;\r\n@B.defineElement({tagName: TB.tableColGroupTagName, mutableAttributes})\r\nexport class TableColGroup extends HTMLElement implements ColNoticeReceiver, B.AttributeHandlers<typeof mutableAttributes[number]> {\r\n // #region 子元素\r\n constructor() {\r\n super();\r\n this.$lbl = document.createElement('span');\r\n this.$menu = B.createTxtBtn('⋮');\r\n\r\n this.$div = document.createElement('div');\r\n this.$div.append(this.$lbl, this.$menu);\r\n }\r\n readonly $div: HTMLDivElement;\r\n readonly $lbl: HTMLElement;\r\n readonly $menu: HTMLElement;\r\n\r\n /**\r\n * \r\n * @param {Number} start \r\n * @returns 所有下级可见列的数量\r\n */\r\n setRow(start: number): number {\r\n if (this.hidden) {\r\n //传入的 end 是根据可见列最大的 tier 来计算的。如果此 group.hidden 但是很“深”,会导致 start>end。\r\n throw new Error('call group.setRow() when not hidden');\r\n }\r\n\r\n const $cols = this.$columns;\r\n const $gs = this.$groups;\r\n if ($cols.length === 0 && $gs.length === 0) {\r\n this.#$p = void 0; //防止其通知上级,因为 setRow() 被调用的时候就是上级在布局。\r\n this.remove();\r\n return 0;\r\n }\r\n\r\n this.$div.style.gridRowStart = start.toString(); //div 只占据一行\r\n\r\n start++;\r\n let colVisible = 0; //记录下级的可见列有多少\r\n\r\n for (const $col of $cols) {\r\n if ($col.hidden) {\r\n //不用判断所属 group.visible,因为上级调用 setRow() 时已经判断过了。\r\n }\r\n else {\r\n $col.setRow(start);\r\n colVisible++;\r\n }\r\n }\r\n\r\n for (const $group of $gs) {\r\n if ($group.hidden) {\r\n //不用判断所属 group.visible,因为上级调用 setRow() 时已经判断过了。\r\n }\r\n else {\r\n colVisible += $group.setRow(start);\r\n }\r\n }\r\n if (colVisible === 0) {\r\n this.hidden = true;\r\n return 0;\r\n }\r\n this.$div.style.gridColumnEnd = 'span ' + colVisible;\r\n return colVisible;\r\n }\r\n /**\r\n * 只属于这个 group 的列\r\n */\r\n get $columns(): TableCol[] {\r\n const ret: TableCol[] = []\r\n for (const $c of this.children) {\r\n if ($c instanceof TableCol) {\r\n ret.push($c);\r\n }\r\n }\r\n return ret;\r\n }\r\n /**\r\n * 只属于这个 group 的下级 group\r\n */\r\n get $groups(): TableColGroup[] {\r\n const ret: TableColGroup[] = [];\r\n for (const $c of this.children) {\r\n if ($c instanceof TableColGroup) {\r\n ret.push($c);\r\n }\r\n }\r\n return ret;\r\n }\r\n /**\r\n * 当前列组是否显示\r\n */\r\n get visible(): boolean {\r\n if (this.hidden) {\r\n return false;\r\n }\r\n if (!this.isConnected) {\r\n return false;\r\n }\r\n if (this.#$p instanceof TableColGroup) {\r\n return this.#$p.visible;\r\n }\r\n return true; //#$p 是 table-cols\r\n }\r\n /**\r\n * 当直属于 table-cols,返回 1。\r\n * grid-row-start 的值也是从 1 开始。\r\n */\r\n get tier(): number {\r\n if (this.#$p instanceof TableColGroup) {\r\n return this.#$p.tier + 1;\r\n }\r\n return 1;\r\n }\r\n // #endregion\r\n\r\n // #region 上级元素\r\n connectedCallback() {\r\n if (this.#$p === this.parentElement) return;\r\n this.prepend(this.$div);\r\n this.#$p = this.parentElement as ColGroupNoticeReceiver;\r\n this.#$p.notify({groupAdd:true,$group:this});\r\n }\r\n #$p?: ColGroupNoticeReceiver; //为了 disconnected\r\n\r\n disconnectedCallback() {\r\n if (this.#$p && !this.parentElement) {//不是随着上级一起删除,要通知上级!\r\n this.#$p.notify({groupDel:true,$group:this});\r\n this.#$p = void 0;\r\n }\r\n }\r\n // #endregion\r\n \r\n // #region ColNoticeReceiver\r\n notify(n: NoticeOfColGroup | NoticeOfCol) {\r\n if ('colAdd' in n && n.colAdd) {\r\n if (!n.$col.hidden && this.hidden) this.hidden = false;//group 原来 hidden,加入一个不 hidden 的列,那么就不能再 hidden。\r\n }\r\n this.#$p?.notify(n);\r\n }\r\n // #endregion\r\n\r\n // #region 属性\r\n get label(): string {return this.$lbl.textContent;}\r\n set label(v: string) {this.$lbl.textContent = v;}\r\n\r\n _hidden_set() {\r\n //因为 col 和 col.agg 都是子元素,一起被隐藏了。无需额外处理。\r\n this.notify({groupHide:true,$group:this});\r\n }\r\n // #endregion\r\n\r\n // #region 组菜单\r\n handleClick(e: MouseEvent) {\r\n if (e.target === this.$menu) {\r\n this.#showMenu();\r\n }\r\n }\r\n #showMenu() {\r\n const mis: MiOptions[] = [\r\n {\r\n tag: 'click',\r\n label: this.T.hide, \r\n group: 'action',\r\n onclick: () => {\r\n this.hidden = true;\r\n }\r\n },/* 无法与 table-cols.modelList 同步,所以删除此功能\r\n {\r\n label: T.del!(),\r\n group: 'action',\r\n onclick: () => {\r\n this.remove();\r\n }\r\n },*/\r\n ];\r\n //显示每一列,允许隐藏/显示列\r\n for (const $col of this.$columns) {\r\n const colItem: MiOptions = {\r\n tag: 'check',\r\n group: 'table-col',\r\n label: $col.label ?? '',\r\n checked: !$col.hidden,\r\n onclick() {\r\n $col.setModelProperty('hidden', !$col.hidden);\r\n }\r\n };\r\n mis.push(colItem);\r\n }\r\n const $sm = createMenu(...mis);\r\n $sm.show(this.$menu, B.xy.rightBottom, B.xy.rightTop);\r\n }\r\n // #endregion\r\n\r\n get T() { return TB.getTexts(this); };\r\n}\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [TB.tableColGroupTagName]: TableColGroup;\r\n }\r\n}\r\n\r\n// #region 通知上级\r\nexport interface NoticeOfColGroup {\r\n groupAdd?: boolean;\r\n groupDel?: boolean;\r\n groupHide?: boolean;\r\n\r\n $group: TableColGroup;\r\n}\r\nexport interface ColGroupNoticeReceiver extends HTMLElement {\r\n notify: (msg: NoticeOfColGroup | NoticeOfCol) => void;\r\n}\r\n// #endregion","import { CornerHelper, xy, defineElement } from \"@gzmjs/ui-basic\";\r\nimport { tableColWidthSetterTagName } from \"./00-base\";\r\nimport type { TableCol } from \"./20-col\";\r\n\r\n@defineElement({tagName: tableColWidthSetterTagName})\r\nclass TableColWidthSetter extends HTMLElement {\r\n connectedCallback() {\r\n this.style.border = 'var(--gzm-header-border)'; \r\n this.style.background = 'var(--gzm-a-btn-background)';\r\n }\r\n\r\n get $range(): HTMLInputElement {\r\n if (!this.#range) {\r\n this.#range = document.createElement('input');\r\n this.#range.type = 'range';\r\n this.append(this.#range);\r\n }\r\n return this.#range;\r\n }\r\n #range?: HTMLInputElement;\r\n\r\n public show($col: TableCol) {\r\n this.#calcSize($col);\r\n this.$range.onchange = (e: Event) => {\r\n const $t = e.target as HTMLInputElement;\r\n console.debug('table column width range value = ' + $t.value);\r\n $col.width = $t.value + 'px';\r\n this.remove();\r\n }\r\n\r\n this.setAttribute('popover', 'auto');\r\n new CornerHelper(this, xy.leftTop, $col, xy.leftBottom).pos();\r\n }\r\n\r\n #calcSize($col: TableCol) { \r\n const root = $col.getRootNode() as ShadowRoot;\r\n const $table = root.host as HTMLElement;\r\n\r\n const colRect = $col.getBoundingClientRect();\r\n const gridRect = $table.getBoundingClientRect();\r\n \r\n const colRight2gridRight = Math.floor(gridRect.right - colRect.right); //col 右边框到 grid 右边框的距离\r\n const colRightEmptyWidth = colRight2gridRight - (gridRect.width - $table.clientWidth); /*去掉垂直滚动栏*/\r\n const max = Math.floor(colRect.width + colRightEmptyWidth); //range 的长度应该等于 col 本身的长度加上右侧的空间。\r\n\r\n const $r = this.$range;\r\n $r.style.width = max + 'px'; \r\n $r.max = max.toString();\r\n $r.value = colRect.width.toString();\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [tableColWidthSetterTagName]: TableColWidthSetter;\r\n }\r\n}\r\n","import * as B from '@gzmjs/ui-basic';\r\nimport * as M from '@gzmjs/mvvm';\r\nimport {type MiOptions, createMenu, createMenuWithModel} from '@gzmjs/menu';\r\nimport '@gzmjs/tooltip';\r\nimport * as TB from './00-base';\r\nimport type { TableCell } from './10-cell';\r\nimport { TableColGroup } from './22-colgroup';\r\nimport './05-colWidthSetter';\r\n\r\nexport const sortAsc = '↑'; //▲ 可以直接用于CSS ::before content\r\nexport const sortDesc = '↓'; //▼ https://www.compart.com/en/unicode/U+25BC\r\nconst tableColSort = ['', sortAsc, sortDesc] as const;\r\nexport type TableColSort = typeof tableColSort[number];\r\nfunction isAscSort(s: TableColSort) {return s === sortAsc;}\r\n//function isDescSort(s: TableColSort) {return s === sortDesc;} 用不到\r\n\r\nconst tableColAlign = ['start', 'end', 'center', 'justify'] as const; //css:text-align\r\nexport type TableColAlign = typeof tableColAlign[number];\r\n\r\nexport const TableColAggs = ['count','min','max','sum','avg'] as const;\r\n\r\nexport interface TableColumnBtn {\r\n /**\r\n * 应该是 unicode 字符,且同一列中必须唯一。\r\n */\r\n icon: string;\r\n title: string;\r\n onclick: ($col: TableCol, $btn: HTMLElement) => void;\r\n}\r\nexport interface TableColOptions extends M.ViewModel<TableCol> {\r\n label: string;\r\n\r\n /**\r\n * 分组,多级组用 / 分开\r\n */\r\n group?: string;\r\n \r\n title?: string;\r\n width?: string; //默认 auto\r\n sort?: TableColSort;//无需处理set,通过css来显示箭头\r\n align?: TableColAlign;\r\n wrap?: boolean;\r\n\r\n /**\r\n * boolean 类型显示的内容\r\n * listSource = createBoolTextList()\r\n */\r\n //trueText?: string;\r\n //falseText?: string;\r\n\r\n /**\r\n * 定义了所有允许的聚合操作,如果不为空那么需要显示下拉菜单。\r\n */\r\n aggs?: string[];\r\n\r\n /**\r\n * 无论是否存在 aggs,都可以设置此属性。\r\n */\r\n agg?: string;\r\n\r\n /**\r\n * 直接设置聚合值,但是仍然需要设置 agg。\r\n */\r\n aggValue?: unknown;\r\n\r\n /**\r\n * 控制是否显示默认菜单\r\n */\r\n noMenu?: boolean;\r\n\r\n /**\r\n * 列 label 之后的其他按钮\r\n */\r\n btns?: TableColumnBtn[];\r\n\r\n /**\r\n * 需要显示的字段\r\n */\r\n valueMember: M.ObjMember | string | string[];\r\n listSource?: M.ListSource<object>;\r\n\r\n /**\r\n * 对单元格内容的干涉,$cell 中已经有了内容\r\n */\r\n setCellContent?: (ctx: {$cell: TableCell, $col: TableCol, dataItem: object, dataValue: M.ObjValue}) => void;\r\n\r\n /**\r\n * 列菜单显示之前,可以修改菜单项\r\n */\r\n beforeMenuShow?: (mis: MiOptions[], vm: TableColOptions) => void;\r\n}\r\nexport function createBoolTextList(trueText: string, falseText: string) {\r\n return new M.ListSource([{v:true,d:trueText},{v:false,d:falseText}], 'v', 'd');\r\n}\r\n\r\nconst mutableAttributes = ['key', 'label', 'width', 'hidden', 'sort', 'agg', 'align'] as const;\r\n\r\n@B.defineElement({tagName: TB.tableColTagName, mutableAttributes})\r\nexport class TableCol extends M.ViewElement<TableColOptions> implements B.AttributeHandlers<typeof mutableAttributes[number]> {\r\n\r\n // #region 子元素\r\n get $lbl(): HTMLElement {\r\n if (!this.#lbl) {\r\n this.#lbl = document.createElement('span');\r\n this.prepend(this.#lbl);\r\n }\r\n return this.#lbl;\r\n }\r\n #lbl?: HTMLElement;\r\n\r\n /**\r\n * $lbl 之后允许有多个按钮,最后两个是 agg 按钮和 menu 按钮,但有可能不生成。\r\n * btns 按钮在 $lbl 和 agg 按钮之间\r\n */\r\n set btns(v: TableColumnBtn[]) {\r\n let $bs = this.$btns;\r\n if (!v || !v.length) {\r\n //清空\r\n $bs?.forEach($b => $b.remove());\r\n return;\r\n }\r\n\r\n const $df = document.createDocumentFragment();\r\n for (const b of v) {\r\n let $btn = $bs?.find($b => $b.textContent === b.icon);\r\n if (!$btn) {\r\n $btn = B.createTxtBtn(b.icon);\r\n $btn.title = b.title;\r\n }\r\n $df.appendChild($btn);\r\n }\r\n $bs = this.$btns = Array.from($df.children) as HTMLElement[];\r\n this.$lbl.after(...$bs);\r\n }\r\n $btns?: HTMLElement[]; //生成的按钮数组\r\n // #endregion\r\n\r\n // #region 上级元素\r\n connectedCallback() {\r\n if (this.#$p === this.parentElement) return;\r\n this.#$p = this.parentElement as ColParentElement;\r\n this.#$p.notify({colAdd:true,$col:this});\r\n\r\n void this.$menuBtn; //确保生成\r\n //console.debug(`grid column ${this.label} connected.\\n`);\r\n }\r\n #$p?: ColParentElement;//父元素, disconnectedCallback 的时候有用。\r\n\r\n disconnectedCallback() {\r\n if (!this.parentElement && this.#$p) {\r\n //单独被删除,需要通知上级\r\n this.$agg.remove();\r\n this.#$p.notify({colDel:true,$col:this});\r\n this.#$p = void 0;\r\n //console.debug(`grid column ${this.label} disconnected.\\n`);\r\n }\r\n }\r\n get visible(): boolean {\r\n if (this.hidden) {\r\n return false;\r\n }\r\n const $p = this.#$p;\r\n if (!$p) {\r\n return false;\r\n }\r\n if ($p instanceof TableColGroup) {\r\n return $p.visible;\r\n }\r\n return true; //p 是 grid-cols\r\n }\r\n /**\r\n * 如果没有任何 group,那么每一列都应该调用 setRow(1)\r\n */\r\n setRow(start: number) {\r\n this.style.gridRowStart = start.toString();\r\n /*this.style.gridRowEnd = end;*///所有的 end 都统一是 --grid-col-end\r\n }\r\n // #endregion\r\n\r\n // #region 数据展示\r\n get valueMember(): M.ObjMember | undefined {return this.#vm;}\r\n set valueMember(v: M.ObjMember | string | string[]) {\r\n if (!(v instanceof M.ObjMember)) {\r\n v = new M.ObjMember(v);\r\n }\r\n this.#vm = v;\r\n this.#$p?.notify({colRefresh:true,$col:this});\r\n }\r\n #vm?: M.ObjMember;\r\n\r\n set listSource(_: unknown) {\r\n this.#$p?.notify({colRefresh:true,$col:this});\r\n }\r\n\r\n createCell(dataItem: object): TableCell {\r\n const ret = document.createElement(TB.tableCellTagName);\r\n ret.colKey = this.key;\r\n ret.hidden = this.hidden; //hidden 将不占用 grid\r\n this.#setCellStyle(ret);\r\n this._setCellData(ret, dataItem);\r\n return ret;\r\n }\r\n _setCellData($cell: TableCell, dataItem: object = $cell.$row!.model!.data): void {\r\n $cell.textContent = '';\r\n if (!dataItem) return;\r\n\r\n const dv = this.valueMember?.getObjValue(dataItem) ?? new M.ObjValue(void 0);\r\n this.#setCellData($cell, dv);\r\n this.#createCellLink($cell, dataItem, dv);\r\n }\r\n #setCellData($cell: HTMLElement, dv: M.ObjValue) {\r\n dv = this.#getDisplayFromList(dv) || dv;\r\n $cell.textContent = dv.toString(this);\r\n }\r\n #createCellLink($cell: TableCell, dataItem: object, dataValue: M.ObjValue) {\r\n this.model?.setCellContent?.({\r\n $cell, \r\n $col: this,\r\n dataItem, \r\n dataValue\r\n });\r\n };\r\n #getDisplayFromList(dv: M.ObjValue): M.ObjValue | undefined {\r\n const ls = this.model?.listSource;\r\n return ls?.getListDisplay(dv);\r\n }\r\n\r\n #setCellStyle($cell: HTMLElement) {\r\n const key = this.key;\r\n $cell.style.textAlign = `var(--gzm-text-align-${key}, start)`;\r\n $cell.style.whiteSpace = `var(--gzm-white-space-${key}, normal)`; //https://devdocs.io/css/white-space\r\n $cell.style.wordBreak = `var(--gzm-word-break-${key}, normal)`; //https://devdocs.io/css/word-break\r\n }\r\n // #endregion\r\n\r\n // #region 属性\r\n @B.strAttr\r\n accessor key: string | undefined;\r\n\r\n _key_set() {\r\n this.#setCellStyle(this.$agg);\r\n\r\n const a = this.align;\r\n if (a !== tableColAlign[0]) {\r\n this._align_set(a);\r\n }\r\n\r\n this._wrap_set(this.wrap);\r\n }\r\n\r\n @B.strAttr\r\n accessor label: string | undefined;\r\n\r\n _label_set(nv: string | null) {\r\n this.$lbl.textContent = nv;\r\n }\r\n\r\n get title() {\r\n return this.$lbl.title;\r\n }\r\n set title(v: string) {\r\n this.$lbl.title = v ?? '';\r\n }\r\n\r\n @B.strAttr\r\n accessor width: string = 'auto';\r\n\r\n _width_set() {\r\n this.#$p?.notify({colWidth:true,$col:this});\r\n }\r\n\r\n @B.strAttr\r\n accessor sort: TableColSort = tableColSort[0];\r\n\r\n _sort_set() {\r\n this.#$p?.notify({colSort:true,$col:this});\r\n }\r\n\r\n get isAscSort(): boolean {return isAscSort(this.sort as TableColSort);}\r\n\r\n @B.strAttr\r\n accessor align: TableColAlign = tableColAlign[0];\r\n\r\n _align_set(nv: string | null) {\r\n const key = this.key;\r\n const $list = this.closest(TB.tableListTagName) as HTMLElement;\r\n $list?.style.setProperty(`--gzm-text-align-${key}`, nv);\r\n }\r\n\r\n //因为 attribute 中的 bool 属性无法实现 3 种状态,所以这里没有使用 attribute。\r\n get wrap(): boolean | undefined {return this.#wrap;}\r\n set wrap(v: boolean | undefined) {this.#wrap = v; this._wrap_set(v);}\r\n #wrap?: boolean;\r\n\r\n _wrap_set(nv: boolean | undefined) {\r\n let whiteSpace = 'normal';\r\n let wordBreak = 'normal';\r\n switch (nv) {\r\n case true:\r\n wordBreak = 'break-all'; //url,email 不会自动换行,必须强制。\r\n break;\r\n case false:\r\n whiteSpace = 'nowrap'; //中文文本自动换行,必须禁止才不会换行!\r\n break;\r\n }\r\n const key = this.key;\r\n const $list = this.closest(TB.tableListTagName) as HTMLElement;\r\n $list?.style.setProperty(`--gzm-white-space-${key}`, whiteSpace);\r\n $list?.style.setProperty(`--gzm-word-break-${key}`, wordBreak);\r\n }\r\n\r\n @B.strAttr\r\n accessor agg: string | undefined;\r\n\r\n _agg_set() {\r\n this.aggValue = void 0; //col没有数据,不负责计算,先清空。\r\n this.#$p?.notify({colAgg:true,$col:this});\r\n }\r\n\r\n _hidden_set() {\r\n this.$agg.hidden = this.hidden;\r\n this.#$p?.notify({colHide:true,$col:this});\r\n console.debug(`grid column ${this.label} hidden = ${this.hidden}.\\n`);\r\n }\r\n // #endregion\r\n\r\n // #region 聚合\r\n /**\r\n * 这个元素由列生成,但是不会作为列的子元素\r\n */\r\n get $agg(): HTMLElement {\r\n if (!this.#agg) {\r\n const $agg = this.#agg = document.createElement(TB.tableAggTagName);\r\n $agg.hidden = this.hidden;\r\n }\r\n return this.#agg;\r\n }\r\n #agg?: HTMLElement;\r\n\r\n set aggValue(v: unknown) {\r\n const $a = this.$agg;\r\n const agg = this.agg;\r\n if (agg) {\r\n $a.setAttribute('title', Reflect.get(this.T, agg));//匹配样式显示\r\n this.#setCellData($a, v instanceof M.ObjValue ? v : new M.ObjValue(v));\r\n }\r\n else {\r\n //base 中的样式定义只有 title 才有背景,所以移除 title 并且清空内容,虽然元素未隐藏,但是已经看不出来了。\r\n $a.removeAttribute('title');\r\n $a.textContent = '';\r\n //$a.hidden = true; 因为是 grid 布局,所以不能隐藏(后面的元素会占据其位置)\r\n }\r\n }\r\n\r\n $aggBtn?: HTMLElement;\r\n\r\n /**\r\n * model.aggs 中的属性设置,无需保存在成员中。只是检查按钮是否存在。\r\n */\r\n set aggs(v: string[] | undefined) {\r\n if (v && v.length) {\r\n let $btn = this.$aggBtn;\r\n if (!$btn) {\r\n $btn = this.$aggBtn = B.createTxtBtn('𝚺'); //Σ\r\n $btn.title = this.T.agg;\r\n this.$menuBtn.before($btn);//倒数第2个,最后的是 $menuBtn\r\n }\r\n }\r\n else {\r\n this.$aggBtn?.remove();\r\n this.$aggBtn = void 0;\r\n }\r\n }\r\n\r\n #showAggMenu() {\r\n const mis = this.#createAggMenu();\r\n if (!mis || !mis.length) {\r\n this.$aggBtn?.showTooltip({\r\n render: ($tt) => {\r\n $tt.textContent = this.T.noMenuSet;\r\n },\r\n })\r\n return;\r\n }\r\n const $m = createMenuWithModel({\r\n modelList: mis,\r\n itemClick: (item) => {\r\n this.setModelProperty('agg', item.id);\r\n },\r\n });\r\n $m.show(this.$aggBtn!, B.xy.rightBottom, B.xy.rightTop);\r\n }\r\n\r\n #createAggMenu(): MiOptions[] {\r\n let aggs = this.model?.aggs;\r\n if (!aggs || !aggs.length) {\r\n return [];\r\n }\r\n\r\n const ta = this.agg ?? '';\r\n if (ta && !aggs.includes(ta)) {\r\n aggs = [ta, ...aggs];\r\n }\r\n aggs = ['', ...aggs];\r\n\r\n const T = this.T;\r\n const items: MiOptions[] = aggs.map(a => {\r\n return {\r\n tag: 'radio',\r\n id: a,\r\n label: a ? Reflect.get(T, a) : T.noAgg, //todo: 不属于 T 的怎么办?\r\n checked: ta === a,\r\n };\r\n });\r\n return items;\r\n }\r\n // #endregion\r\n\r\n // #region 菜单\r\n get $menuBtn(): HTMLElement {\r\n if (!this.#menuBtn) {\r\n this.#menuBtn = B.createTxtBtn('⋮');\r\n this.#menuBtn.title = this.T.menu;\r\n this.append(this.#menuBtn);\r\n }\r\n return this.#menuBtn;\r\n }\r\n #menuBtn?: HTMLElement;\r\n\r\n get noMenu(): boolean {return this.$menuBtn.hidden;};\r\n set noMenu(b: boolean) {this.$menuBtn.hidden = b;}\r\n\r\n #showMenu() {\r\n const mis = this.#createMenu();\r\n if (!mis || !mis.length) {\r\n this.$menuBtn.showTooltip({\r\n render: ($tt) => {\r\n $tt.textContent = this.T.noMenuSet;\r\n },\r\n })\r\n return;\r\n }\r\n const $m = createMenu(...mis);\r\n $m.show(this.$menuBtn, B.xy.rightBottom, B.xy.rightTop);\r\n }\r\n #createMenu(): MiOptions[] {\r\n const T = this.T;\r\n //const delItem: MiOptions = {tag:'click',label:T.del!(),group:'c',onclick:()=>this.remove()}; 因为无法与 table-cols.modelList 联动,所以不提供删除功能。\r\n const hideItem: MiOptions = {tag:'click',label: T.hide,group:'c',onclick:()=>this.setModelProperty('hidden', true)};\r\n const alignItem: MiOptions = {tag:'menu',label:T.textAlign,subItems:this.#createAlignMenu(),group:'m'};\r\n const wrapItem: MiOptions = {tag:'menu',label:T.textWrap,subItems:this.#createWrapMenu(),group:'m'};\r\n const sortItem: MiOptions = {tag:'menu',label:T.sort,subItems:this.#createSortMenu(),group:'m'};\r\n const autoWidthItem: MiOptions = {tag:'radio',label:T.autoWidth,group:'width',onclick:()=>this.setModelProperty('width', 'auto')};\r\n const minItem: MiOptions = {tag:'radio',label:T.minWidth,group:'width',onclick:()=>this.setModelProperty('width', 'min-content')};\r\n const maxItem: MiOptions = {tag:'radio',label:T.maxWidth,group:'width',onclick:()=>this.setModelProperty('width', 'max-content')};\r\n const pxItem: MiOptions = {tag:'radio',label:T.pxWidth,group:'width',onclick:()=>this.#showWidthPopup()};\r\n\r\n switch (this.width) {\r\n case 'min-content':\r\n //https://devdocs.io/css/min-content\r\n //只对英文文本有效,宽度将由最长的单词决定。对于中文文本没有意义,因为字符宽度一致。\r\n //对于不换行的文本也没有意义,如 url, email 等。效果等同于 max-content\r\n minItem.checked = true;\r\n break;\r\n case 'max-content':\r\n //https://devdocs.io/css/max-content\r\n //对于不换行的文本,如 url, email 或者 white-space:nowrap; 效果等同于 min-content\r\n maxItem.checked = true;\r\n break;\r\n case 'auto':\r\n autoWidthItem.checked = true;\r\n break;\r\n default:\r\n {\r\n const regex = /^\\d+(\\.\\d+)?px$/;\r\n if (regex.test(this.width)) {\r\n pxItem.checked = true;\r\n }\r\n }\r\n break;\r\n }\r\n const menuItems = [hideItem, alignItem, wrapItem, sortItem, autoWidthItem, minItem, maxItem, pxItem];\r\n this.model?.beforeMenuShow?.(menuItems, this.model);\r\n return menuItems;\r\n }\r\n #createWrapMenu() {\r\n const T = this.T;\r\n const Ts = [\r\n T.autoWrap,\r\n T.mustWrap,//url,email 这类字符串不换行,强制其换行。\r\n T.noWrap,//中文文本会自动换行,强制其不换行。\r\n ];\r\n\r\n const tw = this.wrap;\r\n const tableColWrap = [void 0, true, false];\r\n const items: MiOptions[] = tableColWrap.map((w,i) => {\r\n return {\r\n tag: 'radio',\r\n label: Ts[i]!,\r\n checked: tw === w,\r\n onclick: () => {\r\n this.setModelProperty('wrap', w);\r\n }\r\n };\r\n });\r\n return items;\r\n }\r\n #createSortMenu() {\r\n const T = this.T;\r\n const Ts = [\r\n T.noSort,\r\n T.asc,\r\n T.desc,\r\n ];\r\n\r\n const ta = this.sort;\r\n const items: MiOptions[] = tableColSort.map((s,i) => {\r\n return {\r\n tag: 'radio',\r\n label: Ts[i]!,\r\n checked: ta === s,\r\n onclick: () => {\r\n this.setModelProperty('sort', s);\r\n }\r\n };\r\n });\r\n return items;\r\n }\r\n #createAlignMenu() {\r\n const T = this.T;\r\n const Ts = [\r\n T.startAlign,\r\n T.endAlign,\r\n T.centerAlign,\r\n T.justifyAlign\r\n ];\r\n const ta = this.align;\r\n const items: MiOptions[] = tableColAlign.map((a,i) => {\r\n return {\r\n tag: 'radio',\r\n label: Ts[i]!,\r\n checked: ta === a,\r\n onclick: () => {\r\n this.setModelProperty('align', a);\r\n }\r\n };\r\n });\r\n return items;\r\n }\r\n #showWidthPopup() {\r\n const $setter = document.createElement(TB.tableColWidthSetterTagName);\r\n $setter.show(this);\r\n }\r\n // #endregion\r\n\r\n // #region 鼠标点击\r\n handleClick(e: MouseEvent) {\r\n const $t = e.target as HTMLElement;\r\n if ($t === this.$aggBtn) {\r\n this.#showAggMenu();\r\n }\r\n else if ($t === this.$menuBtn) {\r\n this.#showMenu();\r\n }\r\n else if (e.target === this.$lbl) {\r\n this.#sort();\r\n }\r\n else if (this.$btns?.includes($t)) {\r\n const i = this.$btns.indexOf($t);\r\n const func = this.model?.btns?.[i]?.onclick;\r\n func?.(this, $t);\r\n }\r\n }\r\n\r\n #sort() {\r\n let s = this.sort as TableColSort;\r\n const i = tableColSort.indexOf(s);\r\n \r\n s = tableColSort[i + 1] ?? tableColSort[0];\r\n this.setModelProperty('sort', s);\r\n }\r\n // #endregion\r\n\r\n get T() { return TB.getTexts(this); };\r\n}\r\n\r\n// #region 通知上级\r\nexport interface NoticeOfCol {\r\n colAdd?: boolean; \r\n colDel?: boolean;\r\n colWidth?: boolean;\r\n colSort?: boolean;\r\n colAgg?: boolean;\r\n colHide?: boolean;\r\n colRefresh?: boolean;\r\n\r\n $col: TableCol;\r\n}\r\nexport interface ColNoticeReceiver {\r\n notify: (msg: NoticeOfCol) => void;\r\n}\r\ntype ColParentElement = HTMLElement & ColNoticeReceiver;\r\n// #endregion","import type { TableList } from \"./60-list\";\r\nimport type { TableRow } from \"./16-row\";\r\nimport { TableCol } from \"./20-col\";\r\nimport { TableColGroup } from \"./22-colgroup\";\r\nimport * as TB from './00-base';\r\nimport type {TableColHeadOrTail} from './46-tht-options';\r\n\r\nexport class Snapshot {\r\n constructor($t: TableList) {\r\n this.$t = $t;\r\n }\r\n $t: TableList;\r\n\r\n // #region 列\r\n get $startColumns(): TableCol[] {\r\n return this.#startCols ??= Array.from(this.$t.$colStartCols.querySelectorAll(TB.tableColTagName));\r\n }\r\n #startCols?: TableCol[];\r\n\r\n get $startColumnsVisible(): TableCol[] {\r\n return this.#startColsVisible ??= this.$startColumns.filter($c => $c.visible);\r\n }\r\n #startColsVisible?: TableCol[];\r\n\r\n get $middleColumns(): TableCol[] {\r\n return this.#middleCols ??= Array.from(this.$t.$colMiddleCols.querySelectorAll(TB.tableColTagName));\r\n }\r\n #middleCols?: TableCol[];\r\n\r\n get $middleColumnsVisible(): TableCol[] {\r\n return this.#middleColsVisible ??= this.$middleColumns.filter($c => $c.visible);\r\n }\r\n #middleColsVisible?: TableCol[];\r\n\r\n get $endColumns(): TableCol[] {\r\n return this.#endCols ??= Array.from(this.$t.$colEndCols.querySelectorAll(TB.tableColTagName));\r\n }\r\n #endCols?: TableCol[];\r\n\r\n get $endColumnsVisible(): TableCol[] {\r\n return this.#endColsVisible ??= this.$endColumns.filter($c => $c.visible);\r\n }\r\n #endColsVisible?: TableCol[];\r\n\r\n get $columns(): TableCol[] {\r\n return this.#cols ??= Array.from(this.$t.querySelectorAll(TB.tableColTagName));\r\n }\r\n #cols?: TableCol[];\r\n\r\n get $columnsVisible(): TableCol[] {\r\n return this.#colsVisible ??= this.$columns.filter(c => c.visible);\r\n }\r\n #colsVisible?: TableCol[];\r\n\r\n get $columnsNeedAgg(): TableCol[] {\r\n return this.#colsNeedAgg ??= this.$columnsVisible.filter(c => c.agg);\r\n }\r\n #colsNeedAgg?: TableCol[];\r\n\r\n get $columnsWantSort(): TableCol[] {\r\n return this.#colsWantSort ??= this.$columnsVisible.filter(c => c.sort);\r\n }\r\n #colsWantSort?: TableCol[];\r\n // #endregion\r\n\r\n // #region 头和尾\r\n get $columnHeads(): TableColHeadOrTail[] {\r\n return this.#colHeads ??= Array.from(this.$t.$colHead.children) as TableColHeadOrTail[];\r\n }\r\n #colHeads?: TableColHeadOrTail[];\r\n\r\n get $columnHeadsVisible(): TableColHeadOrTail[] {\r\n return this.#colHeadsVisible ??= this.$columnHeads.filter($c => !$c.hidden);\r\n }\r\n #colHeadsVisible?: TableColHeadOrTail[];\r\n\r\n get $columnTails(): TableColHeadOrTail[] {\r\n return this.#colTails ??= Array.from(this.$t.$colTail.children) as TableColHeadOrTail[];\r\n }\r\n #colTails?: TableColHeadOrTail[];\r\n\r\n get $columnTailsVisible(): TableColHeadOrTail[] {\r\n return this.#colTailsVisible ??= this.$columnTails.filter($c => !$c.hidden);\r\n }\r\n #colTailsVisible?: TableColHeadOrTail[];\r\n // #endregion\r\n\r\n // #region 行\r\n get $rows(): TableRow[] {\r\n return this.#rows ??= Array.from(this.$t.$rows.querySelectorAll(TB.tableRowTagName));\r\n }\r\n #rows?: TableRow[];\r\n\r\n get $rowsActive(): TableRow[] {\r\n return this.#rowsActive ??= this.$rows.filter($row => $row.active);\r\n }\r\n #rowsActive?: TableRow[];\r\n // #endregion\r\n\r\n // #region 列组\r\n /**\r\n * 顶层 column 和 group\r\n */\r\n get $visibleTopColumnsAndGroups(): (TableCol | TableColGroup)[] {\r\n if (!this.#visibleTopColsAndGroups) {\r\n this.#visibleTopColsAndGroups = [];\r\n const tmp = this.#visibleTopColsAndGroups;\r\n const $colss = [this.$t.$colStartCols, this.$t.$colMiddleCols, this.$t.$colEndCols];//所有的col和colGroup都在cols中。\r\n for (const $cols of $colss) {\r\n for (const $c of $cols.children) {\r\n if ($c instanceof TableCol && $c.visible) {\r\n tmp.push($c);\r\n }\r\n else if ($c instanceof TableColGroup && $c.visible) {\r\n tmp.push($c);\r\n }\r\n }\r\n }\r\n }\r\n return this.#visibleTopColsAndGroups;\r\n }\r\n #visibleTopColsAndGroups?: (TableCol | TableColGroup)[];\r\n\r\n /**\r\n * 所有可见列所属的 group 的最大 level\r\n */\r\n get groupsMaxTier(): number {\r\n if (this.#maxTier === undefined) {\r\n const tiers = this.$columnsVisible.map($c => $c.parentElement).filter($c => $c instanceof TableColGroup).map(c => c.tier);\r\n if (tiers.length === 0) {\r\n this.#maxTier = 0;\r\n }\r\n else {\r\n this.#maxTier = Math.max(...tiers);\r\n }\r\n }\r\n return this.#maxTier;\r\n }\r\n #maxTier?: number;\r\n // #endregion\r\n}\r\n","import * as M from '@gzmjs/mvvm';\r\nimport * as TB from './00-base';\r\nimport * as TR from './16-row';\r\nimport * as THT from './46-tht-options';\r\n\r\n/**\r\n * 这是一个基类\r\n */\r\nexport abstract class TableColHeadTailBase<T extends M.ViewModel<M.ViewElement<T>>> extends M.ViewElement<T> implements THT.TableColHeadOrTail {\r\n // #region 子元素\r\n protected _createUI(): void {}\r\n\r\n get $agg(): HTMLElement {\r\n return this.#agg ??= document.createElement(TB.tableAggTagName);\r\n }\r\n #agg?: HTMLElement; \r\n // #endregion\r\n\r\n // #region 父元素\r\n connectedCallback() {\r\n if (this.$p === this.parentElement) return;\r\n this.#checkUnique();\r\n this._createUI();\r\n\r\n this.$p = this.parentElement as HTMLElement & THT.TableHeadTailBridge;\r\n this.$p.notifyConnected(this);\r\n //console.debug(`grid fixed ${this.tagName} connected.\\n`); \r\n }\r\n $p?: HTMLElement & THT.TableHeadTailBridge;//父元素,在 disconnectedCallback() 中使用\r\n\r\n disconnectedCallback() {\r\n if (!this.parentElement && this.$p) {\r\n this._clear();\r\n this.$agg.remove();\r\n this.$p.notifyDisconnected(this);\r\n this.$p = void 0;\r\n }\r\n }\r\n /**\r\n * 为了简化一种只允许在 grid 存在一个\r\n * 否则 findInRow() 就会非常复杂!\r\n */ \r\n #checkUnique() {\r\n const root = this.getRootNode() as ShadowRoot; \r\n if (root.querySelectorAll(this.tagName).length > 1) {\r\n throw new Error(`grid already has ${this.tagName}`);\r\n }\r\n }\r\n \r\n protected _clear() {}\r\n // #endregion\r\n\r\n // #region 属性\r\n get width() {\r\n return '36px';\r\n }\r\n get visible() {\r\n const $p = this.$p;\r\n if (!$p) return false;\r\n return !(this.hidden || $p.hidden);\r\n } \r\n get dataAware() {\r\n return false; //数据相关的,默认false,即无论行绑定什么数据都无所谓。 \r\n }\r\n _hidden_set() {\r\n this.$agg.hidden = this.hidden;\r\n this.$p?.notifyHide(this);\r\n }\r\n // #endregion\r\n\r\n // #region 行\r\n createInRow(): HTMLElement {\r\n return document.createElement(this.rowTagName);\r\n }\r\n /**\r\n * dataAware = true 时会被调用,由子类重写。\r\n */\r\n refresh($row: TR.TableRow, $headOrTail: HTMLElement | null): void {\r\n void $row;\r\n void $headOrTail;\r\n }\r\n\r\n findInRow<InRow extends HTMLElement>($row: TR.TableRow): InRow | null {\r\n return $row.querySelector<InRow>(this.rowTagName);\r\n }\r\n getAllInRow<InRow extends HTMLElement>(): InRow[] {\r\n const root = this.getRootNode();\r\n if (!root) return [];\r\n return Array.from((root as ShadowRoot).querySelectorAll(this.rowTagName));\r\n }\r\n\r\n abstract get rowTagName(): string;\r\n // #endregion\r\n}\r\n","import * as B from '@gzmjs/ui-basic';\r\nimport * as M from '@gzmjs/mvvm';\r\nimport * as TB from './00-base';\r\nimport * as THT from './47-head-tail';\r\nimport type { TableRow } from './16-row';\r\nimport type { TableList } from './60-list';\r\n\r\nexport interface TableColCheckOptions extends M.ViewModel<TableColCheckbox> {\r\n readonly tagName: typeof TB.tableColCheckTagName;\r\n\r\n rowsCheckChanged?: (checked: boolean) => void;\r\n rowCheckChanged?: ($row: TableRow, checked: boolean) => void;\r\n}\r\nconst mutableAttributes = ['hidden'] as const;\r\n@B.defineElement({tagName:TB.tableColCheckTagName, mutableAttributes})\r\nexport class TableColCheckbox extends THT.TableColHeadTailBase<TableColCheckOptions> implements B.AttributeHandlers<typeof mutableAttributes[number]> {\r\n $chk?: HTMLInputElement;\r\n\r\n _createUI() {\r\n const root = this.getRootNode() as ShadowRoot;\r\n root.addEventListener('change', this.#changeHandler);\r\n\r\n if (!this.$chk) {\r\n const $chk = this.$chk = document.createElement('input');\r\n $chk.type = 'checkbox';\r\n $chk.name = '0';//没有意义,为了让 edge 不警告\r\n\r\n //label 的作用是为了让 checkbox 与旁边列的文字对齐\r\n const lbl = document.createElement('label');\r\n lbl.title = this.T.toggleCheck;\r\n lbl.append($chk);\r\n this.append(lbl);\r\n }\r\n }\r\n\r\n #changeHandler = (e: Event) => {\r\n const $et = e.target as HTMLInputElement;\r\n const checked = $et.checked;\r\n\r\n const $col = $et.closest(TB.tableColCheckTagName)\r\n if ($col) {\r\n const $tl = $col.closest(TB.tableListTagName) as TableList;\r\n if ($tl) {\r\n $tl.createSnapshot().$rows.forEach($row => $row.setModelProperty('checked', checked));\r\n this.model?.rowsCheckChanged?.(checked);\r\n }\r\n return;\r\n }\r\n\r\n const $rc = $et.closest(TB.tableRowCheckTagName) as TableRowCheckbox;\r\n if ($rc) {\r\n const $row = $rc.closest(TB.tableRowTagName) as TableRow;\r\n if ($row) {\r\n $row.setModelProperty('checked', checked);\r\n this.model?.rowCheckChanged?.($row, checked);\r\n }\r\n }\r\n };\r\n\r\n protected _clear() {\r\n const root = this.$p?.getRootNode() as ShadowRoot;\r\n root?.removeEventListener('change', this.#changeHandler);\r\n }\r\n\r\n get rowTagName() {\r\n return TB.tableRowCheckTagName;\r\n }\r\n\r\n get T() { return TB.getTexts(this); };\r\n}\r\n\r\n/**\r\n * 由 grid-col-check 为每一行生成\r\n */\r\n@B.defineElement({tagName: TB.tableRowCheckTagName})\r\nexport class TableRowCheckbox extends HTMLElement {\r\n constructor() {\r\n super()\r\n \r\n const $chk = this.$chk = document.createElement('input'); \r\n $chk.type = 'checkbox';\r\n $chk.name = '1';//没有意义,为了让 edge 不警告\r\n }\r\n readonly $chk: HTMLInputElement;\r\n\r\n connectedCallback() {\r\n this.append(this.$chk);\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [TB.tableColCheckTagName]: TableColCheckbox;\r\n [TB.tableRowCheckTagName]: TableRowCheckbox;\r\n }\r\n}\r\n","import * as B from '@gzmjs/ui-basic';\r\nimport * as M from '@gzmjs/mvvm';\r\nimport * as TB from './00-base';\r\nimport * as THT from './47-head-tail';\r\n\r\nexport interface TableColSerialNoOptions extends M.ViewModel<TableColSerialNo> {\r\n readonly tagName: typeof TB.tableColSerialTagName;\r\n}\r\nconst mutableAttributes = ['hidden'] as const;\r\n/**\r\n * 列头显示行号,意义不大,因为宽度必须固定,当行数太大的时候会显示不下!\r\n */\r\n@B.defineElement({tagName: TB.tableColSerialTagName, mutableAttributes})\r\nclass TableColSerialNo extends THT.TableColHeadTailBase<TableColSerialNoOptions> implements B.AttributeHandlers<typeof mutableAttributes[number]> {\r\n\r\n get rowTagName() {\r\n return TB.tableRowSerialTagName;\r\n }\r\n _createUI() {\r\n this.textContent = '#';\r\n }\r\n get width() {\r\n return 'minmax(36px, auto)';\r\n }\r\n}\r\n/**\r\n * 没有任何功能,就不用定义一个类了\r\n *//*\r\n@ELE.defineElement({tagName: TB.tableRowSerialTagName})\r\nclass TableRowSerialNo extends HTMLElement {\r\n}*/","import * as B from '@gzmjs/ui-basic';\r\nimport * as M from '@gzmjs/mvvm';\r\nimport * as TB from './00-base';\r\nimport * as THT from './47-head-tail';\r\nimport type { TableList } from './60-list';\r\nimport type { TableRow } from './16-row';\r\n\r\nexport interface TableColActionOptions extends M.ViewModel<TableColAction> {\r\n readonly tagName: typeof TB.tableColActionTagName;\r\n label?: string;\r\n \r\n actions: Record<string, (ctx: {$row: TableRow, $rowAction: TableRowAction, $btn: HTMLButtonElement}) => void>;\r\n\r\n rowActionConfig?: ($row: TableRow, $rowAction: TableRowAction, btns: Record<string, HTMLButtonElement>) => void;\r\n}\r\nconst mutableAttributes = ['hidden'] as const;\r\n/**\r\n * 按钮操作列\r\n */\r\n@B.defineElement({tagName: TB.tableColActionTagName, mutableAttributes})\r\nclass TableColAction extends THT.TableColHeadTailBase<TableColActionOptions> implements B.AttributeHandlers<typeof mutableAttributes[number]> {\r\n get rowTagName() {\r\n return TB.tableRowActionTagName;\r\n }\r\n\r\n createInRow(): HTMLElement {\r\n const $ret = super.createInRow() as TableRowAction;\r\n const acts = this.actions;\r\n if (acts) {\r\n for (const action in acts) {\r\n const $btn = B.createTxtBtn(action);\r\n $ret.append($btn);\r\n $ret.btns[action] = $btn;\r\n }\r\n }\r\n return $ret;\r\n }\r\n\r\n refresh($row: TableRow, $headOrTail = this.findInRow<HTMLElement>($row)) {//只有 dataAware = true 时才会被调用\r\n if (!$headOrTail) return;\r\n const $inRow = $headOrTail as TableRowAction;\r\n this.model?.rowActionConfig?.($row, $inRow, $inRow.btns);\r\n }\r\n\r\n // #region 属性\r\n get width() {\r\n return 'auto';\r\n }\r\n get dataAware() {\r\n return true; //数据改变可能导致按钮显示发生变化!导致 refresh 函数被调用\r\n }\r\n\r\n actions?: Record<string, (ctx: {$row: TableRow, $rowAction: TableRowAction, $btn: HTMLButtonElement}) => void>;\r\n\r\n get label(): string {return this.textContent;}\r\n set label(v: string) {this.textContent = v;}\r\n // #endregion\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [TB.tableColActionTagName]: TableColAction;\r\n }\r\n}\r\n\r\n/**\r\n * 由 grid-col-action 为每一行生成\r\n */\r\n@B.defineElement({tagName: TB.tableRowActionTagName})\r\nclass TableRowAction extends HTMLElement {\r\n /**\r\n * 为了在 GridColAction.refresh() 中触发事件用,从功能上来说没有必要定义这个属性,可以临时生成 btns 对象。\r\n * 但是在触发事件时读取 button.innerText,导致在 _createRowsFromDataSource() 中调用时回流。\r\n * 因为按钮刚刚生成还未绘制,读取 innerText 就会回流,所以要避免读取 innerText。\r\n * 于是就在这里定义了这个属性。\r\n */\r\n readonly btns: Record<string, HTMLButtonElement> = {};\r\n\r\n handleClick(e: MouseEvent, $list: TableList) {\r\n const $btn = e.target as HTMLButtonElement;\r\n if (!B.isTxtBtn($btn)) return;\r\n\r\n const $row = this.closest(TB.tableRowTagName);\r\n if (!$row) return;\r\n\r\n const $ht = $list.querySelector(TB.tableColActionTagName);\r\n if (!$ht) return;\r\n\r\n const acts = $ht.model?.actions;\r\n if (!acts) return;\r\n\r\n const action = $btn.textContent;\r\n const func = acts[action];\r\n func?.({\r\n $row, \r\n $rowAction: this, \r\n $btn\r\n });\r\n }\r\n}","import * as B from '@gzmjs/ui-basic';\r\nimport * as M from '@gzmjs/mvvm';\r\nimport * as TB from './00-base';\r\nimport * as THT from './47-head-tail';\r\nimport type { TableList } from './60-list';\r\nimport type { TableRow } from './16-row';\r\n\r\nexport interface TableColMenuOptions extends M.ViewModel<TableColMenu> {\r\n readonly tagName: typeof TB.tableColMenuTagName;\r\n rowMenuClick?: ($row: TableRow, $ht: TableRowMenu, $btn: HTMLElement) => void;\r\n}\r\nconst mutableAttributes = ['hidden'] as const;\r\n/**\r\n * 在每一行显示一个菜单按钮,点击后弹出菜单\r\n */\r\n@B.defineElement({tagName:TB.tableColMenuTagName, mutableAttributes})\r\nclass TableColMenu extends THT.TableColHeadTailBase<TableColMenuOptions> implements B.AttributeHandlers<typeof mutableAttributes[number]> {\r\n get rowTagName() {\r\n return TB.tableRowMenuTagName;\r\n }\r\n createInRow() {\r\n const $btn = B.createTxtBtn('⋮');\r\n const $ret = super.createInRow();\r\n $ret.append($btn);\r\n return $ret;\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [TB.tableColMenuTagName]: TableColMenu;\r\n }\r\n}\r\n\r\n@B.defineElement({tagName: TB.tableRowMenuTagName})\r\nclass TableRowMenu extends HTMLElement {\r\n handleClick(e: MouseEvent, $list: TableList): void {\r\n const $btn = e.target as HTMLElement;\r\n if (!B.isTxtBtn($btn)) return;\r\n\r\n const $row = this.closest(TB.tableRowTagName);\r\n if (!$row) {\r\n return;\r\n }\r\n\r\n const $cm = $list.querySelector(TB.tableColMenuTagName);\r\n if (!$cm) {\r\n return;\r\n }\r\n\r\n $cm.model?.rowMenuClick?.($row, this, $btn);\r\n }\r\n}","import {defineElement} from '@gzmjs/ui-basic';\r\nimport * as M from '@gzmjs/mvvm';\r\nimport * as TB from './00-base';\r\nimport * as TR from './16-row';\r\nimport type { Snapshot } from './35-snapshot';\r\nimport type { TableCol } from './20-col';\r\nimport type { TableList } from './60-list';\r\n\r\ninterface TableRowsOptions extends M.ViewListModel<TR.TableRowOptions, TR.TableRow, TableRows> {\r\n tagName?: typeof TB.tableRowsTagName;\r\n}\r\n\r\n@defineElement({tagName: TB.tableRowsTagName})\r\nexport class TableRows extends M.ViewListElement<TR.TableRowOptions, TR.TableRow, TableRowsOptions> {\r\n // #region ViewListElement\r\n protected _getViewItemTagName(): string {\r\n return TB.tableRowTagName;\r\n }\r\n public [M.handleModelEvent](source: unknown, evt: M.ModelEvent): boolean {\r\n if (source === this.modelList) {\r\n return new RowsModelListEventHandler(this, source).handle(evt);\r\n }\r\n return super[M.handleModelEvent](source, evt);\r\n }\r\n // #endregion\r\n\r\n /**\r\n * 根据数据源排序\r\n */\r\n sortDataSource(ss: Snapshot): boolean {\r\n const ds = this.modelList;\r\n if (!ds || ds.length === 0) {\r\n return false;\r\n }\r\n const $cols = ss.$columnsWantSort;\r\n if ($cols.length === 0) {\r\n return false;\r\n }\r\n \r\n const func = getSortFunc($cols); \r\n ds.sort(func);\r\n\r\n if (M.modelEventPaused in ds) {\r\n //上面的排序触发事件。\r\n }\r\n else {\r\n //手工触发事件\r\n const ev = new M.ModelListSortEvent<TR.TableRowOptions>(ds);\r\n this[M.handleModelEvent](ds, ev);\r\n }\r\n\r\n return true;\r\n }\r\n}\r\n\r\nclass RowsModelListEventHandler extends M.ModelListEventHandler<TR.TableRowOptions, TR.TableRow, TableRowsOptions> {\r\n constructor($rows: TableRows, source: unknown) {\r\n super($rows, source);\r\n this.$rows = $rows;\r\n this.$list = $rows.parentElement as TableList;\r\n this.#ss = this.$list.createSnapshot();\r\n }\r\n readonly $rows: TableRows;\r\n readonly $list: TableList;\r\n #ss: Snapshot;\r\n #refreshFunc?: ($r: TR.TableRow, rd: boolean) => void;\r\n\r\n private refreshRow($row: TR.TableRow): void {\r\n const rf = (this.#refreshFunc ??= this.$list.getRowRefreshFunc(this.#ss));\r\n rf($row, true);\r\n }\r\n private sortItem(item: TR.TableRowOptions) {\r\n const $cols = this.#ss.$columnsWantSort;\r\n if ($cols.length === 0) return;\r\n\r\n //sortItem 在 proxy 中实现\r\n const ml = this.$vl.modelList;\r\n if ('sortItem' in ml && typeof(ml.sortItem) === 'function') {\r\n const func = getSortFunc($cols);\r\n ml.sortItem(item, func);\r\n }\r\n }\r\n\r\n protected _createEleItem(item: TR.TableRowOptions) : TR.TableRow {\r\n const $ret = super._createEleItem(item);\r\n this.refreshRow($ret);\r\n return $ret;\r\n }\r\n protected _refresh($row: TR.TableRow) : void {\r\n this.refreshRow($row);\r\n }\r\n\r\n protected _insert(arg: M.ModelItemsInsertEvent<TR.TableRowOptions>): boolean {\r\n const ret = super._insert(arg);\r\n this.$list.refreshAggs(this.#ss);\r\n arg.items.forEach(item => this.sortItem(item));\r\n return ret;\r\n }\r\n protected _update(arg: M.ModelItemUpdateEvent<TR.TableRowOptions>): boolean {\r\n const ret = super._update(arg);\r\n this.$list.refreshAggs(this.#ss); \r\n this.sortItem(arg.item);\r\n return ret;\r\n }\r\n protected _delete(arg: M.ModelItemsDeleteEvent<TR.TableRowOptions>): boolean {\r\n const ret = super._delete(arg);\r\n this.$list.refreshAggs(this.#ss);\r\n return ret;\r\n }\r\n protected _replace(arg: M.ModelItemReplaceEvent<TR.TableRowOptions>): boolean {\r\n const ret = super._replace(arg);\r\n this.$list.refreshAggs(this.#ss);\r\n this.sortItem(arg.item);\r\n return ret;\r\n }\r\n protected _reset(arg: M.ModelListResetEvent<TR.TableRowOptions>): boolean {\r\n const ret = super._reset(arg);\r\n this.$list.refreshAggs(this.#ss);\r\n if (this.$list.$table.autoSort) {\r\n this.$rows.sortDataSource(this.#ss)\r\n }\r\n return ret;\r\n }\r\n protected _sort(arg: M.ModelListSortEvent<TR.TableRowOptions>): boolean {\r\n return super._sort(arg);\r\n }\r\n}\r\n\r\nfunction getSortFunc($cols: TableCol[]) {\r\n //把所有列中的 valueMember 放到一个一维数组中。\r\n const vms = $cols.flatMap($c => $c.valueMember?.member);\r\n if (vms.length === 0) {\r\n //没有任何排序字段,返回一个恒等函数。\r\n return () => 0;\r\n }\r\n \r\n //与 vms 一一对应,每一个 vm 字段采用的是正序还是倒序, 1 是正序,-1 是倒序。\r\n const ads = $cols.flatMap($c => {\r\n const ad = $c.isAscSort ? 1 : -1;\r\n return Array.from({length: $c.valueMember?.length ?? 0}, () => ad);\r\n });\r\n \r\n return (r1: TR.TableRowOptions, r2: TR.TableRowOptions) => {\r\n for (let i = 0; i < vms.length; i++) {\r\n const vm = vms[i]!;\r\n const ad = ads[i]!;\r\n\r\n const v1 = Reflect.get(r1.data, vm);\r\n const v2 = Reflect.get(r2.data, vm);\r\n if (v1 < v2) {\r\n return -1 * ad;\r\n }\r\n else if (v1 > v2) {\r\n return 1 * ad;\r\n }\r\n //相等,进入 for 的下一次循环,也就是下一个字段\r\n }\r\n return 0;\r\n };\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [TB.tableRowsTagName]: TableRows;\r\n }\r\n}","import {defineElement} from '@gzmjs/ui-basic';\r\nimport * as TB from './00-base';\r\nimport type { Snapshot } from './35-snapshot';\r\n\r\n@defineElement({tagName: TB.tableAggsTagName})\r\nexport class TableAggs extends HTMLElement {\r\n // #region 子元素\r\n constructor() {\r\n super();\r\n this.$start = document.createElement(TB.tableAggStartTagName);\r\n this.$middle = document.createElement(TB.tableAggMiddleTagName);\r\n this.$end = document.createElement(TB.tableAggEndTagName);\r\n }\r\n readonly $start: HTMLElement;\r\n readonly $middle: HTMLElement;\r\n readonly $end: HTMLElement;\r\n\r\n get $grid() {\r\n const ret = this.parentElement?.parentElement;//直接上级是 grid-list,然后才是 grid-view\r\n if (ret?.tagName === TB.tableViewTagName) {\r\n return ret;\r\n }\r\n return null;\r\n }\r\n connectedCallback() {\r\n if (this.childElementCount > 0) return; //已经有子元素了,说明已经连接过了。\r\n this.append(this.$start, this.$middle, this.$end);\r\n }\r\n // #endregion\r\n\r\n // #region 数据展示\r\n refresh(ss: Snapshot) {\r\n let $aggs = [...ss.$columnHeads, ...ss.$startColumns].map($x => $x.$agg);\r\n this.$start.innerHTML = '';\r\n this.$start.append(...$aggs);\r\n\r\n this.$middle.innerHTML = '';\r\n this.$middle.append(...ss.$middleColumns.map($x => $x.$agg));\r\n\r\n $aggs = [...ss.$endColumns, ...ss.$columnTails].map($x => $x.$agg);\r\n this.$end.innerHTML = '';\r\n this.$end.append(...$aggs);\r\n }\r\n // #endregion\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [TB.tableAggsTagName]: TableAggs;\r\n }\r\n}","import * as B from '@gzmjs/ui-basic';\r\nimport * as M from '@gzmjs/mvvm';\r\nimport * as TB from './00-base';\r\nimport * as TC from './20-col';\r\nimport * as TG from './22-colgroup';\r\nimport type { TableList } from './60-list';\r\n\r\ninterface TcsOptions extends M.ViewListModel<TC.TableColOptions, TC.TableCol, TableCols> {\r\n tagName?: typeof TB.tableColsTagName\r\n}\r\n\r\n@B.defineElement({tagName: TB.tableColsTagName})\r\nexport class TableCols extends M.ViewGroupElement<TC.TableColOptions, TC.TableCol, TcsOptions> implements TG.ColGroupNoticeReceiver {\r\n\r\n // #region ViewGroupElement\r\n public [M.handleModelEvent](source: unknown, evt: M.ModelEvent): boolean {\r\n const $l = this.closest(TB.tableListTagName) as TableList;\r\n const old = $l.colLayoutPaused;\r\n $l.colLayoutPaused = true;\r\n const ret = super[M.handleModelEvent](source, evt);\r\n $l.colLayoutPaused = old;\r\n return ret;\r\n }\r\n\r\n protected _getViewItemTagName(): string {\r\n return TB.tableColTagName;\r\n }\r\n\r\n protected readonly groupElementTagName: string = TB.tableColGroupTagName;\r\n\r\n /**\r\n * 同时还实现了生成 group 元素的功能\r\n * 无需重写 _createGroupElement 和 _putGroupElement\r\n */\r\n protected _tryGetGroupElement(vm: TC.TableColOptions): HTMLElement | null {\r\n const group = this.getGroupValueFromModel(vm);\r\n if (!group) return this; //没有上级 group,这个就是上级元素。\r\n\r\n const groupChain = this.#getGroupByLabel(group);\r\n groupChain.forEach((gc, i) => {\r\n let $g = gc.$group;\r\n if (!$g) {\r\n $g = gc.$group = document.createElement(TB.tableColGroupTagName);\r\n $g.label = gc.label;\r\n if (i === 0) {\r\n this.append($g);\r\n }\r\n else {\r\n groupChain[i-1]!.$group!.append($g);\r\n }\r\n }\r\n });\r\n return groupChain.pop()!.$group!;\r\n }\r\n\r\n #getGroupByLabel(group: string) {\r\n const sa = group.split('/');\r\n const ret: {label: string, $group?: TG.TableColGroup}[] = sa.map(s => {\r\n return {\r\n label: s,\r\n $group: void 0\r\n };\r\n });\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n let $p: HTMLElement = this;\r\n for (const r of ret) {\r\n let found = false;\r\n for (const $c of $p.children) {\r\n if ($c instanceof TG.TableColGroup) {\r\n if ($c.label === r.label) {\r\n found = true;\r\n $p = r.$group = $c;\r\n break;\r\n }\r\n }\r\n }\r\n if (!found) {\r\n break;\r\n }\r\n }\r\n return ret;\r\n }\r\n // #endregion\r\n\r\n // #region ColGroupNoticeReceiver\r\n notify(n: TC.NoticeOfCol | TG.NoticeOfColGroup) {\r\n const $list = this.closest(TB.tableListTagName) as TG.ColGroupNoticeReceiver\r\n $list?.notify(n);\r\n }\r\n // #endregion\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [TB.tableColsTagName]: TableCols;\r\n }\r\n}","import * as B from '@gzmjs/ui-basic';\r\nimport * as M from '@gzmjs/mvvm';\r\nimport * as TB from './00-base';\r\nimport * as THT from './46-tht-options';\r\nimport {TableColHeadTailBase} from './47-head-tail';\r\nimport type { TableList } from './60-list';\r\n\r\nexport interface TableColHeadOptions extends M.ViewListModel<THT.ThtOptions, TableColHeadTailBase<THT.ThtOptions>, TableColHead> {\r\n tagName?: typeof TB.tableColHeadTagName;\r\n}\r\n\r\n@B.defineElement({tagName:TB.tableColHeadTagName})\r\nexport class TableColHead extends M.ViewListElement<THT.ThtOptions, TableColHeadTailBase<THT.ThtOptions>, TableColHeadOptions> implements THT.TableHeadTailBridge {\r\n\r\n // #region ViewListElement\r\n public [M.handleModelEvent](source: unknown, evt: M.ModelEvent): boolean {\r\n const $l = this.closest(TB.tableListTagName) as TableList;\r\n const old = $l.colLayoutPaused;\r\n $l.colLayoutPaused = true;\r\n const ret = super[M.handleModelEvent](source, evt);\r\n $l.colLayoutPaused = old;\r\n return ret;\r\n }\r\n\r\n protected _getViewItemTagName(options: THT.ThtOptions): string {return options.tagName;}\r\n // #endregion\r\n \r\n get $list(): Element & THT.TableHeadTailNoticeReceiver | null {\r\n return this.closest(TB.tableListTagName) as Element & THT.TableHeadTailNoticeReceiver;\r\n }\r\n\r\n // #region TableHeadTailBridge\r\n notifyHide($child: THT.TableColHeadOrTail) {\r\n this.$list?.notify({headHide:true,$head:$child});\r\n }\r\n notifyConnected($child: THT.TableColHeadOrTail) {\r\n this.$list?.notify({headAdd:true,$head:$child});\r\n }\r\n notifyDisconnected($child: THT.TableColHeadOrTail) {\r\n this.$list?.notify({headDel:true,$head:$child});\r\n }\r\n // #endregion\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [TB.tableColHeadTagName]: TableColHead;\r\n }\r\n}","import * as B from '@gzmjs/ui-basic';\r\nimport * as M from '@gzmjs/mvvm';\r\nimport * as TB from './00-base';\r\nimport * as THT from './46-tht-options';\r\nimport {TableColHeadTailBase} from './47-head-tail';\r\nimport type { TableList } from './60-list';\r\n\r\nexport interface TableColTailOptions extends M.ViewListModel<THT.ThtOptions, TableColHeadTailBase<THT.ThtOptions>, TableColTail> {\r\n tagName?: typeof TB.tableColTailTagName;\r\n}\r\n\r\n@B.defineElement({tagName:TB.tableColTailTagName})\r\nexport class TableColTail extends M.ViewListElement<THT.ThtOptions, TableColHeadTailBase<THT.ThtOptions>, TableColTailOptions> implements THT.TableHeadTailBridge {\r\n \r\n // #region ViewListElement\r\n public [M.handleModelEvent](source: unknown, evt: M.ModelEvent): boolean {\r\n const $l = this.closest(TB.tableListTagName) as TableList;\r\n const old = $l.colLayoutPaused;\r\n $l.colLayoutPaused = true;\r\n const ret = super[M.handleModelEvent](source, evt);\r\n $l.colLayoutPaused = old;\r\n return ret;\r\n }\r\n\r\n protected _getViewItemTagName(options: THT.ThtOptions): string {return options.tagName;}\r\n // #endregion\r\n\r\n get $list(): Element & THT.TableHeadTailNoticeReceiver | null {\r\n return this.closest(TB.tableListTagName) as Element & THT.TableHeadTailNoticeReceiver;\r\n }\r\n \r\n // #region TableHeadTailBridge\r\n notifyHide($child: THT.TableColHeadOrTail) {\r\n this.$list?.notify({tailHide:true,$tail:$child});\r\n }\r\n notifyConnected($child: THT.TableColHeadOrTail) {\r\n this.$list?.notify({tailAdd:true,$tail:$child});\r\n }\r\n notifyDisconnected($child: THT.TableColHeadOrTail) {\r\n this.$list?.notify({tailDel:true,$tail:$child});\r\n }\r\n // #endregion\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [TB.tableColTailTagName]: TableColTail;\r\n }\r\n}","import * as B from '@gzmjs/ui-basic';\r\nimport * as TB from './00-base';\r\nimport { TableCol, type NoticeOfCol } from './20-col';\r\nimport { TableCell } from './10-cell';\r\nimport { Snapshot } from './35-snapshot';\r\nimport { TableRow } from './16-row';\r\nimport type { TableView } from './62-table';\r\nimport type { NoticeOfColGroup } from './22-colgroup';\r\nimport type { NoticeOfHead, NoticeOfTail, TableColHeadOrTail } from './46-tht-options';\r\n\r\n// 必须 import 才能正常测试\r\nimport './17-rows';\r\nimport './18-aggs';\r\nimport './25-cols';\r\nimport './48-col-head';\r\nimport './48-col-tail';\r\n\r\n@B.defineElement({tagName: TB.tableListTagName})\r\nexport class TableList extends HTMLElement {\r\n // #region 布局\r\n readonly $colStart = document.createElement(TB.tableColStartTagName);\r\n readonly $colMiddle = document.createElement(TB.tableColMiddleTagName);\r\n readonly $colEnd = document.createElement(TB.tableColEndTagName);\r\n\r\n readonly $colHead = document.createElement(TB.tableColHeadTagName);\r\n readonly $colTail = document.createElement(TB.tableColTailTagName);\r\n\r\n readonly $colStartCols = document.createElement(TB.tableColsTagName);\r\n readonly $colMiddleCols = document.createElement(TB.tableColsTagName);\r\n readonly $colEndCols = document.createElement(TB.tableColsTagName);\r\n\r\n readonly $rows = document.createElement(TB.tableRowsTagName);\r\n\r\n readonly $aggs = document.createElement(TB.tableAggsTagName);\r\n\r\n initLayout() {\r\n this.append(this.$colStart, this.$colMiddle, this.$colEnd, this.$rows, this.$aggs);\r\n\r\n //列\r\n this.$colStart.append(this.$colHead, this.$colStartCols);\r\n this.$colMiddle.append(this.$colMiddleCols);\r\n this.$colEnd.append(this.$colEndCols, this.$colTail);\r\n }\r\n // #endregion\r\n\r\n createSnapshot() {\r\n return new Snapshot(this);\r\n }\r\n getCellsByColKey(colKey: string): TableCell[] {\r\n return Array.from(this.querySelectorAll(`${TB.tableCellTagName}[col-key='${colKey}']`));\r\n }\r\n\r\n // #region 属性\r\n get $table(): TableView {return (this.getRootNode() as ShadowRoot).host as TableView;}\r\n // #endregion\r\n\r\n // #region 排序\r\n sortRows(ss = this.createSnapshot()) {\r\n const $t = this.$table;\r\n if ($t.autoSort) {\r\n this.$rows.sortDataSource(ss);\r\n }\r\n else {\r\n $t.model?.columnSort?.(ss.$columnsWantSort.map(x => x.model!), ss.$columnsWantSort);\r\n }\r\n }\r\n // #endregion\r\n\r\n // #region 聚合\r\n _calcAgg($col: TableCol) {\r\n const agg = $col.agg;\r\n if (agg) {\r\n this.showAggs(true);\r\n this.#doCalcAgg($col);\r\n }\r\n else {\r\n this.#hideAggsIfNotNeeded();\r\n }\r\n }\r\n showAggs(b: boolean) {\r\n this.$aggs.hidden = !b; //true - 要显示\r\n }\r\n #hideAggsIfNotNeeded(ss = this.createSnapshot()) {\r\n const $cols = ss.$columnsNeedAgg;\r\n if ($cols.length === 0 || !this.$rows.childElementCount) { //如果一行也没有就不要显示\r\n this.showAggs(false);\r\n return false; //说明没有 agg 需要计算\r\n }\r\n return $cols;\r\n }\r\n #doCalcAgg($col: TableCol, $t = this.$table) {\r\n if ($t.autoAgg) {\r\n $col.setModelProperty('aggValue', this.#calcAggValueFromDataSource($col));\r\n }\r\n else {\r\n $t.model?.columnAgg?.($col.model!, $col);\r\n }\r\n }\r\n #calcAggValueFromDataSource($col: TableCol): unknown {\r\n const ds = this.$rows.modelList;\r\n if (!ds || ds.length === 0) {\r\n return 0;\r\n }\r\n\r\n const agg = $col.agg!;\r\n if (agg === 'count') {\r\n return ds.length;\r\n }\r\n\r\n const func = Reflect.get(this.$table, agg);\r\n if (typeof func !== 'function') {\r\n return void 0;\r\n }\r\n\r\n const vm = $col.valueMember?.member[0];\r\n if (!vm) return void 0;\r\n\r\n const da = ds.map(r => Reflect.get(r.data, vm));\r\n const ret = func.call(this.$table, ...da);\r\n return ret;\r\n }\r\n \r\n refreshAggs(ss = this.createSnapshot()) {\r\n const $needAgg = this.#hideAggsIfNotNeeded(ss);\r\n if (!$needAgg) {\r\n return;\r\n }\r\n this.showAggs(true);\r\n $needAgg.forEach($c => this.#doCalcAgg($c));\r\n }\r\n // #endregion\r\n\r\n // #region 通知\r\n #colId = 0;\r\n notify(n: NoticeOfCol | NoticeOfColGroup | NoticeOfHead | NoticeOfTail) {\r\n if ('colAdd' in n && n.colAdd) {\r\n if (n.$col.key) {\r\n //服务器端生成的 html 可能自带 key。\r\n }\r\n else {\r\n n.$col.key = (++this.#colId).toString(); //这个 id 与 css grid 布局中的列无关。\r\n }\r\n }\r\n else if ('colSort' in n && n.colSort) {\r\n let doSort = true;\r\n if (!this.$table.multiSort && n.$col.sort) {\r\n this.createSnapshot().$columnsWantSort.forEach($c => {\r\n if ($c !== n.$col) {\r\n $c.sort = '';\r\n doSort = false; //$c.sort='' 也会导致 _notify 被调用,但不满足上面的 n.$col.sort 条件。\r\n }\r\n });\r\n }\r\n if (!doSort) return;\r\n console.debug(`grid column ${n.$col.label} sort ${n.$col.sort}`);\r\n }\r\n this.#columnsMovement.push(n);\r\n if (this.colLayoutPaused) return;\r\n this.#layoutCols();\r\n }\r\n refreshAll() {\r\n this.#columnsMovement.push({all:true}); \r\n if (this.colLayoutPaused) return;\r\n this.#layoutCols();\r\n }\r\n\r\n get colLayoutPaused() {\r\n return this.#colLayoutPaused;\r\n }\r\n set colLayoutPaused(b: boolean) {\r\n b = !!b;\r\n if (!b) {\r\n this.#layoutCols();\r\n }\r\n /* 要等 #layoutCols() 执行完毕,因为 #layoutCols() 过程中可能又会添加入新的 #columnsMovement!\r\n 例如 col-group.setRow() 中会 this.hidden = true。这么做可以防止重入 #layoutCols() */\r\n this.#colLayoutPaused = b;\r\n }\r\n #colLayoutPaused = false;\r\n\r\n /**\r\n * 用来处理 #columnsMovement 中需要单独处理的事件。\r\n * 如列的删除,需要删除所有对应的单元格;列的隐藏,需要隐藏所有对应的单元格。\r\n * 组的删除和隐藏,因为涉及到多个列,所以不在这里处理。\r\n */\r\n #beforeLayout(cms: LayoutNotice[]): NoticeFlags {\r\n const ret: NoticeFlags = {};\r\n for (let i=0; i<cms.length; i++) {\r\n const m = cms[i];\r\n if (!m) continue;\r\n\r\n if ('colDel' in m && m.colDel) {\r\n this.#delColCells(m.$col);\r\n }\r\n else if ('colHide' in m && m.colHide) {\r\n this.#hiddenColCells(m.$col);\r\n }\r\n else if ('colRefresh' in m && m.colRefresh) {\r\n this.#colRefresh(m.$col);\r\n }\r\n else if ('colSort' in m && m.colSort) {\r\n this.sortRows();\r\n }\r\n else if ('colAgg' in m && m.colAgg) {\r\n this._calcAgg(m.$col);\r\n }\r\n else if ('headDel' in m && m.headDel) {\r\n //refreshRows() 无法删除每一行中对应的单元格\r\n this.#delHeadCells(m.$head);\r\n }\r\n else if ('tailDel' in m && m.tailDel) {\r\n //refreshRows() 无法删除每一行中对应的单元格\r\n this.#delTailCells(m.$tail);\r\n }\r\n Object.assign(ret, m);//用来记录 colAdd 之类的属性, $col、$group 之类的属性无所谓(可以互相覆盖)\r\n }\r\n return ret;\r\n }\r\n #afterLayout(): void {\r\n if (this.#columnsMovement.length > 0) {\r\n this.#layoutCols();\r\n }\r\n }\r\n /**\r\n * 用来记录 colLayoutPaused 期间发生的布局改变事件\r\n */\r\n #columnsMovement: LayoutNotice[] = [];\r\n\r\n #layoutCols(): void {\r\n const ss = this.createSnapshot();\r\n const cms = this.#columnsMovement;\r\n this.#columnsMovement = []; //#layoutCols 调用过程中可能会产生新的事件进入 #columnMovement\r\n const cm = this.#beforeLayout(cms);\r\n \r\n //cm 中一共 18 种情况\r\n //以下 14 个都是影响【列数】\r\n const col = cm.colAdd || cm.colDel || cm.colHide;\r\n const group = cm.groupAdd || cm.groupDel || cm.groupHide;\r\n const head = cm.headAdd || cm.headDel || cm.headHide;\r\n const tail = cm.tailAdd || cm.tailDel || cm.tailHide;\r\n\r\n if (cm.all) {\r\n this.#refreshColumns();\r\n }\r\n if (cm.all || col || group || head || tail || cm.colWidth) {\r\n this._setColumnsTemplate(ss);\r\n }\r\n if (cm.all || col || group) {\r\n this._layoutColumnGroup(ss)\r\n }\r\n if (cm.all || cm.colAdd || group || cm.headAdd || cm.tailAdd) {\r\n //head/tail 中记录了自己的 $agg,在 hidden 和 del 时直接就处理了,无需刷新。\r\n //col 中记录自己的 $agg,在 hidden 和 del 时直接就处理了,无需刷新。\r\n //group 中除了 groupAdd 之外都需要调用 refresh(),不过 groupAdd 会伴随 colAdd 事件,这里就不单独处理了。\r\n this.$aggs.refresh(ss);\r\n }\r\n if (cm.all || col || group || head || tail || cm.colWidth) {\r\n //影响 _stickHeads/Tails 就会影响固定行头和行尾,所以需要刷新\r\n this.#refreshRows(ss);\r\n }\r\n this.#afterLayout();\r\n }\r\n // #endregion\r\n\r\n // #region 布局变化\r\n #hiddenColCells($col: TableCol) {\r\n const hidden = !$col.visible;\r\n const $cells = this.getCellsByColKey($col.key!);\r\n $cells.forEach($cell => $cell.hidden = hidden);\r\n }\r\n #delColCells($col: TableCol) {\r\n const $cells = this.getCellsByColKey($col.key!);\r\n $cells.forEach($cell => $cell.remove());\r\n }\r\n #colRefresh($col: TableCol) {\r\n const $cells = this.getCellsByColKey($col.key!);\r\n $cells.forEach($cell => $col._setCellData($cell));\r\n }\r\n #delHeadCells($head: TableColHeadOrTail) {\r\n $head.getAllInRow().forEach($h => $h.remove());\r\n }\r\n #delTailCells($tail: TableColHeadOrTail) {\r\n $tail.getAllInRow().forEach($t => $t.remove());\r\n }\r\n _setColumnsTemplate(ss = this.createSnapshot()) {\r\n const $heads = ss.$columnHeadsVisible;\r\n let startSpan = $heads.length;\r\n\r\n const $startCols = ss.$startColumnsVisible;\r\n startSpan += $startCols.length;\r\n\r\n const $middleCols = ss.$middleColumnsVisible;\r\n const middleSpan = $middleCols.length;\r\n\r\n const $endCols = ss.$endColumnsVisible;\r\n let endSpan = $endCols.length;\r\n\r\n const $tails = ss.$columnTailsVisible;\r\n endSpan += $tails.length;\r\n\r\n const str = [...$heads, ...$startCols, ...$middleCols, ...$endCols, ...$tails].map($c => $c.width).join(' ');\r\n this.style.gridTemplateColumns = str;\r\n this.style.setProperty('--grid-start-span', startSpan.toString());\r\n this.style.setProperty('--grid-middle-span', middleSpan.toString());\r\n this.style.setProperty('--grid-end-span', endSpan.toString());\r\n \r\n void (startSpan ? this.removeAttribute('no-start') : this.setAttribute('no-start', ''));\r\n void (endSpan ? this.removeAttribute('no-end') : this.setAttribute('no-end', ''));\r\n console.debug('grid column layout - ' + str + ' - startSpan = ' + startSpan + ', middleSpan = ' + middleSpan + ', endSpan = ' + endSpan);\r\n }\r\n _layoutColumnGroup(ss = this.createSnapshot()) {\r\n //+1 因为 tier 是根据 group 计算的,而 group 下还有 column。 \r\n //+1 因为 css 中 start 从 1 开始。\r\n const end = ss.groupsMaxTier + 1 + 1;\r\n this.style.setProperty('--grid-col-end', end.toString());\r\n\r\n ss.$visibleTopColumnsAndGroups.forEach($cg => $cg.setRow(1)); //group 由其自己逐层设置\r\n console.debug('--grid-col-end = ' + end);\r\n }\r\n #refreshRows(ss = this.createSnapshot()) {\r\n const begin = new Date().valueOf();\r\n const refresh = this.getRowRefreshFunc(ss);\r\n\r\n const $rows = ss.$rows;\r\n $rows.forEach($row => {\r\n //refresh() 时 cells 数量可能会变动,导致 grid 重新布局。为了提高效率将其隐藏,但测试下来效果不明显。\r\n //row.hidden = true;\r\n refresh($row);\r\n //row.hidden = false;\r\n });\r\n const interval = new Date().valueOf() - begin;\r\n console.debug(`grid refresh ${$rows.length} rows for ${interval} ms`);\r\n }\r\n\r\n getRowRefreshFunc(ss = this.createSnapshot()) {\r\n return ($row: TableRow, refreshCellData = false) => {\r\n $row.refresh(ss, refreshCellData);\r\n };\r\n }\r\n\r\n #refreshColumns() {\r\n this.colLayoutPaused = true;\r\n\r\n //强迫 cols 重新生成所有的列\r\n // eslint-disable-next-line no-self-assign\r\n this.$colStartCols.modelList = this.$colStartCols.modelList;\r\n // eslint-disable-next-line no-self-assign\r\n this.$colMiddleCols.modelList = this.$colMiddleCols.modelList;\r\n // eslint-disable-next-line no-self-assign\r\n this.$colEndCols.modelList = this.$colEndCols.modelList;\r\n \r\n this.colLayoutPaused = false;\r\n }\r\n // #endregion\r\n}\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [TB.tableListTagName]: TableList;\r\n }\r\n}\r\n\r\ntype LayoutNotice = NoticeOfCol | NoticeOfColGroup | NoticeOfHead | NoticeOfTail | {all: true};\r\ninterface NoticeFlags extends Omit<NoticeOfCol & NoticeOfColGroup & NoticeOfHead & NoticeOfTail, '$col' | '$group' | '$head' | '$tail'> {\r\n all?: boolean;\r\n}\r\n//type test = keyof NoticeFlags; 用来测试 NoticeFlags 中的属性","import * as B from '@gzmjs/ui-basic';\r\nimport * as M from '@gzmjs/mvvm';\r\nimport * as TB from './00-base';\r\nimport { TableList } from './60-list';\r\nimport type { ThtOptions } from './46-tht-options';\r\nimport type { TableCol, TableColOptions } from './20-col';\r\nimport { TableRow } from './16-row';\r\nimport { TableCell } from './10-cell';\r\n\r\nexport interface TableViewOptions extends M.ViewModel<TableView> {\r\n /**\r\n * 多行 active\r\n */\r\n multiple?: boolean;\r\n\r\n /**\r\n * 允许多个字段排序\r\n */\r\n multiSort?: boolean;\r\n /**\r\n * 自动根据表格中的内容排序\r\n */\r\n autoSort?: boolean;\r\n /**\r\n * !autoSort,此函数才会被调用\r\n * @param $columnsWantSort 需要排序的字段\r\n * @returns \r\n */\r\n columnSort?: (colsWantSort: TableColOptions[], $colsWantSort: TableCol[]) => void;\r\n\r\n /**\r\n * 自动根据表格中的内容聚合\r\n */\r\n autoAgg?: boolean;\r\n /**\r\n * !autoAgg,此函数才会被调用\r\n * @param $col 要聚合的列\r\n * @returns \r\n */\r\n columnAgg?: (col: TableColOptions, $col: TableCol) => void;\r\n\r\n heads?: ThtOptions[];\r\n tails?: ThtOptions[];\r\n\r\n colsStart?: TableColOptions[];\r\n colsMiddle?: TableColOptions[];\r\n colsEnd?: TableColOptions[];\r\n\r\n /**\r\n * 这个属性放在最后,确保所有的列都先生成。\r\n */\r\n dataSource?: object[];\r\n}\r\n\r\nconst mutableAttributes = ['multiple', 'auto-sort', 'auto-agg'] as const;\r\n\r\n@B.defineElement({tagName: TB.tableViewTagName, mutableAttributes})\r\nexport class TableView extends M.ViewElement<TableViewOptions> implements B.AttributeHandlers<typeof mutableAttributes[number]> {\r\n constructor() {\r\n super();\r\n\r\n const $l = this.$list = document.createElement(TB.tableListTagName);\r\n $l.initLayout();\r\n $l.onclick = this.#clickHandler;\r\n\r\n const $section = document.createElement('section');\r\n $section.append($l, document.createElement('div'));\r\n\r\n const $root = this.attachShadow({mode: 'closed'});\r\n $root.adoptedStyleSheets = [B.baseStyle, B.utilityStyle, TB.styleSheet];\r\n $root.append($section);\r\n }\r\n readonly $list: TableList;\r\n \r\n // #region click\r\n #clickHandler = (e: Event) => {\r\n const $cp = e.composedPath() as Element[]; //https://devdocs.io/dom/event/composedpath\r\n const $ge = $cp.find($c => $c.tagName.startsWith('GZM-TABLE-'));\r\n if (!$ge) return;\r\n\r\n if ($ge instanceof TableCell) {\r\n const $row = $ge.closest<TableRow>(TB.tableRowTagName);\r\n if ($row) {\r\n this.#switchActiveRow($row);\r\n }\r\n }\r\n else if ($ge instanceof TableRow) {\r\n this.#switchActiveRow($ge);\r\n }\r\n else {\r\n if ('handleClick' in $ge && typeof $ge.handleClick === 'function') {\r\n $ge.handleClick(e, this.$list);\r\n }\r\n }\r\n };\r\n #switchActiveRow($row: TableRow) {\r\n if ($row.active) {\r\n $row.setModelProperty('active', false);\r\n return;\r\n }\r\n if (this.multiple) {\r\n //多选\r\n $row.setModelProperty('active', true);\r\n return;\r\n }\r\n const ss = this.$list.createSnapshot();\r\n ss.$rowsActive.forEach($row => $row.setModelProperty('active', false));\r\n $row.setModelProperty('active', true);\r\n }\r\n // #endregion\r\n\r\n // #region models\r\n /**\r\n * 设置 model 会导致此函数被调用来设置各个属性,所以需要控制 colLayoutPaused;\r\n */\r\n public [M.handleModelEvent](source: unknown, evt: M.ModelEvent): boolean {\r\n if (source === this.dataSource) {\r\n return new M.DataListEventHandler(this.dataSource!, this.$list.$rows.modelList, 'data').handle(evt);\r\n }\r\n \r\n const $l = this.$list;\r\n const old = $l.colLayoutPaused;\r\n $l.colLayoutPaused = true;\r\n const ret = super[M.handleModelEvent](source, evt);\r\n $l.colLayoutPaused = old;\r\n return ret;\r\n }\r\n \r\n get heads(): ThtOptions[] {return this.$list.$colHead.modelList;}\r\n set heads(v: ThtOptions[]) {\r\n this.$list.$colHead.modelList = v;\r\n }\r\n\r\n get tails(): ThtOptions[] {return this.$list.$colTail.modelList;}\r\n set tails(v: ThtOptions[]) {\r\n this.$list.$colTail.modelList = v;\r\n }\r\n\r\n get colsStart(): TableColOptions[] {return this.$list.$colStartCols.modelList;}\r\n set colsStart(v: TableColOptions[]) {\r\n this.$list.$colStartCols.modelList = v;\r\n }\r\n\r\n get colsMiddle(): TableColOptions[] {return this.$list.$colMiddleCols.modelList;}\r\n set colsMiddle(v: TableColOptions[]) {\r\n this.$list.$colMiddleCols.modelList = v;\r\n }\r\n\r\n get colsEnd(): TableColOptions[] {return this.$list.$colEndCols.modelList;}\r\n set colsEnd(v: TableColOptions[]) {\r\n this.$list.$colEndCols.modelList = v;\r\n }\r\n\r\n get dataSource() {return this.#ds;}\r\n set dataSource(ds: object[] | undefined) {\r\n const old = this.#ds;\r\n if (old) {\r\n (old as M.ModelList)[M.offModelEvent]?.(this);\r\n }\r\n this.#ds = ds;\r\n if (ds) {\r\n (ds as M.ModelList)[M.onModelEvent]?.(this);\r\n const ml = new M.DataListEventHandler(ds, this.$list.$rows.modelList, 'data').createModelList();\r\n this.$list.$rows.setModelProperty('modelList', M.createViewModel(ml));\r\n }\r\n else {\r\n this.$list.$rows.setModelProperty('modelList', []);\r\n }\r\n }\r\n #ds?: object[];\r\n // #endregion\r\n\r\n // #region 对外方法\r\n /**\r\n * @returns 选中的行的数据\r\n */\r\n getActiveModels() {\r\n return this.getActiveRows().map($row => $row.model);\r\n }\r\n getActiveRows(): TableRow[] {\r\n return this.$list.createSnapshot().$rowsActive;\r\n } \r\n getCheckedRows(): TableRow[] {\r\n const $chks = this.$list.querySelectorAll(`${TB.tableRowCheckTagName} input[type=\"checkbox\"]:checked`);\r\n const $rows = Array.from($chks).map($x => $x.closest(TB.tableRowTagName) as TableRow);\r\n return $rows;\r\n }\r\n getCheckedModels() {\r\n return this.getCheckedRows().map($row => $row.model);\r\n }\r\n // #endregion\r\n\r\n // #region 属性\r\n @B.boolAttr\r\n accessor multiple: boolean = false;\r\n\r\n _multiple_set() {\r\n if (this.multiple) return;\r\n\r\n const $rs = this.$list.createSnapshot().$rowsActive;\r\n for (let i=1; i<$rs.length; i++) {\r\n $rs[i]?.setModelProperty('active', false); //第一行仍然 active,其他去 active。\r\n }\r\n }\r\n\r\n @B.boolAttr\r\n accessor multiSort: boolean = false;\r\n\r\n @B.boolAttr\r\n accessor autoSort: boolean = false;\r\n\r\n _auto_sort_set() {\r\n this.$list.sortRows();\r\n }\r\n\r\n @B.boolAttr\r\n accessor autoAgg: boolean = false;\r\n\r\n _auto_agg_set() {\r\n this.$list.refreshAggs();\r\n }\r\n // #endregion\r\n\r\n // #region 默认聚合函数 autoAgg 时调用,60-list #calcAggValueFromDataSource() 中使用\r\n count(... args: unknown[]): number {\r\n return args.length;\r\n }\r\n sum(... args: number[]): number | undefined {\r\n if (args.length === 0) return 0;\r\n args = this.#num(...args);\r\n if (args.length === 0) return void 0\r\n return args.reduce((p, c) => p + c, 0);\r\n }\r\n avg(... args: number[]): number | undefined {\r\n if (args.length === 0) return 0;\r\n const sum = this.sum(...args);\r\n return sum === void 0 ? sum : sum / args.length;\r\n }\r\n min(... args: unknown[]): unknown {\r\n if (args.length === 0) return 0;\r\n const nums = this.#num(...args);\r\n if (nums.length === args.length) {\r\n return Math.min(...nums);\r\n }\r\n return args.reduce((min, current) => {\r\n // 比较当前累积的最小值和当前元素,返回更小的那个\r\n try {\r\n return compare(current, min) < 0 ? current : min;\r\n }\r\n catch(e) {\r\n console.warn(e, min, current);\r\n }\r\n return min;\r\n }, args[0]);\r\n }\r\n max(... args: unknown[]): unknown {\r\n if (args.length === 0) return 0;\r\n const nums = this.#num(...args);\r\n if (nums.length === args.length) {\r\n return Math.max(...nums);\r\n }\r\n return args.reduce((max, current) => {\r\n // 比较当前累积的最小值和当前元素,返回更小的那个\r\n try {\r\n return compare(current, max) > 0 ? current : max;\r\n }\r\n catch(e) {\r\n console.warn(e, max, current);\r\n }\r\n return max;\r\n }, args[0]);\r\n }\r\n #num(... args: unknown[]): number[] {\r\n args = args.flatMap(n => n).map(n => Number(n)).filter(n => !Number.isNaN(n));\r\n return args as number[];\r\n }\r\n // #endregion\r\n\r\n readonly T = B.createText(TB.texts, B.globalTexts).bindHtmlElement(this);\r\n}\r\n\r\nfunction compare(a: unknown, b: unknown): number {\r\n if (a === b) {\r\n return 0;\r\n }\r\n if (Array.isArray(a) && Array.isArray(b)) {\r\n const l = Math.max(a.length, b.length);\r\n for (let i = 0; i < l; i++) {\r\n const ret = compare(a[i], b[i]);\r\n if (ret !== 0) {\r\n return ret;\r\n }\r\n }\r\n return 0;\r\n }\r\n //这里 a,b 是否数字不重要,重要的是让 js 自行去处理转换。\r\n return (a as number) < (b as number) ? -1 : 1;\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n [TB.tableViewTagName]: TableView;\r\n }\r\n}\r\n"],"names":["_a","_init","TB.tableCellTagName","__privateAdd","__runInitializers","TB.tableRowTagName","__decoratorStart","__decorateElement","_b","mutableAttributes","__publicField","TB.tableRowStartTagName","TB.tableRowMiddleTagName","TB.tableRowEndTagName","__privateMethod","TB.tableRowCheckTagName","TB.tableListTagName","TB.tableColGroupTagName","_TableColGroup","TB.getTexts","_agg","TB.tableColTagName","__privateGet","__privateSet","TB.tableAggTagName","TB.tableColWidthSetterTagName","TB.tableColCheckTagName","TB.tableColSerialTagName","TB.tableRowSerialTagName","TB.tableColActionTagName","TB.tableRowActionTagName","TB.tableColMenuTagName","TB.tableRowMenuTagName","TB.tableRowsTagName","TB.tableAggsTagName","TB.tableAggStartTagName","TB.tableAggMiddleTagName","TB.tableAggEndTagName","TB.tableViewTagName","TB.tableColsTagName","TG.TableColGroup","TB.tableColHeadTagName","TB.tableColTailTagName","TB.tableColStartTagName","TB.tableColMiddleTagName","TB.tableColEndTagName","TB.texts","TB.styleSheet","$row"],"mappings":"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"}
|