@fxlt/common-ui 0.0.4 → 0.0.5-rc2

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/animations.css CHANGED
@@ -113,3 +113,18 @@
113
113
  .fade-out-animation {
114
114
  animation: fade-out 0.4s ease-out forwards;
115
115
  }
116
+
117
+ @keyframes pulse-glow {
118
+ 0%,
119
+ 100% {
120
+ opacity: 1;
121
+ filter: brightness(1);
122
+ }
123
+ 50% {
124
+ opacity: 0.7;
125
+ filter: brightness(1.4);
126
+ }
127
+ }
128
+ .animate-pulse-glow {
129
+ animation: pulse-glow 3s ease-in-out infinite;
130
+ }
package/components.css CHANGED
@@ -104,10 +104,6 @@
104
104
  .mdc-data-table__cell {
105
105
  border-left: 1px solid rgb(var(--border-default)) !important;
106
106
  background-color: rgb(var(--bg-primary)) !important;
107
- /* padding-top: 8px !important;
108
- padding-bottom: 8px !important;
109
- padding-left: 16px !important;
110
- padding-right: 16px !important; */
111
107
  font-family: 'BeVietnamPro';
112
108
  }
113
109
 
@@ -166,6 +162,9 @@ input[type='password'] {
166
162
  }
167
163
 
168
164
  /* system style */
165
+ .txt-heading-02 {
166
+ @apply font-semibold text-4xl tracking-normal leading-10 text-text-primary;
167
+ }
169
168
  .txt-heading-03 {
170
169
  @apply font-semibold text-3xl tracking-normal leading-10 text-text-primary;
171
170
  }
@@ -413,25 +412,12 @@ input[type='password'] {
413
412
  }
414
413
  /* progress bar */
415
414
  .progress-bar-container {
416
- @apply bg-bg-hover mt-semi rounded-full h-1.5 overflow-hidden shadow-inner;
415
+ @apply bg-bg-hover mt-semi rounded-md h-1.5 overflow-hidden shadow-inner;
417
416
  }
418
417
  .progress-bar-buffer {
419
- @apply h-1.5 bg-primary rounded-full transition-all duration-700 ease-in-out animate-pulse-glow;
420
- }
421
- @keyframes pulse-glow {
422
- 0%,
423
- 100% {
424
- opacity: 1;
425
- filter: brightness(1);
426
- }
427
- 50% {
428
- opacity: 0.7;
429
- filter: brightness(1.4);
430
- }
431
- }
432
- .animate-pulse-glow {
433
- animation: pulse-glow 3s ease-in-out infinite;
418
+ @apply h-1.5 bg-primary rounded-md transition-all duration-700 ease-in-out;
434
419
  }
420
+
435
421
  /* radio button */
436
422
  .radio-container {
437
423
  @apply w-large h-large flex items-center justify-center rounded-full border;
@@ -485,3 +471,6 @@ input[type='password'] {
485
471
  rgb(var(--gradient-primary-end))
486
472
  ) border-box;
487
473
  }
474
+ .skeleton-load {
475
+ @apply rounded bg-gray-200 animate-pulse motion-reduce:animate-none;
476
+ }
@@ -1,8 +1,8 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { Directive, Input, Component, createComponent, Injectable, ViewChild, Inject, EventEmitter, NgModule, HostListener, PLATFORM_ID, Output, Optional, Self, ChangeDetectionStrategy, TemplateRef, ContentChildren, ViewChildren, importProvidersFrom } from '@angular/core';
3
- import * as i32 from '@angular/material/paginator';
3
+ import * as i33 from '@angular/material/paginator';
4
4
  import { MatPaginator, MatPaginatorModule } from '@angular/material/paginator';
5
- import * as i33 from '@angular/material/table';
5
+ import * as i34 from '@angular/material/table';
6
6
  import { MatTableDataSource, MatTable, MatTableModule } from '@angular/material/table';
7
7
  import * as i2 from '@angular/common';
8
8
  import { isPlatformBrowser, CommonModule } from '@angular/common';
@@ -23,36 +23,36 @@ import * as i2$2 from '@angular/router';
23
23
  import { catchError } from 'rxjs/operators';
24
24
  import * as i3$1 from '@angular/material/select';
25
25
  import { MatSelectModule } from '@angular/material/select';
26
- import * as i29 from '@angular/material/radio';
26
+ import * as i30 from '@angular/material/radio';
27
27
  import { MatRadioModule } from '@angular/material/radio';
28
- import * as i30 from '@angular/material/button';
28
+ import * as i31 from '@angular/material/button';
29
29
  import { MatButtonModule } from '@angular/material/button';
30
- import * as i31 from '@angular/material/icon';
30
+ import * as i32 from '@angular/material/icon';
31
31
  import { MatIconModule } from '@angular/material/icon';
32
- import * as i34 from '@angular/material/snack-bar';
32
+ import * as i35 from '@angular/material/snack-bar';
33
33
  import { MatSnackBarModule } from '@angular/material/snack-bar';
34
- import * as i36 from '@angular/material/checkbox';
34
+ import * as i37 from '@angular/material/checkbox';
35
35
  import { MatCheckboxModule } from '@angular/material/checkbox';
36
- import * as i37 from '@angular/material/card';
36
+ import * as i38 from '@angular/material/card';
37
37
  import { MatCardModule } from '@angular/material/card';
