@rt-tools/ui-kit-v2 0.39.1 → 0.40.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/fesm2022/rt-tools-ui-kit-v2-ai-prompt-input.mjs +13 -1
- package/fesm2022/rt-tools-ui-kit-v2-ai-prompt-input.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-core.mjs +12 -0
- package/fesm2022/rt-tools-ui-kit-v2-core.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs +3 -1
- package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs +60 -7
- package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs +91 -10
- package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-detail-list.mjs +2 -2
- package/fesm2022/rt-tools-ui-kit-v2-detail-list.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs +76 -5
- package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +111 -35
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs +37 -16
- package/fesm2022/rt-tools-ui-kit-v2-stat-tile.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-table.mjs +94 -5
- package/fesm2022/rt-tools-ui-kit-v2-table.mjs.map +1 -1
- package/package.json +1 -1
- package/src/lib/components/date-picker/panel/rt-date-panel.component.scss +51 -2
- package/src/lib/components/date-range/panel/rt-date-range-panel.component.scss +95 -2
- package/src/lib/components/detail-list/CONTEXT.md +3 -0
- package/src/lib/components/detail-list/rt-detail-row.component.scss +1 -0
- package/src/lib/components/input-number/CONTEXT.md +8 -0
- package/src/lib/components/input-number/rt-input-number.component.scss +50 -0
- package/src/lib/components/stat-tile/CONTEXT.md +11 -6
- package/src/lib/components/stat-tile/rt-stat-tile.component.scss +21 -0
- package/src/lib/components/stat-tile/stories/component/test-stat-tile-matrix.component.scss +15 -0
- package/src/lib/components/table/CONTEXT.md +20 -0
- package/src/lib/components/table/rt-table.component.scss +77 -22
- package/src/lib/components/table/stories/component/test-table-pinned.component.scss +76 -0
- package/src/rich-editor/lib/components/chat/CONTEXT.md +5 -0
- package/src/styles/_primitives.scss +2 -0
- package/src/styles/_semantic.scss +9 -0
- package/src/styles/_theme-dark.scss +2 -0
- package/styles/tokens.css +66 -0
- package/types/rt-tools-ui-kit-v2-ai-prompt-input.d.ts +4 -0
- package/types/rt-tools-ui-kit-v2-core.d.ts +9 -1
- package/types/rt-tools-ui-kit-v2-date-picker.d.ts +14 -0
- package/types/rt-tools-ui-kit-v2-input-number.d.ts +30 -2
- package/types/rt-tools-ui-kit-v2-rich-editor.d.ts +13 -1
- package/types/rt-tools-ui-kit-v2-stat-tile.d.ts +29 -6
- package/types/rt-tools-ui-kit-v2-table.d.ts +31 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from "@angular/core";
|
|
2
|
-
import { ChangeDetectionStrategy, Component, ViewEncapsulation, computed, inject, input } from "@angular/core";
|
|
2
|
+
import { ChangeDetectionStrategy, Component, ViewEncapsulation, booleanAttribute, computed, inject, input } from "@angular/core";
|
|
3
3
|
import { BlockDirective, ElemDirective, ModDirective } from "@rt-tools/core";
|
|
4
4
|
import { RT_KIT_LABELS, rtKitLabel } from "@rt-tools/ui-kit-v2/core";
|
|
5
5
|
import { RtIconComponent } from "@rt-tools/ui-kit-v2/icon";
|
|
@@ -15,18 +15,16 @@ function directionOf(percent) {
|
|
|
15
15
|
if (percent > 0) return "up";
|
|
16
16
|
return percent < 0 ? "down" : "flat";
|
|
17
17
|
}
|
|
18
|
-
function
|
|
19
|
-
|
|
20
|
-
return `${percent > 0 ? "+" : ""}${String(percent).replace(".", ",")} %`;
|
|
18
|
+
function signedNumber(value) {
|
|
19
|
+
return `${value > 0 ? "+" : ""}${String(value).replace(".", ",")}`;
|
|
21
20
|
}
|
|
22
|
-
function deltaRow(key, delta) {
|
|
23
|
-
|
|
24
|
-
const direction = directionOf(delta.percent);
|
|
21
|
+
function deltaRow(key, delta, percent, pointsText) {
|
|
22
|
+
const direction = directionOf(percent);
|
|
25
23
|
return {
|
|
26
24
|
key,
|
|
27
25
|
direction,
|
|
28
26
|
label: delta.label,
|
|
29
|
-
text:
|
|
27
|
+
text: delta.unit === "points" ? pointsText : `${signedNumber(percent)} %`,
|
|
30
28
|
baseline: delta.baseline ?? "",
|
|
31
29
|
icon: DIRECTION_ICONS[direction]
|
|
32
30
|
};
|
|
@@ -35,9 +33,11 @@ var RtStatTileComponent = class RtStatTileComponent {
|
|
|
35
33
|
constructor() {
|
|
36
34
|
this.#baselineParams = computed(() => ({ value: this.deltaPrimary()?.baseline ?? "" }), ...ngDevMode ? [{ debugName: "#baselineParams" }] : /* istanbul ignore next */ []);
|
|
37
35
|
this.#baselineLine = rtKitLabel("uiBaseline", this.#baselineParams);
|
|
36
|
+
this.#primaryPoints = rtKitLabel("uiPercentagePoints", computed(() => ({ value: signedNumber(this.deltaPrimary()?.percent ?? 0) })));
|
|
37
|
+
this.#yearPoints = rtKitLabel("uiPercentagePoints", computed(() => ({ value: signedNumber(this.deltaSecondary()?.percent ?? 0) })));
|
|
38
38
|
this.t = inject(RT_KIT_LABELS);
|
|
39
|
-
this.primaryDelta = computed(() => this.#visibleDelta(this.deltaPrimary()), ...ngDevMode ? [{ debugName: "primaryDelta" }] : /* istanbul ignore next */ []);
|
|
40
|
-
this.yearDelta = computed(() => this.#visibleDelta(this.deltaSecondary()), ...ngDevMode ? [{ debugName: "yearDelta" }] : /* istanbul ignore next */ []);
|
|
39
|
+
this.primaryDelta = computed(() => this.#visibleDelta("primary", this.deltaPrimary(), this.#primaryPoints()), ...ngDevMode ? [{ debugName: "primaryDelta" }] : /* istanbul ignore next */ []);
|
|
40
|
+
this.yearDelta = computed(() => this.#visibleDelta("year", this.deltaSecondary(), this.#yearPoints()), ...ngDevMode ? [{ debugName: "yearDelta" }] : /* istanbul ignore next */ []);
|
|
41
41
|
this.baselineText = computed(() => this.deltaPrimary()?.baseline ? this.#baselineLine() : "", ...ngDevMode ? [{ debugName: "baselineText" }] : /* istanbul ignore next */ []);
|
|
42
42
|
this.label = input.required(...ngDevMode ? [{ debugName: "label" }] : /* istanbul ignore next */ []);
|
|
43
43
|
this.value = input.required(...ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []);
|
|
@@ -45,12 +45,18 @@ var RtStatTileComponent = class RtStatTileComponent {
|
|
|
45
45
|
this.deltaPrimary = input(null, ...ngDevMode ? [{ debugName: "deltaPrimary" }] : /* istanbul ignore next */ []);
|
|
46
46
|
this.deltaSecondary = input(null, ...ngDevMode ? [{ debugName: "deltaSecondary" }] : /* istanbul ignore next */ []);
|
|
47
47
|
this.hint = input(null, ...ngDevMode ? [{ debugName: "hint" }] : /* istanbul ignore next */ []);
|
|
48
|
+
this.growthIsWorse = input(false, {
|
|
49
|
+
...ngDevMode ? { debugName: "growthIsWorse" } : /* istanbul ignore next */ {},
|
|
50
|
+
transform: booleanAttribute
|
|
51
|
+
});
|
|
48
52
|
}
|
|
49
53
|
#baselineParams;
|
|
50
54
|
#baselineLine;
|
|
51
|
-
#
|
|
55
|
+
#primaryPoints;
|
|
56
|
+
#yearPoints;
|
|
57
|
+
#visibleDelta(key, delta, pointsText) {
|
|
52
58
|
if (!delta || delta.percent === null) return null;
|
|
53
|
-
return deltaRow(
|
|
59
|
+
return deltaRow(key, delta, delta.percent, pointsText);
|
|
54
60
|
}
|
|
55
61
|
static {
|
|
56
62
|
this.ɵfac = i0.ɵɵngDeclareFactory({
|
|
@@ -111,12 +117,19 @@ var RtStatTileComponent = class RtStatTileComponent {
|
|
|
111
117
|
isSignal: true,
|
|
112
118
|
isRequired: false,
|
|
113
119
|
transformFunction: null
|
|
120
|
+
},
|
|
121
|
+
growthIsWorse: {
|
|
122
|
+
classPropertyName: "growthIsWorse",
|
|
123
|
+
publicName: "growthIsWorse",
|
|
124
|
+
isSignal: true,
|
|
125
|
+
isRequired: false,
|
|
126
|
+
transformFunction: null
|
|
114
127
|
}
|
|
115
128
|
},
|
|
116
129
|
host: { classAttribute: "rt-stat-tile" },
|
|
117
130
|
ngImport: i0,
|
|
118
|
-
template: "<article rtBlock=\"rt-stat-tile\" qa-dataid=\"stat-tile\">\n <header rtElem=\"head\">\n <span rtElem=\"label\" qa-dataid=\"stat-tile-label\">{{ label() }}</span>\n @if (hint(); as hintText) {\n <rt-icon rtElem=\"hint\" qa-dataid=\"stat-tile-hint\" name=\"info-circle\" size=\"xs\" [attr.title]=\"hintText\" />\n }\n </header>\n\n <div rtElem=\"value-row\">\n <p rtElem=\"value\" qa-dataid=\"stat-tile-value\">{{ value() }}</p>\n\n @if (primaryDelta(); as row) {\n <span\n rtElem=\"delta\"\n qa-dataid=\"stat-tile-delta\"\n [attr.data-direction]=\"row.direction\"\n [rtMod]=\"{ direction: row.direction }\"\n [attr.title]=\"row.label\">\n <rt-icon qa-dataid=\"stat-tile-delta-icon\" size=\"xs\" [name]=\"row.icon\" />\n <span qa-dataid=\"stat-tile-delta-percent\">{{ row.text }}</span>\n </span>\n }\n\n @if (yearDelta(); as row) {\n <span\n rtElem=\"year\"\n qa-dataid=\"stat-tile-year\"\n [attr.data-direction]=\"row.direction\"\n [rtMod]=\"{ direction: row.direction }\"\n [attr.title]=\"row.label\">\n {{ t().uiYearOverYear }} {{ row.text }}\n </span>\n }\n </div>\n\n @if (baselineText(); as text) {\n <p rtElem=\"baseline\" qa-dataid=\"stat-tile-baseline\">{{ text }}</p>\n }\n\n @if (secondary(); as text) {\n <p rtElem=\"secondary\" qa-dataid=\"stat-tile-secondary\">{{ text }}</p>\n }\n</article>\n",
|
|
119
|
-
styles: ["@charset \"UTF-8\";@layer rt-kit.components{rt-stat-tile{display:block}rt-stat-tile .rt-stat-tile{--rt-stat-tile-year-radius: var(--rt-radius-sm);display:flex;height:100%;flex-direction:column;gap:var(--rt-space-2)}rt-stat-tile .rt-stat-tile__head{display:flex;align-items:center;gap:var(--rt-space-1)}rt-stat-tile .rt-stat-tile__label{color:var(--rt-color-text-primary);font-size:var(--rt-text-sm);font-weight:var(--rt-font-weight-semibold)}rt-stat-tile .rt-stat-tile__hint{color:var(--rt-color-text-muted);cursor:help}rt-stat-tile .rt-stat-tile__value-row{display:flex;flex-wrap:wrap;align-items:center;gap:var(--rt-space-4)}rt-stat-tile .rt-stat-tile__value{margin:0;color:var(--rt-color-text-primary);font-size:var(--rt-text-3xl);font-weight:var(--rt-font-weight-bold);line-height:var(--rt-leading-none)}rt-stat-tile .rt-stat-tile__delta{display:inline-flex;align-items:center;color:var(--rt-color-text-muted);font-size:var(--rt-text-md);font-weight:var(--rt-font-weight-bold);gap:var(--rt-space-1);line-height:var(--rt-leading-none)}rt-stat-tile .rt-stat-tile__delta--direction--up{color:var(--rt-color-state-success)}rt-stat-tile .rt-stat-tile__delta--direction--down{color:var(--rt-color-state-danger)}rt-stat-tile .rt-stat-tile__year{flex:0 0 auto;padding:var(--rt-space-0-5) var(--rt-space-2);border-radius:var(--rt-stat-tile-year-radius);background:var(--rt-color-bg-surface-subtle);color:var(--rt-color-text-muted);font-size:var(--rt-text-xs);font-weight:var(--rt-font-weight-semibold);line-height:var(--rt-leading-none);white-space:nowrap}rt-stat-tile .rt-stat-tile__year--direction--up{background:var(--rt-color-state-success-bg);color:var(--rt-color-state-success)}rt-stat-tile .rt-stat-tile__year--direction--down{background:var(--rt-color-state-danger-bg);color:var(--rt-color-state-danger)}rt-stat-tile .rt-stat-tile__baseline{overflow:hidden;margin:0;color:var(--rt-color-text-muted);font-size:var(--rt-text-sm);text-overflow:ellipsis;white-space:nowrap}rt-stat-tile .rt-stat-tile__secondary{overflow:hidden;margin:auto 0 0;color:var(--rt-color-text-muted);font-size:var(--rt-text-xs);text-overflow:ellipsis;white-space:nowrap}}\n"],
|
|
131
|
+
template: "<article rtBlock=\"rt-stat-tile\" qa-dataid=\"stat-tile\" [rtMod]=\"{ 'growth-worse': growthIsWorse() }\">\n <header rtElem=\"head\">\n <span rtElem=\"label\" qa-dataid=\"stat-tile-label\">{{ label() }}</span>\n @if (hint(); as hintText) {\n <rt-icon rtElem=\"hint\" qa-dataid=\"stat-tile-hint\" name=\"info-circle\" size=\"xs\" [attr.title]=\"hintText\" />\n }\n </header>\n\n <div rtElem=\"value-row\">\n <p rtElem=\"value\" qa-dataid=\"stat-tile-value\">{{ value() }}</p>\n\n @if (primaryDelta(); as row) {\n <span\n rtElem=\"delta\"\n qa-dataid=\"stat-tile-delta\"\n [attr.data-direction]=\"row.direction\"\n [rtMod]=\"{ direction: row.direction }\"\n [attr.title]=\"row.label\">\n <rt-icon qa-dataid=\"stat-tile-delta-icon\" size=\"xs\" [name]=\"row.icon\" />\n <span qa-dataid=\"stat-tile-delta-percent\">{{ row.text }}</span>\n </span>\n }\n\n @if (yearDelta(); as row) {\n <span\n rtElem=\"year\"\n qa-dataid=\"stat-tile-year\"\n [attr.data-direction]=\"row.direction\"\n [rtMod]=\"{ direction: row.direction }\"\n [attr.title]=\"row.label\">\n {{ t().uiYearOverYear }} {{ row.text }}\n </span>\n }\n </div>\n\n @if (baselineText(); as text) {\n <p rtElem=\"baseline\" qa-dataid=\"stat-tile-baseline\">{{ text }}</p>\n }\n\n @if (secondary(); as text) {\n <p rtElem=\"secondary\" qa-dataid=\"stat-tile-secondary\">{{ text }}</p>\n }\n</article>\n",
|
|
132
|
+
styles: ["@charset \"UTF-8\";@layer rt-kit.components{rt-stat-tile{display:block}rt-stat-tile .rt-stat-tile{--rt-stat-tile-year-radius: var(--rt-radius-sm);display:flex;height:100%;flex-direction:column;gap:var(--rt-space-2)}rt-stat-tile .rt-stat-tile__head{display:flex;align-items:center;gap:var(--rt-space-1)}rt-stat-tile .rt-stat-tile__label{color:var(--rt-color-text-primary);font-size:var(--rt-text-sm);font-weight:var(--rt-font-weight-semibold)}rt-stat-tile .rt-stat-tile__hint{color:var(--rt-color-text-muted);cursor:help}rt-stat-tile .rt-stat-tile__value-row{display:flex;flex-wrap:wrap;align-items:center;gap:var(--rt-space-4)}rt-stat-tile .rt-stat-tile__value{margin:0;color:var(--rt-color-text-primary);font-size:var(--rt-text-3xl);font-weight:var(--rt-font-weight-bold);line-height:var(--rt-leading-none)}rt-stat-tile .rt-stat-tile__delta{display:inline-flex;align-items:center;color:var(--rt-color-text-muted);font-size:var(--rt-text-md);font-weight:var(--rt-font-weight-bold);gap:var(--rt-space-1);line-height:var(--rt-leading-none)}rt-stat-tile .rt-stat-tile__delta--direction--up{color:var(--rt-color-state-success)}rt-stat-tile .rt-stat-tile__delta--direction--down{color:var(--rt-color-state-danger)}rt-stat-tile .rt-stat-tile__year{flex:0 0 auto;padding:var(--rt-space-0-5) var(--rt-space-2);border-radius:var(--rt-stat-tile-year-radius);background:var(--rt-color-bg-surface-subtle);color:var(--rt-color-text-muted);font-size:var(--rt-text-xs);font-weight:var(--rt-font-weight-semibold);line-height:var(--rt-leading-none);white-space:nowrap}rt-stat-tile .rt-stat-tile__year--direction--up{background:var(--rt-color-state-success-bg);color:var(--rt-color-state-success)}rt-stat-tile .rt-stat-tile__year--direction--down{background:var(--rt-color-state-danger-bg);color:var(--rt-color-state-danger)}rt-stat-tile .rt-stat-tile__baseline{overflow:hidden;margin:0;color:var(--rt-color-text-muted);font-size:var(--rt-text-sm);text-overflow:ellipsis;white-space:nowrap}rt-stat-tile .rt-stat-tile--growth-worse .rt-stat-tile__delta--direction--up{color:var(--rt-color-state-danger)}rt-stat-tile .rt-stat-tile--growth-worse .rt-stat-tile__delta--direction--down{color:var(--rt-color-state-success)}rt-stat-tile .rt-stat-tile--growth-worse .rt-stat-tile__year--direction--up{background:var(--rt-color-state-danger-bg);color:var(--rt-color-state-danger)}rt-stat-tile .rt-stat-tile--growth-worse .rt-stat-tile__year--direction--down{background:var(--rt-color-state-success-bg);color:var(--rt-color-state-success)}rt-stat-tile .rt-stat-tile__secondary{overflow:hidden;margin:auto 0 0;color:var(--rt-color-text-muted);font-size:var(--rt-text-xs);text-overflow:ellipsis;white-space:nowrap}}\n"],
|
|
120
133
|
dependencies: [
|
|
121
134
|
{
|
|
122
135
|
kind: "component",
|
|
@@ -174,8 +187,8 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
174
187
|
ModDirective
|
|
175
188
|
],
|
|
176
189
|
host: { class: BEM_BLOCK },
|
|
177
|
-
template: "<article rtBlock=\"rt-stat-tile\" qa-dataid=\"stat-tile\">\n <header rtElem=\"head\">\n <span rtElem=\"label\" qa-dataid=\"stat-tile-label\">{{ label() }}</span>\n @if (hint(); as hintText) {\n <rt-icon rtElem=\"hint\" qa-dataid=\"stat-tile-hint\" name=\"info-circle\" size=\"xs\" [attr.title]=\"hintText\" />\n }\n </header>\n\n <div rtElem=\"value-row\">\n <p rtElem=\"value\" qa-dataid=\"stat-tile-value\">{{ value() }}</p>\n\n @if (primaryDelta(); as row) {\n <span\n rtElem=\"delta\"\n qa-dataid=\"stat-tile-delta\"\n [attr.data-direction]=\"row.direction\"\n [rtMod]=\"{ direction: row.direction }\"\n [attr.title]=\"row.label\">\n <rt-icon qa-dataid=\"stat-tile-delta-icon\" size=\"xs\" [name]=\"row.icon\" />\n <span qa-dataid=\"stat-tile-delta-percent\">{{ row.text }}</span>\n </span>\n }\n\n @if (yearDelta(); as row) {\n <span\n rtElem=\"year\"\n qa-dataid=\"stat-tile-year\"\n [attr.data-direction]=\"row.direction\"\n [rtMod]=\"{ direction: row.direction }\"\n [attr.title]=\"row.label\">\n {{ t().uiYearOverYear }} {{ row.text }}\n </span>\n }\n </div>\n\n @if (baselineText(); as text) {\n <p rtElem=\"baseline\" qa-dataid=\"stat-tile-baseline\">{{ text }}</p>\n }\n\n @if (secondary(); as text) {\n <p rtElem=\"secondary\" qa-dataid=\"stat-tile-secondary\">{{ text }}</p>\n }\n</article>\n",
|
|
178
|
-
styles: ["@charset \"UTF-8\";@layer rt-kit.components{rt-stat-tile{display:block}rt-stat-tile .rt-stat-tile{--rt-stat-tile-year-radius: var(--rt-radius-sm);display:flex;height:100%;flex-direction:column;gap:var(--rt-space-2)}rt-stat-tile .rt-stat-tile__head{display:flex;align-items:center;gap:var(--rt-space-1)}rt-stat-tile .rt-stat-tile__label{color:var(--rt-color-text-primary);font-size:var(--rt-text-sm);font-weight:var(--rt-font-weight-semibold)}rt-stat-tile .rt-stat-tile__hint{color:var(--rt-color-text-muted);cursor:help}rt-stat-tile .rt-stat-tile__value-row{display:flex;flex-wrap:wrap;align-items:center;gap:var(--rt-space-4)}rt-stat-tile .rt-stat-tile__value{margin:0;color:var(--rt-color-text-primary);font-size:var(--rt-text-3xl);font-weight:var(--rt-font-weight-bold);line-height:var(--rt-leading-none)}rt-stat-tile .rt-stat-tile__delta{display:inline-flex;align-items:center;color:var(--rt-color-text-muted);font-size:var(--rt-text-md);font-weight:var(--rt-font-weight-bold);gap:var(--rt-space-1);line-height:var(--rt-leading-none)}rt-stat-tile .rt-stat-tile__delta--direction--up{color:var(--rt-color-state-success)}rt-stat-tile .rt-stat-tile__delta--direction--down{color:var(--rt-color-state-danger)}rt-stat-tile .rt-stat-tile__year{flex:0 0 auto;padding:var(--rt-space-0-5) var(--rt-space-2);border-radius:var(--rt-stat-tile-year-radius);background:var(--rt-color-bg-surface-subtle);color:var(--rt-color-text-muted);font-size:var(--rt-text-xs);font-weight:var(--rt-font-weight-semibold);line-height:var(--rt-leading-none);white-space:nowrap}rt-stat-tile .rt-stat-tile__year--direction--up{background:var(--rt-color-state-success-bg);color:var(--rt-color-state-success)}rt-stat-tile .rt-stat-tile__year--direction--down{background:var(--rt-color-state-danger-bg);color:var(--rt-color-state-danger)}rt-stat-tile .rt-stat-tile__baseline{overflow:hidden;margin:0;color:var(--rt-color-text-muted);font-size:var(--rt-text-sm);text-overflow:ellipsis;white-space:nowrap}rt-stat-tile .rt-stat-tile__secondary{overflow:hidden;margin:auto 0 0;color:var(--rt-color-text-muted);font-size:var(--rt-text-xs);text-overflow:ellipsis;white-space:nowrap}}\n"]
|
|
190
|
+
template: "<article rtBlock=\"rt-stat-tile\" qa-dataid=\"stat-tile\" [rtMod]=\"{ 'growth-worse': growthIsWorse() }\">\n <header rtElem=\"head\">\n <span rtElem=\"label\" qa-dataid=\"stat-tile-label\">{{ label() }}</span>\n @if (hint(); as hintText) {\n <rt-icon rtElem=\"hint\" qa-dataid=\"stat-tile-hint\" name=\"info-circle\" size=\"xs\" [attr.title]=\"hintText\" />\n }\n </header>\n\n <div rtElem=\"value-row\">\n <p rtElem=\"value\" qa-dataid=\"stat-tile-value\">{{ value() }}</p>\n\n @if (primaryDelta(); as row) {\n <span\n rtElem=\"delta\"\n qa-dataid=\"stat-tile-delta\"\n [attr.data-direction]=\"row.direction\"\n [rtMod]=\"{ direction: row.direction }\"\n [attr.title]=\"row.label\">\n <rt-icon qa-dataid=\"stat-tile-delta-icon\" size=\"xs\" [name]=\"row.icon\" />\n <span qa-dataid=\"stat-tile-delta-percent\">{{ row.text }}</span>\n </span>\n }\n\n @if (yearDelta(); as row) {\n <span\n rtElem=\"year\"\n qa-dataid=\"stat-tile-year\"\n [attr.data-direction]=\"row.direction\"\n [rtMod]=\"{ direction: row.direction }\"\n [attr.title]=\"row.label\">\n {{ t().uiYearOverYear }} {{ row.text }}\n </span>\n }\n </div>\n\n @if (baselineText(); as text) {\n <p rtElem=\"baseline\" qa-dataid=\"stat-tile-baseline\">{{ text }}</p>\n }\n\n @if (secondary(); as text) {\n <p rtElem=\"secondary\" qa-dataid=\"stat-tile-secondary\">{{ text }}</p>\n }\n</article>\n",
|
|
191
|
+
styles: ["@charset \"UTF-8\";@layer rt-kit.components{rt-stat-tile{display:block}rt-stat-tile .rt-stat-tile{--rt-stat-tile-year-radius: var(--rt-radius-sm);display:flex;height:100%;flex-direction:column;gap:var(--rt-space-2)}rt-stat-tile .rt-stat-tile__head{display:flex;align-items:center;gap:var(--rt-space-1)}rt-stat-tile .rt-stat-tile__label{color:var(--rt-color-text-primary);font-size:var(--rt-text-sm);font-weight:var(--rt-font-weight-semibold)}rt-stat-tile .rt-stat-tile__hint{color:var(--rt-color-text-muted);cursor:help}rt-stat-tile .rt-stat-tile__value-row{display:flex;flex-wrap:wrap;align-items:center;gap:var(--rt-space-4)}rt-stat-tile .rt-stat-tile__value{margin:0;color:var(--rt-color-text-primary);font-size:var(--rt-text-3xl);font-weight:var(--rt-font-weight-bold);line-height:var(--rt-leading-none)}rt-stat-tile .rt-stat-tile__delta{display:inline-flex;align-items:center;color:var(--rt-color-text-muted);font-size:var(--rt-text-md);font-weight:var(--rt-font-weight-bold);gap:var(--rt-space-1);line-height:var(--rt-leading-none)}rt-stat-tile .rt-stat-tile__delta--direction--up{color:var(--rt-color-state-success)}rt-stat-tile .rt-stat-tile__delta--direction--down{color:var(--rt-color-state-danger)}rt-stat-tile .rt-stat-tile__year{flex:0 0 auto;padding:var(--rt-space-0-5) var(--rt-space-2);border-radius:var(--rt-stat-tile-year-radius);background:var(--rt-color-bg-surface-subtle);color:var(--rt-color-text-muted);font-size:var(--rt-text-xs);font-weight:var(--rt-font-weight-semibold);line-height:var(--rt-leading-none);white-space:nowrap}rt-stat-tile .rt-stat-tile__year--direction--up{background:var(--rt-color-state-success-bg);color:var(--rt-color-state-success)}rt-stat-tile .rt-stat-tile__year--direction--down{background:var(--rt-color-state-danger-bg);color:var(--rt-color-state-danger)}rt-stat-tile .rt-stat-tile__baseline{overflow:hidden;margin:0;color:var(--rt-color-text-muted);font-size:var(--rt-text-sm);text-overflow:ellipsis;white-space:nowrap}rt-stat-tile .rt-stat-tile--growth-worse .rt-stat-tile__delta--direction--up{color:var(--rt-color-state-danger)}rt-stat-tile .rt-stat-tile--growth-worse .rt-stat-tile__delta--direction--down{color:var(--rt-color-state-success)}rt-stat-tile .rt-stat-tile--growth-worse .rt-stat-tile__year--direction--up{background:var(--rt-color-state-danger-bg);color:var(--rt-color-state-danger)}rt-stat-tile .rt-stat-tile--growth-worse .rt-stat-tile__year--direction--down{background:var(--rt-color-state-success-bg);color:var(--rt-color-state-success)}rt-stat-tile .rt-stat-tile__secondary{overflow:hidden;margin:auto 0 0;color:var(--rt-color-text-muted);font-size:var(--rt-text-xs);text-overflow:ellipsis;white-space:nowrap}}\n"]
|
|
179
192
|
}]
|
|
180
193
|
}],
|
|
181
194
|
propDecorators: {
|
|
@@ -226,6 +239,14 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
226
239
|
alias: "hint",
|
|
227
240
|
required: false
|
|
228
241
|
}]
|
|
242
|
+
}],
|
|
243
|
+
growthIsWorse: [{
|
|
244
|
+
type: i0.Input,
|
|
245
|
+
args: [{
|
|
246
|
+
isSignal: true,
|
|
247
|
+
alias: "growthIsWorse",
|
|
248
|
+
required: false
|
|
249
|
+
}]
|
|
229
250
|
}]
|
|
230
251
|
}
|
|
231
252
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rt-tools-ui-kit-v2-stat-tile.mjs","names":[],"sources":["../../../projects/ui-kit-v2/src/lib/components/stat-tile/rt-stat-tile.component.ts","../../../projects/ui-kit-v2/src/lib/components/stat-tile/rt-stat-tile.component.html"],"sourcesContent":["import { computed, inject, input, ChangeDetectionStrategy, Component, InputSignal, Signal, ViewEncapsulation } from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RT_KIT_LABELS, TRtKitLabelMap, rtKitLabel } from '@rt-tools/ui-kit-v2/core';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { IRtStatTile } from './rt-stat-tile.model';\n\nconst BEM_BLOCK: string = 'rt-stat-tile';\n\n/** Строка дельты в готовом к рендеру виде — вся ветвистость решена здесь. */\ninterface IDeltaRow {\n key: string;\n label: string;\n text: string;\n baseline: string;\n direction: IRtStatTile.Direction;\n icon: IRtIcon.Name;\n}\n\nconst DIRECTION_ICONS: Readonly<Record<IRtStatTile.Direction, IRtIcon.Name>> = Object.freeze({\n up: 'arrow-up',\n down: 'arrow-down',\n flat: 'minus',\n unknown: 'minus',\n});\n\nfunction directionOf(percent: number | null): IRtStatTile.Direction {\n if (percent === null) {\n return 'unknown';\n }\n if (percent > 0) {\n return 'up';\n }\n return percent < 0 ? 'down' : 'flat';\n}\n\n/**\n * Нулевая база — «—»: «+100 %» от нуля вводит в заблуждение, «∞» нечитаемо.\n * Дробная часть — через запятую, как и остальные проценты в интерфейсе: кит\n * форматирует сам, потому что не может зависеть от логики приложений.\n */\nfunction percentText(percent: number | null): string {\n if (percent === null) {\n return '—';\n }\n const sign: string = percent > 0 ? '+' : '';\n return `${sign}${String(percent).replace('.', ',')} %`;\n}\n\nfunction deltaRow(key: string, delta: IRtStatTile.Delta | null): IDeltaRow | null {\n if (!delta) {\n return null;\n }\n const direction: IRtStatTile.Direction = directionOf(delta.percent);\n return {\n key,\n direction,\n label: delta.label,\n text: percentText(delta.percent),\n baseline: delta.baseline ?? '',\n icon: DIRECTION_ICONS[direction],\n };\n}\n\n/**\n * KPI-плитка: крупное значение, необязательная вторичная строка и до двух строк\n * сравнения (к предыдущему периоду и к прошлому году).\n *\n * Компонент ничего не считает и не форматирует: `value` и `baseline` приходят\n * готовыми строками, `percent` — посчитанным числом. Так плитка не знает ни про\n * валюты, ни про методику метрик и остаётся общей для любого домена.\n *\n * Нулевая база показывается как «—»: «+100 %» от нуля вводит в заблуждение, а\n * «∞» нечитаемо.\n */\n@Component({\n selector: 'rt-stat-tile',\n templateUrl: './rt-stat-tile.component.html',\n styleUrl: './rt-stat-tile.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n RtIconComponent,\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtStatTileComponent {\n /**\n * Значение базы уходит параметром перевода, а не подставляется в готовую\n * строку: Transloco интерполирует `{{value}}` в момент перевода, и к\n * возвращённой строке подставлять уже нечего — от подписи оставалась одна\n * приставка («было», «was»), а само число пропадало.\n */\n readonly #baselineParams: Signal<Record<string, string>> = computed((): Record<string, string> => ({\n value: this.deltaPrimary()?.baseline ?? '',\n }));\n\n readonly #baselineLine: Signal<string> = rtKitLabel('uiBaseline', this.#baselineParams);\n\n /**\n * Дельта к предыдущему периоду — рядом со значением. Пустая база (`percent`\n * = null) не рисуется вовсе: «—» рядом с цифрой читается как поломка, а не\n * как «сравнивать не с чем».\n */\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n protected readonly primaryDelta: Signal<IDeltaRow | null> = computed((): IDeltaRow | null => this.#visibleDelta(this.deltaPrimary()));\n\n /** Годовое сравнение — отдельным компактным чипом, без слов в строке. */\n protected readonly yearDelta: Signal<IDeltaRow | null> = computed((): IDeltaRow | null => this.#visibleDelta(this.deltaSecondary()));\n\n /**\n * База сравнения — короткой строкой «было X» и ничем больше: всё остальное\n * (занятость, состав воронки) живёт во вторичной строке, иначе одна плитка\n * растягивает ряд под самую длинную подпись.\n */\n protected readonly baselineText: Signal<string> = computed((): string => (this.deltaPrimary()?.baseline ? this.#baselineLine() : ''));\n\n /** Подпись метрики. */\n public readonly label: InputSignal<string> = input.required<string>();\n\n /** Уже отформатированное значение — плитка его не преобразует. */\n public readonly value: InputSignal<string> = input.required<string>();\n\n /** Вторичная строка под значением (занятость, доля оценки и т.п.). */\n public readonly secondary: InputSignal<string | null> = input<string | null>(null);\n\n /** Сравнение с предыдущим равным периодом. */\n public readonly deltaPrimary: InputSignal<IRtStatTile.Delta | null> = input<IRtStatTile.Delta | null>(null);\n\n /** Сравнение с тем же периодом год назад. */\n public readonly deltaSecondary: InputSignal<IRtStatTile.Delta | null> = input<IRtStatTile.Delta | null>(null);\n\n /** Пояснение методики — нативный title на иконке подсказки. */\n public readonly hint: InputSignal<string | null> = input<string | null>(null);\n\n #visibleDelta(delta: IRtStatTile.Delta | null): IDeltaRow | null {\n if (!delta || delta.percent === null) {\n return null;\n }\n return deltaRow('primary', delta);\n }\n}\n","<article rtBlock=\"rt-stat-tile\" qa-dataid=\"stat-tile\">\n <header rtElem=\"head\">\n <span rtElem=\"label\" qa-dataid=\"stat-tile-label\">{{ label() }}</span>\n @if (hint(); as hintText) {\n <rt-icon rtElem=\"hint\" qa-dataid=\"stat-tile-hint\" name=\"info-circle\" size=\"xs\" [attr.title]=\"hintText\" />\n }\n </header>\n\n <div rtElem=\"value-row\">\n <p rtElem=\"value\" qa-dataid=\"stat-tile-value\">{{ value() }}</p>\n\n @if (primaryDelta(); as row) {\n <span\n rtElem=\"delta\"\n qa-dataid=\"stat-tile-delta\"\n [attr.data-direction]=\"row.direction\"\n [rtMod]=\"{ direction: row.direction }\"\n [attr.title]=\"row.label\">\n <rt-icon qa-dataid=\"stat-tile-delta-icon\" size=\"xs\" [name]=\"row.icon\" />\n <span qa-dataid=\"stat-tile-delta-percent\">{{ row.text }}</span>\n </span>\n }\n\n @if (yearDelta(); as row) {\n <span\n rtElem=\"year\"\n qa-dataid=\"stat-tile-year\"\n [attr.data-direction]=\"row.direction\"\n [rtMod]=\"{ direction: row.direction }\"\n [attr.title]=\"row.label\">\n {{ t().uiYearOverYear }} {{ row.text }}\n </span>\n }\n </div>\n\n @if (baselineText(); as text) {\n <p rtElem=\"baseline\" qa-dataid=\"stat-tile-baseline\">{{ text }}</p>\n }\n\n @if (secondary(); as text) {\n <p rtElem=\"secondary\" qa-dataid=\"stat-tile-secondary\">{{ text }}</p>\n }\n</article>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rt-tools-ui-kit-v2-stat-tile.mjs","names":[],"sources":["../../../projects/ui-kit-v2/src/lib/components/stat-tile/rt-stat-tile.component.ts","../../../projects/ui-kit-v2/src/lib/components/stat-tile/rt-stat-tile.component.html"],"sourcesContent":["import { BooleanInput } from '@angular/cdk/coercion';\nimport {\n booleanAttribute,\n computed,\n inject,\n input,\n ChangeDetectionStrategy,\n Component,\n InputSignal,\n InputSignalWithTransform,\n Signal,\n ViewEncapsulation,\n} from '@angular/core';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RT_KIT_LABELS, TRtKitLabelMap, rtKitLabel } from '@rt-tools/ui-kit-v2/core';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { IRtStatTile } from './rt-stat-tile.model';\n\nconst BEM_BLOCK: string = 'rt-stat-tile';\n\n/** Строка дельты в готовом к рендеру виде — вся ветвистость решена здесь. */\ninterface IDeltaRow {\n key: string;\n label: string;\n text: string;\n baseline: string;\n direction: IRtStatTile.Direction;\n icon: IRtIcon.Name;\n}\n\nconst DIRECTION_ICONS: Readonly<Record<IRtStatTile.Direction, IRtIcon.Name>> = Object.freeze({\n up: 'arrow-up',\n down: 'arrow-down',\n flat: 'minus',\n unknown: 'minus',\n});\n\nfunction directionOf(percent: number | null): IRtStatTile.Direction {\n if (percent === null) {\n return 'unknown';\n }\n if (percent > 0) {\n return 'up';\n }\n return percent < 0 ? 'down' : 'flat';\n}\n\n/**\n * Число со знаком роста. Дробная часть — через запятую, как и остальные\n * проценты в интерфейсе: кит форматирует сам, потому что не может зависеть от\n * логики приложений.\n */\nfunction signedNumber(value: number): string {\n const sign: string = value > 0 ? '+' : '';\n return `${sign}${String(value).replace('.', ',')}`;\n}\n\n/**\n * Строка изменения с известной базой. Пункты пишутся переведённой подписью\n * («+10 п.п.», «+10 pp») — её текст приходит готовым, проценты кит дописывает сам.\n */\nfunction deltaRow(key: string, delta: IRtStatTile.Delta, percent: number, pointsText: string): IDeltaRow {\n const direction: IRtStatTile.Direction = directionOf(percent);\n return {\n key,\n direction,\n label: delta.label,\n text: delta.unit === 'points' ? pointsText : `${signedNumber(percent)} %`,\n baseline: delta.baseline ?? '',\n icon: DIRECTION_ICONS[direction],\n };\n}\n\n/**\n * KPI-плитка: крупное значение, необязательная вторичная строка и до двух строк\n * сравнения (к предыдущему периоду и к прошлому году).\n *\n * Компонент ничего не считает и не форматирует: `value` и `baseline` приходят\n * готовыми строками, `percent` — посчитанным числом. Так плитка не знает ни про\n * валюты, ни про методику метрик и остаётся общей для любого домена.\n *\n * Строка с неизвестной базой не рисуется: «+100 %» от нуля вводит в\n * заблуждение, а «—» рядом с цифрой читается как поломка.\n *\n * Цвет строки говорит, хорошо изменение или плохо, а стрелка — только знак\n * числа: у метрики, где рост хуже (отмены, потерянная выручка), рост красный и\n * со стрелкой вверх.\n */\n@Component({\n selector: 'rt-stat-tile',\n templateUrl: './rt-stat-tile.component.html',\n styleUrl: './rt-stat-tile.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // standalone components / directives\n RtIconComponent,\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n host: {\n class: BEM_BLOCK,\n },\n})\nexport class RtStatTileComponent {\n /**\n * Значение базы уходит параметром перевода, а не подставляется в готовую\n * строку: Transloco интерполирует `{{value}}` в момент перевода, и к\n * возвращённой строке подставлять уже нечего — от подписи оставалась одна\n * приставка («было», «was»), а само число пропадало.\n */\n readonly #baselineParams: Signal<Record<string, string>> = computed((): Record<string, string> => ({\n value: this.deltaPrimary()?.baseline ?? '',\n }));\n\n readonly #baselineLine: Signal<string> = rtKitLabel('uiBaseline', this.#baselineParams);\n\n /** Пункты — тоже параметром подписи: порядок числа и единицы знает язык, а не кит. */\n readonly #primaryPoints: Signal<string> = rtKitLabel(\n 'uiPercentagePoints',\n computed((): Record<string, string> => ({ value: signedNumber(this.deltaPrimary()?.percent ?? 0) }))\n );\n\n readonly #yearPoints: Signal<string> = rtKitLabel(\n 'uiPercentagePoints',\n computed((): Record<string, string> => ({ value: signedNumber(this.deltaSecondary()?.percent ?? 0) }))\n );\n\n /** Подписи кита для шаблона — приставка годового чипа. */\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n /**\n * Дельта к предыдущему периоду — рядом со значением. Пустая база (`percent`\n * = null) не рисуется вовсе: «—» рядом с цифрой читается как поломка, а не\n * как «сравнивать не с чем».\n */\n protected readonly primaryDelta: Signal<IDeltaRow | null> = computed((): IDeltaRow | null =>\n this.#visibleDelta('primary', this.deltaPrimary(), this.#primaryPoints())\n );\n\n /** Годовое сравнение — отдельным компактным чипом, без слов в строке. */\n protected readonly yearDelta: Signal<IDeltaRow | null> = computed((): IDeltaRow | null =>\n this.#visibleDelta('year', this.deltaSecondary(), this.#yearPoints())\n );\n\n /**\n * База сравнения — короткой строкой «было X» и ничем больше: всё остальное\n * (занятость, состав воронки) живёт во вторичной строке, иначе одна плитка\n * растягивает ряд под самую длинную подпись.\n */\n protected readonly baselineText: Signal<string> = computed((): string => (this.deltaPrimary()?.baseline ? this.#baselineLine() : ''));\n\n /** Подпись метрики. */\n public readonly label: InputSignal<string> = input.required<string>();\n\n /** Уже отформатированное значение — плитка его не преобразует. */\n public readonly value: InputSignal<string> = input.required<string>();\n\n /** Вторичная строка под значением (занятость, доля оценки и т.п.). */\n public readonly secondary: InputSignal<string | null> = input<string | null>(null);\n\n /** Сравнение с предыдущим равным периодом. */\n public readonly deltaPrimary: InputSignal<IRtStatTile.Delta | null> = input<IRtStatTile.Delta | null>(null);\n\n /** Сравнение с тем же периодом год назад. */\n public readonly deltaSecondary: InputSignal<IRtStatTile.Delta | null> = input<IRtStatTile.Delta | null>(null);\n\n /** Пояснение методики — нативный title на иконке подсказки. */\n public readonly hint: InputSignal<string | null> = input<string | null>(null);\n\n /**\n * Рост метрики плох для владельца (отмены, потерянная выручка): рост обеих\n * строк красный, падение зелёное. Стрелка по-прежнему показывает знак числа.\n */\n public readonly growthIsWorse: InputSignalWithTransform<boolean, BooleanInput> = input<boolean, BooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n #visibleDelta(key: string, delta: IRtStatTile.Delta | null, pointsText: string): IDeltaRow | null {\n if (!delta || delta.percent === null) {\n return null;\n }\n return deltaRow(key, delta, delta.percent, pointsText);\n }\n}\n","<article rtBlock=\"rt-stat-tile\" qa-dataid=\"stat-tile\" [rtMod]=\"{ 'growth-worse': growthIsWorse() }\">\n <header rtElem=\"head\">\n <span rtElem=\"label\" qa-dataid=\"stat-tile-label\">{{ label() }}</span>\n @if (hint(); as hintText) {\n <rt-icon rtElem=\"hint\" qa-dataid=\"stat-tile-hint\" name=\"info-circle\" size=\"xs\" [attr.title]=\"hintText\" />\n }\n </header>\n\n <div rtElem=\"value-row\">\n <p rtElem=\"value\" qa-dataid=\"stat-tile-value\">{{ value() }}</p>\n\n @if (primaryDelta(); as row) {\n <span\n rtElem=\"delta\"\n qa-dataid=\"stat-tile-delta\"\n [attr.data-direction]=\"row.direction\"\n [rtMod]=\"{ direction: row.direction }\"\n [attr.title]=\"row.label\">\n <rt-icon qa-dataid=\"stat-tile-delta-icon\" size=\"xs\" [name]=\"row.icon\" />\n <span qa-dataid=\"stat-tile-delta-percent\">{{ row.text }}</span>\n </span>\n }\n\n @if (yearDelta(); as row) {\n <span\n rtElem=\"year\"\n qa-dataid=\"stat-tile-year\"\n [attr.data-direction]=\"row.direction\"\n [rtMod]=\"{ direction: row.direction }\"\n [attr.title]=\"row.label\">\n {{ t().uiYearOverYear }} {{ row.text }}\n </span>\n }\n </div>\n\n @if (baselineText(); as text) {\n <p rtElem=\"baseline\" qa-dataid=\"stat-tile-baseline\">{{ text }}</p>\n }\n\n @if (secondary(); as text) {\n <p rtElem=\"secondary\" qa-dataid=\"stat-tile-secondary\">{{ text }}</p>\n }\n</article>\n"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Clipboard } from "@angular/cdk/clipboard";
|
|
2
2
|
import * as i0 from "@angular/core";
|
|
3
|
-
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, DestroyRef, Directive, ElementRef, Injectable, Pipe, TemplateRef, ViewChild, ViewEncapsulation, booleanAttribute, computed, contentChild, contentChildren, effect, forwardRef, inject, input, linkedSignal, model, numberAttribute, output, signal, untracked, viewChild } from "@angular/core";
|
|
4
|
-
import { BlockDirective, ElemDirective, IDBStorageService, ModDirective } from "@rt-tools/core";
|
|
3
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, DestroyRef, Directive, ElementRef, Injectable, Injector, Pipe, TemplateRef, ViewChild, ViewEncapsulation, afterNextRender, booleanAttribute, computed, contentChild, contentChildren, effect, forwardRef, inject, input, linkedSignal, model, numberAttribute, output, signal, untracked, viewChild } from "@angular/core";
|
|
4
|
+
import { BlockDirective, ElemDirective, IDBStorageService, ModDirective, WINDOW } from "@rt-tools/core";
|
|
5
5
|
import { BreakpointsService, ERtStorageKeys, RT_KIT_LABELS, rtKitLabel } from "@rt-tools/ui-kit-v2/core";
|
|
6
6
|
import { RtIconButtonComponent } from "@rt-tools/ui-kit-v2/icon-button";
|
|
7
7
|
import { RtTooltipDirective } from "@rt-tools/ui-kit-v2/tooltip";
|
|
@@ -620,7 +620,9 @@ var RtTableFilterHeaderComponent = class RtTableFilterHeaderComponent {
|
|
|
620
620
|
"max",
|
|
621
621
|
"minFractionDigits",
|
|
622
622
|
"maxFractionDigits",
|
|
623
|
-
"grouped"
|
|
623
|
+
"grouped",
|
|
624
|
+
"step",
|
|
625
|
+
"stepper"
|
|
624
626
|
]
|
|
625
627
|
},
|
|
626
628
|
{
|
|
@@ -1165,6 +1167,70 @@ var RtTableColumnSettings = class {
|
|
|
1165
1167
|
if (tableId !== null) this.#persistence.save(tableId, settings);
|
|
1166
1168
|
}
|
|
1167
1169
|
};
|
|
1170
|
+
const EDGE_TOLERANCE = 1;
|
|
1171
|
+
function hiddenEdges(scrollLeft, scrollWidth, clientWidth) {
|
|
1172
|
+
const offset = Math.abs(scrollLeft);
|
|
1173
|
+
return {
|
|
1174
|
+
start: offset > EDGE_TOLERANCE,
|
|
1175
|
+
end: offset + clientWidth < scrollWidth - EDGE_TOLERANCE
|
|
1176
|
+
};
|
|
1177
|
+
}
|
|
1178
|
+
function horizontalScrollParentOf(element, view) {
|
|
1179
|
+
let node = element.parentElement;
|
|
1180
|
+
while (node) {
|
|
1181
|
+
const overflowX = view.getComputedStyle(node).overflowX;
|
|
1182
|
+
if (overflowX === "auto" || overflowX === "scroll") return node;
|
|
1183
|
+
node = node.parentElement;
|
|
1184
|
+
}
|
|
1185
|
+
return null;
|
|
1186
|
+
}
|
|
1187
|
+
var RtTablePinnedEdges = class {
|
|
1188
|
+
#changed;
|
|
1189
|
+
#container = null;
|
|
1190
|
+
#observer = null;
|
|
1191
|
+
#scrollWidth = 0;
|
|
1192
|
+
#clientWidth = 0;
|
|
1193
|
+
#onScroll = () => this.#report();
|
|
1194
|
+
#onResize = () => {
|
|
1195
|
+
this.#measure();
|
|
1196
|
+
this.#report();
|
|
1197
|
+
};
|
|
1198
|
+
constructor(changed) {
|
|
1199
|
+
this.#changed = changed;
|
|
1200
|
+
}
|
|
1201
|
+
watch(table, view) {
|
|
1202
|
+
this.stop();
|
|
1203
|
+
const container = horizontalScrollParentOf(table, view);
|
|
1204
|
+
if (!container) return;
|
|
1205
|
+
this.#container = container;
|
|
1206
|
+
const resizable = typeof ResizeObserver !== "undefined";
|
|
1207
|
+
container.addEventListener("scroll", resizable ? this.#onScroll : this.#onResize, { passive: true });
|
|
1208
|
+
if (resizable) {
|
|
1209
|
+
this.#observer = new ResizeObserver(this.#onResize);
|
|
1210
|
+
this.#observer.observe(container);
|
|
1211
|
+
this.#observer.observe(table);
|
|
1212
|
+
}
|
|
1213
|
+
this.#onResize();
|
|
1214
|
+
}
|
|
1215
|
+
stop() {
|
|
1216
|
+
this.#container?.removeEventListener("scroll", this.#onScroll);
|
|
1217
|
+
this.#container?.removeEventListener("scroll", this.#onResize);
|
|
1218
|
+
this.#observer?.disconnect();
|
|
1219
|
+
this.#container = null;
|
|
1220
|
+
this.#observer = null;
|
|
1221
|
+
}
|
|
1222
|
+
#measure() {
|
|
1223
|
+
const container = this.#container;
|
|
1224
|
+
if (container) {
|
|
1225
|
+
this.#scrollWidth = container.scrollWidth;
|
|
1226
|
+
this.#clientWidth = container.clientWidth;
|
|
1227
|
+
}
|
|
1228
|
+
}
|
|
1229
|
+
#report() {
|
|
1230
|
+
const container = this.#container;
|
|
1231
|
+
if (container) this.#changed(hiddenEdges(container.scrollLeft, this.#scrollWidth, this.#clientWidth));
|
|
1232
|
+
}
|
|
1233
|
+
};
|
|
1168
1234
|
const BEM_BLOCK$3 = "rt-table";
|
|
1169
1235
|
const DEFAULT_SKELETON_ROWS = 5;
|
|
1170
1236
|
const DEFAULT_EMPTY_KEY = "uiNoRows";
|
|
@@ -1174,10 +1240,22 @@ var RtTableComponent = class RtTableComponent extends CdkTable {
|
|
|
1174
1240
|
this.#t_uiNoRows = rtKitLabel(DEFAULT_EMPTY_KEY);
|
|
1175
1241
|
this.#destroyRef = inject(DestroyRef);
|
|
1176
1242
|
this.#breakpoints = inject(BreakpointsService);
|
|
1243
|
+
this.#injector = inject(Injector);
|
|
1244
|
+
this.#host = inject(ElementRef).nativeElement;
|
|
1245
|
+
this.#window = inject(WINDOW);
|
|
1177
1246
|
this.#dataSourceVersion = signal(0, ...ngDevMode ? [{ debugName: "#dataSourceVersion" }] : /* istanbul ignore next */ []);
|
|
1247
|
+
this.#hiddenEdges = signal({
|
|
1248
|
+
start: false,
|
|
1249
|
+
end: false
|
|
1250
|
+
}, {
|
|
1251
|
+
...ngDevMode ? { debugName: "#hiddenEdges" } : /* istanbul ignore next */ {},
|
|
1252
|
+
equal: (a, b) => a.start === b.start && a.end === b.end
|
|
1253
|
+
});
|
|
1254
|
+
this.#pinnedEdges = new RtTablePinnedEdges((edges) => this.#hiddenEdges.set(edges));
|
|
1178
1255
|
this.#sort = linkedSignal(() => this.sort(), ...ngDevMode ? [{ debugName: "#sort" }] : /* istanbul ignore next */ []);
|
|
1179
1256
|
this.#columnSettings = new RtTableColumnSettings(() => this.columnsConfig(), () => this.tableId());
|
|
1180
1257
|
this.hostRole = inject(ElementRef).nativeElement.tagName === "RT-TABLE" ? "table" : null;
|
|
1258
|
+
this.hiddenEdges = this.#hiddenEdges.asReadonly();
|
|
1181
1259
|
this.isInitialLoading = computed(() => this.loading() && this.#hasData() === false, ...ngDevMode ? [{ debugName: "isInitialLoading" }] : /* istanbul ignore next */ []);
|
|
1182
1260
|
this.isEmpty = computed(() => !this.loading() && !this.fetching() && this.#hasData() === false, ...ngDevMode ? [{ debugName: "isEmpty" }] : /* istanbul ignore next */ []);
|
|
1183
1261
|
this.skeletonRowIndexes = computed(() => Array.from({ length: this.skeletonRows() }, (_, i) => i), ...ngDevMode ? [{ debugName: "skeletonRowIndexes" }] : /* istanbul ignore next */ []);
|
|
@@ -1249,7 +1327,12 @@ var RtTableComponent = class RtTableComponent extends CdkTable {
|
|
|
1249
1327
|
#t_uiNoRows;
|
|
1250
1328
|
#destroyRef;
|
|
1251
1329
|
#breakpoints;
|
|
1330
|
+
#injector;
|
|
1331
|
+
#host;
|
|
1332
|
+
#window;
|
|
1252
1333
|
#dataSourceVersion;
|
|
1334
|
+
#hiddenEdges;
|
|
1335
|
+
#pinnedEdges;
|
|
1253
1336
|
#sort;
|
|
1254
1337
|
#columnSettings;
|
|
1255
1338
|
ngOnInit() {
|
|
@@ -1260,11 +1343,13 @@ var RtTableComponent = class RtTableComponent extends CdkTable {
|
|
|
1260
1343
|
this.addColumnDef(this.actionsColumnDef);
|
|
1261
1344
|
}
|
|
1262
1345
|
this.#columnSettings.start();
|
|
1346
|
+
afterNextRender(() => this.#pinnedEdges.watch(this.#host, this.#window), { injector: this.#injector });
|
|
1263
1347
|
this.#columnSettings.saved().pipe(takeUntilDestroyed(this.#destroyRef)).subscribe((settings) => this.applyColumnSettings(settings));
|
|
1264
1348
|
}
|
|
1265
1349
|
ngOnDestroy() {
|
|
1266
1350
|
if (this.actionsColumnDef !== void 0) this.removeColumnDef(this.actionsColumnDef);
|
|
1267
1351
|
this.#columnSettings.stop();
|
|
1352
|
+
this.#pinnedEdges.stop();
|
|
1268
1353
|
super.ngOnDestroy();
|
|
1269
1354
|
}
|
|
1270
1355
|
toggleSort(propertyName) {
|
|
@@ -1446,6 +1531,8 @@ var RtTableComponent = class RtTableComponent extends CdkTable {
|
|
|
1446
1531
|
"class.rt-table--fetching": "fetching()",
|
|
1447
1532
|
"class.rt-table--empty": "isEmpty()",
|
|
1448
1533
|
"class.rt-table--cards": "showCards()",
|
|
1534
|
+
"class.rt-table--hidden-start": "hiddenEdges().start",
|
|
1535
|
+
"class.rt-table--hidden-end": "hiddenEdges().end",
|
|
1449
1536
|
"attr.role": "hostRole",
|
|
1450
1537
|
"attr.aria-label": "ariaLabel()",
|
|
1451
1538
|
"attr.aria-busy": "isInitialLoading() || fetching() ? 'true' : null"
|
|
@@ -1517,7 +1604,7 @@ var RtTableComponent = class RtTableComponent extends CdkTable {
|
|
|
1517
1604
|
}],
|
|
1518
1605
|
ngImport: i0,
|
|
1519
1606
|
template: "<ng-container rtBlock=\"rt-table\">\n <ng-content select=\"caption\" />\n <ng-content select=\"colgroup, col\" />\n\n <ng-container cdkColumnDef=\"rtRowActions\">\n <th *cdkHeaderCellDef rtElem=\"actions-header\" cdk-header-cell aria-hidden=\"true\"></th>\n <td *cdkCellDef=\"let row\" rtElem=\"actions-cell\" qa-dataid=\"table-row-actions\" cdk-cell>\n @if (rowActions()?.template; as tpl) {\n @if (row | rtRowHasActions: rowHasActions()) {\n <div rtElem=\"actions-float\">\n <rt-menu>\n <ng-container [ngTemplateOutlet]=\"tpl\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n </rt-menu>\n </div>\n }\n }\n </td>\n </ng-container>\n\n <ng-container headerRowOutlet />\n\n @if (showFilters()) {\n <tr rtElem=\"filter-row\" qa-dataid=\"table-filter-row\">\n @for (cell of filterCells(); track cell.key) {\n <th\n rtElem=\"filter-cell\"\n qa-dataid=\"table-filter-cell\"\n [rtMod]=\"{ actions: cell.actions }\"\n [attr.aria-hidden]=\"cell.actions || null\">\n @if (cell.filter) {\n <rt-table-filter-header\n [propertyName]=\"cell.key\"\n [filter]=\"cell.filter\"\n [filters]=\"filters()\"\n (filtersChange)=\"reportFilters($event)\" />\n }\n </th>\n }\n </tr>\n }\n\n @if (isInitialLoading()) {\n @for (i of skeletonRowIndexes(); track i) {\n <tr rtElem=\"skeleton-row\" qa-dataid=\"table-skeleton-row\">\n @for (col of displayedColumns(); track col) {\n <td rtElem=\"skeleton-cell\">\n <rt-skeleton rtElem=\"skeleton-bar\" />\n </td>\n }\n </tr>\n }\n }\n\n <ng-container rowOutlet />\n <ng-container noDataRowOutlet />\n <ng-container footerRowOutlet />\n\n @if (isEmpty()) {\n <tr rtElem=\"empty-row\" qa-dataid=\"table-empty-row\">\n <td rtElem=\"empty\" [attr.colspan]=\"displayedColumns().length || null\">\n @if (emptyTemplate(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n <rt-empty-state\n rtElem=\"empty-message\"\n qa-dataid=\"table-empty\"\n [icon]=\"emptyIcon()\"\n [title]=\"emptyText()\"\n [description]=\"emptyDescription()\" />\n }\n </td>\n </tr>\n }\n\n @if (showCards()) {\n <div rtElem=\"cards\" qa-dataid=\"table-cards\" role=\"list\">\n @if (isInitialLoading()) {\n @for (i of skeletonRowIndexes(); track i) {\n <article rtElem=\"card\" qa-dataid=\"table-skeleton-card\" [rtMod]=\"{ skeleton: true }\">\n <rt-skeleton rtElem=\"card-skeleton-bar\" />\n <rt-skeleton rtElem=\"card-skeleton-bar\" />\n </article>\n }\n } @else if (isEmpty()) {\n @if (emptyTemplate(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n <rt-empty-state\n rtElem=\"empty-message\"\n qa-dataid=\"table-empty\"\n [icon]=\"emptyIcon()\"\n [title]=\"emptyText()\"\n [description]=\"emptyDescription()\" />\n }\n } @else {\n @for (row of cardRows(); track row; let index = $index) {\n <article\n rtElem=\"card\"\n qa-dataid=\"table-card\"\n role=\"listitem\"\n [rtTableCardActivation]=\"index\"\n [rtTableCardActivationEnabled]=\"clickable()\">\n @if (cardTemplate()?.template; as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n } @else {\n @for (col of cardColumns(); track col.key) {\n <div rtElem=\"card-field\" qa-dataid=\"table-card-field\" [attr.data-key]=\"col.key\">\n <span rtElem=\"card-label\" qa-dataid=\"table-card-label\">{{ col.label }}</span>\n <div rtElem=\"card-value\" qa-dataid=\"table-card-value\">\n <ng-container [ngTemplateOutlet]=\"col.cell\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n </div>\n </div>\n }\n @if (rowActions()?.template; as tpl) {\n @if (row | rtRowHasActions: rowHasActions()) {\n <div rtElem=\"card-actions\" qa-dataid=\"table-card-actions\">\n <rt-menu>\n <ng-container [ngTemplateOutlet]=\"tpl\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n </rt-menu>\n </div>\n }\n }\n }\n </article>\n }\n }\n </div>\n }\n</ng-container>\n",
|
|
1520
|
-
styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-table{--rt-table-border-width: var(--rt-border-width-thin);--rt-table-card-radius: var(--rt-radius-md);position:relative;display:table;width:100%;background:var(--rt-color-bg
|
|
1607
|
+
styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-table{--rt-table-border-width: var(--rt-border-width-thin);--rt-table-card-radius: var(--rt-radius-md);--rt-table-row-bg: transparent;--rt-table-pinned-bg: var(--rt-color-table-bg);--rt-table-pinned-shadow-color: var(--rt-color-table-pinned-shadow);--rt-table-pinned-shadow-width: 12px;position:relative;display:table;width:100%;background:var(--rt-color-table-bg);border-collapse:collapse;color:var(--rt-color-text-primary)}.rt-table .cdk-header-row,.rt-table .cdk-row,.rt-table__skeleton-row{height:50px}.rt-table .cdk-header-cell,.rt-table .cdk-cell,.rt-table__filter-cell,.rt-table__skeleton-cell{position:relative;padding:var(--rt-space-2) var(--rt-space-5);border-bottom:var(--rt-table-border-width) solid var(--rt-color-border-subtle);border-left:var(--rt-table-border-width) solid var(--rt-color-border-subtle);font-size:var(--rt-text-sm);font-weight:var(--rt-font-weight-medium);text-align:start;vertical-align:middle}.rt-table .cdk-header-cell[data-align=right],.rt-table .cdk-cell[data-align=right],.rt-table__filter-cell[data-align=right],.rt-table__skeleton-cell[data-align=right],.rt-table .cdk-header-cell[data-align=right] input,.rt-table .cdk-cell[data-align=right] input,.rt-table__filter-cell[data-align=right] input,.rt-table__skeleton-cell[data-align=right] input{text-align:right}.rt-table .cdk-header-cell:first-child,.rt-table .cdk-cell:first-child,.rt-table__filter-cell:first-child,.rt-table__skeleton-cell:first-child{border-left:none}.rt-table .cdk-header-cell{border-top:var(--rt-table-border-width) solid var(--rt-color-border-subtle);background:var(--rt-color-table-bg);color:var(--rt-color-text-muted)}.rt-table .cdk-cell{color:var(--rt-color-text-primary);overflow-wrap:anywhere}.rt-table__filter-row{display:table-row}.rt-table__filter-cell{height:auto;background:var(--rt-color-bg-surface);padding-block:var(--rt-space-1);vertical-align:middle}.rt-table__filter-cell--actions,.rt-table__actions-header.cdk-header-cell{width:0;padding:0;border:none}.rt-table__actions-cell.cdk-cell{position:sticky;z-index:1;right:0;width:0;padding:0;border:none;background:transparent}.rt-table__actions-float{position:absolute;display:flex;height:100%;align-items:center;padding:0 var(--rt-space-2) 0 var(--rt-space-8);background:linear-gradient(to right,transparent 0%,var(--rt-color-bg-hover) 45%);inset:0 0 0 auto;pointer-events:none}.rt-table__actions-float .rt-menu{pointer-events:auto}@media(hover:hover){.rt-table__actions-cell.cdk-cell{visibility:hidden}.cdk-row:hover .rt-table__actions-cell.cdk-cell,.cdk-row:focus-within .rt-table__actions-cell.cdk-cell,.rt-table__actions-cell.cdk-cell:has(.rt-menu--open){visibility:visible}}.rt-table .cdk-row,.rt-table .cdk-footer-row{background:var(--rt-table-row-bg)}.rt-table .cdk-row:hover{--rt-table-row-bg: var(--rt-color-bg-hover)}.rt-table .cdk-row.rt-table__row--danger,.rt-table .cdk-row.rt-table__row--danger:hover{--rt-table-row-bg: var(--rt-color-state-danger-bg)}.rt-table .cdk-cell.cdk-table-sticky,.rt-table .cdk-footer-cell.cdk-table-sticky{background:linear-gradient(var(--rt-table-row-bg),var(--rt-table-row-bg)),var(--rt-table-pinned-bg)}.rt-table .cdk-table-sticky-border-elem-left:after,.rt-table .cdk-table-sticky-border-elem-right:after{position:absolute;top:0;bottom:0;width:var(--rt-table-pinned-shadow-width);pointer-events:none}.rt-table .cdk-table-sticky-border-elem-left:after{left:100%;background:linear-gradient(to right,var(--rt-table-pinned-shadow-color),transparent)}.rt-table .cdk-table-sticky-border-elem-right:after{right:100%;background:linear-gradient(to left,var(--rt-table-pinned-shadow-color),transparent)}.rt-table--hidden-start:dir(ltr) .cdk-table-sticky-border-elem-left:after,.rt-table--hidden-end:dir(ltr) .cdk-table-sticky-border-elem-right:after,.rt-table--hidden-start:dir(rtl) .cdk-table-sticky-border-elem-right:after,.rt-table--hidden-end:dir(rtl) .cdk-table-sticky-border-elem-left:after{content:\"\"}.rt-table--clickable .cdk-row,.rt-table--clickable .rt-table__card{cursor:pointer}.rt-table--clickable .cdk-row:focus-visible,.rt-table--clickable .rt-table__card:focus-visible{outline:2px solid var(--rt-color-action-primary);outline-offset:-2px}.rt-table a{text-decoration:none}.rt-table--density--compact .cdk-header-row,.rt-table--density--compact .cdk-row,.rt-table--density--compact .rt-table__skeleton-row{height:36px}.rt-table--density--compact .cdk-header-cell,.rt-table--density--compact .cdk-cell,.rt-table--density--compact .rt-table__skeleton-cell{padding:var(--rt-space-xs) var(--rt-space-sm)}.rt-table__skeleton-bar{display:block;width:80%;height:14px}.rt-table__empty-row{display:table-row}.rt-table__empty{padding:var(--rt-space-6) var(--rt-space-5);border-bottom:var(--rt-table-border-width) solid var(--rt-color-border-subtle);background:var(--rt-color-table-bg);color:var(--rt-color-text-muted);text-align:center}.rt-table__empty-message{margin:0;font-size:var(--rt-text-sm)}.rt-table__overlay{position:absolute;z-index:1;display:grid;min-height:100%;inset:0;place-items:center;pointer-events:none}.rt-table__overlay-backdrop{position:absolute;background:var(--rt-color-table-bg);inset:0;opacity:.72}.rt-table__overlay-spinner{position:sticky;z-index:1;top:50%;display:flex;align-items:center;justify-content:center;transform:translateY(-50%)}.rt-table__cards{display:none}.rt-table--cards{display:block;min-width:0;max-width:100%}.rt-table--cards .cdk-header-row,.rt-table--cards .cdk-row,.rt-table--cards .rt-table__skeleton-row,.rt-table--cards .rt-table__empty-row,.rt-table--cards .rt-table__filter-row{display:none}.rt-table--cards .rt-table__cards{display:flex;flex-direction:column;gap:var(--rt-space-sm)}.rt-table--cards:not(.rt-table--empty){background:transparent}.rt-table__card{display:flex;flex-direction:column;padding:var(--rt-space-md);border:var(--rt-table-border-width) solid var(--rt-color-border-default);border-radius:var(--rt-table-card-radius);background:var(--rt-color-bg-surface);gap:var(--rt-space-xs)}.rt-table__card-field{display:flex;align-items:baseline;justify-content:space-between;gap:var(--rt-space-md)}.rt-table__card-label{flex:0 0 auto;color:var(--rt-color-text-muted);font-size:var(--rt-text-sm)}.rt-table__card-value{min-width:0;overflow-wrap:anywhere;text-align:right}.rt-table__card-value .cdk-cell{display:inline;height:auto;padding:0;border:none;font:inherit;min-inline-size:0;text-align:inherit}.rt-table__card-actions{display:flex;justify-content:flex-end}.rt-table__card-skeleton-bar{display:block;width:60%;height:14px}.rt-table__card-skeleton-bar:first-child{width:80%}.rt-table[data-rt-radius=none]{--rt-table-card-radius: var(--rt-radius-none)}.rt-table[data-rt-radius=xs]{--rt-table-card-radius: var(--rt-radius-xs)}.rt-table[data-rt-radius=sm]{--rt-table-card-radius: var(--rt-radius-sm)}.rt-table[data-rt-radius=ms]{--rt-table-card-radius: var(--rt-radius-ms)}.rt-table[data-rt-radius=md]{--rt-table-card-radius: var(--rt-radius-md)}.rt-table[data-rt-radius=lg]{--rt-table-card-radius: var(--rt-radius-lg)}.rt-table[data-rt-radius=xl]{--rt-table-card-radius: var(--rt-radius-xl)}.rt-table[data-rt-radius=\"2xl\"]{--rt-table-card-radius: var(--rt-radius-2xl)}.rt-table[data-rt-radius=full]{--rt-table-card-radius: var(--rt-radius-full)}}\n"],
|
|
1521
1608
|
dependencies: [
|
|
1522
1609
|
{
|
|
1523
1610
|
kind: "directive",
|
|
@@ -1713,12 +1800,14 @@ i0.ɵɵngDeclareClassMetadata({
|
|
|
1713
1800
|
"[class.rt-table--fetching]": "fetching()",
|
|
1714
1801
|
"[class.rt-table--empty]": "isEmpty()",
|
|
1715
1802
|
"[class.rt-table--cards]": "showCards()",
|
|
1803
|
+
"[class.rt-table--hidden-start]": "hiddenEdges().start",
|
|
1804
|
+
"[class.rt-table--hidden-end]": "hiddenEdges().end",
|
|
1716
1805
|
"[attr.role]": "hostRole",
|
|
1717
1806
|
"[attr.aria-label]": "ariaLabel()",
|
|
1718
1807
|
"[attr.aria-busy]": "isInitialLoading() || fetching() ? 'true' : null"
|
|
1719
1808
|
},
|
|
1720
1809
|
template: "<ng-container rtBlock=\"rt-table\">\n <ng-content select=\"caption\" />\n <ng-content select=\"colgroup, col\" />\n\n <ng-container cdkColumnDef=\"rtRowActions\">\n <th *cdkHeaderCellDef rtElem=\"actions-header\" cdk-header-cell aria-hidden=\"true\"></th>\n <td *cdkCellDef=\"let row\" rtElem=\"actions-cell\" qa-dataid=\"table-row-actions\" cdk-cell>\n @if (rowActions()?.template; as tpl) {\n @if (row | rtRowHasActions: rowHasActions()) {\n <div rtElem=\"actions-float\">\n <rt-menu>\n <ng-container [ngTemplateOutlet]=\"tpl\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n </rt-menu>\n </div>\n }\n }\n </td>\n </ng-container>\n\n <ng-container headerRowOutlet />\n\n @if (showFilters()) {\n <tr rtElem=\"filter-row\" qa-dataid=\"table-filter-row\">\n @for (cell of filterCells(); track cell.key) {\n <th\n rtElem=\"filter-cell\"\n qa-dataid=\"table-filter-cell\"\n [rtMod]=\"{ actions: cell.actions }\"\n [attr.aria-hidden]=\"cell.actions || null\">\n @if (cell.filter) {\n <rt-table-filter-header\n [propertyName]=\"cell.key\"\n [filter]=\"cell.filter\"\n [filters]=\"filters()\"\n (filtersChange)=\"reportFilters($event)\" />\n }\n </th>\n }\n </tr>\n }\n\n @if (isInitialLoading()) {\n @for (i of skeletonRowIndexes(); track i) {\n <tr rtElem=\"skeleton-row\" qa-dataid=\"table-skeleton-row\">\n @for (col of displayedColumns(); track col) {\n <td rtElem=\"skeleton-cell\">\n <rt-skeleton rtElem=\"skeleton-bar\" />\n </td>\n }\n </tr>\n }\n }\n\n <ng-container rowOutlet />\n <ng-container noDataRowOutlet />\n <ng-container footerRowOutlet />\n\n @if (isEmpty()) {\n <tr rtElem=\"empty-row\" qa-dataid=\"table-empty-row\">\n <td rtElem=\"empty\" [attr.colspan]=\"displayedColumns().length || null\">\n @if (emptyTemplate(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n <rt-empty-state\n rtElem=\"empty-message\"\n qa-dataid=\"table-empty\"\n [icon]=\"emptyIcon()\"\n [title]=\"emptyText()\"\n [description]=\"emptyDescription()\" />\n }\n </td>\n </tr>\n }\n\n @if (showCards()) {\n <div rtElem=\"cards\" qa-dataid=\"table-cards\" role=\"list\">\n @if (isInitialLoading()) {\n @for (i of skeletonRowIndexes(); track i) {\n <article rtElem=\"card\" qa-dataid=\"table-skeleton-card\" [rtMod]=\"{ skeleton: true }\">\n <rt-skeleton rtElem=\"card-skeleton-bar\" />\n <rt-skeleton rtElem=\"card-skeleton-bar\" />\n </article>\n }\n } @else if (isEmpty()) {\n @if (emptyTemplate(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" />\n } @else {\n <rt-empty-state\n rtElem=\"empty-message\"\n qa-dataid=\"table-empty\"\n [icon]=\"emptyIcon()\"\n [title]=\"emptyText()\"\n [description]=\"emptyDescription()\" />\n }\n } @else {\n @for (row of cardRows(); track row; let index = $index) {\n <article\n rtElem=\"card\"\n qa-dataid=\"table-card\"\n role=\"listitem\"\n [rtTableCardActivation]=\"index\"\n [rtTableCardActivationEnabled]=\"clickable()\">\n @if (cardTemplate()?.template; as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n } @else {\n @for (col of cardColumns(); track col.key) {\n <div rtElem=\"card-field\" qa-dataid=\"table-card-field\" [attr.data-key]=\"col.key\">\n <span rtElem=\"card-label\" qa-dataid=\"table-card-label\">{{ col.label }}</span>\n <div rtElem=\"card-value\" qa-dataid=\"table-card-value\">\n <ng-container [ngTemplateOutlet]=\"col.cell\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n </div>\n </div>\n }\n @if (rowActions()?.template; as tpl) {\n @if (row | rtRowHasActions: rowHasActions()) {\n <div rtElem=\"card-actions\" qa-dataid=\"table-card-actions\">\n <rt-menu>\n <ng-container [ngTemplateOutlet]=\"tpl\" [ngTemplateOutletContext]=\"{ $implicit: row }\" />\n </rt-menu>\n </div>\n }\n }\n }\n </article>\n }\n }\n </div>\n }\n</ng-container>\n",
|
|
1721
|
-
styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-table{--rt-table-border-width: var(--rt-border-width-thin);--rt-table-card-radius: var(--rt-radius-md);position:relative;display:table;width:100%;background:var(--rt-color-bg
|
|
1810
|
+
styles: ["@charset \"UTF-8\";@layer rt-kit.components{.rt-table{--rt-table-border-width: var(--rt-border-width-thin);--rt-table-card-radius: var(--rt-radius-md);--rt-table-row-bg: transparent;--rt-table-pinned-bg: var(--rt-color-table-bg);--rt-table-pinned-shadow-color: var(--rt-color-table-pinned-shadow);--rt-table-pinned-shadow-width: 12px;position:relative;display:table;width:100%;background:var(--rt-color-table-bg);border-collapse:collapse;color:var(--rt-color-text-primary)}.rt-table .cdk-header-row,.rt-table .cdk-row,.rt-table__skeleton-row{height:50px}.rt-table .cdk-header-cell,.rt-table .cdk-cell,.rt-table__filter-cell,.rt-table__skeleton-cell{position:relative;padding:var(--rt-space-2) var(--rt-space-5);border-bottom:var(--rt-table-border-width) solid var(--rt-color-border-subtle);border-left:var(--rt-table-border-width) solid var(--rt-color-border-subtle);font-size:var(--rt-text-sm);font-weight:var(--rt-font-weight-medium);text-align:start;vertical-align:middle}.rt-table .cdk-header-cell[data-align=right],.rt-table .cdk-cell[data-align=right],.rt-table__filter-cell[data-align=right],.rt-table__skeleton-cell[data-align=right],.rt-table .cdk-header-cell[data-align=right] input,.rt-table .cdk-cell[data-align=right] input,.rt-table__filter-cell[data-align=right] input,.rt-table__skeleton-cell[data-align=right] input{text-align:right}.rt-table .cdk-header-cell:first-child,.rt-table .cdk-cell:first-child,.rt-table__filter-cell:first-child,.rt-table__skeleton-cell:first-child{border-left:none}.rt-table .cdk-header-cell{border-top:var(--rt-table-border-width) solid var(--rt-color-border-subtle);background:var(--rt-color-table-bg);color:var(--rt-color-text-muted)}.rt-table .cdk-cell{color:var(--rt-color-text-primary);overflow-wrap:anywhere}.rt-table__filter-row{display:table-row}.rt-table__filter-cell{height:auto;background:var(--rt-color-bg-surface);padding-block:var(--rt-space-1);vertical-align:middle}.rt-table__filter-cell--actions,.rt-table__actions-header.cdk-header-cell{width:0;padding:0;border:none}.rt-table__actions-cell.cdk-cell{position:sticky;z-index:1;right:0;width:0;padding:0;border:none;background:transparent}.rt-table__actions-float{position:absolute;display:flex;height:100%;align-items:center;padding:0 var(--rt-space-2) 0 var(--rt-space-8);background:linear-gradient(to right,transparent 0%,var(--rt-color-bg-hover) 45%);inset:0 0 0 auto;pointer-events:none}.rt-table__actions-float .rt-menu{pointer-events:auto}@media(hover:hover){.rt-table__actions-cell.cdk-cell{visibility:hidden}.cdk-row:hover .rt-table__actions-cell.cdk-cell,.cdk-row:focus-within .rt-table__actions-cell.cdk-cell,.rt-table__actions-cell.cdk-cell:has(.rt-menu--open){visibility:visible}}.rt-table .cdk-row,.rt-table .cdk-footer-row{background:var(--rt-table-row-bg)}.rt-table .cdk-row:hover{--rt-table-row-bg: var(--rt-color-bg-hover)}.rt-table .cdk-row.rt-table__row--danger,.rt-table .cdk-row.rt-table__row--danger:hover{--rt-table-row-bg: var(--rt-color-state-danger-bg)}.rt-table .cdk-cell.cdk-table-sticky,.rt-table .cdk-footer-cell.cdk-table-sticky{background:linear-gradient(var(--rt-table-row-bg),var(--rt-table-row-bg)),var(--rt-table-pinned-bg)}.rt-table .cdk-table-sticky-border-elem-left:after,.rt-table .cdk-table-sticky-border-elem-right:after{position:absolute;top:0;bottom:0;width:var(--rt-table-pinned-shadow-width);pointer-events:none}.rt-table .cdk-table-sticky-border-elem-left:after{left:100%;background:linear-gradient(to right,var(--rt-table-pinned-shadow-color),transparent)}.rt-table .cdk-table-sticky-border-elem-right:after{right:100%;background:linear-gradient(to left,var(--rt-table-pinned-shadow-color),transparent)}.rt-table--hidden-start:dir(ltr) .cdk-table-sticky-border-elem-left:after,.rt-table--hidden-end:dir(ltr) .cdk-table-sticky-border-elem-right:after,.rt-table--hidden-start:dir(rtl) .cdk-table-sticky-border-elem-right:after,.rt-table--hidden-end:dir(rtl) .cdk-table-sticky-border-elem-left:after{content:\"\"}.rt-table--clickable .cdk-row,.rt-table--clickable .rt-table__card{cursor:pointer}.rt-table--clickable .cdk-row:focus-visible,.rt-table--clickable .rt-table__card:focus-visible{outline:2px solid var(--rt-color-action-primary);outline-offset:-2px}.rt-table a{text-decoration:none}.rt-table--density--compact .cdk-header-row,.rt-table--density--compact .cdk-row,.rt-table--density--compact .rt-table__skeleton-row{height:36px}.rt-table--density--compact .cdk-header-cell,.rt-table--density--compact .cdk-cell,.rt-table--density--compact .rt-table__skeleton-cell{padding:var(--rt-space-xs) var(--rt-space-sm)}.rt-table__skeleton-bar{display:block;width:80%;height:14px}.rt-table__empty-row{display:table-row}.rt-table__empty{padding:var(--rt-space-6) var(--rt-space-5);border-bottom:var(--rt-table-border-width) solid var(--rt-color-border-subtle);background:var(--rt-color-table-bg);color:var(--rt-color-text-muted);text-align:center}.rt-table__empty-message{margin:0;font-size:var(--rt-text-sm)}.rt-table__overlay{position:absolute;z-index:1;display:grid;min-height:100%;inset:0;place-items:center;pointer-events:none}.rt-table__overlay-backdrop{position:absolute;background:var(--rt-color-table-bg);inset:0;opacity:.72}.rt-table__overlay-spinner{position:sticky;z-index:1;top:50%;display:flex;align-items:center;justify-content:center;transform:translateY(-50%)}.rt-table__cards{display:none}.rt-table--cards{display:block;min-width:0;max-width:100%}.rt-table--cards .cdk-header-row,.rt-table--cards .cdk-row,.rt-table--cards .rt-table__skeleton-row,.rt-table--cards .rt-table__empty-row,.rt-table--cards .rt-table__filter-row{display:none}.rt-table--cards .rt-table__cards{display:flex;flex-direction:column;gap:var(--rt-space-sm)}.rt-table--cards:not(.rt-table--empty){background:transparent}.rt-table__card{display:flex;flex-direction:column;padding:var(--rt-space-md);border:var(--rt-table-border-width) solid var(--rt-color-border-default);border-radius:var(--rt-table-card-radius);background:var(--rt-color-bg-surface);gap:var(--rt-space-xs)}.rt-table__card-field{display:flex;align-items:baseline;justify-content:space-between;gap:var(--rt-space-md)}.rt-table__card-label{flex:0 0 auto;color:var(--rt-color-text-muted);font-size:var(--rt-text-sm)}.rt-table__card-value{min-width:0;overflow-wrap:anywhere;text-align:right}.rt-table__card-value .cdk-cell{display:inline;height:auto;padding:0;border:none;font:inherit;min-inline-size:0;text-align:inherit}.rt-table__card-actions{display:flex;justify-content:flex-end}.rt-table__card-skeleton-bar{display:block;width:60%;height:14px}.rt-table__card-skeleton-bar:first-child{width:80%}.rt-table[data-rt-radius=none]{--rt-table-card-radius: var(--rt-radius-none)}.rt-table[data-rt-radius=xs]{--rt-table-card-radius: var(--rt-radius-xs)}.rt-table[data-rt-radius=sm]{--rt-table-card-radius: var(--rt-radius-sm)}.rt-table[data-rt-radius=ms]{--rt-table-card-radius: var(--rt-radius-ms)}.rt-table[data-rt-radius=md]{--rt-table-card-radius: var(--rt-radius-md)}.rt-table[data-rt-radius=lg]{--rt-table-card-radius: var(--rt-radius-lg)}.rt-table[data-rt-radius=xl]{--rt-table-card-radius: var(--rt-radius-xl)}.rt-table[data-rt-radius=\"2xl\"]{--rt-table-card-radius: var(--rt-radius-2xl)}.rt-table[data-rt-radius=full]{--rt-table-card-radius: var(--rt-radius-full)}}\n"]
|
|
1722
1811
|
}]
|
|
1723
1812
|
}],
|
|
1724
1813
|
propDecorators: {
|