@elasticias/ui 1.0.20 → 1.0.22
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 +5852 -5613
- package/fesm2022/elasticias-ui.mjs.map +1 -1
- package/package.json +1 -1
- package/styles/_patterns.scss +111 -192
- package/types/elasticias-ui.d.ts +102 -9
package/package.json
CHANGED
package/styles/_patterns.scss
CHANGED
|
@@ -1134,22 +1134,6 @@
|
|
|
1134
1134
|
lives in the "DETAIL SCREEN PRIMITIVES (Phase 7)" section below. Only the
|
|
1135
1135
|
sub-element rules (`.left` / `.ref` / `.name` / `.right`) live here. */
|
|
1136
1136
|
|
|
1137
|
-
.detail-toolbar .left {
|
|
1138
|
-
display: flex;
|
|
1139
|
-
align-items: center;
|
|
1140
|
-
gap: 10px;
|
|
1141
|
-
flex: 1;
|
|
1142
|
-
min-width: 0;
|
|
1143
|
-
flex-wrap: wrap;
|
|
1144
|
-
}
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
.detail-toolbar .ref {
|
|
1148
|
-
font-family: var(--font-mono);
|
|
1149
|
-
font-size: 14px;
|
|
1150
|
-
font-weight: 700;
|
|
1151
|
-
letter-spacing: -0.01em;
|
|
1152
|
-
}
|
|
1153
1137
|
|
|
1154
1138
|
.detail-toolbar .name {
|
|
1155
1139
|
font-family: var(--font-display);
|
|
@@ -1161,121 +1145,99 @@
|
|
|
1161
1145
|
letter-spacing: -0.015em;
|
|
1162
1146
|
}
|
|
1163
1147
|
|
|
1164
|
-
.detail-toolbar .right {
|
|
1165
|
-
display: flex;
|
|
1166
|
-
align-items: center;
|
|
1167
|
-
gap: 6px;
|
|
1168
|
-
flex-wrap: wrap;
|
|
1169
|
-
margin-inline-start: auto;
|
|
1170
|
-
}
|
|
1171
|
-
|
|
1172
1148
|
/* ──────────── DETAIL GRID + CARD ───────────────────────────────── */
|
|
1173
1149
|
|
|
1174
|
-
.detail-grid {
|
|
1175
|
-
display: grid;
|
|
1176
|
-
grid-template-columns: minmax(0, 1fr);
|
|
1177
|
-
gap: var(--s-3);
|
|
1178
|
-
}
|
|
1179
|
-
|
|
1180
1150
|
@media (min-width: 1100px) {
|
|
1181
1151
|
.detail-grid {
|
|
1182
1152
|
grid-template-columns: minmax(0, 2fr) minmax(300px, 1fr);
|
|
1183
1153
|
}
|
|
1184
1154
|
}
|
|
1185
1155
|
|
|
1186
|
-
.detail-stack {
|
|
1187
|
-
display: grid;
|
|
1188
|
-
gap: var(--s-3);
|
|
1189
|
-
align-content: start;
|
|
1190
|
-
min-width: 0;
|
|
1191
|
-
}
|
|
1192
|
-
|
|
1193
|
-
.card {
|
|
1194
|
-
background: var(--paper-alt);
|
|
1195
|
-
border: 1px solid var(--rule);
|
|
1196
|
-
border-radius: var(--r-2xl);
|
|
1197
|
-
overflow: hidden;
|
|
1198
|
-
}
|
|
1199
|
-
|
|
1200
|
-
.card-head {
|
|
1201
|
-
display: flex;
|
|
1202
|
-
justify-content: space-between;
|
|
1203
|
-
align-items: center;
|
|
1204
|
-
padding: 12px 16px;
|
|
1205
|
-
border-bottom: 1px solid var(--rule-soft, rgba(15, 17, 21, 0.05));
|
|
1206
|
-
gap: var(--s-3);
|
|
1207
|
-
}
|
|
1208
|
-
|
|
1209
|
-
.card-head .title {
|
|
1210
|
-
font-family: var(--font-display);
|
|
1211
|
-
font-variation-settings:
|
|
1212
|
-
'opsz' 12,
|
|
1213
|
-
'wght' 700,
|
|
1214
|
-
'wdth' 88;
|
|
1215
|
-
font-size: 14.5px;
|
|
1216
|
-
letter-spacing: -0.01em;
|
|
1217
|
-
}
|
|
1218
|
-
|
|
1219
|
-
.card-head .meta {
|
|
1220
|
-
font-size: 11.5px;
|
|
1221
|
-
color: var(--text-mute);
|
|
1222
|
-
font-weight: 600;
|
|
1223
|
-
}
|
|
1224
|
-
|
|
1225
|
-
.card-body {
|
|
1226
|
-
padding: 16px;
|
|
1227
|
-
display: grid;
|
|
1228
|
-
/* minmax(0, 1fr): a grid item's default min-width is auto, so a wide child
|
|
1229
|
-
— a table, a nested data card — sized this column and pushed the card
|
|
1230
|
-
past its own container. Same trap as the content area and the screen
|
|
1231
|
-
host; this is the third place it bites. */
|
|
1232
|
-
grid-template-columns: minmax(0, 1fr);
|
|
1233
|
-
gap: var(--s-3);
|
|
1234
|
-
}
|
|
1235
|
-
|
|
1236
|
-
.card-foot {
|
|
1237
|
-
padding: 10px 16px;
|
|
1238
|
-
border-top: 1px solid var(--rule-soft, rgba(15, 17, 21, 0.05));
|
|
1239
|
-
display: flex;
|
|
1240
|
-
justify-content: space-between;
|
|
1241
|
-
align-items: center;
|
|
1242
|
-
gap: var(--s-3);
|
|
1243
|
-
background: var(--paper);
|
|
1244
|
-
}
|
|
1245
|
-
|
|
1246
1156
|
/* ──────────── FORM GRID + FIELD ────────────────────────────────── */
|
|
1247
1157
|
|
|
1248
|
-
|
|
1158
|
+
/* ──────────────────────────────────────────────────────────────────
|
|
1159
|
+
The 12-column form grid — one definition, two names.
|
|
1160
|
+
|
|
1161
|
+
`.ef-form-grid` is the host class of the <ef-form-grid> primitive;
|
|
1162
|
+
`.form-grid` is the raw-class form written directly in templates.
|
|
1163
|
+
Both are in active use (110 span sites across 13 files), and they
|
|
1164
|
+
were maintained as two separate blocks that had already drifted
|
|
1165
|
+
apart: one supported spans {1,2,3,4,6,12}, the other
|
|
1166
|
+
{2,3,4,6,8,9,12}. A `col-8` inside a `.form-grid` therefore did
|
|
1167
|
+
nothing at all, silently, and so did a `col-1` inside an
|
|
1168
|
+
`.ef-form-grid`. Keeping both names on one rule per span makes the
|
|
1169
|
+
two impossible to drift again.
|
|
1170
|
+
|
|
1171
|
+
Every span collapses to full width at the shell's own mobile
|
|
1172
|
+
breakpoint (767px, the one EfViewportService uses). That single
|
|
1173
|
+
rule is why a field never carries a per-breakpoint span in its
|
|
1174
|
+
template, and why this grid stays mobile-first by default rather
|
|
1175
|
+
than by remembering.
|
|
1176
|
+
────────────────────────────────────────────────────────────────── */
|
|
1177
|
+
.form-grid,
|
|
1178
|
+
.ef-form-grid {
|
|
1249
1179
|
display: grid;
|
|
1250
1180
|
gap: var(--s-3);
|
|
1251
1181
|
grid-template-columns: repeat(12, minmax(0, 1fr));
|
|
1252
1182
|
}
|
|
1253
1183
|
|
|
1254
|
-
.form-grid > .col-1
|
|
1184
|
+
.form-grid > .col-1,
|
|
1185
|
+
.ef-form-grid > .col-1 {
|
|
1255
1186
|
grid-column: span 1;
|
|
1256
1187
|
}
|
|
1257
|
-
.form-grid > .col-2
|
|
1188
|
+
.form-grid > .col-2,
|
|
1189
|
+
.ef-form-grid > .col-2 {
|
|
1258
1190
|
grid-column: span 2;
|
|
1259
1191
|
}
|
|
1260
|
-
.form-grid > .col-3
|
|
1192
|
+
.form-grid > .col-3,
|
|
1193
|
+
.ef-form-grid > .col-3 {
|
|
1261
1194
|
grid-column: span 3;
|
|
1262
1195
|
}
|
|
1263
|
-
.form-grid > .col-4
|
|
1196
|
+
.form-grid > .col-4,
|
|
1197
|
+
.ef-form-grid > .col-4 {
|
|
1264
1198
|
grid-column: span 4;
|
|
1265
1199
|
}
|
|
1266
|
-
.form-grid > .col-
|
|
1200
|
+
.form-grid > .col-5,
|
|
1201
|
+
.ef-form-grid > .col-5 {
|
|
1202
|
+
grid-column: span 5;
|
|
1203
|
+
}
|
|
1204
|
+
.form-grid > .col-6,
|
|
1205
|
+
.ef-form-grid > .col-6 {
|
|
1267
1206
|
grid-column: span 6;
|
|
1268
1207
|
}
|
|
1269
|
-
.form-grid > .col-
|
|
1208
|
+
.form-grid > .col-7,
|
|
1209
|
+
.ef-form-grid > .col-7 {
|
|
1210
|
+
grid-column: span 7;
|
|
1211
|
+
}
|
|
1212
|
+
.form-grid > .col-8,
|
|
1213
|
+
.ef-form-grid > .col-8 {
|
|
1214
|
+
grid-column: span 8;
|
|
1215
|
+
}
|
|
1216
|
+
.form-grid > .col-9,
|
|
1217
|
+
.ef-form-grid > .col-9 {
|
|
1218
|
+
grid-column: span 9;
|
|
1219
|
+
}
|
|
1220
|
+
.form-grid > .col-10,
|
|
1221
|
+
.ef-form-grid > .col-10 {
|
|
1222
|
+
grid-column: span 10;
|
|
1223
|
+
}
|
|
1224
|
+
.form-grid > .col-11,
|
|
1225
|
+
.ef-form-grid > .col-11 {
|
|
1226
|
+
grid-column: span 11;
|
|
1227
|
+
}
|
|
1228
|
+
.form-grid > .col-12,
|
|
1229
|
+
.ef-form-grid > .col-12 {
|
|
1270
1230
|
grid-column: span 12;
|
|
1271
1231
|
}
|
|
1272
1232
|
|
|
1273
1233
|
@media (max-width: 767px) {
|
|
1274
|
-
.form-grid > [class*='col-']
|
|
1234
|
+
.form-grid > [class*='col-'],
|
|
1235
|
+
.ef-form-grid > [class*='col-'] {
|
|
1275
1236
|
grid-column: span 12;
|
|
1276
1237
|
}
|
|
1277
1238
|
}
|
|
1278
1239
|
|
|
1240
|
+
|
|
1279
1241
|
.field {
|
|
1280
1242
|
display: grid;
|
|
1281
1243
|
gap: 4px;
|
|
@@ -1422,12 +1384,6 @@
|
|
|
1422
1384
|
|
|
1423
1385
|
/* ──────────── DASHBOARD KPI CARDS ───────────────────────────────── */
|
|
1424
1386
|
|
|
1425
|
-
.kpi-grid {
|
|
1426
|
-
display: grid;
|
|
1427
|
-
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
|
|
1428
|
-
gap: var(--s-3);
|
|
1429
|
-
}
|
|
1430
|
-
|
|
1431
1387
|
.kpi-card {
|
|
1432
1388
|
background: var(--paper-alt);
|
|
1433
1389
|
border: 1px solid var(--rule);
|
|
@@ -1438,60 +1394,6 @@
|
|
|
1438
1394
|
align-content: start;
|
|
1439
1395
|
}
|
|
1440
1396
|
|
|
1441
|
-
.kpi-head {
|
|
1442
|
-
display: flex;
|
|
1443
|
-
justify-content: space-between;
|
|
1444
|
-
align-items: center;
|
|
1445
|
-
gap: 8px;
|
|
1446
|
-
}
|
|
1447
|
-
|
|
1448
|
-
.kpi-value {
|
|
1449
|
-
font-family: var(--font-display);
|
|
1450
|
-
font-variation-settings:
|
|
1451
|
-
'opsz' 96,
|
|
1452
|
-
'wght' 700,
|
|
1453
|
-
'wdth' 80;
|
|
1454
|
-
font-size: clamp(28px, 4vw, 40px);
|
|
1455
|
-
letter-spacing: -0.03em;
|
|
1456
|
-
line-height: 1;
|
|
1457
|
-
font-feature-settings: 'tnum';
|
|
1458
|
-
color: var(--text);
|
|
1459
|
-
}
|
|
1460
|
-
|
|
1461
|
-
.kpi-value .unit {
|
|
1462
|
-
font-family: var(--font-mono);
|
|
1463
|
-
font-size: 0.4em;
|
|
1464
|
-
font-weight: 500;
|
|
1465
|
-
color: var(--text-mute);
|
|
1466
|
-
margin-inline-start: 6px;
|
|
1467
|
-
letter-spacing: 0;
|
|
1468
|
-
}
|
|
1469
|
-
|
|
1470
|
-
.spark {
|
|
1471
|
-
width: 100%;
|
|
1472
|
-
height: 28px;
|
|
1473
|
-
margin-top: 4px;
|
|
1474
|
-
}
|
|
1475
|
-
|
|
1476
|
-
.delta {
|
|
1477
|
-
font-family: var(--font-mono);
|
|
1478
|
-
font-size: 11px;
|
|
1479
|
-
font-weight: 700;
|
|
1480
|
-
padding: 2px 8px;
|
|
1481
|
-
border-radius: var(--r-pill);
|
|
1482
|
-
letter-spacing: 0;
|
|
1483
|
-
}
|
|
1484
|
-
|
|
1485
|
-
.delta.up {
|
|
1486
|
-
background: var(--st-delivered-bg);
|
|
1487
|
-
color: var(--st-delivered-fg);
|
|
1488
|
-
}
|
|
1489
|
-
|
|
1490
|
-
.delta.down {
|
|
1491
|
-
background: var(--st-cancelled-bg);
|
|
1492
|
-
color: var(--st-cancelled-fg);
|
|
1493
|
-
}
|
|
1494
|
-
|
|
1495
1397
|
/* Lower-half dashboard grid (recent activity / pipeline / top lists). */
|
|
1496
1398
|
|
|
1497
1399
|
.dash-grid {
|
|
@@ -2953,40 +2855,7 @@
|
|
|
2953
2855
|
background: var(--paper);
|
|
2954
2856
|
}
|
|
2955
2857
|
|
|
2956
|
-
/*
|
|
2957
|
-
.ef-form-grid {
|
|
2958
|
-
display: grid;
|
|
2959
|
-
gap: var(--s-3);
|
|
2960
|
-
grid-template-columns: repeat(12, minmax(0, 1fr));
|
|
2961
|
-
}
|
|
2962
|
-
|
|
2963
|
-
.ef-form-grid > .col-2 {
|
|
2964
|
-
grid-column: span 2;
|
|
2965
|
-
}
|
|
2966
|
-
.ef-form-grid > .col-3 {
|
|
2967
|
-
grid-column: span 3;
|
|
2968
|
-
}
|
|
2969
|
-
.ef-form-grid > .col-4 {
|
|
2970
|
-
grid-column: span 4;
|
|
2971
|
-
}
|
|
2972
|
-
.ef-form-grid > .col-6 {
|
|
2973
|
-
grid-column: span 6;
|
|
2974
|
-
}
|
|
2975
|
-
.ef-form-grid > .col-8 {
|
|
2976
|
-
grid-column: span 8;
|
|
2977
|
-
}
|
|
2978
|
-
.ef-form-grid > .col-9 {
|
|
2979
|
-
grid-column: span 9;
|
|
2980
|
-
}
|
|
2981
|
-
.ef-form-grid > .col-12 {
|
|
2982
|
-
grid-column: span 12;
|
|
2983
|
-
}
|
|
2984
|
-
|
|
2985
|
-
@media (max-width: 767px) {
|
|
2986
|
-
.ef-form-grid > [class*='col-'] {
|
|
2987
|
-
grid-column: span 12;
|
|
2988
|
-
}
|
|
2989
|
-
}
|
|
2858
|
+
/* The 12-column form grid lives with `.form-grid` above. */
|
|
2990
2859
|
|
|
2991
2860
|
/* Field row inside a form grid. */
|
|
2992
2861
|
.ef-field {
|
|
@@ -3214,6 +3083,7 @@
|
|
|
3214
3083
|
display: flex;
|
|
3215
3084
|
justify-content: space-between;
|
|
3216
3085
|
align-items: center;
|
|
3086
|
+
gap: 8px;
|
|
3217
3087
|
}
|
|
3218
3088
|
|
|
3219
3089
|
.kpi-value {
|
|
@@ -3227,6 +3097,7 @@
|
|
|
3227
3097
|
letter-spacing: -0.04em;
|
|
3228
3098
|
font-feature-settings: 'tnum';
|
|
3229
3099
|
font-variant-numeric: tabular-nums;
|
|
3100
|
+
color: var(--text);
|
|
3230
3101
|
}
|
|
3231
3102
|
|
|
3232
3103
|
.kpi-value .unit {
|
|
@@ -3242,13 +3113,18 @@
|
|
|
3242
3113
|
font-family: var(--font-mono);
|
|
3243
3114
|
font-size: 11px;
|
|
3244
3115
|
font-weight: 600;
|
|
3116
|
+
padding: 2px 8px;
|
|
3117
|
+
border-radius: var(--r-pill);
|
|
3118
|
+
letter-spacing: 0;
|
|
3245
3119
|
}
|
|
3246
3120
|
|
|
3247
3121
|
.delta.up {
|
|
3248
3122
|
color: var(--st-delivered-fg);
|
|
3123
|
+
background: var(--st-delivered-bg);
|
|
3249
3124
|
}
|
|
3250
3125
|
.delta.down {
|
|
3251
3126
|
color: var(--st-cancelled-fg);
|
|
3127
|
+
background: var(--st-cancelled-bg);
|
|
3252
3128
|
}
|
|
3253
3129
|
.delta.flat {
|
|
3254
3130
|
color: var(--text-mute);
|
|
@@ -3259,6 +3135,7 @@
|
|
|
3259
3135
|
opacity: 0.9;
|
|
3260
3136
|
display: block;
|
|
3261
3137
|
width: 100%;
|
|
3138
|
+
margin-top: 4px;
|
|
3262
3139
|
}
|
|
3263
3140
|
|
|
3264
3141
|
.kpi-grid {
|
|
@@ -4616,4 +4493,46 @@ input.ef-input[type='number'] {
|
|
|
4616
4493
|
inline-size: var(--hit-touch);
|
|
4617
4494
|
block-size: var(--hit-touch);
|
|
4618
4495
|
}
|
|
4496
|
+
|
|
4497
|
+
/* Toolbar buttons collapse to icon-only below 767px, so the blanket
|
|
4498
|
+
min-block-size above stretched a 40px-wide button to 48px tall and
|
|
4499
|
+
produced a lozenge four-across in the header. Here the VISUAL stays
|
|
4500
|
+
40px square and the TOUCH TARGET reaches the tier through a hit
|
|
4501
|
+
slop, which is the point of the tier: a thumb needs 48px, an eye
|
|
4502
|
+
does not. */
|
|
4503
|
+
.detail-toolbar .right .btn,
|
|
4504
|
+
.search-toolbar .right .btn {
|
|
4505
|
+
position: relative;
|
|
4506
|
+
inline-size: var(--hit-base);
|
|
4507
|
+
block-size: var(--hit-base);
|
|
4508
|
+
min-inline-size: 0;
|
|
4509
|
+
min-block-size: 0;
|
|
4510
|
+
padding: 0;
|
|
4511
|
+
}
|
|
4512
|
+
|
|
4513
|
+
.detail-toolbar .right .btn::after,
|
|
4514
|
+
.search-toolbar .right .btn::after {
|
|
4515
|
+
content: '';
|
|
4516
|
+
position: absolute;
|
|
4517
|
+
/* (48 - 40) / 2 outward on every side */
|
|
4518
|
+
inset: calc((var(--hit-touch) - var(--hit-base)) / -2);
|
|
4519
|
+
}
|
|
4520
|
+
}
|
|
4521
|
+
|
|
4522
|
+
|
|
4523
|
+
/* ── MOBILE BOTTOM BAR ──────────────────────────────────────────────
|
|
4524
|
+
The phone shell renders a 64px tab bar fixed to the bottom edge.
|
|
4525
|
+
Anything else pinned down there has to clear it, so the height is
|
|
4526
|
+
published as a token rather than copied as a magic number: the order
|
|
4527
|
+
builder's totals pill sat at bottom: 20px and covered the
|
|
4528
|
+
Administration tab, taking a primary navigation destination with it.
|
|
4529
|
+
0px above the breakpoint, where no tab bar is rendered. */
|
|
4530
|
+
:root {
|
|
4531
|
+
--app-bottom-bar: 0px;
|
|
4532
|
+
}
|
|
4533
|
+
|
|
4534
|
+
@media (max-width: 767px) {
|
|
4535
|
+
:root {
|
|
4536
|
+
--app-bottom-bar: 64px;
|
|
4537
|
+
}
|
|
4619
4538
|
}
|
package/types/elasticias-ui.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import * as _angular_core from '@angular/core';
|
|
2
2
|
import { PipeTransform, OnInit, OnChanges, TemplateRef, EventEmitter, AfterContentInit, OnDestroy, SimpleChanges, InjectionToken, AfterViewInit } from '@angular/core';
|
|
3
|
+
import * as _elasticias_screens from '@elasticias/screens';
|
|
4
|
+
import { EfDataCardColumn, ScreenContext, EfDetailToolbarAction, EfSearchToolbarAction, EfDataCardSort, EfDataCardExportRequest, EfDateRange, EfDatePresetKey } from '@elasticias/screens';
|
|
5
|
+
export { EfDataCardColumn, EfDataCardColumnAlign, EfDataCardColumnMobileRole, EfDataCardColumnType, EfDataCardSort, EfDataCardSortDirection, EfDatePresetKey, EfDateRange, EfDetailToolbarAction, EfSearchToolbarAction } from '@elasticias/screens';
|
|
3
6
|
import { Menu } from 'primeng/menu';
|
|
4
7
|
import * as _elasticias_core from '@elasticias/core';
|
|
5
8
|
import { EfBuildPackage, EfModule, EfNavSection, EfNavItem, EfModuleId, EfToast, EfToastAction, EfThemeConfigService } from '@elasticias/core';
|
|
6
9
|
import * as i1 from 'primeng/tooltip';
|
|
7
|
-
import * as _elasticias_screens from '@elasticias/screens';
|
|
8
|
-
import { ScreenContext, EfDetailToolbarAction, EfSearchToolbarAction, EfDataCardColumn, EfDataCardSort, EfDataCardExportRequest, EfDateRange, EfDatePresetKey } from '@elasticias/screens';
|
|
9
|
-
export { EfDataCardColumn, EfDataCardColumnAlign, EfDataCardColumnMobileRole, EfDataCardColumnType, EfDataCardSort, EfDataCardSortDirection, EfDatePresetKey, EfDateRange, EfDetailToolbarAction, EfSearchToolbarAction } from '@elasticias/screens';
|
|
10
10
|
import { BlockableUI } from 'primeng/api';
|
|
11
11
|
import { SafeResourceUrl } from '@angular/platform-browser';
|
|
12
12
|
import { ChartConfiguration } from 'chart.js';
|
|
@@ -435,8 +435,18 @@ declare class EfOrderBuilderComponent implements OnInit {
|
|
|
435
435
|
id: OrderLineItem["id"];
|
|
436
436
|
field: EditableLineField;
|
|
437
437
|
}>;
|
|
438
|
-
/**
|
|
439
|
-
|
|
438
|
+
/**
|
|
439
|
+
* Columns for the lines table.
|
|
440
|
+
*
|
|
441
|
+
* Only the article column is elastic: it carries no width and so absorbs
|
|
442
|
+
* whatever the fixed columns leave. Every other column holds a number whose
|
|
443
|
+
* magnitude is known in advance, so a fixed track keeps the decimal points
|
|
444
|
+
* aligned down the table instead of letting the longest product description
|
|
445
|
+
* shift them. The `mobile` roles decide what `ef-data-card` shows on a
|
|
446
|
+
* phone before the row is expanded, which is why the article leads and the
|
|
447
|
+
* subtotal reads as the row's status.
|
|
448
|
+
*/
|
|
449
|
+
readonly lineColumns: _angular_core.Signal<EfDataCardColumn[]>;
|
|
440
450
|
isEditingCell(item: OrderLineItem, field: EditableLineField): boolean;
|
|
441
451
|
startEditCell(item: OrderLineItem, field: EditableLineField): void;
|
|
442
452
|
stopEditCell(): void;
|
|
@@ -448,6 +458,17 @@ declare class EfOrderBuilderComponent implements OnInit {
|
|
|
448
458
|
recapColumns: _angular_core.Signal<OrderSummaryItem[][]>;
|
|
449
459
|
constructor();
|
|
450
460
|
ngOnInit(): void;
|
|
461
|
+
/**
|
|
462
|
+
* Move a line to a new position.
|
|
463
|
+
*
|
|
464
|
+
* The order of an order's lines is data the operator owns — it is the order
|
|
465
|
+
* the picker walks the shelves in and the order the printed document reads
|
|
466
|
+
* in — so it is reordered by hand rather than derived from a sort.
|
|
467
|
+
*/
|
|
468
|
+
reorderLine(ev: {
|
|
469
|
+
from: number;
|
|
470
|
+
to: number;
|
|
471
|
+
}): void;
|
|
451
472
|
removeOrderLine(id: string | number | undefined): void;
|
|
452
473
|
onFieldChange(item: OrderLineItem): void;
|
|
453
474
|
calculateSubtotal(item: OrderLineItem): number;
|
|
@@ -2460,8 +2481,10 @@ declare class EfCardComponent {
|
|
|
2460
2481
|
}
|
|
2461
2482
|
|
|
2462
2483
|
/**
|
|
2463
|
-
* 12-column form-grid primitive. Children use `.col-
|
|
2464
|
-
* to claim spans;
|
|
2484
|
+
* 12-column form-grid primitive. Children use `.col-1` through
|
|
2485
|
+
* `.col-12` to claim spans; at 767px and below (the shell's own
|
|
2486
|
+
* mobile breakpoint) every span collapses to the full 12, so a
|
|
2487
|
+
* field never carries a per-breakpoint span of its own.
|
|
2465
2488
|
*
|
|
2466
2489
|
* ```html
|
|
2467
2490
|
* <ef-form-grid>
|
|
@@ -4496,6 +4519,40 @@ declare class EfDataCardComponent<TRow = any> implements AfterContentInit {
|
|
|
4496
4519
|
numberFormat(col: EfDataCardColumn): string;
|
|
4497
4520
|
/** Which tools panel is open, if any. */
|
|
4498
4521
|
readonly openTool: _angular_core.WritableSignal<"density" | "columns">;
|
|
4522
|
+
/**
|
|
4523
|
+
* Density this table starts at.
|
|
4524
|
+
*
|
|
4525
|
+
* A viewer's own choice, restored from storage via `tableKey`, still wins;
|
|
4526
|
+
* this only moves the starting point for a table whose rows are meant to be
|
|
4527
|
+
* scanned in bulk (an order's lines, say) rather than read one at a time.
|
|
4528
|
+
*/
|
|
4529
|
+
readonly defaultDensity: _angular_core.InputSignal<EfTableDensity>;
|
|
4530
|
+
/**
|
|
4531
|
+
* Let the viewer drag rows into a new order. Off by default: reordering
|
|
4532
|
+
* only means something where the row order is itself data the user owns
|
|
4533
|
+
* (an order's lines), not on a list whose order comes from a sort.
|
|
4534
|
+
*
|
|
4535
|
+
* Adds a leading handle column; the row is only draggable by that handle,
|
|
4536
|
+
* so selecting text in a cell still works.
|
|
4537
|
+
*/
|
|
4538
|
+
readonly reorderable: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
4539
|
+
/** The moved row's original and new index, once the drag settles. */
|
|
4540
|
+
readonly rowReorder: _angular_core.OutputEmitterRef<{
|
|
4541
|
+
from: number;
|
|
4542
|
+
to: number;
|
|
4543
|
+
}>;
|
|
4544
|
+
/** Index being dragged, and the index it would land on. */
|
|
4545
|
+
readonly dragFrom: _angular_core.WritableSignal<number>;
|
|
4546
|
+
readonly dragTo: _angular_core.WritableSignal<number>;
|
|
4547
|
+
onDragPointerDown(index: number, ev: PointerEvent): void;
|
|
4548
|
+
onDragPointerMove(ev: PointerEvent): void;
|
|
4549
|
+
onDragPointerUp(): void;
|
|
4550
|
+
/**
|
|
4551
|
+
* Keyboard equivalent of the drag. A handle that only answers to a pointer
|
|
4552
|
+
* puts the row order out of reach of anyone not using a mouse, so the same
|
|
4553
|
+
* move is on the arrow keys while the handle has focus.
|
|
4554
|
+
*/
|
|
4555
|
+
onDragKeydown(index: number, ev: KeyboardEvent): void;
|
|
4499
4556
|
/** Row density. Applied as a class on `.tbl-wrap`. */
|
|
4500
4557
|
readonly density: _angular_core.WritableSignal<EfTableDensity>;
|
|
4501
4558
|
/** Column ids the viewer has hidden. */
|
|
@@ -4568,7 +4625,7 @@ declare class EfDataCardComponent<TRow = any> implements AfterContentInit {
|
|
|
4568
4625
|
trackByRow: (_: number, row: TRow) => unknown;
|
|
4569
4626
|
trackByColumn: (_: number, col: EfDataCardColumn) => string;
|
|
4570
4627
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfDataCardComponent<any>, never>;
|
|
4571
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfDataCardComponent<any>, "ef-data-card", never, { "mobileLayout": { "alias": "mobileLayout"; "required": false; "isSignal": true; }; "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "trackByField": { "alias": "trackByField"; "required": false; "isSignal": true; }; "pageNumber": { "alias": "pageNumber"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "totalCount": { "alias": "totalCount"; "required": false; "isSignal": true; }; "pageSizeOptions": { "alias": "pageSizeOptions"; "required": false; "isSignal": true; }; "hidePager": { "alias": "hidePager"; "required": false; "isSignal": true; }; "sort": { "alias": "sort"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "errorMsg": { "alias": "errorMsg"; "required": false; "isSignal": true; }; "loadingKey": { "alias": "loadingKey"; "required": false; "isSignal": true; }; "rowDoubleClickable": { "alias": "rowDoubleClickable"; "required": false; "isSignal": true; }; "hasActionsColumn": { "alias": "hasActionsColumn"; "required": false; "isSignal": true; }; "rowActionsContext": { "alias": "rowActionsContext"; "required": false; "isSignal": true; }; "showViewAction": { "alias": "showViewAction"; "required": false; "isSignal": true; }; "showEditAction": { "alias": "showEditAction"; "required": false; "isSignal": true; }; "showDuplicateAction": { "alias": "showDuplicateAction"; "required": false; "isSignal": true; }; "showDeleteAction": { "alias": "showDeleteAction"; "required": false; "isSignal": true; }; "showDensityControl": { "alias": "showDensityControl"; "required": false; "isSignal": true; }; "showColumnPicker": { "alias": "showColumnPicker"; "required": false; "isSignal": true; }; "showExportControl": { "alias": "showExportControl"; "required": false; "isSignal": true; }; "exporting": { "alias": "exporting"; "required": false; "isSignal": true; }; "screenContext": { "alias": "screenContext"; "required": false; "isSignal": true; }; "searchTerm": { "alias": "searchTerm"; "required": false; "isSignal": true; }; "tableKey": { "alias": "tableKey"; "required": false; "isSignal": true; }; }, { "pageChange": "pageChange"; "pageSizeChange": "pageSizeChange"; "sortChange": "sortChange"; "rowDoubleClick": "rowDoubleClick"; "rowAction": "rowAction"; "exportRequest": "exportRequest"; "clearSearch": "clearSearch"; }, ["bodyTemplates", "headerTemplates"], ["[tbl-head-info]", "[tbl-head-actions]", "[empty-state-mobile]", "[empty-state]"], true, never>;
|
|
4628
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<EfDataCardComponent<any>, "ef-data-card", never, { "mobileLayout": { "alias": "mobileLayout"; "required": false; "isSignal": true; }; "columns": { "alias": "columns"; "required": false; "isSignal": true; }; "rows": { "alias": "rows"; "required": false; "isSignal": true; }; "trackByField": { "alias": "trackByField"; "required": false; "isSignal": true; }; "pageNumber": { "alias": "pageNumber"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "totalCount": { "alias": "totalCount"; "required": false; "isSignal": true; }; "pageSizeOptions": { "alias": "pageSizeOptions"; "required": false; "isSignal": true; }; "hidePager": { "alias": "hidePager"; "required": false; "isSignal": true; }; "sort": { "alias": "sort"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "errorMsg": { "alias": "errorMsg"; "required": false; "isSignal": true; }; "loadingKey": { "alias": "loadingKey"; "required": false; "isSignal": true; }; "rowDoubleClickable": { "alias": "rowDoubleClickable"; "required": false; "isSignal": true; }; "hasActionsColumn": { "alias": "hasActionsColumn"; "required": false; "isSignal": true; }; "rowActionsContext": { "alias": "rowActionsContext"; "required": false; "isSignal": true; }; "showViewAction": { "alias": "showViewAction"; "required": false; "isSignal": true; }; "showEditAction": { "alias": "showEditAction"; "required": false; "isSignal": true; }; "showDuplicateAction": { "alias": "showDuplicateAction"; "required": false; "isSignal": true; }; "showDeleteAction": { "alias": "showDeleteAction"; "required": false; "isSignal": true; }; "showDensityControl": { "alias": "showDensityControl"; "required": false; "isSignal": true; }; "showColumnPicker": { "alias": "showColumnPicker"; "required": false; "isSignal": true; }; "showExportControl": { "alias": "showExportControl"; "required": false; "isSignal": true; }; "exporting": { "alias": "exporting"; "required": false; "isSignal": true; }; "screenContext": { "alias": "screenContext"; "required": false; "isSignal": true; }; "searchTerm": { "alias": "searchTerm"; "required": false; "isSignal": true; }; "tableKey": { "alias": "tableKey"; "required": false; "isSignal": true; }; "defaultDensity": { "alias": "defaultDensity"; "required": false; "isSignal": true; }; "reorderable": { "alias": "reorderable"; "required": false; "isSignal": true; }; }, { "pageChange": "pageChange"; "pageSizeChange": "pageSizeChange"; "sortChange": "sortChange"; "rowDoubleClick": "rowDoubleClick"; "rowAction": "rowAction"; "exportRequest": "exportRequest"; "clearSearch": "clearSearch"; "rowReorder": "rowReorder"; }, ["bodyTemplates", "headerTemplates"], ["[tbl-head-info]", "[tbl-head-actions]", "[empty-state-mobile]", "[empty-state]"], true, never>;
|
|
4572
4629
|
}
|
|
4573
4630
|
|
|
4574
4631
|
/**
|
|
@@ -4611,6 +4668,42 @@ declare class EfColumnHeaderTemplateDirective {
|
|
|
4611
4668
|
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<EfColumnHeaderTemplateDirective, "[efColumnHeaderTemplate]", never, { "columnId": { "alias": "efColumnHeaderTemplate"; "required": true; }; }, {}, never, never, true, never>;
|
|
4612
4669
|
}
|
|
4613
4670
|
|
|
4671
|
+
/**
|
|
4672
|
+
* Feeds a cell's full text to the `ef-tooltip` sitting on the same element,
|
|
4673
|
+
* but only when that text is actually clipped.
|
|
4674
|
+
*
|
|
4675
|
+
* A column wide enough for the longest product description would starve every
|
|
4676
|
+
* other column, so the description ellipsises. The operator is then left with
|
|
4677
|
+
* a row they cannot read and nothing telling them the rest exists. This gives
|
|
4678
|
+
* it back on hover, through the same comptoir-skinned tooltip the rest of the
|
|
4679
|
+
* product uses rather than the browser's unstyled `title` bubble.
|
|
4680
|
+
*
|
|
4681
|
+
* The directive is always attached; what varies is whether it has anything to
|
|
4682
|
+
* say. A cell whose text fits gets its tooltip disabled, so hovering a number
|
|
4683
|
+
* that is fully visible does not pop a bubble repeating it.
|
|
4684
|
+
*
|
|
4685
|
+
* Measuring happens on `mouseenter`/`focusin` rather than from a ResizeObserver
|
|
4686
|
+
* per cell: a 150-line table is a thousand observers for information nobody
|
|
4687
|
+
* needs until a pointer is over one of them, and the tooltip's own show delay
|
|
4688
|
+
* leaves ample time to measure.
|
|
4689
|
+
*
|
|
4690
|
+
* Truncation can happen on the cell or on an element inside it (the order
|
|
4691
|
+
* builder ellipsises an inner `.nm` span, not the `td`), so both are checked.
|
|
4692
|
+
*/
|
|
4693
|
+
declare class EfOverflowTooltipDirective {
|
|
4694
|
+
private readonly host;
|
|
4695
|
+
/** Provided by the `efTooltip` host directive on the same element. */
|
|
4696
|
+
private readonly tooltip;
|
|
4697
|
+
/** 1px of slack: sub-pixel layout rounding otherwise reads as clipped. */
|
|
4698
|
+
private static readonly SLACK;
|
|
4699
|
+
protected sync(): void;
|
|
4700
|
+
/** The cell itself, or the first descendant whose text is cut off. */
|
|
4701
|
+
private findClipped;
|
|
4702
|
+
private isClipped;
|
|
4703
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<EfOverflowTooltipDirective, never>;
|
|
4704
|
+
static ɵdir: _angular_core.ɵɵDirectiveDeclaration<EfOverflowTooltipDirective, "[efOverflowTooltip]", never, {}, {}, never, never, true, never>;
|
|
4705
|
+
}
|
|
4706
|
+
|
|
4614
4707
|
/**
|
|
4615
4708
|
* Row-actions dropdown — V2 successor to `ef-datatable-actionbar`.
|
|
4616
4709
|
*
|
|
@@ -5677,5 +5770,5 @@ declare class EfEmailMetricsCardComponent {
|
|
|
5677
5770
|
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>;
|
|
5678
5771
|
}
|
|
5679
5772
|
|
|
5680
|
-
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 };
|
|
5773
|
+
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, EfOverflowTooltipDirective, 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 };
|
|
5681
5774
|
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 };
|