phx-react 1.3.1864 → 1.3.1865
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/cjs/components/TableSchedule/PHXScheduleTable.d.ts +1 -1
- package/dist/cjs/components/TableSchedule/PHXScheduleTable.js +2 -2
- package/dist/cjs/components/TableSchedule/PHXScheduleTable.js.map +1 -1
- package/dist/cjs/components/TableSchedule/components/PHXScheduleTableBody.d.ts +2 -2
- package/dist/cjs/components/TableSchedule/components/PHXScheduleTableBody.js +25 -14
- package/dist/cjs/components/TableSchedule/components/PHXScheduleTableBody.js.map +1 -1
- package/dist/cjs/components/TableSchedule/components/PHXScheduleTableHead.js +2 -0
- package/dist/cjs/components/TableSchedule/components/PHXScheduleTableHead.js.map +1 -1
- package/dist/cjs/components/TableSchedule/constants.d.ts +15 -3
- package/dist/cjs/components/TableSchedule/constants.js +19 -6
- package/dist/cjs/components/TableSchedule/constants.js.map +1 -1
- package/dist/cjs/components/TableSchedule/renderers.d.ts +2 -1
- package/dist/cjs/components/TableSchedule/renderers.js +299 -22
- package/dist/cjs/components/TableSchedule/renderers.js.map +1 -1
- package/dist/cjs/components/TableSchedule/types.d.ts +25 -0
- package/dist/cjs/components/TableSchedule/utils.d.ts +7 -3
- package/dist/cjs/components/TableSchedule/utils.js +38 -3
- package/dist/cjs/components/TableSchedule/utils.js.map +1 -1
- package/dist/esm/components/TableSchedule/PHXScheduleTable.d.ts +1 -1
- package/dist/esm/components/TableSchedule/PHXScheduleTable.js +2 -2
- package/dist/esm/components/TableSchedule/PHXScheduleTable.js.map +1 -1
- package/dist/esm/components/TableSchedule/components/PHXScheduleTableBody.d.ts +2 -2
- package/dist/esm/components/TableSchedule/components/PHXScheduleTableBody.js +26 -15
- package/dist/esm/components/TableSchedule/components/PHXScheduleTableBody.js.map +1 -1
- package/dist/esm/components/TableSchedule/components/PHXScheduleTableHead.js +2 -0
- package/dist/esm/components/TableSchedule/components/PHXScheduleTableHead.js.map +1 -1
- package/dist/esm/components/TableSchedule/constants.d.ts +15 -3
- package/dist/esm/components/TableSchedule/constants.js +17 -5
- package/dist/esm/components/TableSchedule/constants.js.map +1 -1
- package/dist/esm/components/TableSchedule/renderers.d.ts +2 -1
- package/dist/esm/components/TableSchedule/renderers.js +298 -22
- package/dist/esm/components/TableSchedule/renderers.js.map +1 -1
- package/dist/esm/components/TableSchedule/types.d.ts +25 -0
- package/dist/esm/components/TableSchedule/utils.d.ts +7 -3
- package/dist/esm/components/TableSchedule/utils.js +38 -3
- package/dist/esm/components/TableSchedule/utils.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { PHXScheduleTableProps } from '../types';
|
|
3
|
-
type PHXScheduleTableBodyProps = Pick<PHXScheduleTableProps, 'columns' | 'rows' | 'onCellClick' | 'stickyColumnWidth' | 'defaultCellLayout' | 'userDetailPageUrl' | 'TooltipComponent' | 'ButtonComponent'> & {
|
|
3
|
+
type PHXScheduleTableBodyProps = Pick<PHXScheduleTableProps, 'columns' | 'rows' | 'onCellClick' | 'stickyColumnWidth' | 'defaultCellLayout' | 'scheduleCardSize' | 'scheduleCardVariant' | 'userDetailPageUrl' | 'TooltipComponent' | 'ButtonComponent'> & {
|
|
4
4
|
skipMap: Set<string>;
|
|
5
5
|
stickyHeaderCount: number;
|
|
6
6
|
resolvedStickyColumnWidths: number[];
|
|
@@ -12,5 +12,5 @@ type PHXScheduleTableBodyProps = Pick<PHXScheduleTableProps, 'columns' | 'rows'
|
|
|
12
12
|
* @param {PHXScheduleTableBodyProps} props Body render inputs.
|
|
13
13
|
* @returns {React.ReactNode} The schedule table body.
|
|
14
14
|
*/
|
|
15
|
-
export declare const PHXScheduleTableBody: ({ columns, rows, onCellClick, stickyColumnWidth, defaultCellLayout, userDetailPageUrl, TooltipComponent, ButtonComponent, skipMap, stickyHeaderCount, resolvedStickyColumnWidths, showStickyShadow, }: PHXScheduleTableBodyProps) => React.JSX.Element;
|
|
15
|
+
export declare const PHXScheduleTableBody: ({ columns, rows, onCellClick, stickyColumnWidth, defaultCellLayout, scheduleCardSize, scheduleCardVariant, userDetailPageUrl, TooltipComponent, ButtonComponent, skipMap, stickyHeaderCount, resolvedStickyColumnWidths, showStickyShadow, }: PHXScheduleTableBodyProps) => React.JSX.Element;
|
|
16
16
|
export {};
|
|
@@ -1,30 +1,35 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import React from 'react';
|
|
3
3
|
import { getCellWrapperAlignClassName } from '../constants';
|
|
4
|
-
import { renderCellBoxContent, renderRowHeaderContent, renderScheduleContent, renderTooltipContent, resolveTooltipClassName, } from '../renderers';
|
|
4
|
+
import { renderCellBoxContent, renderRowHeaderContent, renderScheduleCards, renderScheduleContent, renderTooltipContent, resolveTooltipClassName, } from '../renderers';
|
|
5
5
|
import { buildDataCellStyle, buildRowHeaderCellStyle, getCellSpan, getClickableCellClassName, getColumnAlign, getDataCellClassName, getRowHeaderClassName, getRowHeaders, getStaticCellClassName, } from '../utils';
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
7
|
+
* Trả về nội dung hiển thị của ô khi ô đang dùng layout không bọc box.
|
|
8
8
|
*
|
|
9
|
-
* @param {GridCellData} cell
|
|
10
|
-
* @param {
|
|
11
|
-
* @returns {React.ReactNode}
|
|
9
|
+
* @param {GridCellData} cell Dữ liệu ô đang được render.
|
|
10
|
+
* @param {CellRenderContext} context Ngữ cảnh dùng chung để render card lịch và liên kết chi tiết.
|
|
11
|
+
* @returns {React.ReactNode} Nội dung hiển thị cuối cùng của ô theo dữ liệu hiện có.
|
|
12
12
|
*/
|
|
13
|
-
const getPlainCellContent = (cell,
|
|
13
|
+
const getPlainCellContent = (cell, context) => {
|
|
14
|
+
var _a;
|
|
15
|
+
const { defaultScheduleCardSize, defaultScheduleCardVariant, userDetailPageUrl } = context;
|
|
16
|
+
if (cell.scheduleCards && cell.scheduleCards.length > 0) {
|
|
17
|
+
return renderScheduleCards(cell.scheduleCards, (_a = cell.scheduleCardSize) !== null && _a !== void 0 ? _a : defaultScheduleCardSize, defaultScheduleCardVariant, userDetailPageUrl);
|
|
18
|
+
}
|
|
14
19
|
if (cell.scheduleContent) {
|
|
15
20
|
return renderScheduleContent(cell.scheduleContent, userDetailPageUrl);
|
|
16
21
|
}
|
|
17
22
|
return cell.content;
|
|
18
23
|
};
|
|
19
24
|
/**
|
|
20
|
-
*
|
|
25
|
+
* Chọn cách render nội dung ô theo layout hiện tại của ô dữ liệu.
|
|
21
26
|
*
|
|
22
|
-
* @param {GridCellData} cell
|
|
23
|
-
* @param {'boxed' | 'plain'} cellLayout
|
|
24
|
-
* @param {
|
|
25
|
-
* @returns {React.ReactNode}
|
|
27
|
+
* @param {GridCellData} cell Dữ liệu ô đang được render.
|
|
28
|
+
* @param {'boxed' | 'plain'} cellLayout Layout áp dụng cho ô hiện tại.
|
|
29
|
+
* @param {CellRenderContext} context Ngữ cảnh dùng chung để render card lịch và liên kết chi tiết.
|
|
30
|
+
* @returns {React.ReactNode} Nội dung ô đã được dựng đúng theo layout tương ứng.
|
|
26
31
|
*/
|
|
27
|
-
const getBoxContent = (cell, cellLayout,
|
|
32
|
+
const getBoxContent = (cell, cellLayout, context) => cellLayout === 'plain' ? getPlainCellContent(cell, context) : renderCellBoxContent(cell);
|
|
28
33
|
/**
|
|
29
34
|
* Creates the click handler payload for an interactive data cell.
|
|
30
35
|
*
|
|
@@ -69,7 +74,7 @@ const renderInteractiveCellContent = (boxContent, cellLayout, cellWrapperAlignCl
|
|
|
69
74
|
* @param {PHXScheduleTableBodyProps} props Body render inputs.
|
|
70
75
|
* @returns {React.ReactNode} The schedule table body.
|
|
71
76
|
*/
|
|
72
|
-
export const PHXScheduleTableBody = ({ columns, rows, onCellClick, stickyColumnWidth = 130, defaultCellLayout = 'boxed', userDetailPageUrl, TooltipComponent, ButtonComponent, skipMap, stickyHeaderCount, resolvedStickyColumnWidths, showStickyShadow, }) => {
|
|
77
|
+
export const PHXScheduleTableBody = ({ columns, rows, onCellClick, stickyColumnWidth = 130, defaultCellLayout = 'boxed', scheduleCardSize, scheduleCardVariant, userDetailPageUrl, TooltipComponent, ButtonComponent, skipMap, stickyHeaderCount, resolvedStickyColumnWidths, showStickyShadow, }) => {
|
|
73
78
|
/**
|
|
74
79
|
* Wraps a cell with the configured tooltip component when tooltip content exists.
|
|
75
80
|
*
|
|
@@ -99,6 +104,8 @@ export const PHXScheduleTableBody = ({ columns, rows, onCellClick, stickyColumnW
|
|
|
99
104
|
stickyWidths: resolvedStickyColumnWidths,
|
|
100
105
|
width,
|
|
101
106
|
isLast,
|
|
107
|
+
stickyHeaderCount,
|
|
108
|
+
showStickyShadow,
|
|
102
109
|
customStyle: header.style,
|
|
103
110
|
}) }, renderRowHeaderContent(header)));
|
|
104
111
|
}
|
|
@@ -118,11 +125,15 @@ export const PHXScheduleTableBody = ({ columns, rows, onCellClick, stickyColumnW
|
|
|
118
125
|
const columnAlign = getColumnAlign(col.align);
|
|
119
126
|
const cellWrapperAlignClassName = getCellWrapperAlignClassName(columnAlign);
|
|
120
127
|
const cellLayout = (_b = cell.layout) !== null && _b !== void 0 ? _b : defaultCellLayout;
|
|
121
|
-
const boxContent = getBoxContent(cell, cellLayout,
|
|
128
|
+
const boxContent = getBoxContent(cell, cellLayout, {
|
|
129
|
+
defaultScheduleCardSize: scheduleCardSize,
|
|
130
|
+
defaultScheduleCardVariant: scheduleCardVariant,
|
|
131
|
+
userDetailPageUrl,
|
|
132
|
+
});
|
|
122
133
|
const onClick = onCellClick && !cell.disabled ? getCellClickHandler(onCellClick, rowIndex, col.key, cell) : undefined;
|
|
123
134
|
const cellContent = renderInteractiveCellContent(boxContent, cellLayout, cellWrapperAlignClassName, onClick, ButtonComponent);
|
|
124
135
|
const wrappedContent = renderTooltipWrappedContent(cell, cellContent);
|
|
125
|
-
return (React.createElement("td", { key: col.key, colSpan: cs > 1 ? cs : undefined, rowSpan: rs > 1 ? rs : undefined, className: getDataCellClassName(cell.cellClassName), style: buildDataCellStyle(isLast, cell.cellStyle) }, wrappedContent));
|
|
136
|
+
return (React.createElement("td", { key: col.key, colSpan: cs > 1 ? cs : undefined, rowSpan: rs > 1 ? rs : undefined, className: getDataCellClassName(cell.cellClassName), style: buildDataCellStyle(isLast, col.minWidth, cell.cellStyle) }, wrappedContent));
|
|
126
137
|
}
|
|
127
138
|
/**
|
|
128
139
|
* Renders a single table body row with its sticky headers and visible data cells.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PHXScheduleTableBody.js","sourceRoot":"","sources":["../../../../../src/components/TableSchedule/components/PHXScheduleTableBody.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,4BAA4B,EAAE,MAAM,cAAc,CAAA;AAC3D,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,kBAAkB,EAClB,uBAAuB,EACvB,WAAW,EACX,yBAAyB,EACzB,cAAc,EACd,oBAAoB,EACpB,qBAAqB,EACrB,aAAa,EACb,sBAAsB,GACvB,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"PHXScheduleTableBody.js","sourceRoot":"","sources":["../../../../../src/components/TableSchedule/components/PHXScheduleTableBody.tsx"],"names":[],"mappings":"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"}
|
|
@@ -25,6 +25,8 @@ const StickyHeaderPlaceholders = ({ stickyHeaderCount, resolvedStickyColumnWidth
|
|
|
25
25
|
index,
|
|
26
26
|
stickyWidths: resolvedStickyColumnWidths,
|
|
27
27
|
zIndexBase,
|
|
28
|
+
stickyHeaderCount,
|
|
29
|
+
showStickyShadow,
|
|
28
30
|
}) })));
|
|
29
31
|
/**
|
|
30
32
|
* Renders the table head, including grouped headers and sticky row-header placeholders.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PHXScheduleTableHead.js","sourceRoot":"","sources":["../../../../../src/components/TableSchedule/components/PHXScheduleTableHead.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,EACzB,0BAA0B,EAC1B,cAAc,EACd,wBAAwB,GACzB,MAAM,UAAU,CAAA;AAqBjB;;;;;;;GAOG;AACH,MAAM,iCAAiC,GAAG,CACxC,mBAAwC,EACxC,UAAkB,EAClB,OAAgB,EACe,EAAE,CAAC,CAAC;IACnC,GAAG,mBAAmB;IACtB,UAAU;IACV,OAAO;CACR,CAAC,CAAA;AAEF;;;;;GAKG;AACH,MAAM,wBAAwB,GAAG,CAAC,EAChC,iBAAiB,EACjB,0BAA0B,EAC1B,gBAAgB,EAChB,UAAU,EACV,OAAO,GACuB,EAAE,EAAE,CAClC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAC1D,4BACE,GAAG,EAAE,KAAK,EACV,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,wBAAwB,CAAC,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,CAAC,EAC/E,KAAK,EAAE,0BAA0B,CAAC;QAChC,KAAK;QACL,YAAY,EAAE,0BAA0B;QACxC,UAAU;
|
|
1
|
+
{"version":3,"file":"PHXScheduleTableHead.js","sourceRoot":"","sources":["../../../../../src/components/TableSchedule/components/PHXScheduleTableHead.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,EACzB,0BAA0B,EAC1B,cAAc,EACd,wBAAwB,GACzB,MAAM,UAAU,CAAA;AAqBjB;;;;;;;GAOG;AACH,MAAM,iCAAiC,GAAG,CACxC,mBAAwC,EACxC,UAAkB,EAClB,OAAgB,EACe,EAAE,CAAC,CAAC;IACnC,GAAG,mBAAmB;IACtB,UAAU;IACV,OAAO;CACR,CAAC,CAAA;AAEF;;;;;GAKG;AACH,MAAM,wBAAwB,GAAG,CAAC,EAChC,iBAAiB,EACjB,0BAA0B,EAC1B,gBAAgB,EAChB,UAAU,EACV,OAAO,GACuB,EAAE,EAAE,CAClC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAC1D,4BACE,GAAG,EAAE,KAAK,EACV,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,wBAAwB,CAAC,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,CAAC,EAC/E,KAAK,EAAE,0BAA0B,CAAC;QAChC,KAAK;QACL,YAAY,EAAE,0BAA0B;QACxC,UAAU;QACV,iBAAiB;QACjB,gBAAgB;KACjB,CAAC,GACF,CACH,CAAC,CAAA;AAEJ;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAgC;IACnE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,mBAAmB,EAAE,GAAG,KAAK,CAAA;IAE/D,OAAO,CACL;QACG,YAAY,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,CAC1C;YACE,oBAAC,wBAAwB,OAAK,iCAAiC,CAAC,mBAAmB,EAAE,CAAC,EAAE,CAAC,CAAC,GAAI;YAC7F,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAC/B,4BACE,GAAG,EAAE,EAAE,EACP,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,MAAM,EAChC,SAAS,EAAE,mBAAmB,EAC9B,KAAK,EAAE,yBAAyB,EAAE,IAEjC,KAAK,CAAC,MAAM,CACV,CACN,CAAC,CACC,CACN;QAED;YACG,CAAC,YAAY,IAAI,oBAAC,wBAAwB,OAAK,iCAAiC,CAAC,mBAAmB,EAAE,CAAC,CAAC,GAAI;YAC5G,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CACpB,4BACE,GAAG,EAAE,GAAG,CAAC,GAAG,EACZ,SAAS,EAAE,mBAAmB,EAC9B,KAAK,EAAE,0BAA0B,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,IAEzE,GAAG,CAAC,MAAM,CACR,CACN,CAAC,CACC,CACC,CACT,CAAA;AACH,CAAC"}
|
|
@@ -35,13 +35,25 @@ export declare const TOOLTIP_LABEL_CLASSNAME = "text-xs leading-5 text-gray-500"
|
|
|
35
35
|
export declare const TOOLTIP_VALUE_CLASSNAME = "text-xs font-semibold leading-5 text-gray-800";
|
|
36
36
|
export declare const DEFAULT_TOOLTIP_CLASSNAME = "w-fit !px-5 !py-4";
|
|
37
37
|
export declare const SCHEDULE_CELL_CLASSNAME = "flex flex-col gap-2 text-left";
|
|
38
|
-
export declare const SCHEDULE_TITLE_CLASSNAME = "text-sm font-semibold leading-5 text-gray-800";
|
|
39
|
-
export declare const SCHEDULE_TITLE_DOTTED_CLASSNAME = "inline-block w-
|
|
38
|
+
export declare const SCHEDULE_TITLE_CLASSNAME = "whitespace-normal break-words text-sm font-semibold leading-5 text-gray-800";
|
|
39
|
+
export declare const SCHEDULE_TITLE_DOTTED_CLASSNAME = "inline-block max-w-full whitespace-normal break-words border-b-2 border-dotted border-gray-300 text-sm font-semibold leading-5 text-gray-800";
|
|
40
40
|
export declare const SCHEDULE_SECTION_CLASSNAME = "flex flex-col gap-1";
|
|
41
41
|
export declare const SCHEDULE_SECTION_LABEL_CLASSNAME = "flex items-center gap-1.5 text-xs font-normal leading-5 text-gray-500";
|
|
42
|
-
export declare const SCHEDULE_SECTION_VALUE_CLASSNAME = "text-sm font-semibold leading-5 text-gray-800";
|
|
42
|
+
export declare const SCHEDULE_SECTION_VALUE_CLASSNAME = "w-full min-w-0 whitespace-normal break-words text-sm font-semibold leading-5 text-gray-800";
|
|
43
43
|
export declare const SCHEDULE_EMPTY_TITLE_CLASSNAME = "text-sm font-semibold leading-5 text-gray-800";
|
|
44
44
|
export declare const SCHEDULE_EMPTY_DESCRIPTION_CLASSNAME = "text-xs font-normal leading-5 text-gray-500";
|
|
45
|
+
export declare const SCHEDULE_CARD_STACK_CLASSNAME = "flex w-full flex-col gap-3";
|
|
46
|
+
export declare const SCHEDULE_CARD_BUTTON_CLASSNAME = "group w-full shrink-0 overflow-hidden rounded-xl border border-gray-300 bg-white text-left shadow-sm ring-1 ring-inset ring-gray-200/80 transition hover:border-blue-300 hover:shadow-md";
|
|
47
|
+
export declare const SCHEDULE_CARD_CONTENT_CLASSNAME = "relative h-full min-h-0 overflow-hidden";
|
|
48
|
+
export declare const SCHEDULE_CARD_CONTENT_BORDERLESS_CLASSNAME = "relative h-full min-h-0 overflow-hidden";
|
|
49
|
+
export declare const SCHEDULE_CARD_SCROLL_CLASSNAME = "h-full min-h-0 overflow-x-hidden overflow-y-auto [scrollbar-color:transparent_transparent] [scrollbar-gutter:stable] [scrollbar-width:thin] group-hover:[scrollbar-color:rgba(148,163,184,0.75)_transparent] [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:bg-transparent group-hover:[&::-webkit-scrollbar-thumb]:bg-slate-300/80 group-hover:[&::-webkit-scrollbar-thumb:hover]:bg-slate-400/80 [&::-webkit-scrollbar-track]:bg-transparent [&::-webkit-scrollbar]:w-1.5";
|
|
50
|
+
export declare const SCHEDULE_CARD_CONTENT_INNER_CLASSNAME = "flex min-h-full flex-col gap-2 px-4 py-4 pr-1.5";
|
|
51
|
+
export declare const SCHEDULE_CARD_CONTENT_BORDERLESS_INNER_CLASSNAME = "flex min-h-full flex-col gap-2 px-2.5 py-2 pr-1";
|
|
52
|
+
export declare const SCHEDULE_CARD_TITLE_CLASSNAME = "inline-flex max-w-full whitespace-normal break-words rounded-full bg-blue-50 px-3 py-1 text-sm font-semibold leading-5 text-blue-600";
|
|
53
|
+
export declare const SCHEDULE_CARD_BLOCK_CLASSNAME = "flex min-w-0 flex-col gap-2 border-t border-gray-100 pt-3 first:border-t-0 first:pt-0";
|
|
54
|
+
export declare const SCHEDULE_CARD_SECTION_CLASSNAME = "flex flex-col gap-0.5";
|
|
55
|
+
export declare const SCHEDULE_CARD_SECTION_LABEL_CLASSNAME = "inline-flex items-center gap-1.5 text-xs font-normal leading-5 text-gray-500";
|
|
56
|
+
export declare const SCHEDULE_CARD_SECTION_VALUE_CLASSNAME = "w-full min-w-0 whitespace-normal break-words text-xs font-semibold leading-5 text-gray-800";
|
|
45
57
|
export declare const BOXED_CELL_PADDING_CLASSNAME = "px-1 py-1";
|
|
46
58
|
export declare const PLAIN_CELL_PADDING_CLASSNAME = "px-2 py-1.5";
|
|
47
59
|
export declare const BUTTON_BASE_CLASSNAME = "!shadow-none !flex !w-full !rounded-none !text-left";
|
|
@@ -5,7 +5,6 @@ export const stickyBase = {
|
|
|
5
5
|
left: 0,
|
|
6
6
|
zIndex: 2,
|
|
7
7
|
background: 'var(--color-background-primary, #fff)',
|
|
8
|
-
borderRight: BORDER,
|
|
9
8
|
};
|
|
10
9
|
export const thBase = {
|
|
11
10
|
borderBottom: BORDER,
|
|
@@ -23,7 +22,8 @@ export const TABLE_SCROLL_CONTAINER_STYLE = {
|
|
|
23
22
|
border: BORDER,
|
|
24
23
|
};
|
|
25
24
|
export const TABLE_STYLE = {
|
|
26
|
-
width: '
|
|
25
|
+
width: 'max-content',
|
|
26
|
+
minWidth: '100%',
|
|
27
27
|
borderCollapse: 'collapse',
|
|
28
28
|
};
|
|
29
29
|
export const ROW_HEADER_CONTENT_CLASSNAME = 'flex flex-col';
|
|
@@ -66,13 +66,25 @@ export const TOOLTIP_LABEL_CLASSNAME = 'text-xs leading-5 text-gray-500';
|
|
|
66
66
|
export const TOOLTIP_VALUE_CLASSNAME = 'text-xs font-semibold leading-5 text-gray-800';
|
|
67
67
|
export const DEFAULT_TOOLTIP_CLASSNAME = 'w-fit !px-5 !py-4';
|
|
68
68
|
export const SCHEDULE_CELL_CLASSNAME = 'flex flex-col gap-2 text-left';
|
|
69
|
-
export const SCHEDULE_TITLE_CLASSNAME = 'text-sm font-semibold leading-5 text-gray-800';
|
|
70
|
-
export const SCHEDULE_TITLE_DOTTED_CLASSNAME = 'inline-block w-
|
|
69
|
+
export const SCHEDULE_TITLE_CLASSNAME = 'whitespace-normal break-words text-sm font-semibold leading-5 text-gray-800';
|
|
70
|
+
export const SCHEDULE_TITLE_DOTTED_CLASSNAME = 'inline-block max-w-full whitespace-normal break-words border-b-2 border-dotted border-gray-300 text-sm font-semibold leading-5 text-gray-800';
|
|
71
71
|
export const SCHEDULE_SECTION_CLASSNAME = 'flex flex-col gap-1';
|
|
72
72
|
export const SCHEDULE_SECTION_LABEL_CLASSNAME = 'flex items-center gap-1.5 text-xs font-normal leading-5 text-gray-500';
|
|
73
|
-
export const SCHEDULE_SECTION_VALUE_CLASSNAME = 'text-sm font-semibold leading-5 text-gray-800';
|
|
73
|
+
export const SCHEDULE_SECTION_VALUE_CLASSNAME = 'w-full min-w-0 whitespace-normal break-words text-sm font-semibold leading-5 text-gray-800';
|
|
74
74
|
export const SCHEDULE_EMPTY_TITLE_CLASSNAME = 'text-sm font-semibold leading-5 text-gray-800';
|
|
75
75
|
export const SCHEDULE_EMPTY_DESCRIPTION_CLASSNAME = 'text-xs font-normal leading-5 text-gray-500';
|
|
76
|
+
export const SCHEDULE_CARD_STACK_CLASSNAME = 'flex w-full flex-col gap-3';
|
|
77
|
+
export const SCHEDULE_CARD_BUTTON_CLASSNAME = 'group w-full shrink-0 overflow-hidden rounded-xl border border-gray-300 bg-white text-left shadow-sm ring-1 ring-inset ring-gray-200/80 transition hover:border-blue-300 hover:shadow-md';
|
|
78
|
+
export const SCHEDULE_CARD_CONTENT_CLASSNAME = 'relative h-full min-h-0 overflow-hidden';
|
|
79
|
+
export const SCHEDULE_CARD_CONTENT_BORDERLESS_CLASSNAME = 'relative h-full min-h-0 overflow-hidden';
|
|
80
|
+
export const SCHEDULE_CARD_SCROLL_CLASSNAME = 'h-full min-h-0 overflow-x-hidden overflow-y-auto [scrollbar-color:transparent_transparent] [scrollbar-gutter:stable] [scrollbar-width:thin] group-hover:[scrollbar-color:rgba(148,163,184,0.75)_transparent] [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:bg-transparent group-hover:[&::-webkit-scrollbar-thumb]:bg-slate-300/80 group-hover:[&::-webkit-scrollbar-thumb:hover]:bg-slate-400/80 [&::-webkit-scrollbar-track]:bg-transparent [&::-webkit-scrollbar]:w-1.5';
|
|
81
|
+
export const SCHEDULE_CARD_CONTENT_INNER_CLASSNAME = 'flex min-h-full flex-col gap-2 px-4 py-4 pr-1.5';
|
|
82
|
+
export const SCHEDULE_CARD_CONTENT_BORDERLESS_INNER_CLASSNAME = 'flex min-h-full flex-col gap-2 px-2.5 py-2 pr-1';
|
|
83
|
+
export const SCHEDULE_CARD_TITLE_CLASSNAME = 'inline-flex max-w-full whitespace-normal break-words rounded-full bg-blue-50 px-3 py-1 text-sm font-semibold leading-5 text-blue-600';
|
|
84
|
+
export const SCHEDULE_CARD_BLOCK_CLASSNAME = 'flex min-w-0 flex-col gap-2 border-t border-gray-100 pt-3 first:border-t-0 first:pt-0';
|
|
85
|
+
export const SCHEDULE_CARD_SECTION_CLASSNAME = 'flex flex-col gap-0.5';
|
|
86
|
+
export const SCHEDULE_CARD_SECTION_LABEL_CLASSNAME = 'inline-flex items-center gap-1.5 text-xs font-normal leading-5 text-gray-500';
|
|
87
|
+
export const SCHEDULE_CARD_SECTION_VALUE_CLASSNAME = 'w-full min-w-0 whitespace-normal break-words text-xs font-semibold leading-5 text-gray-800';
|
|
76
88
|
export const BOXED_CELL_PADDING_CLASSNAME = 'px-1 py-1';
|
|
77
89
|
export const PLAIN_CELL_PADDING_CLASSNAME = 'px-2 py-1.5';
|
|
78
90
|
export const BUTTON_BASE_CLASSNAME = '!shadow-none !flex !w-full !rounded-none !text-left';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../src/components/TableSchedule/constants.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAKZ,MAAM,CAAC,MAAM,MAAM,GAAG,mDAAmD,CAAA;AAEzE,MAAM,CAAC,MAAM,UAAU,GAAkB;IACvC,QAAQ,EAAE,QAAQ;IAClB,IAAI,EAAE,CAAC;IACP,MAAM,EAAE,CAAC;IACT,UAAU,EAAE,uCAAuC;
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../src/components/TableSchedule/constants.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { GridCellData, GridRowHeader, GridScheduleContent } from './types';
|
|
2
|
+
import { GridCellData, GridRowHeader, GridScheduleCard, GridScheduleCardSize, GridScheduleCardVariant, GridScheduleContent } from './types';
|
|
3
3
|
/**
|
|
4
4
|
* Renders the content displayed inside a sticky row-header cell.
|
|
5
5
|
*
|
|
@@ -22,6 +22,7 @@ export declare const renderCellBoxContent: (cell: GridCellData) => React.JSX.Ele
|
|
|
22
22
|
* @returns {React.ReactNode} The rendered schedule content.
|
|
23
23
|
*/
|
|
24
24
|
export declare const renderScheduleContent: (scheduleContent: GridScheduleContent, userDetailPageUrl?: string) => React.JSX.Element;
|
|
25
|
+
export declare const renderScheduleCards: (scheduleCards: GridScheduleCard[], scheduleCardSize?: GridScheduleCardSize, scheduleCardVariant?: GridScheduleCardVariant, userDetailPageUrl?: string) => React.JSX.Element;
|
|
25
26
|
/**
|
|
26
27
|
* Resolves and renders the tooltip content for a data cell.
|
|
27
28
|
*
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import React from 'react';
|
|
3
|
-
import { CELL_BOX_BASE_CLASSNAME, CELL_BOX_VARIANT_CLASSNAME, DEFAULT_TOOLTIP_CLASSNAME, ROW_HEADER_ALIGN_CLASSNAME, ROW_HEADER_CONTENT_CLASSNAME, ROW_HEADER_DESCRIPTION_CLASSNAME, ROW_HEADER_TITLE_CLASSNAME, SCHEDULE_CELL_CLASSNAME, SCHEDULE_EMPTY_DESCRIPTION_CLASSNAME, SCHEDULE_EMPTY_TITLE_CLASSNAME, SCHEDULE_SECTION_CLASSNAME, SCHEDULE_SECTION_LABEL_CLASSNAME, SCHEDULE_SECTION_VALUE_CLASSNAME, SCHEDULE_TITLE_CLASSNAME, SCHEDULE_TITLE_DOTTED_CLASSNAME, TOOLTIP_CONTENT_CLASSNAME, TOOLTIP_LABEL_CLASSNAME, TOOLTIP_SECTION_CLASSNAME, TOOLTIP_TITLE_CLASSNAME, TOOLTIP_VALUE_CLASSNAME, } from './constants';
|
|
2
|
+
import React, { useEffect, useRef, useState } from 'react';
|
|
3
|
+
import { CELL_BOX_BASE_CLASSNAME, CELL_BOX_VARIANT_CLASSNAME, DEFAULT_TOOLTIP_CLASSNAME, ROW_HEADER_ALIGN_CLASSNAME, ROW_HEADER_CONTENT_CLASSNAME, ROW_HEADER_DESCRIPTION_CLASSNAME, ROW_HEADER_TITLE_CLASSNAME, SCHEDULE_CARD_BUTTON_CLASSNAME, SCHEDULE_CARD_BLOCK_CLASSNAME, SCHEDULE_CARD_CONTENT_CLASSNAME, SCHEDULE_CARD_CONTENT_BORDERLESS_INNER_CLASSNAME, SCHEDULE_CARD_CONTENT_BORDERLESS_CLASSNAME, SCHEDULE_CARD_CONTENT_INNER_CLASSNAME, SCHEDULE_CARD_SCROLL_CLASSNAME, SCHEDULE_CARD_SECTION_CLASSNAME, SCHEDULE_CARD_SECTION_LABEL_CLASSNAME, SCHEDULE_CARD_SECTION_VALUE_CLASSNAME, SCHEDULE_CARD_STACK_CLASSNAME, SCHEDULE_CARD_TITLE_CLASSNAME, SCHEDULE_CELL_CLASSNAME, SCHEDULE_EMPTY_DESCRIPTION_CLASSNAME, SCHEDULE_EMPTY_TITLE_CLASSNAME, SCHEDULE_SECTION_CLASSNAME, SCHEDULE_SECTION_LABEL_CLASSNAME, SCHEDULE_SECTION_VALUE_CLASSNAME, SCHEDULE_TITLE_CLASSNAME, SCHEDULE_TITLE_DOTTED_CLASSNAME, TOOLTIP_CONTENT_CLASSNAME, TOOLTIP_LABEL_CLASSNAME, TOOLTIP_SECTION_CLASSNAME, TOOLTIP_TITLE_CLASSNAME, TOOLTIP_VALUE_CLASSNAME, } from './constants';
|
|
4
|
+
import { PHXBadge } from '../Badge';
|
|
4
5
|
/**
|
|
5
6
|
* Checks whether a render value is a structured person-link object.
|
|
6
7
|
*
|
|
@@ -9,34 +10,108 @@ import { CELL_BOX_BASE_CLASSNAME, CELL_BOX_VARIANT_CLASSNAME, DEFAULT_TOOLTIP_CL
|
|
|
9
10
|
*/
|
|
10
11
|
const isGridPersonLink = (value) => !!value && typeof value === 'object' && 'type' in value && value.type === 'person-link';
|
|
11
12
|
/**
|
|
12
|
-
*
|
|
13
|
+
* Trả về đường dẫn trang chi tiết của một người dùng nếu đủ dữ liệu điều hướng.
|
|
13
14
|
*
|
|
14
|
-
* @param {GridPersonLink} person
|
|
15
|
-
* @param {string} [userDetailPageUrl]
|
|
16
|
-
* @returns {
|
|
15
|
+
* @param {GridPersonLink} person Dữ liệu người dùng đang được hiển thị.
|
|
16
|
+
* @param {string} [userDetailPageUrl] Đường dẫn gốc để ghép tới trang chi tiết.
|
|
17
|
+
* @returns {string | undefined} URL đầy đủ của trang chi tiết, hoặc `undefined` nếu không thể điều hướng.
|
|
17
18
|
*/
|
|
18
|
-
|
|
19
|
+
function resolvePersonLinkHref(person, userDetailPageUrl) {
|
|
20
|
+
if (!userDetailPageUrl || !person.id) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
return `${userDetailPageUrl}${person.id}`;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Hiển thị phần mã đi kèm tên người dùng khi dữ liệu có cung cấp mã.
|
|
27
|
+
*
|
|
28
|
+
* @param {GridPersonLink} person Dữ liệu người dùng cần dựng nhãn hiển thị.
|
|
29
|
+
* @returns {React.ReactNode} Phần nhãn tên và mã của người dùng.
|
|
30
|
+
*/
|
|
31
|
+
function renderPersonLinkLabel(person) {
|
|
32
|
+
return (React.createElement("span", { className: 'whitespace-normal break-words' },
|
|
33
|
+
person.name,
|
|
34
|
+
person.code ? ` (${person.code})` : ''));
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Hiển thị icon dẫn tới trang chi tiết khi ô dữ liệu có thể điều hướng.
|
|
38
|
+
*
|
|
39
|
+
* @param {GridPersonLink} person Dữ liệu người dùng của ô hiện tại.
|
|
40
|
+
* @param {string | undefined} href Đường dẫn điều hướng đã được chuẩn hóa.
|
|
41
|
+
* @returns {React.ReactNode} Icon điều hướng hoặc `null` nếu không cần hiển thị.
|
|
42
|
+
*/
|
|
43
|
+
function renderPersonLinkIcon(person, href) {
|
|
44
|
+
if (!person.id || !href) {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
return React.createElement("span", { className: 'ml-1 inline-block align-baseline' }, person.icon);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Hiển thị một liên kết người dùng trong ô lịch, có thể mở sang trang chi tiết nếu đủ dữ liệu.
|
|
51
|
+
*
|
|
52
|
+
* @param {GridPersonLink} person Thông tin người dùng cần hiển thị.
|
|
53
|
+
* @param {string} [userDetailPageUrl] Đường dẫn gốc để ghép tới trang chi tiết người dùng.
|
|
54
|
+
* @returns {React.ReactNode} Nút liên kết đã dựng xong, hoặc `null` nếu không có tên để hiển thị.
|
|
55
|
+
*/
|
|
56
|
+
function renderPersonLinkNode(person, userDetailPageUrl) {
|
|
19
57
|
if (!person.name)
|
|
20
58
|
return null;
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
};
|
|
59
|
+
const href = resolvePersonLinkHref(person, userDetailPageUrl);
|
|
60
|
+
return (React.createElement("a", { className: 'group/person-link block w-full min-w-0 font-semibold text-gray-800 hover:text-blue-500', href: href, rel: 'noopener noreferrer', target: '_blank' },
|
|
61
|
+
renderPersonLinkLabel(person),
|
|
62
|
+
renderPersonLinkIcon(person, href)));
|
|
63
|
+
}
|
|
27
64
|
/**
|
|
28
|
-
*
|
|
65
|
+
* Hiển thị danh sách nhiều người dùng theo dạng cột trong cùng một ô dữ liệu.
|
|
29
66
|
*
|
|
30
|
-
* @param {
|
|
31
|
-
* @param {string} [userDetailPageUrl]
|
|
32
|
-
* @returns {React.ReactNode}
|
|
67
|
+
* @param {GridPersonLink[]} people Danh sách người dùng cần hiển thị.
|
|
68
|
+
* @param {string} [userDetailPageUrl] Đường dẫn gốc để ghép tới trang chi tiết người dùng.
|
|
69
|
+
* @returns {React.ReactNode} Danh sách liên kết người dùng đã dựng xong.
|
|
70
|
+
*/
|
|
71
|
+
function renderPersonLinkListNode(people, userDetailPageUrl) {
|
|
72
|
+
return (React.createElement("div", { className: 'flex min-w-0 flex-col gap-1' }, people.map((person, index) => {
|
|
73
|
+
var _a;
|
|
74
|
+
return (React.createElement("div", { key: `${(_a = person.id) !== null && _a !== void 0 ? _a : 'person'}-${index}`, className: 'min-w-0' }, renderPersonLinkNode(person, userDetailPageUrl)));
|
|
75
|
+
})));
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Hiển thị một phần tử giá trị bên trong danh sách nhiều dòng của ô dữ liệu.
|
|
79
|
+
*
|
|
80
|
+
* @param {RenderRichValueItem} item Giá trị đơn lẻ cần hiển thị.
|
|
81
|
+
* @param {number} index Chỉ số của giá trị trong danh sách.
|
|
82
|
+
* @param {string} [userDetailPageUrl] Đường dẫn gốc để ghép tới trang chi tiết người dùng.
|
|
83
|
+
* @returns {React.ReactNode} Dòng hiển thị của giá trị tương ứng.
|
|
33
84
|
*/
|
|
34
|
-
|
|
85
|
+
function renderRichValueListItem(item, index, userDetailPageUrl) {
|
|
86
|
+
return (React.createElement("div", { key: index, className: 'min-w-0' }, isGridPersonLink(item) ? renderPersonLinkNode(item, userDetailPageUrl) : item));
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Hiển thị danh sách nhiều giá trị giàu định dạng theo từng dòng riêng biệt.
|
|
90
|
+
*
|
|
91
|
+
* @param {RenderRichValueItem[]} values Danh sách giá trị cần hiển thị.
|
|
92
|
+
* @param {string} [userDetailPageUrl] Đường dẫn gốc để ghép tới trang chi tiết người dùng.
|
|
93
|
+
* @returns {React.ReactNode} Danh sách giá trị đã dựng xong.
|
|
94
|
+
*/
|
|
95
|
+
function renderRichValueList(values, userDetailPageUrl) {
|
|
96
|
+
return (React.createElement("div", { className: 'flex min-w-0 flex-col gap-1' }, values.map((item, index) => renderRichValueListItem(item, index, userDetailPageUrl))));
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Hiển thị giá trị của tooltip hoặc lịch học, hỗ trợ node thô, một người dùng, hoặc danh sách người dùng.
|
|
100
|
+
*
|
|
101
|
+
* @param {ReactNode | GridPersonLink | GridPersonLink[]} value Giá trị cần dựng giao diện.
|
|
102
|
+
* @param {string} [userDetailPageUrl] Đường dẫn gốc để ghép tới trang chi tiết người dùng.
|
|
103
|
+
* @returns {React.ReactNode} Giá trị đã được dựng theo đúng kiểu dữ liệu đầu vào.
|
|
104
|
+
*/
|
|
105
|
+
function renderRichValue(value, userDetailPageUrl) {
|
|
35
106
|
if (Array.isArray(value)) {
|
|
36
|
-
|
|
107
|
+
const values = value;
|
|
108
|
+
if (values.every(isGridPersonLink)) {
|
|
109
|
+
return renderPersonLinkListNode(values, userDetailPageUrl);
|
|
110
|
+
}
|
|
111
|
+
return renderRichValueList(values, userDetailPageUrl);
|
|
37
112
|
}
|
|
38
|
-
return isGridPersonLink(value) ?
|
|
39
|
-
}
|
|
113
|
+
return isGridPersonLink(value) ? renderPersonLinkNode(value, userDetailPageUrl) : value;
|
|
114
|
+
}
|
|
40
115
|
/**
|
|
41
116
|
* Renders the content displayed inside a sticky row-header cell.
|
|
42
117
|
*
|
|
@@ -84,8 +159,209 @@ export const renderScheduleContent = (scheduleContent, userDetailPageUrl) => {
|
|
|
84
159
|
section.label && (React.createElement("div", { className: SCHEDULE_SECTION_LABEL_CLASSNAME },
|
|
85
160
|
section.labelPrefix,
|
|
86
161
|
React.createElement("span", null, section.label))),
|
|
87
|
-
section.items.map((item, itemIndex) => (React.createElement("div", { key: itemIndex, className: SCHEDULE_SECTION_VALUE_CLASSNAME }, isGridPersonLink(item) ?
|
|
162
|
+
section.items.map((item, itemIndex) => (React.createElement("div", { key: itemIndex, className: SCHEDULE_SECTION_VALUE_CLASSNAME }, isGridPersonLink(item) ? renderPersonLinkNode(item, userDetailPageUrl) : item))))))));
|
|
163
|
+
};
|
|
164
|
+
/**
|
|
165
|
+
* Hiển thị một dòng section trong card lịch với nhãn và giá trị đi kèm.
|
|
166
|
+
*
|
|
167
|
+
* @param {GridScheduleCardSection} section Dữ liệu section cần hiển thị.
|
|
168
|
+
* @param {number} sectionIndex Chỉ số section trong danh sách hiện tại.
|
|
169
|
+
* @param {string} [userDetailPageUrl] Đường dẫn gốc để ghép tới trang chi tiết người dùng.
|
|
170
|
+
* @returns {React.ReactNode} Section đã được dựng xong để gắn vào card lịch.
|
|
171
|
+
*/
|
|
172
|
+
function renderScheduleCardSection(section, sectionIndex, userDetailPageUrl) {
|
|
173
|
+
return (React.createElement("div", { key: sectionIndex, className: SCHEDULE_CARD_SECTION_CLASSNAME },
|
|
174
|
+
React.createElement("div", { className: SCHEDULE_CARD_SECTION_LABEL_CLASSNAME },
|
|
175
|
+
section.labelPrefix,
|
|
176
|
+
React.createElement("span", null, section.label)),
|
|
177
|
+
React.createElement("div", { className: SCHEDULE_CARD_SECTION_VALUE_CLASSNAME }, renderRichValue(section.value, userDetailPageUrl))));
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Hiển thị danh sách section dùng chung cho block hoặc card lịch.
|
|
181
|
+
*
|
|
182
|
+
* @param {GridScheduleCardSection[] | undefined} sections Danh sách section cần hiển thị.
|
|
183
|
+
* @param {string} [userDetailPageUrl] Đường dẫn gốc để ghép tới trang chi tiết người dùng.
|
|
184
|
+
* @returns {React.ReactNode} Danh sách section đã dựng xong.
|
|
185
|
+
*/
|
|
186
|
+
function renderScheduleCardSections(sections, userDetailPageUrl) {
|
|
187
|
+
return (sections !== null && sections !== void 0 ? sections : []).map((section, sectionIndex) => renderScheduleCardSection(section, sectionIndex, userDetailPageUrl));
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Hiển thị một block thông tin bên trong card lịch.
|
|
191
|
+
*
|
|
192
|
+
* @param {GridScheduleCardBlock} block Dữ liệu block cần hiển thị.
|
|
193
|
+
* @param {string} [userDetailPageUrl] Đường dẫn gốc để ghép tới trang chi tiết người dùng.
|
|
194
|
+
* @returns {React.ReactNode} Nội dung block đã được dựng xong.
|
|
195
|
+
*/
|
|
196
|
+
function renderScheduleCardBlock(block, userDetailPageUrl) {
|
|
197
|
+
return (React.createElement(React.Fragment, null,
|
|
198
|
+
renderScheduleCardTitle(block.title),
|
|
199
|
+
renderScheduleCardSections(block.sections, userDetailPageUrl)));
|
|
200
|
+
}
|
|
201
|
+
const DEFAULT_SCHEDULE_CARD_SIZE = {
|
|
202
|
+
width: '100%',
|
|
203
|
+
height: 156,
|
|
204
|
+
};
|
|
205
|
+
const resolveBadgeText = (value) => {
|
|
206
|
+
if (typeof value === 'string' || typeof value === 'number') {
|
|
207
|
+
return String(value);
|
|
208
|
+
}
|
|
209
|
+
return undefined;
|
|
88
210
|
};
|
|
211
|
+
/**
|
|
212
|
+
* Hiển thị tiêu đề của card lịch dưới dạng badge hoặc tiêu đề văn bản thường.
|
|
213
|
+
*
|
|
214
|
+
* @param {ReactNode} [title] Giá trị tiêu đề cần hiển thị.
|
|
215
|
+
* @returns {React.ReactNode} Badge hoặc tiêu đề đã dựng xong, hoặc `null` nếu không có dữ liệu.
|
|
216
|
+
*/
|
|
217
|
+
function renderScheduleCardTitle(title) {
|
|
218
|
+
if (!title)
|
|
219
|
+
return null;
|
|
220
|
+
const badgeText = resolveBadgeText(title);
|
|
221
|
+
if (badgeText) {
|
|
222
|
+
return React.createElement(PHXBadge, { hideIcon: true, text: badgeText, type: 'informational' });
|
|
223
|
+
}
|
|
224
|
+
return React.createElement("div", { className: SCHEDULE_CARD_TITLE_CLASSNAME }, title);
|
|
225
|
+
}
|
|
226
|
+
const resolveScheduleCardSize = (scheduleCardSize) => {
|
|
227
|
+
var _a, _b;
|
|
228
|
+
return ({
|
|
229
|
+
width: (_a = scheduleCardSize === null || scheduleCardSize === void 0 ? void 0 : scheduleCardSize.width) !== null && _a !== void 0 ? _a : DEFAULT_SCHEDULE_CARD_SIZE.width,
|
|
230
|
+
height: (_b = scheduleCardSize === null || scheduleCardSize === void 0 ? void 0 : scheduleCardSize.height) !== null && _b !== void 0 ? _b : DEFAULT_SCHEDULE_CARD_SIZE.height,
|
|
231
|
+
});
|
|
232
|
+
};
|
|
233
|
+
const buildScheduleCardStackStyle = (scheduleCardSize) => {
|
|
234
|
+
const resolvedSize = resolveScheduleCardSize(scheduleCardSize);
|
|
235
|
+
return {
|
|
236
|
+
width: resolvedSize.width,
|
|
237
|
+
height: resolvedSize.height,
|
|
238
|
+
};
|
|
239
|
+
};
|
|
240
|
+
const buildScheduleCardButtonStyle = (totalCards, scheduleCardSize) => {
|
|
241
|
+
if (totalCards !== 1) {
|
|
242
|
+
return undefined;
|
|
243
|
+
}
|
|
244
|
+
const resolvedSize = resolveScheduleCardSize(scheduleCardSize);
|
|
245
|
+
return {
|
|
246
|
+
width: resolvedSize.width,
|
|
247
|
+
minHeight: resolvedSize.height,
|
|
248
|
+
height: resolvedSize.height,
|
|
249
|
+
};
|
|
250
|
+
};
|
|
251
|
+
/**
|
|
252
|
+
* Trả về class cho nút card lịch theo biến thể giao diện đang dùng.
|
|
253
|
+
*
|
|
254
|
+
* @param {GridScheduleCardVariant} [scheduleCardVariant='default'] Biến thể hiển thị của card lịch.
|
|
255
|
+
* @returns {string} Chuỗi className áp dụng cho nút card.
|
|
256
|
+
*/
|
|
257
|
+
function getScheduleCardButtonClassName(scheduleCardVariant = 'default') {
|
|
258
|
+
return scheduleCardVariant === 'borderless'
|
|
259
|
+
? 'group w-full shrink-0 appearance-none overflow-hidden rounded-xl bg-white text-left transition'
|
|
260
|
+
: SCHEDULE_CARD_BUTTON_CLASSNAME;
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Trả về class cho vùng nội dung ngoài của card lịch theo biến thể giao diện.
|
|
264
|
+
*
|
|
265
|
+
* @param {GridScheduleCardVariant} [scheduleCardVariant='default'] Biến thể hiển thị của card lịch.
|
|
266
|
+
* @returns {string} Chuỗi className áp dụng cho vùng nội dung ngoài.
|
|
267
|
+
*/
|
|
268
|
+
function getScheduleCardContentClassName(scheduleCardVariant = 'default') {
|
|
269
|
+
return scheduleCardVariant === 'borderless'
|
|
270
|
+
? SCHEDULE_CARD_CONTENT_BORDERLESS_CLASSNAME
|
|
271
|
+
: SCHEDULE_CARD_CONTENT_CLASSNAME;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Trả về class cho vùng nội dung trong cùng của card lịch theo biến thể giao diện.
|
|
275
|
+
*
|
|
276
|
+
* @param {GridScheduleCardVariant} [scheduleCardVariant='default'] Biến thể hiển thị của card lịch.
|
|
277
|
+
* @returns {string} Chuỗi className áp dụng cho vùng nội dung trong cùng.
|
|
278
|
+
*/
|
|
279
|
+
function getScheduleCardContentInnerClassName(scheduleCardVariant = 'default') {
|
|
280
|
+
return scheduleCardVariant === 'borderless'
|
|
281
|
+
? SCHEDULE_CARD_CONTENT_BORDERLESS_INNER_CLASSNAME
|
|
282
|
+
: SCHEDULE_CARD_CONTENT_INNER_CLASSNAME;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Tính trạng thái cuộn của phần nội dung card lịch để quyết định có hiển thị fade ở đáy hay không.
|
|
286
|
+
*
|
|
287
|
+
* @param {HTMLDivElement} element Phần tử cuộn đang được theo dõi.
|
|
288
|
+
* @returns {ScheduleCardScrollState} Trạng thái tràn dọc và vị trí hiện tại của thanh cuộn.
|
|
289
|
+
*/
|
|
290
|
+
function resolveScheduleCardScrollState(element) {
|
|
291
|
+
const hasVerticalOverflow = element.scrollHeight > element.clientHeight;
|
|
292
|
+
const maxScrollTop = element.scrollHeight - element.clientHeight;
|
|
293
|
+
const isAtBottom = maxScrollTop <= 1 || element.scrollTop >= maxScrollTop - 1;
|
|
294
|
+
return {
|
|
295
|
+
hasVerticalOverflow,
|
|
296
|
+
isAtBottom,
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Đồng bộ state cuộn của card lịch từ kích thước và vị trí cuộn hiện tại của phần tử.
|
|
301
|
+
*
|
|
302
|
+
* @param {HTMLDivElement} element Phần tử cuộn đang được theo dõi.
|
|
303
|
+
* @param {(value: React.SetStateAction<boolean>) => void} setHasVerticalOverflow Hàm cập nhật trạng thái tràn dọc.
|
|
304
|
+
* @param {(value: React.SetStateAction<boolean>) => void} setIsAtBottom Hàm cập nhật trạng thái đã cuộn tới đáy.
|
|
305
|
+
* @returns {void}
|
|
306
|
+
*/
|
|
307
|
+
function syncScheduleCardScrollState(element, setHasVerticalOverflow, setIsAtBottom) {
|
|
308
|
+
const nextState = resolveScheduleCardScrollState(element);
|
|
309
|
+
setHasVerticalOverflow(nextState.hasVerticalOverflow);
|
|
310
|
+
setIsAtBottom(nextState.isAtBottom);
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Hiển thị vùng nội dung có thể cuộn của card lịch và thêm hiệu ứng fade khi còn nội dung phía dưới.
|
|
314
|
+
*
|
|
315
|
+
* @param {ScheduleCardScrollableContentProps} props Thuộc tính render của vùng cuộn card lịch.
|
|
316
|
+
* @returns {React.ReactNode} Vùng nội dung card lịch có xử lý overflow theo chiều dọc.
|
|
317
|
+
*/
|
|
318
|
+
function ScheduleCardScrollableContent({ children, scheduleCardVariant, }) {
|
|
319
|
+
const scrollRef = useRef(null);
|
|
320
|
+
const [hasVerticalOverflow, setHasVerticalOverflow] = useState(false);
|
|
321
|
+
const [isAtBottom, setIsAtBottom] = useState(true);
|
|
322
|
+
useEffect(() => {
|
|
323
|
+
const element = scrollRef.current;
|
|
324
|
+
if (!element) {
|
|
325
|
+
return undefined;
|
|
326
|
+
}
|
|
327
|
+
const scrollElement = element;
|
|
328
|
+
/**
|
|
329
|
+
* Đồng bộ trạng thái cuộn mỗi khi kích thước hoặc vị trí cuộn của card thay đổi.
|
|
330
|
+
*
|
|
331
|
+
* @returns {void}
|
|
332
|
+
*/
|
|
333
|
+
function updateScrollState() {
|
|
334
|
+
syncScheduleCardScrollState(scrollElement, setHasVerticalOverflow, setIsAtBottom);
|
|
335
|
+
}
|
|
336
|
+
updateScrollState();
|
|
337
|
+
const resizeObserver = new ResizeObserver(() => {
|
|
338
|
+
updateScrollState();
|
|
339
|
+
});
|
|
340
|
+
resizeObserver.observe(scrollElement);
|
|
341
|
+
const innerElement = scrollElement.firstElementChild;
|
|
342
|
+
if (innerElement instanceof HTMLElement) {
|
|
343
|
+
resizeObserver.observe(innerElement);
|
|
344
|
+
}
|
|
345
|
+
scrollElement.addEventListener('scroll', updateScrollState, { passive: true });
|
|
346
|
+
window.addEventListener('resize', updateScrollState);
|
|
347
|
+
return () => {
|
|
348
|
+
resizeObserver.disconnect();
|
|
349
|
+
scrollElement.removeEventListener('scroll', updateScrollState);
|
|
350
|
+
window.removeEventListener('resize', updateScrollState);
|
|
351
|
+
};
|
|
352
|
+
}, [children, scheduleCardVariant]);
|
|
353
|
+
return (React.createElement("div", { className: getScheduleCardContentClassName(scheduleCardVariant) },
|
|
354
|
+
React.createElement("div", { ref: scrollRef, className: SCHEDULE_CARD_SCROLL_CLASSNAME },
|
|
355
|
+
React.createElement("div", { className: getScheduleCardContentInnerClassName(scheduleCardVariant) }, children)),
|
|
356
|
+
hasVerticalOverflow && !isAtBottom && (React.createElement("div", { className: 'pointer-events-none absolute inset-x-0 bottom-0 h-8 bg-gradient-to-t from-white via-white/90 to-transparent' }))));
|
|
357
|
+
}
|
|
358
|
+
export const renderScheduleCards = (scheduleCards, scheduleCardSize, scheduleCardVariant, userDetailPageUrl) => (React.createElement("div", { className: SCHEDULE_CARD_STACK_CLASSNAME, style: buildScheduleCardStackStyle(scheduleCardSize) }, scheduleCards.map((card, index) => {
|
|
359
|
+
var _a;
|
|
360
|
+
return (React.createElement("button", { key: (_a = card.id) !== null && _a !== void 0 ? _a : index, type: 'button', className: getScheduleCardButtonClassName(scheduleCardVariant), onClick: card.onClick, style: buildScheduleCardButtonStyle(scheduleCards.length, scheduleCardSize) },
|
|
361
|
+
React.createElement(ScheduleCardScrollableContent, { scheduleCardVariant: scheduleCardVariant }, card.blocks && card.blocks.length > 0 ? (card.blocks.map((block, blockIndex) => (React.createElement("div", { key: blockIndex, className: SCHEDULE_CARD_BLOCK_CLASSNAME }, renderScheduleCardBlock(block, userDetailPageUrl))))) : (React.createElement(React.Fragment, null,
|
|
362
|
+
renderScheduleCardTitle(card.title),
|
|
363
|
+
renderScheduleCardSections(card.sections, userDetailPageUrl))))));
|
|
364
|
+
})));
|
|
89
365
|
/**
|
|
90
366
|
* Renders the grouped tooltip sections for a cell.
|
|
91
367
|
*
|