38
- import * as i38 from '@angular/material/datepicker';
38
+ import * as i39 from '@angular/material/datepicker';
39
39
  import { MatDatepickerModule } from '@angular/material/datepicker';
40
- import * as i39 from '@angular/material/timepicker';
40
+ import * as i40 from '@angular/material/timepicker';
41
41
  import { MatTimepickerModule } from '@angular/material/timepicker';
42
- import * as i40 from '@angular/material/badge';
42
+ import * as i41 from '@angular/material/badge';
43
43
  import { MatBadgeModule } from '@angular/material/badge';
44
- import * as i41 from '@angular/material/expansion';
44
+ import * as i42 from '@angular/material/expansion';
45
45
  import { MatExpansionModule } from '@angular/material/expansion';
46
- import * as i42 from '@angular/material/form-field';
46
+ import * as i43 from '@angular/material/form-field';
47
47
  import { MatFormFieldModule } from '@angular/material/form-field';
48
- import * as i43 from '@angular/material/menu';
48
+ import * as i44 from '@angular/material/menu';
49
49
  import { MatMenuModule } from '@angular/material/menu';
50
50
  import * as i3 from '@danielmoncada/angular-datetime-picker';
51
51
  import { OwlDateTimeModule, OwlNativeDateTimeModule, OWL_DATE_TIME_FORMATS } from '@danielmoncada/angular-datetime-picker';
52
52
  import * as i2$3 from 'ngx-echarts';
53
53
  import { NgxEchartsModule } from 'ngx-echarts';
54
54
  import { __decorate, __param } from 'tslib';
55
- import * as i26 from 'ngx-vflow';
55
+ import * as i27 from 'ngx-vflow';
56
56
  import { Vflow } from 'ngx-vflow';
57
57
  import { OwlMomentDateTimeModule } from '@danielmoncada/angular-datetime-picker-moment-adapter';
58
58
 
@@ -257,7 +257,7 @@ class FxUtils {
257
257
  return this.isNull(obj) || obj.length === 0;
258
258
  }
259
259
  static isArrayNotEmpty(obj) {
260
- return !FxUtils.isArrayEmpty(obj);
260
+ return !this.isArrayEmpty(obj);
261
261
  }
262
262
  static replaceStartWithAsterisk(inputString, numToReplace) {
263
263
  if (numToReplace >= inputString.length) {
@@ -356,6 +356,24 @@ class FxUtils {
356
356
  const regex = /^(?=.{6,}$)(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^A-Za-z0-9]).*$/;
357
357
  return regex.test(password);
358
358
  }
359
+ static formatSizeUnits(bytes) {
360
+ if (bytes >= 1073741824) {
361
+ return (bytes / 1073741824).toFixed(2) + " GB";
362
+ }
363
+ else if (bytes >= 1048576) {
364
+ return (bytes / 1048576).toFixed(2) + " MB";
365
+ }
366
+ else if (bytes >= 1024) {
367
+ return (bytes / 1024).toFixed(2) + " KB";
368
+ }
369
+ else if (bytes > 1) {
370
+ return bytes + " bytes";
371
+ }
372
+ else if (bytes == 1) {
373
+ return bytes + " byte";
374
+ }
375
+ return "0 bytes";
376
+ }
359
377
  }
360
378
 
