@elasticias/ui 1.0.10 → 1.0.13
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/elasticias-ui.mjs +284 -23
- package/fesm2022/elasticias-ui.mjs.map +1 -1
- package/package.json +1 -1
- package/styles/_patterns.scss +137 -10
- package/types/elasticias-ui.d.ts +221 -7
package/package.json
CHANGED
package/styles/_patterns.scss
CHANGED
|
@@ -1586,7 +1586,8 @@
|
|
|
1586
1586
|
}
|
|
1587
1587
|
}
|
|
1588
1588
|
|
|
1589
|
-
.row-actions__item
|
|
1589
|
+
.row-actions__item,
|
|
1590
|
+
.ef-menu__item {
|
|
1590
1591
|
appearance: none;
|
|
1591
1592
|
background: transparent;
|
|
1592
1593
|
border: 0;
|
|
@@ -1606,19 +1607,24 @@
|
|
|
1606
1607
|
}
|
|
1607
1608
|
|
|
1608
1609
|
.row-actions__item:hover,
|
|
1609
|
-
.row-actions__item:focus-visible
|
|
1610
|
+
.row-actions__item:focus-visible,
|
|
1611
|
+
.ef-menu__item:hover,
|
|
1612
|
+
.ef-menu__item:focus-visible {
|
|
1610
1613
|
background: var(--paper);
|
|
1611
1614
|
outline: 0;
|
|
1612
1615
|
}
|
|
1613
1616
|
|
|
1614
|
-
.row-actions__item[disabled]
|
|
1617
|
+
.row-actions__item[disabled],
|
|
1618
|
+
.ef-menu__item[disabled] {
|
|
1615
1619
|
opacity: 0.45;
|
|
1616
1620
|
cursor: not-allowed;
|
|
1617
1621
|
background: transparent;
|
|
1618
1622
|
}
|
|
1619
1623
|
|
|
1620
1624
|
.row-actions__item .ico,
|
|
1621
|
-
.row-actions__item i
|
|
1625
|
+
.row-actions__item i,
|
|
1626
|
+
.ef-menu__item .ico,
|
|
1627
|
+
.ef-menu__item i {
|
|
1622
1628
|
width: 16px;
|
|
1623
1629
|
height: 16px;
|
|
1624
1630
|
font-size: 16px;
|
|
@@ -1633,11 +1639,16 @@
|
|
|
1633
1639
|
.row-actions__item:hover .ico,
|
|
1634
1640
|
.row-actions__item:hover i,
|
|
1635
1641
|
.row-actions__item:focus-visible .ico,
|
|
1636
|
-
.row-actions__item:focus-visible i
|
|
1642
|
+
.row-actions__item:focus-visible i,
|
|
1643
|
+
.ef-menu__item:hover .ico,
|
|
1644
|
+
.ef-menu__item:hover i,
|
|
1645
|
+
.ef-menu__item:focus-visible .ico,
|
|
1646
|
+
.ef-menu__item:focus-visible i {
|
|
1637
1647
|
color: var(--text);
|
|
1638
1648
|
}
|
|
1639
1649
|
|
|
1640
|
-
.row-actions__item .kbd
|
|
1650
|
+
.row-actions__item .kbd,
|
|
1651
|
+
.ef-menu__item .kbd {
|
|
1641
1652
|
margin-inline-start: auto;
|
|
1642
1653
|
font-family: 'JetBrains Mono', monospace;
|
|
1643
1654
|
font-size: 10px;
|
|
@@ -1650,26 +1661,142 @@
|
|
|
1650
1661
|
line-height: 1;
|
|
1651
1662
|
}
|
|
1652
1663
|
|
|
1653
|
-
.row-actions__item.danger
|
|
1664
|
+
.row-actions__item.danger,
|
|
1665
|
+
.ef-menu__item.danger {
|
|
1654
1666
|
color: var(--st-cancelled-fg);
|
|
1655
1667
|
}
|
|
1656
1668
|
|
|
1657
1669
|
.row-actions__item.danger .ico,
|
|
1658
|
-
.row-actions__item.danger i
|
|
1670
|
+
.row-actions__item.danger i,
|
|
1671
|
+
.ef-menu__item.danger .ico,
|
|
1672
|
+
.ef-menu__item.danger i {
|
|
1659
1673
|
color: var(--st-cancelled-fg);
|
|
1660
1674
|
}
|
|
1661
1675
|
|
|
1662
1676
|
.row-actions__item.danger:hover,
|
|
1663
|
-
.row-actions__item.danger:focus-visible
|
|
1677
|
+
.row-actions__item.danger:focus-visible,
|
|
1678
|
+
.ef-menu__item.danger:hover,
|
|
1679
|
+
.ef-menu__item.danger:focus-visible {
|
|
1664
1680
|
background: var(--st-cancelled-bg);
|
|
1665
1681
|
}
|
|
1666
1682
|
|
|
1667
|
-
.row-actions__divider
|
|
1683
|
+
.row-actions__divider,
|
|
1684
|
+
.ef-menu__divider {
|
|
1668
1685
|
height: 1px;
|
|
1669
1686
|
background: var(--rule);
|
|
1670
1687
|
margin: 4px;
|
|
1671
1688
|
}
|
|
1672
1689
|
|
|
1690
|
+
/* ──────────── MENU (shared) ─────────────────────────────────────
|
|
1691
|
+
The panel half of the menu language above, without the absolute
|
|
1692
|
+
positioning `.row-actions__menu` needs for its own trigger. Anything
|
|
1693
|
+
that already owns its placement (a popover, a bottom sheet) styles its
|
|
1694
|
+
surface with `.ef-menu` and fills it with `.ef-menu__item`. */
|
|
1695
|
+
|
|
1696
|
+
.ef-menu {
|
|
1697
|
+
display: grid;
|
|
1698
|
+
/* A grid track defaults to auto, so one long row would size the column and
|
|
1699
|
+
widen the whole panel. minmax(0, 1fr) is what lets a label truncate. */
|
|
1700
|
+
grid-template-columns: minmax(0, 1fr);
|
|
1701
|
+
gap: 1px;
|
|
1702
|
+
min-width: 212px;
|
|
1703
|
+
padding: 6px;
|
|
1704
|
+
background: var(--paper-alt);
|
|
1705
|
+
border: 1px solid var(--rule);
|
|
1706
|
+
border-radius: var(--r-xl);
|
|
1707
|
+
box-shadow: var(--shadow-3);
|
|
1708
|
+
}
|
|
1709
|
+
|
|
1710
|
+
/* Identity block at the top of a menu: a name and a secondary line.
|
|
1711
|
+
Sized to sit level with the items rather than tower over them. */
|
|
1712
|
+
.ef-menu__head {
|
|
1713
|
+
display: grid;
|
|
1714
|
+
gap: 1px;
|
|
1715
|
+
min-width: 0;
|
|
1716
|
+
padding: 8px 12px 7px;
|
|
1717
|
+
margin-bottom: 4px;
|
|
1718
|
+
border-bottom: 1px solid var(--rule);
|
|
1719
|
+
}
|
|
1720
|
+
|
|
1721
|
+
.ef-menu__head-name {
|
|
1722
|
+
min-width: 0;
|
|
1723
|
+
overflow: hidden;
|
|
1724
|
+
text-overflow: ellipsis;
|
|
1725
|
+
white-space: nowrap;
|
|
1726
|
+
font-size: 13.5px;
|
|
1727
|
+
font-weight: 700;
|
|
1728
|
+
line-height: 1.3;
|
|
1729
|
+
color: var(--text);
|
|
1730
|
+
}
|
|
1731
|
+
|
|
1732
|
+
.ef-menu__head-sub {
|
|
1733
|
+
min-width: 0;
|
|
1734
|
+
overflow: hidden;
|
|
1735
|
+
text-overflow: ellipsis;
|
|
1736
|
+
white-space: nowrap;
|
|
1737
|
+
font-size: 12px;
|
|
1738
|
+
line-height: 1.3;
|
|
1739
|
+
color: var(--text-mute);
|
|
1740
|
+
}
|
|
1741
|
+
|
|
1742
|
+
/* A nested group, revealed by expanding its parent row. Indented to the
|
|
1743
|
+
label column so the children line up under the text, not the icon. */
|
|
1744
|
+
/* Label takes the free space so a trailing chip or caret can sit at the
|
|
1745
|
+
inline end, and a long name truncates instead of widening the panel. */
|
|
1746
|
+
.ef-menu__label {
|
|
1747
|
+
flex: 1 1 auto;
|
|
1748
|
+
min-width: 0;
|
|
1749
|
+
overflow: hidden;
|
|
1750
|
+
text-overflow: ellipsis;
|
|
1751
|
+
white-space: nowrap;
|
|
1752
|
+
}
|
|
1753
|
+
|
|
1754
|
+
.ef-menu__item .ef-menu__caret {
|
|
1755
|
+
margin-inline-start: auto;
|
|
1756
|
+
width: 12px;
|
|
1757
|
+
height: 12px;
|
|
1758
|
+
font-size: 12px;
|
|
1759
|
+
}
|
|
1760
|
+
|
|
1761
|
+
.ef-menu__item .ef-menu__badge {
|
|
1762
|
+
margin-inline-start: auto;
|
|
1763
|
+
flex: 0 0 auto;
|
|
1764
|
+
padding: 1px 7px;
|
|
1765
|
+
border-radius: var(--r-pill);
|
|
1766
|
+
background: var(--st-cancelled-fg);
|
|
1767
|
+
color: #fff;
|
|
1768
|
+
font-size: 11px;
|
|
1769
|
+
font-weight: 700;
|
|
1770
|
+
line-height: 1.5;
|
|
1771
|
+
}
|
|
1772
|
+
|
|
1773
|
+
/* A popover reduced to a placement mechanism. The `.ef-menu` inside draws
|
|
1774
|
+
the surface, so PrimeNG must not draw a second panel or an arrow. */
|
|
1775
|
+
.p-popover.ef-menu-popover {
|
|
1776
|
+
background: transparent;
|
|
1777
|
+
border: 0;
|
|
1778
|
+
box-shadow: none;
|
|
1779
|
+
padding: 0;
|
|
1780
|
+
}
|
|
1781
|
+
|
|
1782
|
+
.p-popover.ef-menu-popover .p-popover-content {
|
|
1783
|
+
padding: 0;
|
|
1784
|
+
}
|
|
1785
|
+
|
|
1786
|
+
.p-popover.ef-menu-popover:before,
|
|
1787
|
+
.p-popover.ef-menu-popover:after {
|
|
1788
|
+
display: none;
|
|
1789
|
+
}
|
|
1790
|
+
|
|
1791
|
+
.ef-menu__sublist {
|
|
1792
|
+
display: grid;
|
|
1793
|
+
gap: 1px;
|
|
1794
|
+
margin: 0;
|
|
1795
|
+
padding: 0 0 2px 28px;
|
|
1796
|
+
list-style: none;
|
|
1797
|
+
min-width: 0;
|
|
1798
|
+
}
|
|
1799
|
+
|
|
1673
1800
|
/* When a row-actions menu is open inside a data card, the table-wrap
|
|
1674
1801
|
should let the popover escape its overflow. The data-card binds
|
|
1675
1802
|
.has-open-menu when any descendant trigger is in `.open` state. */
|
package/types/elasticias-ui.d.ts
CHANGED
|
@@ -981,6 +981,21 @@ declare class EfBuildStampComponent {
|
|
|
981
981
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfBuildStampComponent, "ef-build-stamp", never, { "owner": { "alias": "owner"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
982
982
|
}
|
|
983
983
|
|
|
984
|
+
/**
|
|
985
|
+
* The server half of the deployment, as an app fetches it from its own API.
|
|
986
|
+
* Every field is optional: the dialog renders the group only for what it was
|
|
987
|
+
* given, so an app with no such endpoint simply omits the input.
|
|
988
|
+
*/
|
|
989
|
+
interface EfAboutServer {
|
|
990
|
+
/** Hosting environment — may differ from the build's own environment. */
|
|
991
|
+
environment?: string;
|
|
992
|
+
/** Runtime description, e.g. `.NET 10.0.6`. */
|
|
993
|
+
runtime?: string;
|
|
994
|
+
/** Version of the API itself. */
|
|
995
|
+
version?: string;
|
|
996
|
+
/** Shared framework assemblies loaded by the API. */
|
|
997
|
+
packages?: EfBuildPackage[];
|
|
998
|
+
}
|
|
984
999
|
/**
|
|
985
1000
|
* "About this app" — which build is running and what shared packages it
|
|
986
1001
|
* was compiled against.
|
|
@@ -1004,6 +1019,14 @@ declare class EfAboutDialogComponent {
|
|
|
1004
1019
|
readonly product: _angular_core.InputSignal<string>;
|
|
1005
1020
|
/** One muted line under the product — a tenant, a plan, an edition. */
|
|
1006
1021
|
readonly edition: _angular_core.InputSignal<string>;
|
|
1022
|
+
/** Which organisation this deployment serves, as a labelled row. */
|
|
1023
|
+
readonly organisation: _angular_core.InputSignal<string>;
|
|
1024
|
+
/** What the API reports about itself. Leave empty to hide the group. */
|
|
1025
|
+
readonly server: _angular_core.InputSignal<EfAboutServer>;
|
|
1026
|
+
/** Outbound link, already carrying whatever query the app wants on it. */
|
|
1027
|
+
readonly websiteUrl: _angular_core.InputSignal<string>;
|
|
1028
|
+
/** What the link reads as — a domain, not a sentence. */
|
|
1029
|
+
readonly websiteLabel: _angular_core.InputSignal<string>;
|
|
1007
1030
|
/** Brand mark. A logo wins over the initial when both are set; empty
|
|
1008
1031
|
* means "none", the same way `edition` and `initial` read. */
|
|
1009
1032
|
readonly logoUrl: _angular_core.InputSignal<string>;
|
|
@@ -1022,10 +1045,17 @@ declare class EfAboutDialogComponent {
|
|
|
1022
1045
|
labelKey: string;
|
|
1023
1046
|
value: string;
|
|
1024
1047
|
}[]>;
|
|
1048
|
+
/** The API's own identity, above the assemblies it loaded. */
|
|
1049
|
+
protected readonly serverRows: _angular_core.Signal<{
|
|
1050
|
+
labelKey: string;
|
|
1051
|
+
value: string;
|
|
1052
|
+
}[]>;
|
|
1053
|
+
protected readonly serverPackages: _angular_core.Signal<EfBuildPackage[]>;
|
|
1054
|
+
protected readonly hasServer: _angular_core.Signal<boolean>;
|
|
1025
1055
|
/** A footer button, not only the header ✕: a thumb needs a real target. */
|
|
1026
1056
|
protected readonly closeAction: EfDialogAction[];
|
|
1027
1057
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfAboutDialogComponent, never>;
|
|
1028
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfAboutDialogComponent, "ef-about-dialog", never, { "visible": { "alias": "visible"; "required": false; "isSignal": true; }; "product": { "alias": "product"; "required": false; "isSignal": true; }; "edition": { "alias": "edition"; "required": false; "isSignal": true; }; "logoUrl": { "alias": "logoUrl"; "required": false; "isSignal": true; }; "initial": { "alias": "initial"; "required": false; "isSignal": true; }; "owner": { "alias": "owner"; "required": false; "isSignal": true; }; }, { "visible": "visibleChange"; }, never, never, true, never>;
|
|
1058
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfAboutDialogComponent, "ef-about-dialog", never, { "visible": { "alias": "visible"; "required": false; "isSignal": true; }; "product": { "alias": "product"; "required": false; "isSignal": true; }; "edition": { "alias": "edition"; "required": false; "isSignal": true; }; "organisation": { "alias": "organisation"; "required": false; "isSignal": true; }; "server": { "alias": "server"; "required": false; "isSignal": true; }; "websiteUrl": { "alias": "websiteUrl"; "required": false; "isSignal": true; }; "websiteLabel": { "alias": "websiteLabel"; "required": false; "isSignal": true; }; "logoUrl": { "alias": "logoUrl"; "required": false; "isSignal": true; }; "initial": { "alias": "initial"; "required": false; "isSignal": true; }; "owner": { "alias": "owner"; "required": false; "isSignal": true; }; }, { "visible": "visibleChange"; }, never, never, true, never>;
|
|
1029
1059
|
}
|
|
1030
1060
|
|
|
1031
1061
|
/**
|
|
@@ -1049,6 +1079,35 @@ declare class EfTooltipDirective {
|
|
|
1049
1079
|
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<EfTooltipDirective, "[efTooltip]", never, {}, {}, never, never, true, [{ directive: typeof i1.Tooltip; inputs: { "pTooltip": "efTooltip"; "tooltipPosition": "efTooltipPosition"; "tooltipDisabled": "efTooltipDisabled"; "tooltipStyleClass": "efTooltipStyleClass"; "tooltipEvent": "efTooltipEvent"; "showDelay": "efTooltipShowDelay"; "hideDelay": "efTooltipHideDelay"; "appendTo": "efTooltipAppendTo"; "autoHide": "efTooltipAutoHide"; "escape": "efTooltipEscape"; "life": "efTooltipLife"; }; outputs: {}; }]>;
|
|
1050
1080
|
}
|
|
1051
1081
|
|
|
1082
|
+
/**
|
|
1083
|
+
* The keyboard-shortcuts reference: every registration currently sitting
|
|
1084
|
+
* in `EfShortcutService`, grouped and rendered with the same `.kbd` chip
|
|
1085
|
+
* `ef-row-actions` and `ef-menu` already use, so a chip means one thing
|
|
1086
|
+
* everywhere it appears.
|
|
1087
|
+
*
|
|
1088
|
+
* Reads `EfShortcutService.list()` directly, so it stays live: open it
|
|
1089
|
+
* while a row menu is on screen and its row-scoped shortcuts are already
|
|
1090
|
+
* listed under "Row actions". Close the row menu and, since a row's
|
|
1091
|
+
* shortcuts unregister with it, they're gone from here too.
|
|
1092
|
+
*
|
|
1093
|
+
* ```html
|
|
1094
|
+
* <ef-shortcuts-dialog [(visible)]="shortcutsOpen" />
|
|
1095
|
+
* ```
|
|
1096
|
+
*/
|
|
1097
|
+
declare class EfShortcutsDialogComponent {
|
|
1098
|
+
private readonly shortcutService;
|
|
1099
|
+
/** Two-way open state. */
|
|
1100
|
+
readonly visible: _angular_core.ModelSignal<boolean>;
|
|
1101
|
+
protected readonly groups: _angular_core.Signal<_elasticias_core.EfShortcutGroup[]>;
|
|
1102
|
+
/** Only macOS reads `⌘` at a glance. Everyone else needs the line
|
|
1103
|
+
* spelling out that it means Ctrl. */
|
|
1104
|
+
protected readonly isMacPlatform: boolean;
|
|
1105
|
+
protected readonly closeAction: EfDialogAction[];
|
|
1106
|
+
protected formatKeys(keys: string): string;
|
|
1107
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfShortcutsDialogComponent, never>;
|
|
1108
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfShortcutsDialogComponent, "ef-shortcuts-dialog", never, { "visible": { "alias": "visible"; "required": false; "isSignal": true; }; }, { "visible": "visibleChange"; }, never, never, true, never>;
|
|
1109
|
+
}
|
|
1110
|
+
|
|
1052
1111
|
declare class EfFieldsetComponent {
|
|
1053
1112
|
/** Direct legend text (not translated) */
|
|
1054
1113
|
legend?: string;
|
|
@@ -1890,6 +1949,89 @@ declare class EfProfileChipComponent {
|
|
|
1890
1949
|
static ngAcceptInputType_readonly: unknown;
|
|
1891
1950
|
}
|
|
1892
1951
|
|
|
1952
|
+
/**
|
|
1953
|
+
* One row in `ef-profile-menu`.
|
|
1954
|
+
*
|
|
1955
|
+
* Navigation is a `command` like everything else: a host that wants to
|
|
1956
|
+
* route passes `command: () => this.router.navigate([...])`, which keeps
|
|
1957
|
+
* the lib free of `RouterModule`.
|
|
1958
|
+
*/
|
|
1959
|
+
interface EfProfileMenuItem {
|
|
1960
|
+
/** Stable identifier, used for tracking and for expansion state. */
|
|
1961
|
+
id: string;
|
|
1962
|
+
/** Translation key for the row label. */
|
|
1963
|
+
labelKey: string;
|
|
1964
|
+
/** PrimeIcons class, e.g. `'pi pi-user'`. */
|
|
1965
|
+
icon?: string;
|
|
1966
|
+
/** Trailing count pill. `0` renders; `undefined` and `null` do not. */
|
|
1967
|
+
badge?: string | number;
|
|
1968
|
+
/** `'danger'` tints the row, for log out and other one-way actions. */
|
|
1969
|
+
severity?: 'default' | 'danger';
|
|
1970
|
+
/** Draw a separating rule above this row. */
|
|
1971
|
+
groupStart?: boolean;
|
|
1972
|
+
/** Rows shown when this one is expanded. A row with children never
|
|
1973
|
+
* runs its own `command`; choosing it toggles the group. */
|
|
1974
|
+
children?: EfProfileMenuItem[];
|
|
1975
|
+
/** What choosing the row does. */
|
|
1976
|
+
command?: () => void;
|
|
1977
|
+
}
|
|
1978
|
+
|
|
1979
|
+
/** The slice of PrimeNG's Popover this component actually calls. Typing it
|
|
1980
|
+
* structurally keeps the template ref usable and the tests free of PrimeNG. */
|
|
1981
|
+
interface Dismissible {
|
|
1982
|
+
hide: () => void;
|
|
1983
|
+
/** PrimeNG positions a popover once, when it opens. Expanding a group
|
|
1984
|
+
* changes the panel's height afterwards, so the host has to ask for a
|
|
1985
|
+
* reposition or the panel grows past the edge it was anchored to. */
|
|
1986
|
+
align?: () => void;
|
|
1987
|
+
}
|
|
1988
|
+
/**
|
|
1989
|
+
* The signed-in user's menu.
|
|
1990
|
+
*
|
|
1991
|
+
* Two renderings of one `items` array. `variant="chip"` (the default) shows
|
|
1992
|
+
* an `ef-profile-chip` that opens a popover, for the side footer on a
|
|
1993
|
+
* desktop. `variant="list"` renders the same rows flat, with no popover,
|
|
1994
|
+
* for the mobile sheet: `ef-app-shell` does not render the side footer on a
|
|
1995
|
+
* phone, and this menu is the only way to sign out, so it cannot live only
|
|
1996
|
+
* there.
|
|
1997
|
+
*
|
|
1998
|
+
* ```html
|
|
1999
|
+
* <ef-profile-menu
|
|
2000
|
+
* side-footer
|
|
2001
|
+
* [name]="userName()"
|
|
2002
|
+
* [secondary]="userEmail()"
|
|
2003
|
+
* [initial]="userInitial()"
|
|
2004
|
+
* [items]="menuItems()"
|
|
2005
|
+
* />
|
|
2006
|
+
* ```
|
|
2007
|
+
*/
|
|
2008
|
+
declare class EfProfileMenuComponent {
|
|
2009
|
+
/** Display name, shown on the chip and in the panel header. */
|
|
2010
|
+
readonly name: _angular_core.InputSignal<string>;
|
|
2011
|
+
/** Second header line. The email, usually. */
|
|
2012
|
+
readonly secondary: _angular_core.InputSignal<string>;
|
|
2013
|
+
/** Chip subtitle. Falls back to `secondary` when empty. */
|
|
2014
|
+
readonly role: _angular_core.InputSignal<string>;
|
|
2015
|
+
/** Avatar glyph. Up to two characters; falls back to the first of `name`. */
|
|
2016
|
+
readonly initial: _angular_core.InputSignal<string>;
|
|
2017
|
+
readonly tone: _angular_core.InputSignal<"tenant" | "neutral">;
|
|
2018
|
+
readonly items: _angular_core.InputSignal<readonly EfProfileMenuItem[]>;
|
|
2019
|
+
readonly variant: _angular_core.InputSignal<"chip" | "list">;
|
|
2020
|
+
readonly itemSelected: _angular_core.OutputEmitterRef<EfProfileMenuItem>;
|
|
2021
|
+
/** Id of the one expanded group, or null. One at a time: a menu that
|
|
2022
|
+
* grows in two directions at once stops being scannable. */
|
|
2023
|
+
private readonly expandedId;
|
|
2024
|
+
readonly chipRole: _angular_core.Signal<string>;
|
|
2025
|
+
isExpanded(id: string): boolean;
|
|
2026
|
+
/**
|
|
2027
|
+
* Choose a row. A row with children toggles its group and leaves the
|
|
2028
|
+
* popover open; a leaf runs its command, reports it, and dismisses.
|
|
2029
|
+
*/
|
|
2030
|
+
select(item: EfProfileMenuItem, popover?: Dismissible): void;
|
|
2031
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfProfileMenuComponent, never>;
|
|
2032
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfProfileMenuComponent, "ef-profile-menu", never, { "name": { "alias": "name"; "required": false; "isSignal": true; }; "secondary": { "alias": "secondary"; "required": false; "isSignal": true; }; "role": { "alias": "role"; "required": false; "isSignal": true; }; "initial": { "alias": "initial"; "required": false; "isSignal": true; }; "tone": { "alias": "tone"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": false; "isSignal": true; }; "variant": { "alias": "variant"; "required": false; "isSignal": true; }; }, { "itemSelected": "itemSelected"; }, never, never, true, never>;
|
|
2033
|
+
}
|
|
2034
|
+
|
|
1893
2035
|
declare class EfBlockUiComponent {
|
|
1894
2036
|
isLoading: boolean;
|
|
1895
2037
|
contentPanel: any;
|
|
@@ -4216,7 +4358,11 @@ declare class EfDataCardComponent<TRow = any> implements AfterContentInit {
|
|
|
4216
4358
|
/** Items array for the auto row-actions cell. Rebuilt per call so
|
|
4217
4359
|
* the ef-row-actions component receives a fresh closure per row.
|
|
4218
4360
|
* Visibility is filtered later by ef-row-actions against
|
|
4219
|
-
* `rowActionsContext` (ScreenContext.isGranted).
|
|
4361
|
+
* `rowActionsContext` (ScreenContext.isGranted).
|
|
4362
|
+
*
|
|
4363
|
+
* `kbd` is rendered through `formatShortcut()`, not a literal glyph:
|
|
4364
|
+
* `ef-row-actions` binds these same keys for real while the row's
|
|
4365
|
+
* menu is open, and a hardcoded `'⌘D'` would lie to a Windows user. */
|
|
4220
4366
|
defaultRowActions(row: TRow): ReadonlyArray<EfRowAction>;
|
|
4221
4367
|
bodyTemplate(columnId: string): TemplateRef<unknown> | undefined;
|
|
4222
4368
|
headerTemplate(columnId: string): TemplateRef<unknown> | undefined;
|
|
@@ -4325,11 +4471,11 @@ declare class EfColumnHeaderTemplateDirective {
|
|
|
4325
4471
|
*
|
|
4326
4472
|
* ```ts
|
|
4327
4473
|
* actions: ReadonlyArray<EfRowAction> = [
|
|
4328
|
-
* { id: 'view', labelKey: 'common_view', icon: 'pi pi-eye', kbd: '
|
|
4474
|
+
* { id: 'view', labelKey: 'common_view', icon: 'pi pi-eye', kbd: formatShortcut('enter'),
|
|
4329
4475
|
* permission: Permissions.Read, command: () => view(row) },
|
|
4330
|
-
* { id: 'edit', labelKey: 'common_edit', icon: 'pi pi-pencil', kbd: '
|
|
4476
|
+
* { id: 'edit', labelKey: 'common_edit', icon: 'pi pi-pencil', kbd: formatShortcut('e'),
|
|
4331
4477
|
* permission: Permissions.Edit, command: () => edit(row) },
|
|
4332
|
-
* { id: 'duplicate', labelKey: 'common_duplicate', icon: 'pi pi-copy',
|
|
4478
|
+
* { id: 'duplicate', labelKey: 'common_duplicate', icon: 'pi pi-copy', kbd: formatShortcut('mod+d'),
|
|
4333
4479
|
* command: () => duplicate(row) },
|
|
4334
4480
|
* { separator: true },
|
|
4335
4481
|
* { id: 'delete', labelKey: 'common_delete', icon: 'pi pi-trash', severity: 'danger',
|
|
@@ -4355,9 +4501,25 @@ declare class EfColumnHeaderTemplateDirective {
|
|
|
4355
4501
|
* Permission filtering: pass `[context]="..."` (a `ScreenContext`); items
|
|
4356
4502
|
* declaring a `permission` are hidden unless that permission is granted.
|
|
4357
4503
|
* Items with no `permission` always show.
|
|
4504
|
+
*
|
|
4505
|
+
* The `kbd` hint is decorative unless it's one of `view` / `edit` /
|
|
4506
|
+
* `duplicate`: this component registers Enter, `E` and `mod+D` against
|
|
4507
|
+
* `EfShortcutService`, gated on `open()`, so they only fire while this
|
|
4508
|
+
* row's menu is on screen. Render `kbd` through `formatShortcut()` (as
|
|
4509
|
+
* above): a hardcoded `'⌘D'` is wrong for a Windows user, which is
|
|
4510
|
+
* exactly the bug this wiring fixes.
|
|
4358
4511
|
*/
|
|
4359
4512
|
declare class EfRowActionsComponent {
|
|
4360
4513
|
private readonly host;
|
|
4514
|
+
private readonly shortcuts;
|
|
4515
|
+
/** Distinguishes this instance's registrations from every other row's:
|
|
4516
|
+
* each row on screen constructs its own component, and ids must not
|
|
4517
|
+
* collide or one row's disposer (and its `when`) would clobber
|
|
4518
|
+
* another's still-live registration. */
|
|
4519
|
+
private static nextInstanceId;
|
|
4520
|
+
private readonly instanceId;
|
|
4521
|
+
constructor();
|
|
4522
|
+
private isFocusInsideMenu;
|
|
4361
4523
|
/** Action descriptors. */
|
|
4362
4524
|
readonly items: _angular_core.InputSignal<readonly EfRowAction[]>;
|
|
4363
4525
|
/** Optional context — when present, items with a `permission` are
|
|
@@ -4702,6 +4864,58 @@ declare class EfClearButtonComponent {
|
|
|
4702
4864
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfClearButtonComponent, "ef-clear-button", never, { "ariaLabel": { "alias": "ariaLabel"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, { "clear": "clear"; }, never, never, true, never>;
|
|
4703
4865
|
}
|
|
4704
4866
|
|
|
4867
|
+
/** What the form hands back. `currentPassword` is absent when the host
|
|
4868
|
+
* did not ask for one (an administrator resetting someone else's). */
|
|
4869
|
+
interface EfChangePasswordSubmit {
|
|
4870
|
+
currentPassword?: string;
|
|
4871
|
+
newPassword: string;
|
|
4872
|
+
}
|
|
4873
|
+
/**
|
|
4874
|
+
* Password form, deliberately without an API client.
|
|
4875
|
+
*
|
|
4876
|
+
* `@elasticias/ui` cannot import an app's generated HTTP client, and that
|
|
4877
|
+
* limitation is what makes one component serve two different endpoints: a
|
|
4878
|
+
* user changing their own password proves the old one, an administrator
|
|
4879
|
+
* resetting someone else's does not. The host reads `canSubmit()`, calls
|
|
4880
|
+
* `submit()` from its dialog footer, and listens to `submitted`.
|
|
4881
|
+
*
|
|
4882
|
+
* ```html
|
|
4883
|
+
* <ef-change-password
|
|
4884
|
+
* #form
|
|
4885
|
+
* [requireCurrent]="!userId()"
|
|
4886
|
+
* [busy]="saving()"
|
|
4887
|
+
* [errors]="serverErrors()"
|
|
4888
|
+
* (submitted)="save($event)"
|
|
4889
|
+
* />
|
|
4890
|
+
* ```
|
|
4891
|
+
*
|
|
4892
|
+
* There is no `reset()`: hosts mount it under `@if`, so every open is a
|
|
4893
|
+
* fresh instance.
|
|
4894
|
+
*/
|
|
4895
|
+
declare class EfChangePasswordComponent {
|
|
4896
|
+
/** Ask for the existing password. False for an administrator reset. */
|
|
4897
|
+
readonly requireCurrent: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
4898
|
+
/** A request is in flight: the form refuses to submit again. */
|
|
4899
|
+
readonly busy: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
4900
|
+
/** Already-translated server messages, rendered under the fields. */
|
|
4901
|
+
readonly errors: _angular_core.InputSignal<readonly string[]>;
|
|
4902
|
+
/** Minimum length. Kept in step with the backend validator's 8. */
|
|
4903
|
+
readonly minLength: _angular_core.InputSignal<number>;
|
|
4904
|
+
readonly submitted: _angular_core.OutputEmitterRef<EfChangePasswordSubmit>;
|
|
4905
|
+
readonly currentPassword: _angular_core.WritableSignal<string>;
|
|
4906
|
+
readonly newPassword: _angular_core.WritableSignal<string>;
|
|
4907
|
+
readonly confirmation: _angular_core.WritableSignal<string>;
|
|
4908
|
+
/**
|
|
4909
|
+
* Translation keys for every rule the current input breaks. Empty while
|
|
4910
|
+
* the user has typed nothing, so the form does not scold on open.
|
|
4911
|
+
*/
|
|
4912
|
+
readonly validationKeys: _angular_core.Signal<string[]>;
|
|
4913
|
+
readonly canSubmit: _angular_core.Signal<boolean>;
|
|
4914
|
+
submit(): void;
|
|
4915
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfChangePasswordComponent, never>;
|
|
4916
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfChangePasswordComponent, "ef-change-password", never, { "requireCurrent": { "alias": "requireCurrent"; "required": false; "isSignal": true; }; "busy": { "alias": "busy"; "required": false; "isSignal": true; }; "errors": { "alias": "errors"; "required": false; "isSignal": true; }; "minLength": { "alias": "minLength"; "required": false; "isSignal": true; }; }, { "submitted": "submitted"; }, never, never, true, never>;
|
|
4917
|
+
}
|
|
4918
|
+
|
|
4705
4919
|
/**
|
|
4706
4920
|
* Native Comptoir textarea — no PrimeNG wrapper. Pairs with the
|
|
4707
4921
|
* `.ef-textarea` rule in `@elasticias/ui/styles/patterns` (focus
|
|
@@ -5288,5 +5502,5 @@ declare class EfEmailMetricsCardComponent {
|
|
|
5288
5502
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfEmailMetricsCardComponent, "ef-email-metrics-card", never, { "metrics": { "alias": "metrics"; "required": false; "isSignal": true; }; "recentEvents": { "alias": "recentEvents"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; }, { "rangeChange": "rangeChange"; }, never, never, true, never>;
|
|
5289
5503
|
}
|
|
5290
5504
|
|
|
5291
|
-
export { EF_BADGE_BG_COLORS, EF_BADGE_BG_LIGHT_COLORS, EF_BADGE_BORDER_COLORS, EF_BADGE_DEFAULTS, EF_BADGE_TEXT_COLORS, EF_CHART_PALETTE, EF_DATATABLE_ACTIONS_DEFAULTS, EF_DATATABLE_COLUMN_DEFAULTS, EF_DATATABLE_DEFAULTS, EF_DATA_CARD_MOBILE_LAYOUT, EF_STATUS_COLORS, EF_STATUS_COLOR_ALIASES, EfAboutDialogComponent, EfActivationFilterComponent, EfAppMainComponent, EfAppShellComponent, EfAppShellMobileComponent, EfAppTopComponent, EfBadgeComponent, EfBlockUiComponent, EfBlockableDivComponent, EfBottomSheetComponent, EfBuildStampComponent, EfBulkBarComponent, EfButtonComponent, EfButtonGroupComponent, EfCardComponent, EfChangeHistoryComponent, EfChartComponent, EfCheckboxComponent, EfClearButtonComponent, EfColumnHeaderTemplateDirective, EfColumnTemplateDirective, EfCompactPipe, EfConfirmDialogComponent, EfCurrencyPipe, EfDataCardComponent, EfDatatableActionBarComponent, EfDatatableComponent, EfDatepickerAdvancedComponent, EfDatepickerComponent, EfDetailToolbarComponent, EfDialogComponent, EfEmailMetricsCardComponent, EfEmptyStateComponent, EfFabComponent, EfFieldsetComponent, EfFilterDrawerComponent, EfFilterPillComponent, EfFormGridComponent, EfInputNumberComponent, EfInputTextComponent, EfKpiCardComponent, EfLabelComponent, EfModuleRailComponent, EfModuleSideComponent, EfMultiSelectComponent, EfOrderBuilderComponent, EfOrderSummaryComponent, EfPagerComponent, EfPasswordComponent, EfPdfPreviewComponent, EfPillGroupComponent, EfPresetPillComponent, EfPriceDisplayComponent, EfProductCatalogueComponent, EfProductCatalogueFilterComponent, EfProductTypeaheadComponent, EfProfileChipComponent, EfPulseComponent, EfQuantitySelectorComponent, EfQuantityStepperComponent, EfRankListComponent, EfRowActionsComponent, EfSearchToolbarComponent, EfSelectButtonComponent, EfSelectComponent, EfServerErrorsDirective, EfSkeletonComponent, EfSmartBarComponent, EfStatsComponent, EfStatusChipComponent, EfTabPanelDirective, EfTabsComponent, EfTextareaComponent, EfThemeConfiguratorComponent, EfThemeToggleComponent, EfTimelineComponent, EfToastRegionComponent, EfToggleSwitchComponent, EfToolbarComponent, EfTooltipDirective, EfTotalsComponent, OrderEntityHelper, OrderLineItemHelper, TruncatePipe, buildChartConfig, getColumnAlignment, mergeColumnDefaults, resolveEfStatusColor };
|
|
5292
|
-
export type { CatalogueProduct, CatalogueProductVariant, CategoryAssignment, CategoryGroup, CategoryItem, DatatableSearchEntity, DocumentConfig, EfBadgeColor, EfBadgeConfig, EfBadgeSize, EfBadgeVariant, EfButtonComptoirSeverity, EfButtonPrimeNGSeverity, EfButtonSeverity, EfChangeHistoryEntry, EfChangeHistoryFieldChange, EfChartSeries, EfChartType, EfDataCardMobileLayout, EfDataCardRowAction, EfDatatableActions, EfDatatableColumn, EfDatatableColumnAlign, EfDatatableColumnType, EfDatatableConfig, EfDateFieldValue, EfDatePreset, EfDialogAction, EfDialogSeverity, EfDialogSize, EfFabPosition, EfKpiDeltaTone, EfKpiSparkline, EfPillItem, EfPresetItem, EfRankRow, EfRowAction, EfSkeletonVariant, EfStatsRow, EfStatusColor, EfStatusReferenceItem, EfTabItem, EfTabsModule, EfTabsVariant, EfTimelineItem, EfTimelineState, EfToastRegionPosition, EfTotalsGrand, EfTotalsRow, HighlightSegment, OrderChangeInfo, OrderEntity, OrderLineItem, OrderProductsSummary, OrderSummaryItem, ProductCountGroup, ProductCountGroupLabel, ProductTypeaheadRow, ProductTypeaheadSelection, ProductWithCountGroup, SelectedFilter, ValidationResult };
|
|
5505
|
+
export { EF_BADGE_BG_COLORS, EF_BADGE_BG_LIGHT_COLORS, EF_BADGE_BORDER_COLORS, EF_BADGE_DEFAULTS, EF_BADGE_TEXT_COLORS, EF_CHART_PALETTE, EF_DATATABLE_ACTIONS_DEFAULTS, EF_DATATABLE_COLUMN_DEFAULTS, EF_DATATABLE_DEFAULTS, EF_DATA_CARD_MOBILE_LAYOUT, EF_STATUS_COLORS, EF_STATUS_COLOR_ALIASES, EfAboutDialogComponent, EfActivationFilterComponent, EfAppMainComponent, EfAppShellComponent, EfAppShellMobileComponent, EfAppTopComponent, EfBadgeComponent, EfBlockUiComponent, EfBlockableDivComponent, EfBottomSheetComponent, EfBuildStampComponent, EfBulkBarComponent, EfButtonComponent, EfButtonGroupComponent, EfCardComponent, EfChangeHistoryComponent, EfChangePasswordComponent, EfChartComponent, EfCheckboxComponent, EfClearButtonComponent, EfColumnHeaderTemplateDirective, EfColumnTemplateDirective, EfCompactPipe, EfConfirmDialogComponent, EfCurrencyPipe, EfDataCardComponent, EfDatatableActionBarComponent, EfDatatableComponent, EfDatepickerAdvancedComponent, EfDatepickerComponent, EfDetailToolbarComponent, EfDialogComponent, EfEmailMetricsCardComponent, EfEmptyStateComponent, EfFabComponent, EfFieldsetComponent, EfFilterDrawerComponent, EfFilterPillComponent, EfFormGridComponent, EfInputNumberComponent, EfInputTextComponent, EfKpiCardComponent, EfLabelComponent, EfModuleRailComponent, EfModuleSideComponent, EfMultiSelectComponent, EfOrderBuilderComponent, EfOrderSummaryComponent, EfPagerComponent, EfPasswordComponent, EfPdfPreviewComponent, EfPillGroupComponent, EfPresetPillComponent, EfPriceDisplayComponent, EfProductCatalogueComponent, EfProductCatalogueFilterComponent, EfProductTypeaheadComponent, EfProfileChipComponent, EfProfileMenuComponent, EfPulseComponent, EfQuantitySelectorComponent, EfQuantityStepperComponent, EfRankListComponent, EfRowActionsComponent, EfSearchToolbarComponent, EfSelectButtonComponent, EfSelectComponent, EfServerErrorsDirective, EfShortcutsDialogComponent, EfSkeletonComponent, EfSmartBarComponent, EfStatsComponent, EfStatusChipComponent, EfTabPanelDirective, EfTabsComponent, EfTextareaComponent, EfThemeConfiguratorComponent, EfThemeToggleComponent, EfTimelineComponent, EfToastRegionComponent, EfToggleSwitchComponent, EfToolbarComponent, EfTooltipDirective, EfTotalsComponent, OrderEntityHelper, OrderLineItemHelper, TruncatePipe, buildChartConfig, getColumnAlignment, mergeColumnDefaults, resolveEfStatusColor };
|
|
5506
|
+
export type { CatalogueProduct, CatalogueProductVariant, CategoryAssignment, CategoryGroup, CategoryItem, DatatableSearchEntity, DocumentConfig, EfAboutServer, EfBadgeColor, EfBadgeConfig, EfBadgeSize, EfBadgeVariant, EfButtonComptoirSeverity, EfButtonPrimeNGSeverity, EfButtonSeverity, EfChangeHistoryEntry, EfChangeHistoryFieldChange, EfChangePasswordSubmit, EfChartSeries, EfChartType, EfDataCardMobileLayout, EfDataCardRowAction, EfDatatableActions, EfDatatableColumn, EfDatatableColumnAlign, EfDatatableColumnType, EfDatatableConfig, EfDateFieldValue, EfDatePreset, EfDialogAction, EfDialogSeverity, EfDialogSize, EfFabPosition, EfKpiDeltaTone, EfKpiSparkline, EfPillItem, EfPresetItem, EfProfileMenuItem, EfRankRow, EfRowAction, EfSkeletonVariant, EfStatsRow, EfStatusColor, EfStatusReferenceItem, EfTabItem, EfTabsModule, EfTabsVariant, EfTimelineItem, EfTimelineState, EfToastRegionPosition, EfTotalsGrand, EfTotalsRow, HighlightSegment, OrderChangeInfo, OrderEntity, OrderLineItem, OrderProductsSummary, OrderSummaryItem, ProductCountGroup, ProductCountGroupLabel, ProductTypeaheadRow, ProductTypeaheadSelection, ProductWithCountGroup, SelectedFilter, ValidationResult };
|