@fxlt/common-ui 0.0.4 → 0.0.5-rc1

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
 
@@ -413,25 +409,12 @@ input[type='password'] {
413
409
  }
414
410
  /* progress bar */
415
411
  .progress-bar-container {
416
- @apply bg-bg-hover mt-semi rounded-full h-1.5 overflow-hidden shadow-inner;
412
+ @apply bg-bg-hover mt-semi rounded-md h-1.5 overflow-hidden shadow-inner;
417
413
  }
418
414
  .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;
415
+ @apply h-1.5 bg-primary rounded-md transition-all duration-700 ease-in-out;
434
416
  }
417
+
435
418
  /* radio button */
436
419
  .radio-container {
437
420
  @apply w-large h-large flex items-center justify-center rounded-full border;
@@ -485,3 +468,6 @@ input[type='password'] {
485
468
  rgb(var(--gradient-primary-end))
486
469
  ) border-box;
487
470
  }
471
+ .skeleton-load {
472
+ @apply rounded bg-gray-200 animate-pulse motion-reduce:animate-none;
473
+ }
@@ -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,88 @@ 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,
1458
- },
1459
- emphasis: {
1460
- scale: true,
1461
- scaleSize: 10,
1462
- itemStyle: { borderWidth: 0 },
1463
- label: { textBorderWidth: 0 },
1493
+ },
1494
+ series: [
1495
+ {
1496
+ type: 'pie',
1497
+ radius: ['40%', '70%'],
1498
+ center: ['40%', '50%'],
1499
+ avoidLabelOverlap: true,
1500
+ data,
1501
+ label: {
1502
+ //{a} Series name
1503
+ //{b} Data name (slice label)
1504
+ //{c} Data value
1505
+ //{d} Percentage
1506
+ position: 'outside',
1507
+ formatter: '{d}%',
1508
+ fontSize: this.labelFontSize,
1509
+ fontFamily: this.labelFontFamily,
1510
+ color: FxUtils.convertColorFromVariable('--text-primary'),
1511
+ textBorderWidth: 0,
1512
+ textBorderColor: 'transparent',
1513
+ },
1514
+ labelLine: {
1515
+ show: this.showPieLabel,
1516
+ length: 12,
1517
+ length2: 12,
1518
+ },
1519
+ itemStyle: {
1520
+ borderWidth: 0,
1521
+ },
1522
+ emphasis: {
1523
+ scale: true,
1524
+ scaleSize: 10,
1525
+ itemStyle: { borderWidth: 0 },
1526
+ label: { textBorderWidth: 0 },
1527
+ },
1464
1528
  },
1529
+ ],
1530
+ graphic: {
1531
+ type: 'group',
1532
+ left: '40%',
1533
+ top: '50%',
1534
+ bounding: 'raw',
1535
+ children: [
1536
+ {
1537
+ type: 'text',
1538
+ style: {
1539
+ text: total.toString(),
1540
+ fontSize: 24,
1541
+ fontWeight: 600,
1542
+ fontFamily: this.labelFontFamily,
1543
+ fill: FxUtils.convertColorFromVariable('--text-primary'),
1544
+ align: 'center',
1545
+ verticalAlign: 'middle',
1546
+ },
1547
+ y: 0,
1548
+ },
1549
+ ],
1465
1550
  },
1466
- ],
1467
- }),
1551
+ };
1552
+ },
1468
1553
  sunburst: (data, colors) => ({
1469
1554
  color: colors,
1470
1555
  series: [
@@ -1546,11 +1631,11 @@ class ChartComponent {
1546
1631
  });
1547
1632
  }
1548
1633
  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"] }] });
1634
+ 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
1635
  }
