@gcsa/console-core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/gcsaChat.d.ts +6 -0
- package/dist/gcsaChat.d.ts.map +1 -0
- package/dist/gcsaChat.js +31 -0
- package/dist/gcsaClipboard.d.ts +2 -0
- package/dist/gcsaClipboard.d.ts.map +1 -0
- package/dist/gcsaClipboard.js +30 -0
- package/dist/gcsaCssLength.d.ts +3 -0
- package/dist/gcsaCssLength.d.ts.map +1 -0
- package/dist/gcsaCssLength.js +6 -0
- package/dist/gcsaDate.d.ts +15 -0
- package/dist/gcsaDate.d.ts.map +1 -0
- package/dist/gcsaDate.js +12 -0
- package/dist/gcsaDateTimeValue.d.ts +8 -0
- package/dist/gcsaDateTimeValue.d.ts.map +1 -0
- package/dist/gcsaDateTimeValue.js +16 -0
- package/dist/gcsaLocale.d.ts +109 -0
- package/dist/gcsaLocale.d.ts.map +1 -0
- package/dist/gcsaLocale.js +320 -0
- package/dist/gcsaMarkdown.d.ts +2 -0
- package/dist/gcsaMarkdown.d.ts.map +1 -0
- package/dist/gcsaMarkdown.js +19 -0
- package/dist/gcsaMenu.d.ts +21 -0
- package/dist/gcsaMenu.d.ts.map +1 -0
- package/dist/gcsaMenu.js +20 -0
- package/dist/gcsaMessage.d.ts +3 -0
- package/dist/gcsaMessage.d.ts.map +1 -0
- package/dist/gcsaMessage.js +1 -0
- package/dist/gcsaPagination.d.ts +13 -0
- package/dist/gcsaPagination.d.ts.map +1 -0
- package/dist/gcsaPagination.js +52 -0
- package/dist/gcsaPopupCollision.d.ts +22 -0
- package/dist/gcsaPopupCollision.d.ts.map +1 -0
- package/dist/gcsaPopupCollision.js +66 -0
- package/dist/gcsaPopupPositioning.d.ts +30 -0
- package/dist/gcsaPopupPositioning.d.ts.map +1 -0
- package/dist/gcsaPopupPositioning.js +18 -0
- package/dist/gcsaPopupStyles.d.ts +51 -0
- package/dist/gcsaPopupStyles.d.ts.map +1 -0
- package/dist/gcsaPopupStyles.js +115 -0
- package/dist/gcsaSize.d.ts +9 -0
- package/dist/gcsaSize.d.ts.map +1 -0
- package/dist/gcsaSize.js +13 -0
- package/dist/gcsaTableEvents.d.ts +27 -0
- package/dist/gcsaTableEvents.d.ts.map +1 -0
- package/dist/gcsaTableEvents.js +13 -0
- package/dist/gcsaTableLayout.d.ts +23 -0
- package/dist/gcsaTableLayout.d.ts.map +1 -0
- package/dist/gcsaTableLayout.js +36 -0
- package/dist/gcsaTableMigration.d.ts +34 -0
- package/dist/gcsaTableMigration.d.ts.map +1 -0
- package/dist/gcsaTableMigration.js +65 -0
- package/dist/gcsaTablePreferences.d.ts +16 -0
- package/dist/gcsaTablePreferences.d.ts.map +1 -0
- package/dist/gcsaTablePreferences.js +53 -0
- package/dist/gcsaTableRows.d.ts +8 -0
- package/dist/gcsaTableRows.d.ts.map +1 -0
- package/dist/gcsaTableRows.js +29 -0
- package/dist/gcsaTime.d.ts +23 -0
- package/dist/gcsaTime.d.ts.map +1 -0
- package/dist/gcsaTime.js +63 -0
- package/dist/index.d.ts +163 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/package.json +37 -0
- package/src/gcsaChat.ts +35 -0
- package/src/gcsaClipboard.ts +28 -0
- package/src/gcsaCssLength.ts +5 -0
- package/src/gcsaDate.ts +30 -0
- package/src/gcsaDateTimeValue.ts +18 -0
- package/src/gcsaLocale.ts +431 -0
- package/src/gcsaMarkdown.ts +19 -0
- package/src/gcsaMenu.ts +43 -0
- package/src/gcsaMessage.ts +3 -0
- package/src/gcsaPagination.ts +68 -0
- package/src/gcsaPopupCollision.ts +111 -0
- package/src/gcsaPopupPositioning.ts +57 -0
- package/src/gcsaPopupStyles.ts +137 -0
- package/src/gcsaSize.ts +29 -0
- package/src/gcsaTableEvents.ts +36 -0
- package/src/gcsaTableLayout.ts +69 -0
- package/src/gcsaTableMigration.ts +104 -0
- package/src/gcsaTablePreferences.ts +61 -0
- package/src/gcsaTableRows.ts +36 -0
- package/src/gcsaTime.ts +83 -0
- package/src/index.ts +237 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
export function normalizeGcsaTableColumns(columns, options = {}) {
|
|
2
|
+
let selectable = false;
|
|
3
|
+
let expandable = false;
|
|
4
|
+
let fixedSelection = false;
|
|
5
|
+
let selectionColumnWidth;
|
|
6
|
+
let expandColumnWidth;
|
|
7
|
+
const normalized = [];
|
|
8
|
+
const page = Math.max(1, options.page ?? 1);
|
|
9
|
+
const pageSize = Math.max(1, options.pageSize ?? 10);
|
|
10
|
+
const indexOffset = (page - 1) * pageSize;
|
|
11
|
+
columns.forEach((column, index) => {
|
|
12
|
+
const { formatter: legacyFormatter, children: legacyChildren, ...columnRest } = column;
|
|
13
|
+
const type = column.type;
|
|
14
|
+
const width = normalizeColumnWidth(column.width);
|
|
15
|
+
const minWidth = normalizeColumnWidth(column.minWidth ?? column['min-width']);
|
|
16
|
+
const showOverflowTooltip = column.showOverflowTooltip ?? column['show-overflow-tooltip'];
|
|
17
|
+
const sortMethod = column.sortMethod ?? column['sort-method'];
|
|
18
|
+
if (type === 'selection') {
|
|
19
|
+
selectable = column.selectable ?? true;
|
|
20
|
+
fixedSelection || (fixedSelection = Boolean(column.fixed));
|
|
21
|
+
selectionColumnWidth ?? (selectionColumnWidth = width ? Number.parseFloat(width) : undefined);
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
if (type === 'expand') {
|
|
25
|
+
expandable = true;
|
|
26
|
+
expandColumnWidth ?? (expandColumnWidth = width ? Number.parseFloat(width) : undefined);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
const id = column.id ?? column.prop ?? (type === 'index' ? '__index' : `column-${index}`);
|
|
30
|
+
const header = column.header ?? column.label ?? (type === 'index' ? '#' : id);
|
|
31
|
+
const accessorKey = column.accessorKey ?? column.prop;
|
|
32
|
+
const children = legacyChildren?.length
|
|
33
|
+
? normalizeGcsaTableColumns(legacyChildren, options).columns
|
|
34
|
+
: undefined;
|
|
35
|
+
normalized.push({
|
|
36
|
+
...columnRest,
|
|
37
|
+
id,
|
|
38
|
+
header,
|
|
39
|
+
...(accessorKey ? { accessorKey } : {}),
|
|
40
|
+
...(children ? { columns: children } : {}),
|
|
41
|
+
sortable: column.sortable === 'custom' ? true : column.sortable,
|
|
42
|
+
...(sortMethod ? { sortCompare: sortMethod } : {}),
|
|
43
|
+
...(legacyFormatter ? { formatter: (value, row, rowIndex) => legacyFormatter(row, column, value, rowIndex) } : {}),
|
|
44
|
+
width,
|
|
45
|
+
minWidth,
|
|
46
|
+
showOverflowTooltip,
|
|
47
|
+
...(type === 'index' ? {
|
|
48
|
+
formatter: (_value, _row, rowIndex) => {
|
|
49
|
+
const absoluteIndex = indexOffset + rowIndex;
|
|
50
|
+
if (typeof column.index === 'function')
|
|
51
|
+
return column.index(absoluteIndex);
|
|
52
|
+
if (typeof column.index === 'number')
|
|
53
|
+
return column.index + absoluteIndex;
|
|
54
|
+
return absoluteIndex + 1;
|
|
55
|
+
}
|
|
56
|
+
} : {})
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
return { columns: normalized, selectable, expandable, fixedSelection, selectionColumnWidth, expandColumnWidth };
|
|
60
|
+
}
|
|
61
|
+
function normalizeColumnWidth(value) {
|
|
62
|
+
if (value === undefined || value === null || value === '')
|
|
63
|
+
return undefined;
|
|
64
|
+
return typeof value === 'number' ? `${value}px` : /^\d+(?:\.\d+)?$/.test(value) ? `${value}px` : value;
|
|
65
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type GcsaTableSortingPreference = {
|
|
2
|
+
id: string;
|
|
3
|
+
desc: boolean;
|
|
4
|
+
};
|
|
5
|
+
export type GcsaTablePreferences = {
|
|
6
|
+
columnVisibility?: Record<string, boolean>;
|
|
7
|
+
columnWidths?: Record<string, number>;
|
|
8
|
+
sorting?: GcsaTableSortingPreference[];
|
|
9
|
+
pageSize?: number;
|
|
10
|
+
};
|
|
11
|
+
export type GcsaTablePreferenceStorage = Pick<Storage, 'getItem' | 'setItem' | 'removeItem'>;
|
|
12
|
+
export declare function normalizeGcsaTablePreferences(value: unknown): GcsaTablePreferences;
|
|
13
|
+
export declare function readGcsaTablePreferences(storage: GcsaTablePreferenceStorage | undefined, key: string): GcsaTablePreferences;
|
|
14
|
+
export declare function writeGcsaTablePreferences(storage: GcsaTablePreferenceStorage | undefined, key: string, value: GcsaTablePreferences): boolean;
|
|
15
|
+
export declare function clearGcsaTablePreferences(storage: GcsaTablePreferenceStorage | undefined, key: string): boolean;
|
|
16
|
+
//# sourceMappingURL=gcsaTablePreferences.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gcsaTablePreferences.d.ts","sourceRoot":"","sources":["../src/gcsaTablePreferences.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,0BAA0B,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;AAEvE,MAAM,MAAM,oBAAoB,GAAG;IACjC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,OAAO,CAAC,EAAE,0BAA0B,EAAE,CAAC;IACvC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG,IAAI,CAAC,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,YAAY,CAAC,CAAC;AAY7F,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,CASlF;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,0BAA0B,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,oBAAoB,CAQ3H;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,0BAA0B,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAQ5I;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,0BAA0B,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAQ/G"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
function isRecord(value) {
|
|
2
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
3
|
+
}
|
|
4
|
+
function normalizeRecord(value, predicate) {
|
|
5
|
+
if (!isRecord(value))
|
|
6
|
+
return undefined;
|
|
7
|
+
const entries = Object.entries(value).filter(([, entry]) => predicate(entry));
|
|
8
|
+
return entries.length ? Object.fromEntries(entries) : undefined;
|
|
9
|
+
}
|
|
10
|
+
export function normalizeGcsaTablePreferences(value) {
|
|
11
|
+
if (!isRecord(value))
|
|
12
|
+
return {};
|
|
13
|
+
const columnVisibility = normalizeRecord(value.columnVisibility, (entry) => typeof entry === 'boolean');
|
|
14
|
+
const columnWidths = normalizeRecord(value.columnWidths, (entry) => typeof entry === 'number' && Number.isFinite(entry) && entry > 0);
|
|
15
|
+
const sorting = Array.isArray(value.sorting)
|
|
16
|
+
? value.sorting.filter(isRecord).filter(entry => typeof entry.id === 'string' && typeof entry.desc === 'boolean').map(entry => ({ id: entry.id, desc: entry.desc }))
|
|
17
|
+
: undefined;
|
|
18
|
+
const pageSize = typeof value.pageSize === 'number' && Number.isInteger(value.pageSize) && value.pageSize > 0 ? value.pageSize : undefined;
|
|
19
|
+
return { columnVisibility, columnWidths, sorting: sorting?.length ? sorting : undefined, pageSize };
|
|
20
|
+
}
|
|
21
|
+
export function readGcsaTablePreferences(storage, key) {
|
|
22
|
+
if (!storage || !key)
|
|
23
|
+
return {};
|
|
24
|
+
try {
|
|
25
|
+
const raw = storage.getItem(key);
|
|
26
|
+
return raw ? normalizeGcsaTablePreferences(JSON.parse(raw)) : {};
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return {};
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export function writeGcsaTablePreferences(storage, key, value) {
|
|
33
|
+
if (!storage || !key)
|
|
34
|
+
return false;
|
|
35
|
+
try {
|
|
36
|
+
storage.setItem(key, JSON.stringify(normalizeGcsaTablePreferences(value)));
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export function clearGcsaTablePreferences(storage, key) {
|
|
44
|
+
if (!storage || !key)
|
|
45
|
+
return false;
|
|
46
|
+
try {
|
|
47
|
+
storage.removeItem(key);
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolves the row id used by TanStack Table and the legacy table API.
|
|
3
|
+
* TanStack's default fallback is relative to the parent row; keeping that
|
|
4
|
+
* behavior here prevents parent and child rows from sharing an id in trees.
|
|
5
|
+
*/
|
|
6
|
+
export declare function getGcsaTableRowId<T extends Record<string, unknown>>(row: T, index: number, rowKey?: (keyof T & string) | ((row: T, index: number) => string), parentId?: string): string;
|
|
7
|
+
export declare function getGcsaTableDefaultExpandedKeys<T extends Record<string, unknown>>(rows: T[], treeData: boolean, childrenKey: keyof T & string, rowKey?: (keyof T & string) | ((row: T, index: number) => string)): string[];
|
|
8
|
+
//# sourceMappingURL=gcsaTableRows.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gcsaTableRows.d.ts","sourceRoot":"","sources":["../src/gcsaTableRows.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjE,GAAG,EAAE,CAAC,EACN,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,CAAA,MAAM,CAAC,GAAG,MAAM,IAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,EAC/D,QAAQ,CAAC,EAAE,MAAM,UAKlB;AAED,wBAAgB,+BAA+B,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/E,IAAI,EAAE,CAAC,EAAE,EACT,QAAQ,EAAE,OAAO,EACjB,WAAW,EAAE,MAAM,CAAC,GAAG,MAAM,EAC7B,MAAM,CAAC,EAAE,CAAA,MAAM,CAAC,GAAG,MAAM,IAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,YAehE"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolves the row id used by TanStack Table and the legacy table API.
|
|
3
|
+
* TanStack's default fallback is relative to the parent row; keeping that
|
|
4
|
+
* behavior here prevents parent and child rows from sharing an id in trees.
|
|
5
|
+
*/
|
|
6
|
+
export function getGcsaTableRowId(row, index, rowKey, parentId) {
|
|
7
|
+
if (typeof rowKey === 'function')
|
|
8
|
+
return rowKey(row, index);
|
|
9
|
+
if (rowKey)
|
|
10
|
+
return String(row[rowKey]);
|
|
11
|
+
return parentId ? `${parentId}.${index}` : String(index);
|
|
12
|
+
}
|
|
13
|
+
export function getGcsaTableDefaultExpandedKeys(rows, treeData, childrenKey, rowKey) {
|
|
14
|
+
if (!treeData)
|
|
15
|
+
return rows.map((row, index) => getGcsaTableRowId(row, index, rowKey));
|
|
16
|
+
const keys = [];
|
|
17
|
+
const visit = (items, parentPath = '') => {
|
|
18
|
+
items.forEach((row, index) => {
|
|
19
|
+
const children = row[childrenKey];
|
|
20
|
+
if (!Array.isArray(children) || !children.length)
|
|
21
|
+
return;
|
|
22
|
+
const path = parentPath ? `${parentPath}.${index}` : String(index);
|
|
23
|
+
keys.push(rowKey ? getGcsaTableRowId(row, index, rowKey) : path);
|
|
24
|
+
visit(children, path);
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
visit(rows);
|
|
28
|
+
return keys;
|
|
29
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** 24 小时制时间字符串 HH:mm */
|
|
2
|
+
export type GcsaTimeString = string;
|
|
3
|
+
export type GcsaTimePickerOptions = {
|
|
4
|
+
min?: GcsaTimeString;
|
|
5
|
+
max?: GcsaTimeString;
|
|
6
|
+
/** 步长,单位秒,默认 60 */
|
|
7
|
+
step?: number;
|
|
8
|
+
};
|
|
9
|
+
export declare const GCSA_TIME_STRING_PATTERN: RegExp;
|
|
10
|
+
export declare const GCSA_TIME_PICKER_CELL_HEIGHT = 32;
|
|
11
|
+
export declare function isGcsaTimeString(value: string): value is GcsaTimeString;
|
|
12
|
+
export declare function gcsaTimeToMinutes(value?: string): number | undefined;
|
|
13
|
+
export declare function gcsaMinutesToTime(totalMinutes: number): GcsaTimeString;
|
|
14
|
+
export declare function gcsaNormalizeTimeStep(step?: number): number;
|
|
15
|
+
export declare function gcsaBuildTimeOptions({ min, max, step }?: GcsaTimePickerOptions): GcsaTimeString[];
|
|
16
|
+
export declare function gcsaTimePickerHours(options: GcsaTimeString[]): string[];
|
|
17
|
+
export declare function gcsaTimePickerMinutes(options: GcsaTimeString[], hour: string): string[];
|
|
18
|
+
export declare function gcsaResolveTimeDraft(value: string | undefined, options: GcsaTimeString[]): GcsaTimeString;
|
|
19
|
+
export declare function gcsaNearestTimeOption(options: GcsaTimeString[], targetMinutes: number): GcsaTimeString;
|
|
20
|
+
export declare function gcsaCurrentTimeOption(options: GcsaTimeString[]): GcsaTimeString;
|
|
21
|
+
export declare function gcsaTimePickerScrollTop(index: number): number;
|
|
22
|
+
export declare function gcsaTimePickerScrollIndex(scrollTop: number, itemCount: number): number;
|
|
23
|
+
//# sourceMappingURL=gcsaTime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gcsaTime.d.ts","sourceRoot":"","sources":["../src/gcsaTime.ts"],"names":[],"mappings":"AAAA,wBAAwB;AACxB,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAEpC,MAAM,MAAM,qBAAqB,GAAG;IAClC,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,mBAAmB;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,eAAO,MAAM,wBAAwB,QAAkB,CAAC;AACxD,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAE/C,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,cAAc,CAEvE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIpE;AAED,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,cAAc,CAKtE;AAED,wBAAgB,qBAAqB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAI3D;AAED,wBAAgB,oBAAoB,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAE,qBAA0B,GAAG,cAAc,EAAE,CAWrG;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,EAAE,CAEvE;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAEvF;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,cAAc,CAGzG;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,cAAc,EAAE,EAAE,aAAa,EAAE,MAAM,GAAG,cAAc,CAMtG;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,cAAc,CAG/E;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED,wBAAgB,yBAAyB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAGtF"}
|
package/dist/gcsaTime.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export const GCSA_TIME_STRING_PATTERN = /^\d{2}:\d{2}$/;
|
|
2
|
+
export const GCSA_TIME_PICKER_CELL_HEIGHT = 32;
|
|
3
|
+
export function isGcsaTimeString(value) {
|
|
4
|
+
return GCSA_TIME_STRING_PATTERN.test(value);
|
|
5
|
+
}
|
|
6
|
+
export function gcsaTimeToMinutes(value) {
|
|
7
|
+
if (!value || !GCSA_TIME_STRING_PATTERN.test(value))
|
|
8
|
+
return undefined;
|
|
9
|
+
const [hours, minutes] = value.split(':').map(Number);
|
|
10
|
+
return hours * 60 + minutes;
|
|
11
|
+
}
|
|
12
|
+
export function gcsaMinutesToTime(totalMinutes) {
|
|
13
|
+
const normalized = Math.max(0, Math.min(1439, totalMinutes));
|
|
14
|
+
const hours = Math.floor(normalized / 60);
|
|
15
|
+
const minutes = normalized % 60;
|
|
16
|
+
return `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}`;
|
|
17
|
+
}
|
|
18
|
+
export function gcsaNormalizeTimeStep(step) {
|
|
19
|
+
const seconds = Number(step);
|
|
20
|
+
if (!Number.isFinite(seconds) || seconds <= 0)
|
|
21
|
+
return 60;
|
|
22
|
+
return Math.max(60, Math.round(seconds / 60) * 60);
|
|
23
|
+
}
|
|
24
|
+
export function gcsaBuildTimeOptions({ min, max, step } = {}) {
|
|
25
|
+
const incrementMinutes = gcsaNormalizeTimeStep(step) / 60;
|
|
26
|
+
const start = Math.max(0, gcsaTimeToMinutes(min) ?? 0);
|
|
27
|
+
const end = Math.min(1439, gcsaTimeToMinutes(max) ?? 1439);
|
|
28
|
+
const result = [];
|
|
29
|
+
for (let value = start; value <= end; value += incrementMinutes) {
|
|
30
|
+
result.push(gcsaMinutesToTime(value));
|
|
31
|
+
}
|
|
32
|
+
return result.length ? result : [gcsaMinutesToTime(start)];
|
|
33
|
+
}
|
|
34
|
+
export function gcsaTimePickerHours(options) {
|
|
35
|
+
return [...new Set(options.map(option => option.slice(0, 2)))];
|
|
36
|
+
}
|
|
37
|
+
export function gcsaTimePickerMinutes(options, hour) {
|
|
38
|
+
return options.filter(option => option.startsWith(`${hour}:`)).map(option => option.slice(3));
|
|
39
|
+
}
|
|
40
|
+
export function gcsaResolveTimeDraft(value, options) {
|
|
41
|
+
if (value && options.includes(value))
|
|
42
|
+
return value;
|
|
43
|
+
return options[0] ?? '00:00';
|
|
44
|
+
}
|
|
45
|
+
export function gcsaNearestTimeOption(options, targetMinutes) {
|
|
46
|
+
return options.reduce((best, option) => {
|
|
47
|
+
const optionMinutes = gcsaTimeToMinutes(option) ?? 0;
|
|
48
|
+
const bestMinutes = gcsaTimeToMinutes(best) ?? 0;
|
|
49
|
+
return Math.abs(optionMinutes - targetMinutes) < Math.abs(bestMinutes - targetMinutes) ? option : best;
|
|
50
|
+
}, options[0] ?? '00:00');
|
|
51
|
+
}
|
|
52
|
+
export function gcsaCurrentTimeOption(options) {
|
|
53
|
+
const now = new Date();
|
|
54
|
+
return gcsaNearestTimeOption(options, now.getHours() * 60 + now.getMinutes());
|
|
55
|
+
}
|
|
56
|
+
export function gcsaTimePickerScrollTop(index) {
|
|
57
|
+
return Math.max(0, index) * GCSA_TIME_PICKER_CELL_HEIGHT;
|
|
58
|
+
}
|
|
59
|
+
export function gcsaTimePickerScrollIndex(scrollTop, itemCount) {
|
|
60
|
+
if (!itemCount)
|
|
61
|
+
return 0;
|
|
62
|
+
return Math.max(0, Math.min(itemCount - 1, Math.round(scrollTop / GCSA_TIME_PICKER_CELL_HEIGHT)));
|
|
63
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export type GcsaNavItem = {
|
|
3
|
+
key: string;
|
|
4
|
+
label: string;
|
|
5
|
+
href?: string;
|
|
6
|
+
/** @deprecated use iconKey */
|
|
7
|
+
icon?: string;
|
|
8
|
+
iconKey?: 'dashboard' | 'alert' | 'assets' | 'settings' | 'users' | 'chat';
|
|
9
|
+
};
|
|
10
|
+
export type GcsaTableColumnAlign = 'left' | 'center' | 'right';
|
|
11
|
+
/** 固定列方向;`true` 兼容 Element Plus,等价于左固定。 */
|
|
12
|
+
export type GcsaTableColumnFixed = 'left' | 'right' | true;
|
|
13
|
+
export type GcsaTableColumnFilter = {
|
|
14
|
+
type: 'text' | 'select';
|
|
15
|
+
placeholder?: string;
|
|
16
|
+
options?: GcsaSelectOption[];
|
|
17
|
+
};
|
|
18
|
+
export type GcsaTableColumn<T> = {
|
|
19
|
+
/** 列唯一键,对应插槽 `cell-{id}` / `header-{id}` */
|
|
20
|
+
id: string;
|
|
21
|
+
header: string;
|
|
22
|
+
accessorKey?: keyof T & string;
|
|
23
|
+
/** 是否可排序 */
|
|
24
|
+
sortable?: boolean;
|
|
25
|
+
/** 自定义客户端排序比较函数,返回值语义与 Array.sort 一致 */
|
|
26
|
+
sortCompare?: (a: T, b: T) => number;
|
|
27
|
+
width?: string;
|
|
28
|
+
/** 列最小宽度,避免窄容器下文字被挤成竖排 */
|
|
29
|
+
minWidth?: string;
|
|
30
|
+
/** 是否允许用户拖拽调整列宽 */
|
|
31
|
+
resizable?: boolean;
|
|
32
|
+
/** 内容过长时显示省略号,并通过 title 保留完整内容 */
|
|
33
|
+
showOverflowTooltip?: boolean;
|
|
34
|
+
align?: GcsaTableColumnAlign;
|
|
35
|
+
fixed?: GcsaTableColumnFixed;
|
|
36
|
+
hidden?: boolean;
|
|
37
|
+
filter?: GcsaTableColumnFilter;
|
|
38
|
+
/** 插槽后缀,默认与 id 相同 */
|
|
39
|
+
slot?: string;
|
|
40
|
+
/** 无插槽时的简易单元格渲染 */
|
|
41
|
+
cell?: (row: T) => unknown;
|
|
42
|
+
/** 默认单元格格式化;不改变排序和原始值,只改变展示内容 */
|
|
43
|
+
formatter?: (value: unknown, row: T, index: number) => unknown;
|
|
44
|
+
/** Grouped child columns; compatible with nested el-table-column definitions. */
|
|
45
|
+
columns?: GcsaTableColumn<T>[];
|
|
46
|
+
};
|
|
47
|
+
export { normalizeGcsaTableColumns } from './gcsaTableMigration';
|
|
48
|
+
export type { GcsaLegacyTableColumn, GcsaTableMigration, GcsaTableMigrationOptions } from './gcsaTableMigration';
|
|
49
|
+
export type GcsaChatMessageRole = 'user' | 'assistant' | 'system';
|
|
50
|
+
export type GcsaChatMessage = {
|
|
51
|
+
id: string;
|
|
52
|
+
role: GcsaChatMessageRole;
|
|
53
|
+
content: string;
|
|
54
|
+
status?: 'streaming' | 'done' | 'error';
|
|
55
|
+
/** 消息时间,用于底部 meta 展示 */
|
|
56
|
+
createdAt?: string | number | Date;
|
|
57
|
+
/** 强制纯文本,不渲染 Markdown */
|
|
58
|
+
plainText?: boolean;
|
|
59
|
+
/** 系统就绪 / 提示类消息样式 */
|
|
60
|
+
systemReady?: boolean;
|
|
61
|
+
/** 错误消息样式 */
|
|
62
|
+
error?: boolean;
|
|
63
|
+
};
|
|
64
|
+
export { formatGcsaChatTime, gcsaChatAvatarLabel, shouldRenderGcsaChatMarkdown } from './gcsaChat';
|
|
65
|
+
export type { GcsaChatMarkdownMode } from './gcsaChat';
|
|
66
|
+
export { renderGcsaMarkdown } from './gcsaMarkdown';
|
|
67
|
+
export type { GcsaMessageType } from './gcsaMessage';
|
|
68
|
+
export { GCSA_MESSAGE_DURATION_MS } from './gcsaMessage';
|
|
69
|
+
export { copyGcsaText } from './gcsaClipboard';
|
|
70
|
+
export { collectGcsaMenuBranchKeys, navItemsToMenuItems } from './gcsaMenu';
|
|
71
|
+
export type { GcsaMenuIconKey, GcsaMenuItem, GcsaMenuMode } from './gcsaMenu';
|
|
72
|
+
export declare const gcsaLoginSchema: z.ZodObject<{
|
|
73
|
+
email: z.ZodString;
|
|
74
|
+
password: z.ZodString;
|
|
75
|
+
}, "strip", z.ZodTypeAny, {
|
|
76
|
+
email: string;
|
|
77
|
+
password: string;
|
|
78
|
+
}, {
|
|
79
|
+
email: string;
|
|
80
|
+
password: string;
|
|
81
|
+
}>;
|
|
82
|
+
export { formatGcsaDateParts, formatGcsaMonthParts, isGcsaDateString, isGcsaMonthString } from './gcsaDate';
|
|
83
|
+
export { GCSA_TIME_PICKER_CELL_HEIGHT, GCSA_TIME_STRING_PATTERN, gcsaBuildTimeOptions, gcsaCurrentTimeOption, gcsaMinutesToTime, gcsaNearestTimeOption, gcsaNormalizeTimeStep, gcsaResolveTimeDraft, gcsaTimePickerHours, gcsaTimePickerMinutes, gcsaTimePickerScrollIndex, gcsaTimePickerScrollTop, gcsaTimeToMinutes, isGcsaTimeString } from './gcsaTime';
|
|
84
|
+
export type { GcsaTimePickerOptions, GcsaTimeString } from './gcsaTime';
|
|
85
|
+
export type { GcsaDatePickerMode, GcsaDateRangeValue, GcsaDateString, GcsaMonthRangeValue, GcsaMonthString } from './gcsaDate';
|
|
86
|
+
export { GCSA_DEFAULT_LOCALE, formatGcsaLocaleMessage, getGcsaDatePickerMessages, getGcsaLocaleMessages, getGcsaStartOfWeek, normalizeGcsaLocale } from './gcsaLocale';
|
|
87
|
+
export type { GcsaConsoleLocale, GcsaConsoleLocaleMessages, GcsaDatePickerLocaleStrings } from './gcsaLocale';
|
|
88
|
+
export { clearGcsaTablePreferences, normalizeGcsaTablePreferences, readGcsaTablePreferences, writeGcsaTablePreferences } from './gcsaTablePreferences';
|
|
89
|
+
export type { GcsaTablePreferenceStorage, GcsaTablePreferences, GcsaTableSortingPreference } from './gcsaTablePreferences';
|
|
90
|
+
export { GCSA_TABLE_DEFAULT_COLUMN_MIN_WIDTH, GCSA_TABLE_EXPAND_COLUMN_WIDTH, GCSA_TABLE_MIN_WIDTH_FLOOR, GCSA_TABLE_SELECTION_COLUMN_WIDTH, getGcsaTableFixedOffset, getGcsaTableMinWidth } from './gcsaTableLayout';
|
|
91
|
+
export type { GcsaTableFixedOffsetOptions, GcsaTableLayoutColumn } from './gcsaTableLayout';
|
|
92
|
+
export { getGcsaTableSortChange, getGcsaTableSorting } from './gcsaTableEvents';
|
|
93
|
+
export type { GcsaTableColumnInfo, GcsaTableHeaderEvent, GcsaTableSortChange, GcsaTableSortOrder, GcsaTableSortingEntry } from './gcsaTableEvents';
|
|
94
|
+
export { getGcsaTableDefaultExpandedKeys, getGcsaTableRowId } from './gcsaTableRows';
|
|
95
|
+
export { getGcsaPaginationItems, parseGcsaPaginationLayout, resolveGcsaPaginationLayout, getGcsaPaginationAlignClass, GCSA_PAGINATION_LAYOUT_PARTS } from './gcsaPagination';
|
|
96
|
+
export type { GcsaPaginationItem, GcsaPaginationAlign, GcsaPaginationLayoutPart } from './gcsaPagination';
|
|
97
|
+
export declare const gcsaNotifySchema: z.ZodObject<{
|
|
98
|
+
title: z.ZodString;
|
|
99
|
+
channel: z.ZodEnum<["email", "webhook", "sms"]>;
|
|
100
|
+
enabled: z.ZodBoolean;
|
|
101
|
+
}, "strip", z.ZodTypeAny, {
|
|
102
|
+
title: string;
|
|
103
|
+
channel: "email" | "webhook" | "sms";
|
|
104
|
+
enabled: boolean;
|
|
105
|
+
}, {
|
|
106
|
+
title: string;
|
|
107
|
+
channel: "email" | "webhook" | "sms";
|
|
108
|
+
enabled: boolean;
|
|
109
|
+
}>;
|
|
110
|
+
export type GcsaNotifyValues = z.infer<typeof gcsaNotifySchema>;
|
|
111
|
+
export type GcsaButtonVariant = 'primary' | 'secondary' | 'ghost' | 'danger' | 'link';
|
|
112
|
+
export type GcsaButtonSize = 'sm' | 'md' | 'lg';
|
|
113
|
+
export type { GcsaComponentSize } from './gcsaSize';
|
|
114
|
+
import type { GcsaComponentSize } from './gcsaSize';
|
|
115
|
+
export type GcsaSelectSize = GcsaComponentSize;
|
|
116
|
+
export type GcsaInputNumberControls = 'both' | 'right' | 'none';
|
|
117
|
+
export type GcsaConsoleTheme = 'dark' | 'light';
|
|
118
|
+
export type GcsaDrawerPlacement = 'left' | 'right' | 'top' | 'bottom';
|
|
119
|
+
export type GcsaSelectOption = {
|
|
120
|
+
label: string;
|
|
121
|
+
value: string;
|
|
122
|
+
/** 分组标题;同组选项使用相同 group */
|
|
123
|
+
group?: string;
|
|
124
|
+
disabled?: boolean;
|
|
125
|
+
};
|
|
126
|
+
export type GcsaCascaderOption = {
|
|
127
|
+
label: string;
|
|
128
|
+
value: string;
|
|
129
|
+
disabled?: boolean;
|
|
130
|
+
children?: GcsaCascaderOption[];
|
|
131
|
+
};
|
|
132
|
+
export type GcsaTransferOption = {
|
|
133
|
+
label: string;
|
|
134
|
+
value: string;
|
|
135
|
+
disabled?: boolean;
|
|
136
|
+
};
|
|
137
|
+
export type GcsaStepStatus = 'wait' | 'process' | 'finish' | 'error';
|
|
138
|
+
export type GcsaStepItem = {
|
|
139
|
+
key: string;
|
|
140
|
+
title: string;
|
|
141
|
+
description?: string;
|
|
142
|
+
status?: GcsaStepStatus;
|
|
143
|
+
disabled?: boolean;
|
|
144
|
+
};
|
|
145
|
+
export type GcsaTimelineItem = {
|
|
146
|
+
key: string;
|
|
147
|
+
label?: string;
|
|
148
|
+
content: string;
|
|
149
|
+
time?: string;
|
|
150
|
+
tone?: 'primary' | 'success' | 'warning' | 'danger';
|
|
151
|
+
};
|
|
152
|
+
export type GcsaRadioOption = {
|
|
153
|
+
label: string;
|
|
154
|
+
value: string;
|
|
155
|
+
disabled?: boolean;
|
|
156
|
+
};
|
|
157
|
+
export { GCSA_DEFAULT_COMPONENT_SIZE, gcsaControlSizeClass, resolveGcsaButtonSize, resolveGcsaComponentSize } from './gcsaSize';
|
|
158
|
+
export { createGcsaPopupPositioning, type GcsaPopupPlacement, type GcsaPopupPositioningOptions } from './gcsaPopupPositioning';
|
|
159
|
+
export { assertFloatingWithinViewport, buildGcsaPopupMiddleware, computeGcsaPopupPosition, getFloatingBox, type GcsaPopupRect, type GcsaViewportRect } from './gcsaPopupCollision';
|
|
160
|
+
export { GCSA_POPUP_OVERFLOW_PADDING, GCSA_POPUP_STYLE_CONTRACT, GCSA_POPUP_VIEWPORT_CSS_INSET, cssBlockIncludes, extractCssRuleBlock, validatePopupStyleContract, type GcsaPopupStyleRule } from './gcsaPopupStyles';
|
|
161
|
+
export { toCssLength } from './gcsaCssLength';
|
|
162
|
+
export { gcsaJoinDateTime, gcsaSplitDateTime, type GcsaDateTimeString } from './gcsaDateTimeValue';
|
|
163
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export { normalizeGcsaTableColumns } from './gcsaTableMigration';
|
|
3
|
+
export { formatGcsaChatTime, gcsaChatAvatarLabel, shouldRenderGcsaChatMarkdown } from './gcsaChat';
|
|
4
|
+
export { renderGcsaMarkdown } from './gcsaMarkdown';
|
|
5
|
+
export { GCSA_MESSAGE_DURATION_MS } from './gcsaMessage';
|
|
6
|
+
export { copyGcsaText } from './gcsaClipboard';
|
|
7
|
+
export { collectGcsaMenuBranchKeys, navItemsToMenuItems } from './gcsaMenu';
|
|
8
|
+
export const gcsaLoginSchema = z.object({
|
|
9
|
+
email: z.string().email('请输入有效邮箱'),
|
|
10
|
+
password: z.string().min(6, '至少 6 位密码')
|
|
11
|
+
});
|
|
12
|
+
export { formatGcsaDateParts, formatGcsaMonthParts, isGcsaDateString, isGcsaMonthString } from './gcsaDate';
|
|
13
|
+
export { GCSA_TIME_PICKER_CELL_HEIGHT, GCSA_TIME_STRING_PATTERN, gcsaBuildTimeOptions, gcsaCurrentTimeOption, gcsaMinutesToTime, gcsaNearestTimeOption, gcsaNormalizeTimeStep, gcsaResolveTimeDraft, gcsaTimePickerHours, gcsaTimePickerMinutes, gcsaTimePickerScrollIndex, gcsaTimePickerScrollTop, gcsaTimeToMinutes, isGcsaTimeString } from './gcsaTime';
|
|
14
|
+
export { GCSA_DEFAULT_LOCALE, formatGcsaLocaleMessage, getGcsaDatePickerMessages, getGcsaLocaleMessages, getGcsaStartOfWeek, normalizeGcsaLocale } from './gcsaLocale';
|
|
15
|
+
export { clearGcsaTablePreferences, normalizeGcsaTablePreferences, readGcsaTablePreferences, writeGcsaTablePreferences } from './gcsaTablePreferences';
|
|
16
|
+
export { GCSA_TABLE_DEFAULT_COLUMN_MIN_WIDTH, GCSA_TABLE_EXPAND_COLUMN_WIDTH, GCSA_TABLE_MIN_WIDTH_FLOOR, GCSA_TABLE_SELECTION_COLUMN_WIDTH, getGcsaTableFixedOffset, getGcsaTableMinWidth } from './gcsaTableLayout';
|
|
17
|
+
export { getGcsaTableSortChange, getGcsaTableSorting } from './gcsaTableEvents';
|
|
18
|
+
export { getGcsaTableDefaultExpandedKeys, getGcsaTableRowId } from './gcsaTableRows';
|
|
19
|
+
export { getGcsaPaginationItems, parseGcsaPaginationLayout, resolveGcsaPaginationLayout, getGcsaPaginationAlignClass, GCSA_PAGINATION_LAYOUT_PARTS } from './gcsaPagination';
|
|
20
|
+
export const gcsaNotifySchema = z.object({
|
|
21
|
+
title: z.string().min(1, '标题不能为空'),
|
|
22
|
+
channel: z.enum(['email', 'webhook', 'sms']),
|
|
23
|
+
enabled: z.boolean()
|
|
24
|
+
});
|
|
25
|
+
export { GCSA_DEFAULT_COMPONENT_SIZE, gcsaControlSizeClass, resolveGcsaButtonSize, resolveGcsaComponentSize } from './gcsaSize';
|
|
26
|
+
export { createGcsaPopupPositioning } from './gcsaPopupPositioning';
|
|
27
|
+
export { assertFloatingWithinViewport, buildGcsaPopupMiddleware, computeGcsaPopupPosition, getFloatingBox } from './gcsaPopupCollision';
|
|
28
|
+
export { GCSA_POPUP_OVERFLOW_PADDING, GCSA_POPUP_STYLE_CONTRACT, GCSA_POPUP_VIEWPORT_CSS_INSET, cssBlockIncludes, extractCssRuleBlock, validatePopupStyleContract } from './gcsaPopupStyles';
|
|
29
|
+
export { toCssLength } from './gcsaCssLength';
|
|
30
|
+
export { gcsaJoinDateTime, gcsaSplitDateTime } from './gcsaDateTimeValue';
|
package/package.json
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@gcsa/console-core",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Shared types and schemas for GCSA console UI",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "UNLICENSED",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist",
|
|
9
|
+
"src"
|
|
10
|
+
],
|
|
11
|
+
"main": "./dist/index.js",
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"import": "./dist/index.js"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
19
|
+
"publishConfig": {
|
|
20
|
+
"access": "public"
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"dompurify": "^3.4.11",
|
|
24
|
+
"marked": "^18.0.5",
|
|
25
|
+
"zod": "^3.24.4"
|
|
26
|
+
},
|
|
27
|
+
"devDependencies": {
|
|
28
|
+
"@floating-ui/dom": "^1.8.0",
|
|
29
|
+
"happy-dom": "^17.4.7",
|
|
30
|
+
"typescript": "^5.8.3"
|
|
31
|
+
},
|
|
32
|
+
"scripts": {
|
|
33
|
+
"build": "tsc -p tsconfig.json",
|
|
34
|
+
"test": "node --test tests/*.test.mjs",
|
|
35
|
+
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
36
|
+
}
|
|
37
|
+
}
|
package/src/gcsaChat.ts
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { GcsaChatMessage, GcsaChatMessageRole } from './index';
|
|
2
|
+
|
|
3
|
+
export type GcsaChatMarkdownMode = false | true | 'assistant';
|
|
4
|
+
|
|
5
|
+
export function shouldRenderGcsaChatMarkdown(
|
|
6
|
+
message: GcsaChatMessage,
|
|
7
|
+
mode: GcsaChatMarkdownMode = 'assistant'
|
|
8
|
+
): boolean {
|
|
9
|
+
if (message.plainText) return false;
|
|
10
|
+
if (mode === false) return false;
|
|
11
|
+
if (mode === true) return true;
|
|
12
|
+
return message.role === 'assistant' && !message.systemReady;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function gcsaChatAvatarLabel(
|
|
16
|
+
message: GcsaChatMessage,
|
|
17
|
+
labels?: Partial<Record<GcsaChatMessageRole, string>>
|
|
18
|
+
): string {
|
|
19
|
+
if (labels?.[message.role]) return labels[message.role]!;
|
|
20
|
+
if (message.role === 'user') return 'U';
|
|
21
|
+
if (message.role === 'system') return 'S';
|
|
22
|
+
return 'A';
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function formatGcsaChatTime(value?: string | number | Date): string {
|
|
26
|
+
if (value == null || value === '') return '';
|
|
27
|
+
const date = value instanceof Date ? value : new Date(value);
|
|
28
|
+
if (Number.isNaN(date.getTime())) return '';
|
|
29
|
+
return date.toLocaleString(undefined, {
|
|
30
|
+
month: '2-digit',
|
|
31
|
+
day: '2-digit',
|
|
32
|
+
hour: '2-digit',
|
|
33
|
+
minute: '2-digit'
|
|
34
|
+
});
|
|
35
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
export async function copyGcsaText(text: string): Promise<boolean> {
|
|
2
|
+
if (!text) return false;
|
|
3
|
+
|
|
4
|
+
try {
|
|
5
|
+
if (typeof navigator !== 'undefined' && navigator.clipboard?.writeText) {
|
|
6
|
+
await navigator.clipboard.writeText(text);
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
9
|
+
} catch {
|
|
10
|
+
// fall through to legacy copy
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
try {
|
|
14
|
+
if (typeof document === 'undefined') return false;
|
|
15
|
+
const textarea = document.createElement('textarea');
|
|
16
|
+
textarea.value = text;
|
|
17
|
+
textarea.setAttribute('readonly', '');
|
|
18
|
+
textarea.style.position = 'fixed';
|
|
19
|
+
textarea.style.left = '-9999px';
|
|
20
|
+
document.body.appendChild(textarea);
|
|
21
|
+
textarea.select();
|
|
22
|
+
const ok = document.execCommand('copy');
|
|
23
|
+
document.body.removeChild(textarea);
|
|
24
|
+
return ok;
|
|
25
|
+
} catch {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** 将组件 width/minWidth/maxWidth 等 prop 规范为 CSS 长度字符串 */
|
|
2
|
+
export function toCssLength(value?: string | number): string | undefined {
|
|
3
|
+
if (value === undefined || value === null || value === '') return undefined;
|
|
4
|
+
return typeof value === 'number' ? `${value}px` : value;
|
|
5
|
+
}
|
package/src/gcsaDate.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/** ISO 日期字符串 YYYY-MM-DD */
|
|
2
|
+
export type GcsaDateString = string;
|
|
3
|
+
|
|
4
|
+
/** ISO 年月字符串 YYYY-MM */
|
|
5
|
+
export type GcsaMonthString = string;
|
|
6
|
+
|
|
7
|
+
/** 日期范围 [开始, 结束],均为 YYYY-MM-DD;未选时对应项为空字符串 */
|
|
8
|
+
export type GcsaDateRangeValue = [GcsaDateString, GcsaDateString];
|
|
9
|
+
|
|
10
|
+
/** 年月范围 [开始, 结束],均为 YYYY-MM;未选时对应项为空字符串 */
|
|
11
|
+
export type GcsaMonthRangeValue = [GcsaMonthString, GcsaMonthString];
|
|
12
|
+
|
|
13
|
+
/** DatePicker / DateRangePicker 选择粒度 */
|
|
14
|
+
export type GcsaDatePickerMode = 'date' | 'month';
|
|
15
|
+
|
|
16
|
+
export function isGcsaDateString(value: string): boolean {
|
|
17
|
+
return /^\d{4}-\d{2}-\d{2}$/.test(value);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function isGcsaMonthString(value: string): boolean {
|
|
21
|
+
return /^\d{4}-\d{2}$/.test(value);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function formatGcsaDateParts(year: number, month: number, day: number): GcsaDateString {
|
|
25
|
+
return `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')}`;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export function formatGcsaMonthParts(year: number, month: number): GcsaMonthString {
|
|
29
|
+
return `${year}-${String(month).padStart(2, '0')}`;
|
|
30
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** ISO 日期时间字符串 YYYY-MM-DD HH:mm:ss */
|
|
2
|
+
export type GcsaDateTimeString = string;
|
|
3
|
+
|
|
4
|
+
export function gcsaSplitDateTime(value?: string | null): { date: string; time: string } {
|
|
5
|
+
if (!value?.trim()) return { date: '', time: '00:00:00' };
|
|
6
|
+
const [date = '', time = '00:00:00'] = value.trim().split(/\s+/);
|
|
7
|
+
const [hour = '00', minute = '00', second = '00'] = time.split(':');
|
|
8
|
+
return {
|
|
9
|
+
date,
|
|
10
|
+
time: `${hour.padStart(2, '0')}:${minute.padStart(2, '0')}:${second.padStart(2, '0').slice(0, 2)}`
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function gcsaJoinDateTime(date: string, time: string): GcsaDateTimeString {
|
|
15
|
+
if (!date) return '';
|
|
16
|
+
const [hour = '00', minute = '00', second = '00'] = (time || '00:00:00').split(':');
|
|
17
|
+
return `${date} ${hour.padStart(2, '0')}:${minute.padStart(2, '0')}:${second.padStart(2, '0').slice(0, 2)}`;
|
|
18
|
+
}
|