361
379
  class HttpWrapper {
@@ -455,6 +473,7 @@ class BaseTableComponent extends BaseComponent {
455
473
  toastr;
456
474
  _lock = false;
457
475
  keywordChange$ = new Subject();
476
+ dataSourcePlaceholder;
458
477
  config;
459
478
  paginator;
460
479
  table;
@@ -469,10 +488,16 @@ class BaseTableComponent extends BaseComponent {
469
488
  this.keywordChange$.pipe(debounceTime(300)).subscribe(async (keyword) => {
470
489
  await this.refresh();
471
490
  });
491
+ this.dataSourcePlaceholder = Array(this.pageSize).fill({});
472
492
  this.init();
473
493
  }
474
494
  init() { }
475
495
  ngAfterViewInit() {
496
+ if (this.paginator && this.paginator.page) {
497
+ this.paginator.page.subscribe(event => {
498
+ this.onPageChange(event);
499
+ });
500
+ }
476
501
  this.ref.detectChanges();
477
502
  }
478
503
  async refresh() {
@@ -486,7 +511,7 @@ class BaseTableComponent extends BaseComponent {
486
511
  async fetch() {
487
512
  this.loading = true;
488
513
  try {
489
- const params = { page: this.page + 1, pageSize: this.pageSize, ...this.filters };
514
+ const params = { page: (this.page ?? 0) + 1, pageSize: this.pageSize, ...this.filters };
490
515
  const result = await this.api.search(params);
491
516
  this.setDataSource(result);
492
517
  }
@@ -658,8 +683,14 @@ class BaseTableComponent extends BaseComponent {
658
683
  throw err;
659
684
  }
660
685
  }
661
- value(model, key) {
662
- return _.get(model, key);
686
+ tagClass(tag) {
687
+ return FxUtils.getTagClass(tag);
688
+ }
689
+ capitalize(label) {
690
+ return _.capitalize(label);
691
+ }
692
+ value(model, key, defaultValue) {
693
+ return _.get(model, key, defaultValue);
663
694
  }
664
695
  toggleExpand(element) {
665
696
  this.expandedElement = this.expandedElement === element ? null : element;
@@ -1312,18 +1343,31 @@ class ChartComponent {
1312
1343
  palette;
1313
1344
  height = '400px';
1314
1345
  loading = false;
1346
+ pieLegendAlign = '10%';
1347
+ pieLegendPosition = 'middle';
1348
+ showPieLabel = true;
1349
+ labelFontFamily = 'BeVietnamPro';
1315
1350
  chartClick = new EventEmitter();
1316
1351
  chartInit = new EventEmitter();
1317
1352
  labelFontSize = 12;
1318
- labelFontFamily = 'BeVietnamPro';
1353
+ canInit = false;
1319
1354
  chartOptions = {};
1320
1355
  chartInstance;
1321
1356
  resizeObserver;
1357
+ intersectionObserver;
1322
1358
  constructor(ref, cdr) {
1323
1359
  this.ref = ref;
1324
1360
  this.cdr = cdr;
1325
1361
  }
1326
1362
  ngAfterViewInit() {
1363
+ this.intersectionObserver = new IntersectionObserver(([entry]) => {
1364
+ if (entry.isIntersecting && !this.canInit) {
1365
+ this.canInit = true;
1366
+ this.rebuildChart();
1367
+ this.cdr.detectChanges();
1368
+ }
1369
+ }, { threshold: 0.1 });
1370
+ this.intersectionObserver.observe(this.ref.nativeElement);
1327
1371
  this.resizeObserver = new ResizeObserver(() => {
1328
1372
  if (this.chartInstance)
1329
1373
  this.chartInstance.resize();
@@ -1331,11 +1375,13 @@ class ChartComponent {
1331
1375
  this.resizeObserver.observe(this.ref.nativeElement);
1332
1376
  }
1333
1377
  ngOnDestroy() {
1334
- if (this.resizeObserver)
1335
- this.resizeObserver.disconnect();
1378
+ this.resizeObserver?.disconnect();
1379
+ this.intersectionObserver?.disconnect();
1336
1380
  }
1337
1381
  ngOnChanges() {
1338
- this.rebuildChart();
1382
+ if (this.canInit) {
1383
+ this.rebuildChart();
1384
+ }
1339
1385
  }
1340
1386
  onThemeChange() {
1341
1387
  requestAnimationFrame(() => {
@@ -1348,8 +1394,7 @@ class ChartComponent {
1348
1394
  onChartInit(chart) {
1349
1395
  this.chartInstance = chart;
1350
1396
  this.chartInit.emit(chart);
1351
- requestAnimationFrame(() => this.chartInstance?.resize());
1352
- setTimeout(() => this.chartInstance?.resize(), 100);
1397
+ requestAnimationFrame(() => chart.resize());
1353
1398
  }
1354
1399
  rebuildChart() {
1355
1400
  this.chartOptions = this.buildOptions();
@@ -1373,9 +1418,13 @@ class ChartComponent {
1373
1418
  type: 'category',
1374
1419
  data: data?.categories || [],
1375
1420
  axisLabel: {
1421
+ interval: 0,
1376
1422
  fontFamily: this.labelFontFamily,
1377
1423
  fontSize: this.labelFontSize,
1378
1424
  color: FxUtils.convertColorFromVariable('--text-secondary'),
1425
+ width: 80,
1426
+ overflow: 'truncate',
1427
+ ellipsis: '…',
1379
1428
  },
1380
1429
  axisLine: {
1381
1430
  lineStyle: { color: FxUtils.convertColorFromVariable('--border-strong') },
@@ -1399,6 +1448,12 @@ class ChartComponent {
1399
1448
  series: [
1400
1449
  {
1401
1450
  type: 'bar',
1451
+ itemStyle: {
1452
+ color: (params) => {
1453
+ const palette = colors || [];
1454
+ return palette[params.dataIndex % palette.length];
1455
+ },
1456
+ },
1402
1457
  data: data?.values || [],
1403
1458
  label: {
1404
1459
  show: true,
@@ -1413,58 +1468,106 @@ class ChartComponent {
1413
1468
  },
1414
1469
  ],
1415
1470
  }),
1416
- pie: (data, colors) => ({
1417
- color: colors,
1418
- tooltip: { trigger: 'item' },
1419
- legend: {
1420
- orient: 'vertical',
1421
- top: 'bottom',
1422
- right: 10,
1423
- textStyle: {
1424
- fontFamily: "BeVietnamPro",
1425
- color: FxUtils.convertColorFromVariable('--text-primary'),
1426
- fontSize: 12,
1427
- fontWeight: 500,
1428
- },
1429
- icon: 'circle',
1430
- itemGap: 8,
1431
- padding: 0,
1432
- },
1433
- series: [
1434
- {
1435
- type: 'pie',
1436
- radius: ['40%', '70%'],
1437
- avoidLabelOverlap: true,
1438
- data,
1439
- label: {
1440
- //{a} Series name
1441
- //{b} Data name (slice label)
1442
- //{c} Data value
1443
- //{d} Percentage
1444
- formatter: '{b}: {c}',
1445
- fontSize: this.labelFontSize,
1471
+ pie: (data, colors) => {
1472
+ const total = data.reduce((sum, d) => sum + d.value, 0);
1473
+ return {
1474
+ color: colors,
1475
+ tooltip: { trigger: 'item' },
1476
+ legend: {
1477
+ orient: 'vertical',
1478
+ right: this.pieLegendAlign,
1479
+ top: this.pieLegendPosition,
1480
+ icon: 'circle',
1481
+ align: 'left',
1482
+ itemGap: 12,
1483
+ formatter: (name) => {
1484
+ const item = data.find((d) => d.name === name);
1485
+ return item ? `${name}: ${item.value}` : name;
1486
+ },
1487
+ textStyle: {
1446
1488
  fontFamily: this.labelFontFamily,
1489
+ fontSize: 13,
1490
+ fontWeight: 500,
1447
1491
  color: FxUtils.convertColorFromVariable('--text-primary'),
1448
- textBorderWidth: 0,
1449
- textBorderColor: 'transparent',
1450
1492
  },
1451
- labelLine: {
1452
- show: true,
1453
- length: 15,
1454
- length2: 15,
1455
- },
1456
- itemStyle: {
1457
- borderWidth: 0,
1493
+ },
1494
+ series: [
1495
+ {
1496
+ type: 'pie',
1497
+ radius: ['40%', '70%'],
1498
+ center: ['40%', '50%'],
1499
+ avoidLabelOverlap: true,
1500
+ data,
1501
+ label: {
1502
+ show: this.showPieLabel,
1503
+ //{a} Series name
1504
+ //{b} Data name (slice label)
1505
+ //{c} Data value
1506
+ //{d} Percentage
1507
+ position: 'outside',
1508
+ formatter: '{d}%',
1509
+ fontSize: this.labelFontSize,
1510
+ fontFamily: this.labelFontFamily,
1511
+ color: FxUtils.convertColorFromVariable('--text-primary'),
1512
+ textBorderWidth: 0,
1513
+ textBorderColor: 'transparent',
1514
+ },
1515
+ labelLine: {
1516
+ show: this.showPieLabel,
1517
+ length: 12,
1518
+ length2: 12,
1519
+ },
1520
+ itemStyle: {
1521
+ borderWidth: 0,
1522
+ },
1523
+ emphasis: {
1524
+ scale: true,
1525
+ scaleSize: 10,
1526
+ itemStyle: { borderWidth: 0 },
1527
+ label: { textBorderWidth: 0 },
1528
+ },
1458
1529
  },
1459
- emphasis: {
1460
- scale: true,
1461
- scaleSize: 10,
1462
- itemStyle: { borderWidth: 0 },
1463
- label: { textBorderWidth: 0 },
1530
+ ],
1531
+ media: [
1532
+ {
1533
+ query: { maxWidth: 480 },
1534
+ option: {
1535
+ legend: {
1536
+ orient: 'horizontal',
1537
+ left: 'center',
1538
+ bottom: 0,
1539
+ },
1540
+ series: [
1541
+ {
1542
+ center: ['50%', '40%'],
1543
+ },
1544
+ ],
1545
+ },
1464
1546
  },
1547
+ ],
1548
+ graphic: {
1549
+ type: 'group',
1550
+ left: '40%',
1551
+ top: '50%',
1552
+ bounding: 'raw',
1553
+ children: [
1554
+ {
1555
+ type: 'text',
1556
+ style: {
1557
+ text: total.toString(),
1558
+ fontSize: 24,
1559
+ fontWeight: 600,
1560
+ fontFamily: this.labelFontFamily,
1561
+ fill: FxUtils.convertColorFromVariable('--text-primary'),
1562
+ align: 'center',
1563
+ verticalAlign: 'middle',
1564
+ },
1565
+ y: 0,
1566
+ },
1567
+ ],
1465
1568
  },
1466
- ],
1467
- }),
1569
+ };
1570
+ },
1468
1571
  sunburst: (data, colors) => ({
1469
1572
  color: colors,
1470
1573
  series: [
@@ -1546,11 +1649,11 @@ class ChartComponent {
1546
1649
  });
1547
1650
  }
1548
1651
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ChartComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
1549
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: ChartComponent, isStandalone: false, selector: "fx-ui-chart", inputs: { type: "type", data: "data", options: "options", palette: "palette", height: "height", loading: "loading" }, outputs: { chartClick: "chartClick", chartInit: "chartInit" }, host: { listeners: { "window:theme-changed": "onThemeChange()" } }, usesOnChanges: true, ngImport: i0, template: "<div class=\"chart-wrapper\" [style.height]=\"height\" [class.loading]=\"loading\">\n <div\n echarts\n [options]=\"chartOptions\"\n (chartInit)=\"onChartInit($event)\"\n (chartClick)=\"onChartClick($event)\"\n class=\"w-full h-full\">\n </div>\n\n <div class=\"chart-loader\" *ngIf=\"loading\">\n <span class=\"txt-default\">Loading...</span>\n </div>\n</div>", styles: [".chart-wrapper{position:relative;width:100%}.chart-container{width:100%;height:100%}.chart-loader{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:rgba(var(--bg-primary-hover)/.6);font-weight:500;font-size:1.1rem;z-index:2;border-radius:4px}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$3.NgxEchartsDirective, selector: "echarts, [echarts]", inputs: ["options", "theme", "initOpts", "merge", "autoResize", "loading", "loadingType", "loadingOpts"], outputs: ["chartInit", "optionsError", "chartClick", "chartDblClick", "chartMouseDown", "chartMouseMove", "chartMouseUp", "chartMouseOver", "chartMouseOut", "chartGlobalOut", "chartContextMenu", "chartHighlight", "chartDownplay", "chartSelectChanged", "chartLegendSelectChanged", "chartLegendSelected", "chartLegendUnselected", "chartLegendLegendSelectAll", "chartLegendLegendInverseSelect", "chartLegendScroll", "chartDataZoom", "chartDataRangeSelected", "chartGraphRoam", "chartGeoRoam", "chartTreeRoam", "chartTimelineChanged", "chartTimelinePlayChanged", "chartRestore", "chartDataViewChanged", "chartMagicTypeChanged", "chartGeoSelectChanged", "chartGeoSelected", "chartGeoUnselected", "chartAxisAreaSelected", "chartBrush", "chartBrushEnd", "chartBrushSelected", "chartGlobalCursorTaken", "chartRendered", "chartFinished"], exportAs: ["echarts"] }] });
1652
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: ChartComponent, isStandalone: false, selector: "fx-ui-chart", inputs: { type: "type", data: "data", options: "options", palette: "palette", height: "height", loading: "loading", pieLegendAlign: "pieLegendAlign", pieLegendPosition: "pieLegendPosition", showPieLabel: "showPieLabel", labelFontFamily: "labelFontFamily" }, outputs: { chartClick: "chartClick", chartInit: "chartInit" }, host: { listeners: { "window:theme-changed": "onThemeChange()" } }, usesOnChanges: true, ngImport: i0, template: "<div class=\"chart-wrapper\" [style.height]=\"height\" [class.loading]=\"loading\">\n <ng-container *ngIf=\"canInit\">\n <div\n echarts\n [options]=\"chartOptions\"\n (chartInit)=\"onChartInit($event)\"\n (chartClick)=\"onChartClick($event)\"\n class=\"w-full h-full\">\n </div>\n </ng-container>\n\n <div class=\"chart-loader\" *ngIf=\"loading\">\n <span class=\"txt-default\">Loading...</span>\n </div>\n</div>\n", styles: [":host{display:block;width:100%}.chart-wrapper{position:relative;width:100%;height:100%}.chart-container{width:100%;height:100%}.chart-loader{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:rgba(var(--bg-primary-hover)/.6);font-weight:500;font-size:1.1rem;z-index:2;border-radius:4px}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$3.NgxEchartsDirective, selector: "echarts, [echarts]", inputs: ["options", "theme", "initOpts", "merge", "autoResize", "loading", "loadingType", "loadingOpts"], outputs: ["chartInit", "optionsError", "chartClick", "chartDblClick", "chartMouseDown", "chartMouseMove", "chartMouseUp", "chartMouseOver", "chartMouseOut", "chartGlobalOut", "chartContextMenu", "chartHighlight", "chartDownplay", "chartSelectChanged", "chartLegendSelectChanged", "chartLegendSelected", "chartLegendUnselected", "chartLegendLegendSelectAll", "chartLegendLegendInverseSelect", "chartLegendScroll", "chartDataZoom", "chartDataRangeSelected", "chartGraphRoam", "chartGeoRoam", "chartTreeRoam", "chartTimelineChanged", "chartTimelinePlayChanged", "chartRestore", "chartDataViewChanged", "chartMagicTypeChanged", "chartGeoSelectChanged", "chartGeoSelected", "chartGeoUnselected", "chartAxisAreaSelected", "chartBrush", "chartBrushEnd", "chartBrushSelected", "chartGlobalCursorTaken", "chartRendered", "chartFinished"], exportAs: ["echarts"] }] });
1550
1653
  }
1551
1654
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ChartComponent, decorators: [{
1552
1655
  type: Component,
1553
- args: [{ selector: 'fx-ui-chart', standalone: false, template: "<div class=\"chart-wrapper\" [style.height]=\"height\" [class.loading]=\"loading\">\n <div\n echarts\n [options]=\"chartOptions\"\n (chartInit)=\"onChartInit($event)\"\n (chartClick)=\"onChartClick($event)\"\n class=\"w-full h-full\">\n </div>\n\n <div class=\"chart-loader\" *ngIf=\"loading\">\n <span class=\"txt-default\">Loading...</span>\n </div>\n</div>", styles: [".chart-wrapper{position:relative;width:100%}.chart-container{width:100%;height:100%}.chart-loader{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:rgba(var(--bg-primary-hover)/.6);font-weight:500;font-size:1.1rem;z-index:2;border-radius:4px}\n"] }]
1656
+ args: [{ selector: 'fx-ui-chart', standalone: false, template: "<div class=\"chart-wrapper\" [style.height]=\"height\" [class.loading]=\"loading\">\n <ng-container *ngIf=\"canInit\">\n <div\n echarts\n [options]=\"chartOptions\"\n (chartInit)=\"onChartInit($event)\"\n (chartClick)=\"onChartClick($event)\"\n class=\"w-full h-full\">\n </div>\n </ng-container>\n\n <div class=\"chart-loader\" *ngIf=\"loading\">\n <span class=\"txt-default\">Loading...</span>\n </div>\n</div>\n", styles: [":host{display:block;width:100%}.chart-wrapper{position:relative;width:100%;height:100%}.chart-container{width:100%;height:100%}.chart-loader{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background:rgba(var(--bg-primary-hover)/.6);font-weight:500;font-size:1.1rem;z-index:2;border-radius:4px}\n"] }]
1554
1657
  }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }], propDecorators: { type: [{
1555
1658
  type: Input
1556
1659
  }], data: [{
@@ -1563,6 +1666,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
1563
1666
  type: Input
1564
1667
  }], loading: [{
1565
1668
  type: Input
1669
+ }], pieLegendAlign: [{
1670
+ type: Input
1671
+ }], pieLegendPosition: [{
1672
+ type: Input
1673
+ }], showPieLabel: [{
1674
+ type: Input
1675
+ }], labelFontFamily: [{
1676
+ type: Input
1566
1677
  }], chartClick: [{
1567
1678
  type: Output
1568
1679
  }], chartInit: [{
@@ -1921,7 +2032,7 @@ class FlowConnection {
1921
2032
  ];
1922
2033
  }
1923
2034
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: FlowConnection, deps: [], target: i0.ɵɵFactoryTarget.Component });
1924
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: FlowConnection, isStandalone: false, selector: "fx-ui-flow-connection", inputs: { nodes: "nodes", edges: "edges", backgroundColor: "backgroundColor", view: "view" }, ngImport: i0, template: "<vflow\n [background]=\"{\n type: 'solid',\n color: `rgba(var(${backgroundColor})`\n}\"\n [nodes]=\"nodes\"\n [edges]=\"edges\"\n (onConnect)=\"handleConnection($event)\"\n [view]=\"view\"\n/>\n", styles: [""], dependencies: [{ kind: "component", type: i26.VflowComponent, selector: "vflow", inputs: ["view", "minZoom", "maxZoom", "background", "optimization", "entitiesSelectable", "keyboardShortcuts", "connection", "snapGrid", "elevateNodesOnSelect", "elevateEdgesOnSelect", "nodes", "alignmentHelper", "edges"], outputs: ["onComponentNodeEvent"] }, { kind: "directive", type: i26.ConnectionControllerDirective, selector: "[onConnect], [onReconnect]", outputs: ["onConnect", "onReconnect"] }] });
2035
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.4", type: FlowConnection, isStandalone: false, selector: "fx-ui-flow-connection", inputs: { nodes: "nodes", edges: "edges", backgroundColor: "backgroundColor", view: "view" }, ngImport: i0, template: "<vflow\n [background]=\"{\n type: 'solid',\n color: `rgba(var(${backgroundColor})`\n}\"\n [nodes]=\"nodes\"\n [edges]=\"edges\"\n (onConnect)=\"handleConnection($event)\"\n [view]=\"view\"\n/>\n", styles: [""], dependencies: [{ kind: "component", type: i27.VflowComponent, selector: "vflow", inputs: ["view", "minZoom", "maxZoom", "background", "optimization", "entitiesSelectable", "keyboardShortcuts", "connection", "snapGrid", "elevateNodesOnSelect", "elevateEdgesOnSelect", "nodes", "alignmentHelper", "edges"], outputs: ["onComponentNodeEvent"] }, { kind: "directive", type: i27.ConnectionControllerDirective, selector: "[onConnect], [onReconnect]", outputs: ["onConnect", "onReconnect"] }] });
1925
2036
  }
1926
2037
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: FlowConnection, decorators: [{
1927
2038
  type: Component,
@@ -2699,6 +2810,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
2699
2810
  args: ['window:resize']
2700
2811
  }] } });
2701
2812
 
2813
+ class TableCell {
2814
+ loading;
2815
+ skeletonClass = 'h-4 w-full';
2816
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: TableCell, deps: [], target: i0.ɵɵFactoryTarget.Component });
2817
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.4", type: TableCell, isStandalone: false, selector: "fx-ui-table-cell", inputs: { loading: "loading", skeletonClass: "skeletonClass" }, ngImport: i0, template: "@if (!loading) {\n <div animate.enter=\"fade-in-animation\" class=\"inline-block my-normal\">\n <ng-content />\n </div>\n} @else {\n <div animate.enter=\"fade-in-animation\" class=\"skeleton-load my-semi\" [class]=\"skeletonClass\"></div>\n}\n", styles: [""] });
2818
+ }
2819
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: TableCell, decorators: [{
2820
+ type: Component,
2821
+ args: [{ selector: 'fx-ui-table-cell', standalone: false, template: "@if (!loading) {\n <div animate.enter=\"fade-in-animation\" class=\"inline-block my-normal\">\n <ng-content />\n </div>\n} @else {\n <div animate.enter=\"fade-in-animation\" class=\"skeleton-load my-semi\" [class]=\"skeletonClass\"></div>\n}\n" }]
2822
+ }], propDecorators: { loading: [{
2823
+ type: Input,
2824
+ args: [{ required: true }]
2825
+ }], skeletonClass: [{
2826
+ type: Input
2827
+ }] } });
2828
+
2702
2829
  class TagComponent {
2703
2830
  label;
2704
2831
  type = 'default';
@@ -2851,6 +2978,7 @@ const FX_COMPONENTS = [
2851
2978
  FlowConnection,
2852
2979
  CircleProgressBar,
2853
2980
  TreeDiagram,
2981
+ TableCell,
2854
2982
  ];
2855
2983
 
2856
2984
  class ConfirmationDialogComponent {
@@ -2906,7 +3034,7 @@ const MY_MOMENT_FORMATS = {
2906
3034
  };
2907
3035
  class UiModule {
2908
3036
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: UiModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
2909
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.4", ngImport: i0, type: UiModule, declarations: [InputComponent, SelectComponent, RadioButtonComponent, CheckboxComponent, DndUploadComponent, ButtonComponent, RadioButtonToggleComponent, DatetimePicker, LoadingPanel, SearchBarComponent, TabGroupComponent, TabComponent, HeroIconComponent, ToastComponent, ToastContainerComponent, TagComponent, ChartComponent, SliderComponent, SwitchComponent, RichTextAreaComponent, SkeletonTableLoadingComponent, FlowConnection, CircleProgressBar, TreeDiagram, ConfirmationDialogComponent], imports: [CommonModule,
3037
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.4", ngImport: i0, type: UiModule, declarations: [InputComponent, SelectComponent, RadioButtonComponent, CheckboxComponent, DndUploadComponent, ButtonComponent, RadioButtonToggleComponent, DatetimePicker, LoadingPanel, SearchBarComponent, TabGroupComponent, TabComponent, HeroIconComponent, ToastComponent, ToastContainerComponent, TagComponent, ChartComponent, SliderComponent, SwitchComponent, RichTextAreaComponent, SkeletonTableLoadingComponent, FlowConnection, CircleProgressBar, TreeDiagram, TableCell, ConfirmationDialogComponent], imports: [CommonModule,
2910
3038
  FormsModule,
2911
3039
  ReactiveFormsModule,
2912
3040
  OwlDateTimeModule,
@@ -2914,14 +3042,14 @@ class UiModule {
2914
3042
  OwlMomentDateTimeModule,
2915
3043
  HasPermissionDirective,
2916
3044
  TrimOnBlurDirective,
2917
- NgHeroiconsModule, i26.VflowComponent, i26.HandleComponent, i26.ResizableComponent, i26.SelectableDirective, i26.MiniMapComponent, i26.NodeToolbarComponent, i26.CustomTemplateEdgeComponent, i26.DragHandleDirective, i26.ConnectionControllerDirective, i26.NodeHtmlTemplateDirective, i26.NodeSvgTemplateDirective, i26.GroupNodeTemplateDirective, i26.EdgeLabelHtmlTemplateDirective, i26.EdgeTemplateDirective, i26.ConnectionTemplateDirective, i26.HandleTemplateDirective, i2$3.NgxEchartsModule, i3$1.MatSelectModule, i29.MatRadioModule, i30.MatButtonModule, i31.MatIconModule, i32.MatPaginatorModule, i33.MatTableModule, i34.MatSnackBarModule, i1$1.MatDialogModule, i36.MatCheckboxModule, i37.MatCardModule, i38.MatDatepickerModule, i39.MatTimepickerModule, i40.MatBadgeModule, i41.MatExpansionModule, i42.MatFormFieldModule, i43.MatMenuModule], exports: [InputComponent, SelectComponent, RadioButtonComponent, CheckboxComponent, DndUploadComponent, ButtonComponent, RadioButtonToggleComponent, DatetimePicker, LoadingPanel, SearchBarComponent, TabGroupComponent, TabComponent, HeroIconComponent, ToastComponent, ToastContainerComponent, TagComponent, ChartComponent, SliderComponent, SwitchComponent, RichTextAreaComponent, SkeletonTableLoadingComponent, FlowConnection, CircleProgressBar, TreeDiagram, ConfirmationDialogComponent,
3045
+ NgHeroiconsModule, i27.VflowComponent, i27.HandleComponent, i27.ResizableComponent, i27.SelectableDirective, i27.MiniMapComponent, i27.NodeToolbarComponent, i27.CustomTemplateEdgeComponent, i27.DragHandleDirective, i27.ConnectionControllerDirective, i27.NodeHtmlTemplateDirective, i27.NodeSvgTemplateDirective, i27.GroupNodeTemplateDirective, i27.EdgeLabelHtmlTemplateDirective, i27.EdgeTemplateDirective, i27.ConnectionTemplateDirective, i27.HandleTemplateDirective, i2$3.NgxEchartsModule, i3$1.MatSelectModule, i30.MatRadioModule, i31.MatButtonModule, i32.MatIconModule, i33.MatPaginatorModule, i34.MatTableModule, i35.MatSnackBarModule, i1$1.MatDialogModule, i37.MatCheckboxModule, i38.MatCardModule, i39.MatDatepickerModule, i40.MatTimepickerModule, i41.MatBadgeModule, i42.MatExpansionModule, i43.MatFormFieldModule, i44.MatMenuModule], exports: [InputComponent, SelectComponent, RadioButtonComponent, CheckboxComponent, DndUploadComponent, ButtonComponent, RadioButtonToggleComponent, DatetimePicker, LoadingPanel, SearchBarComponent, TabGroupComponent, TabComponent, HeroIconComponent, ToastComponent, ToastContainerComponent, TagComponent, ChartComponent, SliderComponent, SwitchComponent, RichTextAreaComponent, SkeletonTableLoadingComponent, FlowConnection, CircleProgressBar, TreeDiagram, TableCell, ConfirmationDialogComponent,
2918
3046
  // Module
2919
3047
  FormsModule,
2920
3048
  ReactiveFormsModule,
2921
3049
  OwlDateTimeModule,
2922
3050
  OwlNativeDateTimeModule,
2923
3051
  HasPermissionDirective,
2924
- NgHeroiconsModule, i3$1.MatSelectModule, i29.MatRadioModule, i30.MatButtonModule, i31.MatIconModule, i32.MatPaginatorModule, i33.MatTableModule, i34.MatSnackBarModule, i1$1.MatDialogModule, i36.MatCheckboxModule, i37.MatCardModule, i38.MatDatepickerModule, i39.MatTimepickerModule, i40.MatBadgeModule, i41.MatExpansionModule, i42.MatFormFieldModule, i43.MatMenuModule] });
3052
+ NgHeroiconsModule, i3$1.MatSelectModule, i30.MatRadioModule, i31.MatButtonModule, i32.MatIconModule, i33.MatPaginatorModule, i34.MatTableModule, i35.MatSnackBarModule, i1$1.MatDialogModule, i37.MatCheckboxModule, i38.MatCardModule, i39.MatDatepickerModule, i40.MatTimepickerModule, i41.MatBadgeModule, i42.MatExpansionModule, i43.MatFormFieldModule, i44.MatMenuModule] });
2925
3053
  static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: UiModule, providers: [
2926
3054
  importProvidersFrom(NgHeroiconsModule.forRoot()),
2927
3055
  { provide: OWL_DATE_TIME_FORMATS, useValue: MY_MOMENT_FORMATS },
@@ -2931,13 +3059,13 @@ class UiModule {
2931
3059
  OwlDateTimeModule,
2932
3060
  OwlNativeDateTimeModule,
2933
3061
  OwlMomentDateTimeModule,
2934
- NgHeroiconsModule, i26.VflowComponent, i26.HandleComponent, i26.ResizableComponent, i26.MiniMapComponent, i26.NodeToolbarComponent, i26.CustomTemplateEdgeComponent, NgxEchartsModule.forRoot({ echarts: () => import('echarts') }), MATERIAL_MODULE,
3062
+ NgHeroiconsModule, i27.VflowComponent, i27.HandleComponent, i27.ResizableComponent, i27.MiniMapComponent, i27.NodeToolbarComponent, i27.CustomTemplateEdgeComponent, NgxEchartsModule.forRoot({ echarts: () => import('echarts') }), MATERIAL_MODULE,
2935
3063
  // Module
2936
3064
  FormsModule,
2937
3065
  ReactiveFormsModule,
2938
3066
  OwlDateTimeModule,
2939
3067
  OwlNativeDateTimeModule,
2940
- NgHeroiconsModule, i3$1.MatSelectModule, i29.MatRadioModule, i30.MatButtonModule, i31.MatIconModule, i32.MatPaginatorModule, i33.MatTableModule, i34.MatSnackBarModule, i1$1.MatDialogModule, i36.MatCheckboxModule, i37.MatCardModule, i38.MatDatepickerModule, i39.MatTimepickerModule, i40.MatBadgeModule, i41.MatExpansionModule, i42.MatFormFieldModule, i43.MatMenuModule] });
3068
+ NgHeroiconsModule, i3$1.MatSelectModule, i30.MatRadioModule, i31.MatButtonModule, i32.MatIconModule, i33.MatPaginatorModule, i34.MatTableModule, i35.MatSnackBarModule, i1$1.MatDialogModule, i37.MatCheckboxModule, i38.MatCardModule, i39.MatDatepickerModule, i40.MatTimepickerModule, i41.MatBadgeModule, i42.MatExpansionModule, i43.MatFormFieldModule, i44.MatMenuModule] });
2941
3069
  }
2942
3070
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: UiModule, decorators: [{
2943
3071
  type: NgModule,
@@ -2985,5 +3113,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
2985
3113
  * Generated bundle index. Do not edit.
2986
3114
  */
2987
3115
 
2988
- export { AuthInterceptor, AuthStateService, BaseComponent, BaseDialogComponent, BaseResolver, BaseTableComponent, BreadcrumbService, ButtonComponent, ChartComponent, CheckboxComponent, CircleProgressBar, ConfirmationDialogComponent, DatetimePicker, DndUploadComponent, FlowConnection, FxLoadingService, FxStorageService, FxToastrService, FxUtils, HasPermissionDirective, HeroIconComponent, HttpLoaderFactory, HttpWrapper, InputComponent, LoadingPanel, MY_MOMENT_FORMATS, PermissionGuard, PermissionService, QuillStyleLoaderService, RadioButtonComponent, RadioButtonToggleComponent, RichTextAreaComponent, SearchBarComponent, SelectComponent, SkeletonTableLoadingComponent, SliderComponent, SwitchComponent, TabComponent, TabGroupComponent, TagComponent, ThemeService, ToastComponent, ToastContainerComponent, TranslationModule, TranslationService, TreeDiagram, TrimOnBlurDirective, UiModule };
3116
+ export { AuthInterceptor, AuthStateService, BaseComponent, BaseDialogComponent, BaseResolver, BaseTableComponent, BreadcrumbService, ButtonComponent, ChartComponent, CheckboxComponent, CircleProgressBar, ConfirmationDialogComponent, DatetimePicker, DndUploadComponent, FlowConnection, FxLoadingService, FxStorageService, FxToastrService, FxUtils, HasPermissionDirective, HeroIconComponent, HttpLoaderFactory, HttpWrapper, InputComponent, LoadingPanel, MY_MOMENT_FORMATS, PermissionGuard, PermissionService, QuillStyleLoaderService, RadioButtonComponent, RadioButtonToggleComponent, RichTextAreaComponent, SearchBarComponent, SelectComponent, SkeletonTableLoadingComponent, SliderComponent, SwitchComponent, TabComponent, TabGroupComponent, TableCell, TagComponent, ThemeService, ToastComponent, ToastContainerComponent, TranslationModule, TranslationService, TreeDiagram, TrimOnBlurDirective, UiModule };
2989
3117
  //# sourceMappingURL=fxlt-common-ui.mjs.map