1551
1636
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: ChartComponent, decorators: [{
1552
1637
  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"] }]
1638
+ 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
1639
  }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }], propDecorators: { type: [{
1555
1640
  type: Input
1556
1641
  }], data: [{
@@ -1563,6 +1648,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
1563
1648
  type: Input
1564
1649
  }], loading: [{
1565
1650
  type: Input
1651
+ }], pieLegendAlign: [{
1652
+ type: Input
1653
+ }], pieLegendPosition: [{
1654
+ type: Input
1655
+ }], showPieLabel: [{
1656
+ type: Input
1657
+ }], labelFontFamily: [{
1658
+ type: Input
1566
1659
  }], chartClick: [{
1567
1660
  type: Output
1568
1661
  }], chartInit: [{
@@ -1921,7 +2014,7 @@ class FlowConnection {
1921
2014
  ];
1922
2015
  }
1923
2016
  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"] }] });
2017
+ 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
2018
  }
1926
2019
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: FlowConnection, decorators: [{
1927
2020
  type: Component,
@@ -2699,6 +2792,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
2699
2792
  args: ['window:resize']
2700
2793
  }] } });
2701
2794
 
2795
+ class TableCell {
2796
+ loading;
2797
+ skeletonClass = 'h-4 w-full';
2798
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: TableCell, deps: [], target: i0.ɵɵFactoryTarget.Component });
2799
+ 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: [""] });
2800
+ }
2801
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: TableCell, decorators: [{
2802
+ type: Component,
2803
+ 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" }]
2804
+ }], propDecorators: { loading: [{
2805
+ type: Input,
2806
+ args: [{ required: true }]
2807
+ }], skeletonClass: [{
2808
+ type: Input
2809
+ }] } });
2810
+
2702
2811
  class TagComponent {
2703
2812
  label;
2704
2813
  type = 'default';
@@ -2851,6 +2960,7 @@ const FX_COMPONENTS = [
2851
2960
  FlowConnection,
2852
2961
  CircleProgressBar,
2853
2962
  TreeDiagram,
2963
+ TableCell,
2854
2964
  ];
2855
2965
 
2856
2966
  class ConfirmationDialogComponent {
@@ -2906,7 +3016,7 @@ const MY_MOMENT_FORMATS = {
2906
3016
  };
2907
3017
  class UiModule {
2908
3018
  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,
3019
+ 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
3020
  FormsModule,
2911
3021
  ReactiveFormsModule,
2912
3022
  OwlDateTimeModule,
@@ -2914,14 +3024,14 @@ class UiModule {
2914
3024
  OwlMomentDateTimeModule,
2915
3025
  HasPermissionDirective,
2916
3026
  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,
3027
+ 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
3028
  // Module
2919
3029
  FormsModule,
2920
3030
  ReactiveFormsModule,
2921
3031
  OwlDateTimeModule,
2922
3032
  OwlNativeDateTimeModule,
2923
3033
  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] });
3034
+ 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
3035
  static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: UiModule, providers: [
2926
3036
  importProvidersFrom(NgHeroiconsModule.forRoot()),
2927
3037
  { provide: OWL_DATE_TIME_FORMATS, useValue: MY_MOMENT_FORMATS },
@@ -2931,13 +3041,13 @@ class UiModule {
2931
3041
  OwlDateTimeModule,
2932
3042
  OwlNativeDateTimeModule,
2933
3043
  OwlMomentDateTimeModule,
2934
- NgHeroiconsModule, i26.VflowComponent, i26.HandleComponent, i26.ResizableComponent, i26.MiniMapComponent, i26.NodeToolbarComponent, i26.CustomTemplateEdgeComponent, NgxEchartsModule.forRoot({ echarts: () => import('echarts') }), MATERIAL_MODULE,
3044
+ NgHeroiconsModule, i27.VflowComponent, i27.HandleComponent, i27.ResizableComponent, i27.MiniMapComponent, i27.NodeToolbarComponent, i27.CustomTemplateEdgeComponent, NgxEchartsModule.forRoot({ echarts: () => import('echarts') }), MATERIAL_MODULE,
2935
3045
  // Module
2936
3046
  FormsModule,
2937
3047
  ReactiveFormsModule,
2938
3048
  OwlDateTimeModule,
2939
3049
  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] });
3050
+ 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
3051
  }
2942
3052
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImport: i0, type: UiModule, decorators: [{
2943
3053
  type: NgModule,
@@ -2985,5 +3095,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.4", ngImpor
2985
3095
  * Generated bundle index. Do not edit.
2986
3096
  */
2987
3097
 
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 };
3098
+ 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
3099
  //# sourceMappingURL=fxlt-common-ui.mjs.map