@tetacom/ng-components 1.2.5 → 1.2.7
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/component/public-api.d.ts +1 -0
- package/component/tabs/tabs/tabs.component.d.ts +10 -1
- package/docs/badgeDocs.mdx +17 -22
- package/docs/chipDocs.mdx +13 -15
- package/docs/tabsDocs.mdx +107 -89
- package/esm2022/component/chart-3d/chart3d/chart3d.component.mjs +2 -2
- package/esm2022/component/public-api.mjs +3 -1
- package/esm2022/component/table/head-cell-dropdown/head-cell-dropdown.component.mjs +2 -2
- package/esm2022/component/tabs/tab/tab.component.mjs +2 -2
- package/esm2022/component/tabs/tabs/tabs.component.mjs +23 -11
- package/fesm2022/tetacom-ng-components.mjs +460 -448
- package/fesm2022/tetacom-ng-components.mjs.map +1 -1
- package/package.json +1 -1
- package/style/badge.scss +11 -12
- package/style/chips.scss +102 -14
- package/style/presets/font-presets.scss +8 -0
- package/style/tabs.scss +42 -18
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { Component, ChangeDetectionStrategy, HostBinding, Directive, Optional, Inject, ContentChild, Input, Injectable, Host, HostListener, forwardRef, ElementRef, EventEmitter, Output, TemplateRef, Injector,
|
|
2
|
+
import { Component, ChangeDetectionStrategy, HostBinding, Directive, Optional, Inject, ContentChild, Input, Injectable, Host, HostListener, ViewChild, forwardRef, ElementRef, EventEmitter, Output, TemplateRef, Injector, ViewContainerRef, Pipe, ViewEncapsulation, ChangeDetectorRef, NgModule, ContentChildren, inject, SkipSelf, PLATFORM_ID, InjectionToken } from '@angular/core';
|
|
3
3
|
import * as i1$1 from '@angular/common';
|
|
4
4
|
import { NgTemplateOutlet, DOCUMENT, NgClass, AsyncPipe, DatePipe, CommonModule, isPlatformBrowser } from '@angular/common';
|
|
5
5
|
import * as i1 from '@angular/common/http';
|
|
6
6
|
import { HttpClient } from '@angular/common/http';
|
|
7
|
-
import { map, takeWhile
|
|
7
|
+
import { map, takeWhile, tap, filter as filter$1, throttleTime, withLatestFrom } from 'rxjs/operators';
|
|
8
|
+
import * as THREE from 'three';
|
|
9
|
+
import * as d3 from 'd3';
|
|
10
|
+
import { BehaviorSubject, ReplaySubject, combineLatest, takeWhile as takeWhile$1, filter, map as map$1, lastValueFrom, take, shareReplay, Subject, animationFrameScheduler, fromEvent, tap as tap$1, merge, Observable, share, pipe } from 'rxjs';
|
|
11
|
+
import { OrbitControls } from 'three-stdlib';
|
|
8
12
|
import * as i2 from '@angular/forms';
|
|
9
13
|
import { NG_VALUE_ACCESSOR, FormsModule, UntypedFormControl, UntypedFormGroup, Validators, ControlContainer, NgForm, NgModelGroup, FormGroup, ReactiveFormsModule } from '@angular/forms';
|
|
10
14
|
import { maskitoDateTimeOptionsGenerator, maskitoDateOptionsGenerator, maskitoDateRangeOptionsGenerator } from '@maskito/kit';
|
|
11
15
|
import dayjs from 'dayjs';
|
|
12
|
-
import { BehaviorSubject, ReplaySubject, combineLatest, takeWhile, filter, map as map$1, lastValueFrom, take, shareReplay, Subject, animationFrameScheduler, fromEvent, tap, merge, Observable, share, pipe } from 'rxjs';
|
|
13
16
|
import * as i4 from '@maskito/angular';
|
|
14
17
|
import { MaskitoModule } from '@maskito/angular';
|
|
15
18
|
import { trigger, transition, style, animate } from '@angular/animations';
|
|
@@ -17,9 +20,6 @@ import * as i1$2 from '@ngneat/transloco';
|
|
|
17
20
|
import { TranslocoModule, TRANSLOCO_SCOPE } from '@ngneat/transloco';
|
|
18
21
|
import { CdkVirtualScrollViewport, CdkFixedSizeVirtualScroll, CdkVirtualForOf } from '@angular/cdk/scrolling';
|
|
19
22
|
import objectHash from 'object-hash';
|
|
20
|
-
import * as THREE from 'three';
|
|
21
|
-
import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
|
|
22
|
-
import * as d3 from 'd3';
|
|
23
23
|
import { coerceBooleanProperty } from '@angular/cdk/coercion';
|
|
24
24
|
import isLeapYear from 'dayjs/plugin/isLeapYear';
|
|
25
25
|
import utc from 'dayjs/plugin/utc';
|
|
@@ -416,119 +416,402 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImpor
|
|
|
416
416
|
args: ['class']
|
|
417
417
|
}] } });
|
|
418
418
|
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
}
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
419
|
+
class Chart3dOptions {
|
|
420
|
+
constructor(options) {
|
|
421
|
+
this.axes = { ...options?.axes };
|
|
422
|
+
this.series = options?.series || [];
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
class ThemeSwitchService {
|
|
427
|
+
constructor() {
|
|
428
|
+
const value = this.restoreTheme();
|
|
429
|
+
this.theme$ = new BehaviorSubject(value);
|
|
430
|
+
this.theme = this.theme$.asObservable();
|
|
431
|
+
}
|
|
432
|
+
switchTheme() {
|
|
433
|
+
const value = !this.theme$.value;
|
|
434
|
+
this.saveTheme(value);
|
|
435
|
+
this.theme$.next(value);
|
|
436
|
+
}
|
|
437
|
+
saveTheme(value) {
|
|
438
|
+
localStorage.setItem('theme', value.toString());
|
|
439
|
+
}
|
|
440
|
+
restoreTheme() {
|
|
441
|
+
const theme = localStorage.getItem('theme');
|
|
442
|
+
if (theme) {
|
|
443
|
+
return JSON.parse(theme);
|
|
429
444
|
}
|
|
430
|
-
return
|
|
445
|
+
return true;
|
|
431
446
|
}
|
|
432
|
-
|
|
433
|
-
|
|
447
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: ThemeSwitchService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
448
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: ThemeSwitchService, providedIn: 'root' }); }
|
|
449
|
+
}
|
|
450
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: ThemeSwitchService, decorators: [{
|
|
451
|
+
type: Injectable,
|
|
452
|
+
args: [{
|
|
453
|
+
providedIn: 'root',
|
|
454
|
+
}]
|
|
455
|
+
}], ctorParameters: () => [] });
|
|
456
|
+
|
|
457
|
+
class Chart3dComponent {
|
|
458
|
+
constructor(_elementRef, _themeService) {
|
|
459
|
+
this._elementRef = _elementRef;
|
|
460
|
+
this._themeService = _themeService;
|
|
461
|
+
this.SIDE_SIZE = 100;
|
|
462
|
+
this._alive = true;
|
|
434
463
|
}
|
|
435
|
-
set
|
|
436
|
-
if (
|
|
437
|
-
this.
|
|
438
|
-
this.
|
|
464
|
+
set config(config) {
|
|
465
|
+
if (config) {
|
|
466
|
+
this._config = config;
|
|
467
|
+
this.init();
|
|
439
468
|
}
|
|
440
469
|
}
|
|
441
|
-
|
|
442
|
-
this.
|
|
443
|
-
this.tabindex = 0;
|
|
444
|
-
this.palette = 'primary';
|
|
445
|
-
this.labelPosition = 'right';
|
|
446
|
-
/**
|
|
447
|
-
* Значение
|
|
448
|
-
*/
|
|
449
|
-
this.model$ = null;
|
|
470
|
+
get config() {
|
|
471
|
+
return this._config;
|
|
450
472
|
}
|
|
451
|
-
|
|
452
|
-
|
|
473
|
+
get canvas() {
|
|
474
|
+
return this.canvasRef.nativeElement;
|
|
475
|
+
}
|
|
476
|
+
ngOnInit() {
|
|
477
|
+
this._themeService.theme
|
|
478
|
+
.pipe(takeWhile(_ => this._alive), tap(_ => {
|
|
479
|
+
this.gridColor = _ ? '#5d6a73' : '#bdbdc6';
|
|
480
|
+
this.axesColor = _ ? '#8e8f9d' : '#7d8f9a';
|
|
481
|
+
this.init();
|
|
482
|
+
}))
|
|
483
|
+
.subscribe();
|
|
484
|
+
}
|
|
485
|
+
ngAfterViewInit() {
|
|
486
|
+
this.addResizeObserver();
|
|
487
|
+
this.createScene();
|
|
488
|
+
this.startRenderingLoop();
|
|
489
|
+
this.init();
|
|
490
|
+
}
|
|
491
|
+
ngOnDestroy() {
|
|
492
|
+
this._alive = false;
|
|
493
|
+
this.removeResizeObserver();
|
|
494
|
+
}
|
|
495
|
+
init() {
|
|
496
|
+
if (!this._scene) {
|
|
453
497
|
return;
|
|
454
498
|
}
|
|
455
|
-
|
|
456
|
-
this.
|
|
457
|
-
}
|
|
458
|
-
else {
|
|
459
|
-
if (!this.isChecked()) {
|
|
460
|
-
this.addValue();
|
|
461
|
-
}
|
|
462
|
-
else {
|
|
463
|
-
this.removeValue();
|
|
464
|
-
}
|
|
465
|
-
}
|
|
466
|
-
this.checked = this.isChecked();
|
|
467
|
-
}
|
|
468
|
-
writeValue(model) {
|
|
469
|
-
if (this.binary) {
|
|
470
|
-
this.model$ = model;
|
|
499
|
+
while (this._scene.children.length > 0) {
|
|
500
|
+
this._scene.remove(this._scene.children[0]);
|
|
471
501
|
}
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
else {
|
|
477
|
-
this.model$ = [];
|
|
502
|
+
const { x, y, z } = this.getScales(this._config.series);
|
|
503
|
+
this.config.series.forEach((data, idx) => {
|
|
504
|
+
if (!data.points?.length) {
|
|
505
|
+
return;
|
|
478
506
|
}
|
|
507
|
+
const points = data.points.map(_ => new THREE.Vector3(x(_.x), y(_.y), z(_.z)));
|
|
508
|
+
const color = d3.scaleOrdinal(d3.schemeTableau10);
|
|
509
|
+
const material = new THREE.LineBasicMaterial({
|
|
510
|
+
color: data?.color ?? color(idx.toString()),
|
|
511
|
+
});
|
|
512
|
+
const tubeGeometry = new THREE.TubeGeometry(new THREE.CatmullRomCurve3(points), 1024, 0.5, 20, false);
|
|
513
|
+
let tube = new THREE.Line(tubeGeometry, material);
|
|
514
|
+
this._scene.add(tube);
|
|
515
|
+
});
|
|
516
|
+
const circles = x.ticks(this.SIDE_SIZE / 10);
|
|
517
|
+
const material = new THREE.LineBasicMaterial({ color: this.axesColor });
|
|
518
|
+
const pointsLines = [];
|
|
519
|
+
pointsLines.push(new THREE.Vector3(0, 0, 0));
|
|
520
|
+
pointsLines.push(new THREE.Vector3(0, 0, z(-z.domain()[1])));
|
|
521
|
+
pointsLines.push(new THREE.Vector3(0, 0, 0));
|
|
522
|
+
pointsLines.push(new THREE.Vector3(x(-x.domain()[1]), 0, 0));
|
|
523
|
+
const geometryLines = new THREE.BufferGeometry().setFromPoints(pointsLines);
|
|
524
|
+
const line = new THREE.Line(geometryLines, material);
|
|
525
|
+
this._scene.add(line);
|
|
526
|
+
circles.forEach(r => {
|
|
527
|
+
const material = new THREE.LineDashedMaterial({
|
|
528
|
+
color: this.gridColor,
|
|
529
|
+
dashSize: 1,
|
|
530
|
+
gapSize: 3,
|
|
531
|
+
});
|
|
532
|
+
const circleGeometry = new THREE.BufferGeometry().setFromPoints(new THREE.Path()
|
|
533
|
+
.absarc(0, 0, x(r), 0, Math.PI * 2, false)
|
|
534
|
+
.getSpacedPoints(100));
|
|
535
|
+
const circle = new THREE.LineSegments(circleGeometry, material);
|
|
536
|
+
circle.geometry.rotateX(-Math.PI / 2);
|
|
537
|
+
this._scene.add(circle);
|
|
538
|
+
});
|
|
539
|
+
this.drawTicks(x, y, z);
|
|
540
|
+
if (!this._controls) {
|
|
541
|
+
this._controls = new OrbitControls(this._camera, this._renderer.domElement);
|
|
542
|
+
this._controls.enableDamping = true;
|
|
543
|
+
this._controls.enablePan = true;
|
|
544
|
+
this._controls.dampingFactor = 0.25;
|
|
545
|
+
this._controls.screenSpacePanning = true;
|
|
546
|
+
this._controls.minDistance = 0;
|
|
547
|
+
this._controls.maxDistance = 10000;
|
|
548
|
+
this._controls.maxPolarAngle = Math.PI / 2;
|
|
549
|
+
this._controls.enableZoom = true;
|
|
479
550
|
}
|
|
480
|
-
this.checked = this.isChecked();
|
|
481
|
-
this.cdr.detectChanges();
|
|
482
551
|
}
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
552
|
+
createScene() {
|
|
553
|
+
this._scene = new THREE.Scene();
|
|
554
|
+
const aspectRatio = this._elementRef.nativeElement.clientWidth /
|
|
555
|
+
this._elementRef.nativeElement.clientHeight;
|
|
556
|
+
const fieldOfView = 10;
|
|
557
|
+
const nearClippingPane = 1;
|
|
558
|
+
const farClippingPane = 10000;
|
|
559
|
+
this._camera = new THREE.PerspectiveCamera(fieldOfView, aspectRatio, nearClippingPane, farClippingPane);
|
|
560
|
+
this._camera.position.set(1300, 1300, 1300).setLength(1300);
|
|
561
|
+
this._scene.add(this._camera);
|
|
490
562
|
}
|
|
491
|
-
|
|
492
|
-
this.
|
|
563
|
+
setSize(width, height) {
|
|
564
|
+
this._camera.aspect = width / height;
|
|
565
|
+
this._renderer.setSize(width, height);
|
|
566
|
+
this._camera.updateProjectionMatrix();
|
|
493
567
|
}
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
this.model = [...this.model, this.value];
|
|
497
|
-
}
|
|
498
|
-
else {
|
|
499
|
-
this.model = [this.value];
|
|
500
|
-
}
|
|
568
|
+
render() {
|
|
569
|
+
this._renderer.render(this._scene, this._camera);
|
|
501
570
|
}
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
571
|
+
startRenderingLoop() {
|
|
572
|
+
this._renderer = new THREE.WebGLRenderer({
|
|
573
|
+
antialias: true,
|
|
574
|
+
canvas: this.canvas,
|
|
575
|
+
alpha: true,
|
|
576
|
+
preserveDrawingBuffer: true,
|
|
577
|
+
});
|
|
578
|
+
const animate = () => {
|
|
579
|
+
requestAnimationFrame(animate);
|
|
580
|
+
this._controls?.update();
|
|
581
|
+
this.render();
|
|
582
|
+
};
|
|
583
|
+
animate();
|
|
507
584
|
}
|
|
508
|
-
|
|
509
|
-
this.
|
|
585
|
+
addResizeObserver() {
|
|
586
|
+
this._obs = new ResizeObserver(_ => {
|
|
587
|
+
this.setSize(_[0]?.contentRect.width, _[0]?.contentRect.height);
|
|
588
|
+
});
|
|
589
|
+
this._obs.observe(this._elementRef.nativeElement);
|
|
510
590
|
}
|
|
511
|
-
|
|
512
|
-
this.
|
|
513
|
-
this.
|
|
591
|
+
removeResizeObserver() {
|
|
592
|
+
this._obs.unobserve(this._elementRef.nativeElement);
|
|
593
|
+
this._obs.disconnect();
|
|
514
594
|
}
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
595
|
+
makeSprite(text, opts) {
|
|
596
|
+
const fontSize = 20;
|
|
597
|
+
const canvas = document.createElement('canvas');
|
|
598
|
+
const ctx = canvas.getContext('2d');
|
|
599
|
+
const textWidth = text.length * 50;
|
|
600
|
+
canvas.height = 50;
|
|
601
|
+
canvas.width = 50;
|
|
602
|
+
if (ctx) {
|
|
603
|
+
ctx.font = `${fontSize}px Arial`;
|
|
604
|
+
ctx.textAlign = 'center';
|
|
605
|
+
ctx.textBaseline = 'middle';
|
|
606
|
+
ctx.fillStyle = '#A0A0A0';
|
|
607
|
+
ctx.fillText(text, 25, 25);
|
|
608
|
+
}
|
|
609
|
+
const texture = new THREE.Texture(canvas);
|
|
610
|
+
texture.minFilter = THREE.LinearFilter;
|
|
611
|
+
texture.needsUpdate = true;
|
|
612
|
+
const spriteMaterial = new THREE.SpriteMaterial({
|
|
613
|
+
map: texture,
|
|
614
|
+
});
|
|
615
|
+
const sprite = new THREE.Sprite(spriteMaterial);
|
|
616
|
+
sprite.scale.set(0.4 * fontSize, 0.4 * fontSize, 0.4 * fontSize);
|
|
617
|
+
return sprite;
|
|
618
|
+
}
|
|
619
|
+
drawTicks(x, y, z) {
|
|
620
|
+
const ticks = new THREE.Object3D();
|
|
621
|
+
const scalesExtrems = [];
|
|
622
|
+
[x, y, z].forEach((scale, idx) => {
|
|
623
|
+
const generatedTicks = scale.ticks(this.SIDE_SIZE / 10);
|
|
624
|
+
scalesExtrems.push(d3.max(generatedTicks));
|
|
625
|
+
generatedTicks.forEach((_) => {
|
|
626
|
+
const sprite = this.makeSprite(_);
|
|
627
|
+
if (idx === 0) {
|
|
628
|
+
sprite.position.set(x(_), y(y.domain()[1]), 0);
|
|
629
|
+
}
|
|
630
|
+
if (idx === 1) {
|
|
631
|
+
sprite.position.set(-10, y(_), 0);
|
|
632
|
+
}
|
|
633
|
+
if (idx === 2) {
|
|
634
|
+
sprite.position.set(0, y(y.domain()[1]), z(_));
|
|
635
|
+
}
|
|
636
|
+
ticks.add(sprite);
|
|
637
|
+
});
|
|
638
|
+
});
|
|
639
|
+
const northLabel = this.makeSprite('X', { fontSize: 28 });
|
|
640
|
+
const westLabel = this.makeSprite('Y', { fontSize: 28 });
|
|
641
|
+
const tvdLabel = this.makeSprite('TVD', { fontSize: 28 });
|
|
642
|
+
northLabel.position.set(x(x.domain()[1]) + 5, 0, 0);
|
|
643
|
+
westLabel.position.set(0, 0, y(y.domain()[0]) + 5);
|
|
644
|
+
tvdLabel.position.set(0, z(z.domain()[1]) + 5, 0);
|
|
645
|
+
ticks.add(northLabel, westLabel, tvdLabel);
|
|
646
|
+
const axesHelper = new THREE.AxesHelper(this.SIDE_SIZE);
|
|
647
|
+
axesHelper.setColors(this.axesColor, this.axesColor, this.axesColor);
|
|
648
|
+
this._scene.add(axesHelper);
|
|
649
|
+
this._scene.add(ticks);
|
|
650
|
+
}
|
|
651
|
+
getScales(series) {
|
|
652
|
+
const extrems = series.map(_ => ({
|
|
653
|
+
x: d3.extent(_.points, (p) => p.x),
|
|
654
|
+
y: d3.extent(_.points, (p) => p.y),
|
|
655
|
+
z: d3.extent(_.points, (p) => p.z),
|
|
656
|
+
}));
|
|
657
|
+
const flattenExtrems = extrems.reduce((acc, _) => {
|
|
658
|
+
acc.x = acc.x.concat(_.x);
|
|
659
|
+
acc.y = acc.y.concat(_.y);
|
|
660
|
+
acc.z = acc.z.concat(_.z);
|
|
661
|
+
return acc;
|
|
662
|
+
}, { x: [], y: [], z: [] });
|
|
663
|
+
const x = d3
|
|
664
|
+
.scaleLinear()
|
|
665
|
+
.domain([
|
|
666
|
+
0,
|
|
667
|
+
this._config?.axes?.max == null
|
|
668
|
+
? parseInt(d3.max(flattenExtrems.x))
|
|
669
|
+
: this._config.axes.max,
|
|
670
|
+
])
|
|
671
|
+
.range([0, this.SIDE_SIZE])
|
|
672
|
+
.nice();
|
|
673
|
+
const y = d3
|
|
674
|
+
.scaleLinear()
|
|
675
|
+
.domain([0, parseInt(d3.max(flattenExtrems.y), 10)])
|
|
676
|
+
.range([this.SIDE_SIZE, 0]);
|
|
677
|
+
const z = d3
|
|
678
|
+
.scaleLinear()
|
|
679
|
+
.domain([
|
|
680
|
+
0,
|
|
681
|
+
this._config?.axes?.max == null
|
|
682
|
+
? parseInt(d3.max(flattenExtrems.z))
|
|
683
|
+
: this._config.axes.max,
|
|
684
|
+
])
|
|
685
|
+
.range([0, this.SIDE_SIZE])
|
|
686
|
+
.nice();
|
|
687
|
+
return { x, y, z };
|
|
688
|
+
}
|
|
689
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: Chart3dComponent, deps: [{ token: i0.ElementRef }, { token: ThemeSwitchService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
690
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.5", type: Chart3dComponent, isStandalone: true, selector: "teta-chart3d", inputs: { config: "config" }, viewQueries: [{ propertyName: "canvasRef", first: true, predicate: ["canvas"], descendants: true }], ngImport: i0, template: "<canvas #canvas></canvas>\n", styles: [":host{display:flex;width:100%;height:100%}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
691
|
+
}
|
|
692
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: Chart3dComponent, decorators: [{
|
|
693
|
+
type: Component,
|
|
694
|
+
args: [{ selector: 'teta-chart3d', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<canvas #canvas></canvas>\n", styles: [":host{display:flex;width:100%;height:100%}\n"] }]
|
|
695
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: ThemeSwitchService }], propDecorators: { canvasRef: [{
|
|
696
|
+
type: ViewChild,
|
|
697
|
+
args: ['canvas']
|
|
698
|
+
}], config: [{
|
|
699
|
+
type: Input
|
|
700
|
+
}] } });
|
|
701
|
+
|
|
702
|
+
const CHECKBOX_CONTROL_VALUE_ACCESSOR = {
|
|
703
|
+
provide: NG_VALUE_ACCESSOR,
|
|
704
|
+
useExisting: forwardRef(() => CheckboxComponent),
|
|
705
|
+
multi: true,
|
|
706
|
+
};
|
|
707
|
+
class CheckboxComponent {
|
|
708
|
+
get getClass() {
|
|
709
|
+
const result = [this.class, 'checkbox'];
|
|
710
|
+
if (this.palette) {
|
|
711
|
+
result.push(`checkbox-${this.palette}`);
|
|
712
|
+
}
|
|
713
|
+
return result.join(' ');
|
|
714
|
+
}
|
|
715
|
+
get model() {
|
|
716
|
+
return this.model$;
|
|
717
|
+
}
|
|
718
|
+
set model(v) {
|
|
719
|
+
if (v !== this.model$) {
|
|
720
|
+
this.model$ = v;
|
|
721
|
+
this.onChange(v);
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
constructor(cdr) {
|
|
725
|
+
this.cdr = cdr;
|
|
726
|
+
this.tabindex = 0;
|
|
727
|
+
this.palette = 'primary';
|
|
728
|
+
this.labelPosition = 'right';
|
|
729
|
+
/**
|
|
730
|
+
* Значение
|
|
731
|
+
*/
|
|
732
|
+
this.model$ = null;
|
|
733
|
+
}
|
|
734
|
+
changeValue() {
|
|
735
|
+
if (this.disabled) {
|
|
736
|
+
return;
|
|
737
|
+
}
|
|
738
|
+
if (this.binary) {
|
|
739
|
+
this.model = !this.model;
|
|
740
|
+
}
|
|
741
|
+
else {
|
|
742
|
+
if (!this.isChecked()) {
|
|
743
|
+
this.addValue();
|
|
744
|
+
}
|
|
745
|
+
else {
|
|
746
|
+
this.removeValue();
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
this.checked = this.isChecked();
|
|
750
|
+
}
|
|
751
|
+
writeValue(model) {
|
|
752
|
+
if (this.binary) {
|
|
753
|
+
this.model$ = model;
|
|
754
|
+
}
|
|
755
|
+
else {
|
|
756
|
+
if (model && model instanceof Array) {
|
|
757
|
+
this.model$ = model;
|
|
758
|
+
}
|
|
759
|
+
else {
|
|
760
|
+
this.model$ = [];
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
this.checked = this.isChecked();
|
|
764
|
+
this.cdr.detectChanges();
|
|
765
|
+
}
|
|
766
|
+
isChecked() {
|
|
767
|
+
if (this.binary) {
|
|
768
|
+
return this.allowNull ? this.model : !!this.model;
|
|
769
|
+
}
|
|
770
|
+
else {
|
|
771
|
+
return this.model && this.model.indexOf(this.value) >= 0;
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
removeValue() {
|
|
775
|
+
this.model = this.model.filter((val) => val !== this.value);
|
|
776
|
+
}
|
|
777
|
+
addValue() {
|
|
778
|
+
if (this.model) {
|
|
779
|
+
this.model = [...this.model, this.value];
|
|
780
|
+
}
|
|
781
|
+
else {
|
|
782
|
+
this.model = [this.value];
|
|
783
|
+
}
|
|
784
|
+
}
|
|
785
|
+
ngOnInit() { }
|
|
786
|
+
onChange(_) { }
|
|
787
|
+
onTouched() { }
|
|
788
|
+
registerOnChange(fn) {
|
|
789
|
+
this.onChange = fn;
|
|
790
|
+
}
|
|
791
|
+
registerOnTouched(fn) {
|
|
792
|
+
this.onTouched = fn;
|
|
793
|
+
}
|
|
794
|
+
setDisabledState(isDisabled) {
|
|
795
|
+
this.disabled = isDisabled;
|
|
796
|
+
this.cdr.detectChanges();
|
|
797
|
+
}
|
|
798
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: CheckboxComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
799
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.5", type: CheckboxComponent, isStandalone: true, selector: "teta-checkbox", inputs: { class: "class", palette: "palette", noLabel: "noLabel", disabled: "disabled", value: "value", binary: "binary", labelPosition: "labelPosition", allowNull: "allowNull" }, host: { listeners: { "click": "changeValue()" }, properties: { "attr.tabindex": "this.tabindex", "class": "this.getClass", "class.checkbox_disabled": "this.disabled" } }, providers: [CHECKBOX_CONTROL_VALUE_ACCESSOR], ngImport: i0, template: "@if (labelPosition==='right') {\n <div class=\"checkbox__tick\" [class.checkbox__tick_active]=\"checked != false\">\n <teta-icon [name]=\"checked ? 'tick' : checked === false ? '' : 'dash'\"></teta-icon>\n </div>\n @if (!noLabel) {\n <span class=\"font-body-3\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </span>\n }\n}\n@if (labelPosition==='left') {\n @if (!noLabel) {\n <span class=\"font-body-3\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </span>\n }\n <div class=\"checkbox__tick\" [class.checkbox__tick_active]=\"checked != false\">\n <teta-icon [name]=\"checked ? 'tick' : checked === false ? '' : 'dash'\"></teta-icon>\n </div>\n}\n<ng-template #content><ng-content></ng-content></ng-template>\n", styles: [""], dependencies: [{ kind: "component", type: IconComponent, selector: "teta-icon", inputs: ["name", "size", "palette", "class"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
800
|
+
}
|
|
801
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: CheckboxComponent, decorators: [{
|
|
802
|
+
type: Component,
|
|
803
|
+
args: [{ selector: 'teta-checkbox', providers: [CHECKBOX_CONTROL_VALUE_ACCESSOR], changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [IconComponent, NgTemplateOutlet], template: "@if (labelPosition==='right') {\n <div class=\"checkbox__tick\" [class.checkbox__tick_active]=\"checked != false\">\n <teta-icon [name]=\"checked ? 'tick' : checked === false ? '' : 'dash'\"></teta-icon>\n </div>\n @if (!noLabel) {\n <span class=\"font-body-3\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </span>\n }\n}\n@if (labelPosition==='left') {\n @if (!noLabel) {\n <span class=\"font-body-3\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </span>\n }\n <div class=\"checkbox__tick\" [class.checkbox__tick_active]=\"checked != false\">\n <teta-icon [name]=\"checked ? 'tick' : checked === false ? '' : 'dash'\"></teta-icon>\n </div>\n}\n<ng-template #content><ng-content></ng-content></ng-template>\n" }]
|
|
804
|
+
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { tabindex: [{
|
|
805
|
+
type: HostBinding,
|
|
806
|
+
args: ['attr.tabindex']
|
|
807
|
+
}], class: [{
|
|
808
|
+
type: Input
|
|
809
|
+
}], getClass: [{
|
|
810
|
+
type: HostBinding,
|
|
811
|
+
args: ['class']
|
|
812
|
+
}], palette: [{
|
|
813
|
+
type: Input
|
|
814
|
+
}], noLabel: [{
|
|
532
815
|
type: Input
|
|
533
816
|
}], disabled: [{
|
|
534
817
|
type: HostBinding,
|
|
@@ -1139,7 +1422,7 @@ class DateCalendarComponent extends BaseCalendar {
|
|
|
1139
1422
|
this.setDate = new EventEmitter();
|
|
1140
1423
|
this.calendar = [];
|
|
1141
1424
|
combineLatest([this.currentYear, this.currentMonth, this.minMax])
|
|
1142
|
-
.pipe(takeWhile(() => this.alive), filter(([currentYear, currentMonth]) => currentMonth !== null && currentYear !== null), map$1(([year, month, minMax]) => {
|
|
1425
|
+
.pipe(takeWhile$1(() => this.alive), filter(([currentYear, currentMonth]) => currentMonth !== null && currentYear !== null), map$1(([year, month, minMax]) => {
|
|
1143
1426
|
return this.generateCalendar(dayjs(new Date(this.selectedDate)).locale('ru', { weekStart: 1 }), year, month, minMax);
|
|
1144
1427
|
}))
|
|
1145
1428
|
.subscribe(_ => {
|
|
@@ -1664,7 +1947,7 @@ class DynamicContentBaseDirective {
|
|
|
1664
1947
|
this._alive = true;
|
|
1665
1948
|
this._open = false;
|
|
1666
1949
|
this._zone.onStable
|
|
1667
|
-
.pipe(takeWhile
|
|
1950
|
+
.pipe(takeWhile(_ => this._alive), filter$1(_ => this._open))
|
|
1668
1951
|
.subscribe(_ => {
|
|
1669
1952
|
this.setPosition();
|
|
1670
1953
|
});
|
|
@@ -1907,7 +2190,7 @@ class DropdownBase {
|
|
|
1907
2190
|
}
|
|
1908
2191
|
};
|
|
1909
2192
|
this._zone.onStable
|
|
1910
|
-
.pipe(takeWhile
|
|
2193
|
+
.pipe(takeWhile(_ => this._alive), throttleTime(10, undefined, { trailing: true }))
|
|
1911
2194
|
.subscribe(_ => {
|
|
1912
2195
|
if (this._head?.nativeElement && this._body) {
|
|
1913
2196
|
setTimeout(() => {
|
|
@@ -2336,7 +2619,7 @@ class RangeCalendarComponent extends BaseCalendar {
|
|
|
2336
2619
|
this.setDate = new EventEmitter();
|
|
2337
2620
|
this._hoveredDate = null;
|
|
2338
2621
|
combineLatest([this.currentYear, this.currentMonth, this.minMax])
|
|
2339
|
-
.pipe(takeWhile(() => this.alive), shareReplay({ bufferSize: 1, refCount: false }), filter(([currentYear, currentMonth]) => currentMonth !== null && currentYear !== null), map$1(([year, month, minMax]) => {
|
|
2622
|
+
.pipe(takeWhile$1(() => this.alive), shareReplay({ bufferSize: 1, refCount: false }), filter(([currentYear, currentMonth]) => currentMonth !== null && currentYear !== null), map$1(([year, month, minMax]) => {
|
|
2340
2623
|
const { availableYear, availableMonth } = this.getAvailableMonthYear(month + 1, year);
|
|
2341
2624
|
return {
|
|
2342
2625
|
currentMonth: this.generateCalendar(dayjs(new Date(this.selectedDate.from || new Date())).locale('ru', { weekStart: 1 }), year, month, minMax),
|
|
@@ -3455,7 +3738,7 @@ class ScrollableComponent {
|
|
|
3455
3738
|
this._container = this._scrollDirective;
|
|
3456
3739
|
}
|
|
3457
3740
|
fromEvent(this._container.nativeElement, 'scroll')
|
|
3458
|
-
.pipe(takeWhile
|
|
3741
|
+
.pipe(takeWhile(() => this._alive), tap$1((event) => {
|
|
3459
3742
|
this._scrollbarHorizontal.nativeElement.scrollLeft =
|
|
3460
3743
|
event.target.scrollLeft;
|
|
3461
3744
|
this._scrollbarVertical.nativeElement.scrollTop =
|
|
@@ -4478,7 +4761,7 @@ class FilterHostComponent {
|
|
|
4478
4761
|
this._componentRef.injector.get(ChangeDetectorRef).detectChanges();
|
|
4479
4762
|
this._init = true;
|
|
4480
4763
|
this._componentRef.instance.filterChanged
|
|
4481
|
-
.pipe(takeWhile
|
|
4764
|
+
.pipe(takeWhile((_) => this._alive))
|
|
4482
4765
|
.subscribe((filter) => {
|
|
4483
4766
|
this.filterChanged.emit(filter);
|
|
4484
4767
|
});
|
|
@@ -4772,7 +5055,7 @@ class MessageHostComponent {
|
|
|
4772
5055
|
}
|
|
4773
5056
|
ngOnInit() {
|
|
4774
5057
|
this._svc.message
|
|
4775
|
-
.pipe(takeWhile
|
|
5058
|
+
.pipe(takeWhile((_) => this._alive))
|
|
4776
5059
|
.subscribe((messages) => {
|
|
4777
5060
|
if (messages) {
|
|
4778
5061
|
if (!this.messages) {
|
|
@@ -4783,7 +5066,7 @@ class MessageHostComponent {
|
|
|
4783
5066
|
this._cdr.markForCheck();
|
|
4784
5067
|
});
|
|
4785
5068
|
this._svc.clear
|
|
4786
|
-
.pipe(takeWhile
|
|
5069
|
+
.pipe(takeWhile((_) => this._alive))
|
|
4787
5070
|
.subscribe((x) => {
|
|
4788
5071
|
if (!x) {
|
|
4789
5072
|
this.messages = [];
|
|
@@ -6091,7 +6374,7 @@ class PropertyGridItemComponent {
|
|
|
6091
6374
|
this.formGroup.registerControl(this.column.name, FormsUtil.initControlFromColumn(this.column, this.item));
|
|
6092
6375
|
this._formSub?.unsubscribe();
|
|
6093
6376
|
this._formSub = this.formGroup?.controls[this.column.name]?.valueChanges
|
|
6094
|
-
.pipe(takeWhile
|
|
6377
|
+
.pipe(takeWhile(() => this._alive))
|
|
6095
6378
|
.subscribe(_ => {
|
|
6096
6379
|
this.controlValueChange.emit({
|
|
6097
6380
|
id: _,
|
|
@@ -6417,7 +6700,7 @@ class SwitchComponent {
|
|
|
6417
6700
|
this.switchClass = true;
|
|
6418
6701
|
this._alive = true;
|
|
6419
6702
|
this.svc.value
|
|
6420
|
-
.pipe(takeWhile
|
|
6703
|
+
.pipe(takeWhile((_) => this._alive), filter$1((_) => _ !== this._value))
|
|
6421
6704
|
.subscribe((_) => {
|
|
6422
6705
|
this.onChange(_);
|
|
6423
6706
|
this._value = _;
|
|
@@ -6472,7 +6755,7 @@ class SwitchButtonComponent {
|
|
|
6472
6755
|
this.svc = svc;
|
|
6473
6756
|
this.cdr = cdr;
|
|
6474
6757
|
this._alive = true;
|
|
6475
|
-
this.svc.value.pipe(takeWhile
|
|
6758
|
+
this.svc.value.pipe(takeWhile((_) => this._alive)).subscribe((_) => {
|
|
6476
6759
|
this.svcValue = _;
|
|
6477
6760
|
this.cdr.markForCheck();
|
|
6478
6761
|
});
|
|
@@ -7650,7 +7933,7 @@ class CellComponentBase {
|
|
|
7650
7933
|
ngOnInit() {
|
|
7651
7934
|
this.init();
|
|
7652
7935
|
this.formGroup?.controls[this.column.name]?.valueChanges
|
|
7653
|
-
.pipe(takeWhile
|
|
7936
|
+
.pipe(takeWhile(() => this._alive))
|
|
7654
7937
|
.subscribe(value => {
|
|
7655
7938
|
this.formGroup.updateValueAndValidity();
|
|
7656
7939
|
this.row.valid = this.formGroup?.valid;
|
|
@@ -7663,7 +7946,7 @@ class CellComponentBase {
|
|
|
7663
7946
|
}
|
|
7664
7947
|
init() {
|
|
7665
7948
|
this.svc.editRowStart
|
|
7666
|
-
.pipe(takeWhile
|
|
7949
|
+
.pipe(takeWhile(_ => this._alive))
|
|
7667
7950
|
.subscribe((cell) => {
|
|
7668
7951
|
if (this.index === cell?.row && !this._edit) {
|
|
7669
7952
|
this.start(cell, 'row');
|
|
@@ -7673,7 +7956,7 @@ class CellComponentBase {
|
|
|
7673
7956
|
}
|
|
7674
7957
|
});
|
|
7675
7958
|
this.svc.editCellStart
|
|
7676
|
-
.pipe(takeWhile
|
|
7959
|
+
.pipe(takeWhile(_ => this._alive))
|
|
7677
7960
|
.subscribe((cell) => {
|
|
7678
7961
|
if (this.index === cell?.row &&
|
|
7679
7962
|
this.column.name === cell?.column &&
|
|
@@ -7686,7 +7969,7 @@ class CellComponentBase {
|
|
|
7686
7969
|
}
|
|
7687
7970
|
});
|
|
7688
7971
|
this.svc.valueSet
|
|
7689
|
-
.pipe(takeWhile
|
|
7972
|
+
.pipe(takeWhile(_ => this._alive))
|
|
7690
7973
|
.subscribe((cellValue) => {
|
|
7691
7974
|
if (this.index === cellValue.row &&
|
|
7692
7975
|
this.column.name === cellValue.column) {
|
|
@@ -8046,7 +8329,7 @@ class SelectionCellComponent {
|
|
|
8046
8329
|
}
|
|
8047
8330
|
ngOnInit() {
|
|
8048
8331
|
this._svc.selectedRows
|
|
8049
|
-
.pipe(takeWhile
|
|
8332
|
+
.pipe(takeWhile((_) => this._alive))
|
|
8050
8333
|
.subscribe((_) => {
|
|
8051
8334
|
this.selectedRows = _;
|
|
8052
8335
|
this._cdr.markForCheck();
|
|
@@ -8115,24 +8398,24 @@ class TableBodyComponent {
|
|
|
8115
8398
|
ngOnInit() {
|
|
8116
8399
|
this.locale = this._config.locale;
|
|
8117
8400
|
combineLatest([this._svc.columns, this._svc.hiddenColumns])
|
|
8118
|
-
.pipe(takeWhile
|
|
8401
|
+
.pipe(takeWhile(_ => this._alive))
|
|
8119
8402
|
.subscribe((values) => {
|
|
8120
8403
|
const [columns, hiddenColumns] = values;
|
|
8121
8404
|
this._hiddenColumns = hiddenColumns;
|
|
8122
8405
|
this.columns = ArrayUtil.flatten(columns, 'columns', true).filter(_ => this._hiddenColumns.indexOf(_.name) < 0);
|
|
8123
8406
|
this._cdr.markForCheck();
|
|
8124
8407
|
});
|
|
8125
|
-
this._svc.displayData.pipe(takeWhile
|
|
8408
|
+
this._svc.displayData.pipe(takeWhile(_ => this._alive)).subscribe(_ => {
|
|
8126
8409
|
this.data = _;
|
|
8127
8410
|
this._cdr.markForCheck();
|
|
8128
8411
|
this.viewport?.checkViewportSize();
|
|
8129
8412
|
});
|
|
8130
|
-
this._svc.dict.pipe(takeWhile
|
|
8413
|
+
this._svc.dict.pipe(takeWhile(_ => this._alive)).subscribe(_ => {
|
|
8131
8414
|
this.dict = _;
|
|
8132
8415
|
this._cdr.markForCheck();
|
|
8133
8416
|
});
|
|
8134
8417
|
this._svc.scrollIndex
|
|
8135
|
-
.pipe(takeWhile
|
|
8418
|
+
.pipe(takeWhile(() => this._alive))
|
|
8136
8419
|
.subscribe(async (index) => {
|
|
8137
8420
|
if (this.viewport) {
|
|
8138
8421
|
this.viewport.scrollToIndex(index, 'auto');
|
|
@@ -8143,7 +8426,7 @@ class TableBodyComponent {
|
|
|
8143
8426
|
}
|
|
8144
8427
|
this._cdr.markForCheck();
|
|
8145
8428
|
});
|
|
8146
|
-
this._svc.activeRow.pipe(takeWhile
|
|
8429
|
+
this._svc.activeRow.pipe(takeWhile(_ => this._alive)).subscribe(async (_) => {
|
|
8147
8430
|
this.activeRow = _;
|
|
8148
8431
|
this._cdr.markForCheck();
|
|
8149
8432
|
});
|
|
@@ -8626,7 +8909,7 @@ class TreeItemComponent {
|
|
|
8626
8909
|
}
|
|
8627
8910
|
ngOnInit() {
|
|
8628
8911
|
this.service.openItems
|
|
8629
|
-
.pipe(takeWhile
|
|
8912
|
+
.pipe(takeWhile((_) => this._alive))
|
|
8630
8913
|
.subscribe((_) => {
|
|
8631
8914
|
const found = _?.find((x) => this.service.compareItems(x) ===
|
|
8632
8915
|
this.service.compareItems(this.item));
|
|
@@ -8711,7 +8994,7 @@ class TreeComponent {
|
|
|
8711
8994
|
return index;
|
|
8712
8995
|
};
|
|
8713
8996
|
this._service.openItems
|
|
8714
|
-
.pipe(takeWhile
|
|
8997
|
+
.pipe(takeWhile((_) => this._alive), filter$1((_) => this._openItems !== _))
|
|
8715
8998
|
.subscribe((_) => {
|
|
8716
8999
|
this._openItems = _;
|
|
8717
9000
|
this.displayData = this.getDisplayData(this._data, 0);
|
|
@@ -8739,7 +9022,7 @@ class TreeComponent {
|
|
|
8739
9022
|
this.removeResizeObserver();
|
|
8740
9023
|
}
|
|
8741
9024
|
ngAfterViewInit() {
|
|
8742
|
-
this._service.scrollToIndex.pipe(takeWhile
|
|
9025
|
+
this._service.scrollToIndex.pipe(takeWhile(() => this._alive)).subscribe((index) => {
|
|
8743
9026
|
this._zone.runOutsideAngular(() => {
|
|
8744
9027
|
setTimeout(() => {
|
|
8745
9028
|
this.viewport?.scrollToIndex(index, 'smooth');
|
|
@@ -8857,7 +9140,7 @@ class VisibilityDropdownTabComponent {
|
|
|
8857
9140
|
};
|
|
8858
9141
|
this.locale = this._config.locale;
|
|
8859
9142
|
this._svc.hiddenColumns
|
|
8860
|
-
.pipe(takeWhile
|
|
9143
|
+
.pipe(takeWhile(_ => this._alive), map(_ => [..._]))
|
|
8861
9144
|
.subscribe(_ => {
|
|
8862
9145
|
this.hiddenColumns = _;
|
|
8863
9146
|
});
|
|
@@ -9217,8 +9500,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImpor
|
|
|
9217
9500
|
}] } });
|
|
9218
9501
|
|
|
9219
9502
|
class TabsComponent {
|
|
9503
|
+
get verticalClassTabs() {
|
|
9504
|
+
return this.direction === 'vertical';
|
|
9505
|
+
}
|
|
9220
9506
|
constructor() {
|
|
9221
9507
|
this.classTabs = true;
|
|
9508
|
+
/**
|
|
9509
|
+
* Tabs direction
|
|
9510
|
+
*/
|
|
9511
|
+
this.direction = 'horizontal';
|
|
9512
|
+
/**
|
|
9513
|
+
* Tabs size
|
|
9514
|
+
*/
|
|
9515
|
+
this.size = 'm';
|
|
9222
9516
|
/**
|
|
9223
9517
|
* Whether the closed tabs should be hidden without destroying them
|
|
9224
9518
|
*/
|
|
@@ -9234,9 +9528,7 @@ class TabsComponent {
|
|
|
9234
9528
|
*/
|
|
9235
9529
|
select(tabId) {
|
|
9236
9530
|
const selectedTab = this._getTabById(tabId);
|
|
9237
|
-
if (selectedTab &&
|
|
9238
|
-
!selectedTab.disabled &&
|
|
9239
|
-
this.activeId !== selectedTab.id) {
|
|
9531
|
+
if (selectedTab && !selectedTab.disabled && this.activeId !== selectedTab.id) {
|
|
9240
9532
|
let defaultPrevented = false;
|
|
9241
9533
|
this.tabChange.emit({
|
|
9242
9534
|
activeId: this.activeId,
|
|
@@ -9252,27 +9544,30 @@ class TabsComponent {
|
|
|
9252
9544
|
}
|
|
9253
9545
|
ngAfterContentChecked() {
|
|
9254
9546
|
const activeTab = this._getTabById(this.activeId);
|
|
9255
|
-
this.activeId = activeTab
|
|
9256
|
-
? activeTab.id
|
|
9257
|
-
: this.tabs.length
|
|
9258
|
-
? this.tabs.first.id
|
|
9259
|
-
: null;
|
|
9547
|
+
this.activeId = activeTab ? activeTab.id : this.tabs.length ? this.tabs.first.id : null;
|
|
9260
9548
|
}
|
|
9261
9549
|
_getTabById(id) {
|
|
9262
9550
|
const tabsWithId = this.tabs.filter((tab) => tab.id === id);
|
|
9263
9551
|
return tabsWithId.length ? tabsWithId[0] : null;
|
|
9264
9552
|
}
|
|
9265
9553
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: TabsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
9266
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.5", type: TabsComponent, isStandalone: true, selector: "teta-tabs", inputs: { activeId: "activeId", destroyOnHide: "destroyOnHide" }, outputs: { tabChange: "tabChange" }, host: { properties: { "class.tabs": "this.classTabs" } }, queries: [{ propertyName: "tabs", predicate: TabComponent }], ngImport: i0, template: "<div class=\"tabs-head\"
|
|
9554
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.5", type: TabsComponent, isStandalone: true, selector: "teta-tabs", inputs: { activeId: "activeId", direction: "direction", size: "size", destroyOnHide: "destroyOnHide" }, outputs: { tabChange: "tabChange" }, host: { properties: { "class.tabs": "this.classTabs", "class.tabs_vertical": "this.verticalClassTabs" } }, queries: [{ propertyName: "tabs", predicate: TabComponent }], ngImport: i0, template: "<div role=\"tablist\" class=\"tabs-head\" [class.tabs-head_small]=\"size === 's'\">\n @for (tab of tabs; track tab) {\n <button\n type=\"button\"\n class=\"tabs-head-item\"\n (click)=\"select(tab.id)\"\n [class.tabs-head-item_active]=\"tab.id === activeId\"\n [disabled]=\"tab.disabled\"\n >\n <span\n [id]=\"tab.id\"\n class=\"tabs-title\"\n role=\"tab\"\n [attr.tabindex]=\"tab.disabled ? '-1' : undefined\"\n [attr.aria-controls]=\"!destroyOnHide || tab.id === activeId ? tab.id + '-panel' : null\"\n [attr.aria-expanded]=\"tab.id === activeId\"\n [attr.aria-disabled]=\"tab.disabled\"\n >\n {{ tab.title }}\n <ng-template [ngTemplateOutlet]=\"tab.titleTpl?.template\"></ng-template>\n </span>\n </button>\n }\n</div>\n<div class=\"tabs-content\">\n @for (tab of tabs; track tab) { @if (!destroyOnHide || tab.id === activeId) {\n <ng-template [ngTemplateOutlet]=\"tab.contentTpl?.template\"></ng-template>\n } }\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
|
|
9267
9555
|
}
|
|
9268
9556
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: TabsComponent, decorators: [{
|
|
9269
9557
|
type: Component,
|
|
9270
|
-
args: [{ selector: 'teta-tabs', standalone: true, imports: [NgTemplateOutlet], template: "<div class=\"tabs-head\"
|
|
9558
|
+
args: [{ selector: 'teta-tabs', standalone: true, imports: [NgTemplateOutlet], template: "<div role=\"tablist\" class=\"tabs-head\" [class.tabs-head_small]=\"size === 's'\">\n @for (tab of tabs; track tab) {\n <button\n type=\"button\"\n class=\"tabs-head-item\"\n (click)=\"select(tab.id)\"\n [class.tabs-head-item_active]=\"tab.id === activeId\"\n [disabled]=\"tab.disabled\"\n >\n <span\n [id]=\"tab.id\"\n class=\"tabs-title\"\n role=\"tab\"\n [attr.tabindex]=\"tab.disabled ? '-1' : undefined\"\n [attr.aria-controls]=\"!destroyOnHide || tab.id === activeId ? tab.id + '-panel' : null\"\n [attr.aria-expanded]=\"tab.id === activeId\"\n [attr.aria-disabled]=\"tab.disabled\"\n >\n {{ tab.title }}\n <ng-template [ngTemplateOutlet]=\"tab.titleTpl?.template\"></ng-template>\n </span>\n </button>\n }\n</div>\n<div class=\"tabs-content\">\n @for (tab of tabs; track tab) { @if (!destroyOnHide || tab.id === activeId) {\n <ng-template [ngTemplateOutlet]=\"tab.contentTpl?.template\"></ng-template>\n } }\n</div>\n" }]
|
|
9271
9559
|
}], ctorParameters: () => [], propDecorators: { classTabs: [{
|
|
9272
9560
|
type: HostBinding,
|
|
9273
9561
|
args: ['class.tabs']
|
|
9562
|
+
}], verticalClassTabs: [{
|
|
9563
|
+
type: HostBinding,
|
|
9564
|
+
args: ['class.tabs_vertical']
|
|
9274
9565
|
}], activeId: [{
|
|
9275
9566
|
type: Input
|
|
9567
|
+
}], direction: [{
|
|
9568
|
+
type: Input
|
|
9569
|
+
}], size: [{
|
|
9570
|
+
type: Input
|
|
9276
9571
|
}], destroyOnHide: [{
|
|
9277
9572
|
type: Input
|
|
9278
9573
|
}], tabChange: [{
|
|
@@ -9297,7 +9592,7 @@ class HeadCellDropdownComponent {
|
|
|
9297
9592
|
return index;
|
|
9298
9593
|
}
|
|
9299
9594
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: HeadCellDropdownComponent, deps: [{ token: TableService }, { token: TetaConfigService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
9300
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.5", type: HeadCellDropdownComponent, isStandalone: true, selector: "teta-head-cell-dropdown", inputs: { columns: "columns", column: "column", state: "state", data: "data", tabTemplates: "tabTemplates", dropDownOpen: "dropDownOpen" }, outputs: { dropDownOpenChange: "dropDownOpenChange" }, ngImport: i0, template: "@if (dropDownOpen) {\n <teta-tabs class=\"column_auto\">\n @for (tab of tabTemplates; track trackIndex($index)) {\n @if (tab.showTab(column)) {\n <teta-tab>\n <ng-template tetaTabTitle>\n @if (tab.icon) {\n <teta-icon [name]=\"tab.icon\" [palette]=\"'text'\"></teta-icon>\n }\n </ng-template>\n <ng-template tetaTabContent>\n <ng-container\n *ngTemplateOutlet=\"tab.template; context: {\n column: column,\n columns: columns,\n data: data,\n state: state,\n close: closeDropdown\n }\"></ng-container>\n </ng-template>\n </teta-tab>\n }\n }\n </teta-tabs>\n}\n", styles: [":host{display:flex;flex-grow:1;min-height:0;min-width:250px}\n"], dependencies: [{ kind: "component", type: TabsComponent, selector: "teta-tabs", inputs: ["activeId", "destroyOnHide"], outputs: ["tabChange"] }, { kind: "component", type: TabComponent, selector: "teta-tab", inputs: ["id", "title", "disabled"] }, { kind: "directive", type: TabTitleDirective, selector: "[tetaTabTitle]" }, { kind: "component", type: IconComponent, selector: "teta-icon", inputs: ["name", "size", "palette", "class"] }, { kind: "directive", type: TabContentDirective, selector: "[tetaTabContent]" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
9595
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.5", type: HeadCellDropdownComponent, isStandalone: true, selector: "teta-head-cell-dropdown", inputs: { columns: "columns", column: "column", state: "state", data: "data", tabTemplates: "tabTemplates", dropDownOpen: "dropDownOpen" }, outputs: { dropDownOpenChange: "dropDownOpenChange" }, ngImport: i0, template: "@if (dropDownOpen) {\n <teta-tabs class=\"column_auto\">\n @for (tab of tabTemplates; track trackIndex($index)) {\n @if (tab.showTab(column)) {\n <teta-tab>\n <ng-template tetaTabTitle>\n @if (tab.icon) {\n <teta-icon [name]=\"tab.icon\" [palette]=\"'text'\"></teta-icon>\n }\n </ng-template>\n <ng-template tetaTabContent>\n <ng-container\n *ngTemplateOutlet=\"tab.template; context: {\n column: column,\n columns: columns,\n data: data,\n state: state,\n close: closeDropdown\n }\"></ng-container>\n </ng-template>\n </teta-tab>\n }\n }\n </teta-tabs>\n}\n", styles: [":host{display:flex;flex-grow:1;min-height:0;min-width:250px}\n"], dependencies: [{ kind: "component", type: TabsComponent, selector: "teta-tabs", inputs: ["activeId", "direction", "size", "destroyOnHide"], outputs: ["tabChange"] }, { kind: "component", type: TabComponent, selector: "teta-tab", inputs: ["id", "title", "disabled"] }, { kind: "directive", type: TabTitleDirective, selector: "[tetaTabTitle]" }, { kind: "component", type: IconComponent, selector: "teta-icon", inputs: ["name", "size", "palette", "class"] }, { kind: "directive", type: TabContentDirective, selector: "[tetaTabContent]" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
9301
9596
|
}
|
|
9302
9597
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: HeadCellDropdownComponent, decorators: [{
|
|
9303
9598
|
type: Component,
|
|
@@ -9651,7 +9946,7 @@ class TableHeadGroupComponent {
|
|
|
9651
9946
|
this._cdr = _cdr;
|
|
9652
9947
|
this._alive = true;
|
|
9653
9948
|
this._svc.hiddenColumns
|
|
9654
|
-
.pipe(takeWhile
|
|
9949
|
+
.pipe(takeWhile((_) => this._alive))
|
|
9655
9950
|
.subscribe((_) => {
|
|
9656
9951
|
this._hiddenColumns = _;
|
|
9657
9952
|
this._cdr.markForCheck();
|
|
@@ -9708,7 +10003,7 @@ class SelectionHeadCellComponent {
|
|
|
9708
10003
|
}
|
|
9709
10004
|
ngOnInit() {
|
|
9710
10005
|
this._svc.selectedRows
|
|
9711
|
-
.pipe(takeWhile
|
|
10006
|
+
.pipe(takeWhile((_) => this._alive))
|
|
9712
10007
|
.subscribe((_) => {
|
|
9713
10008
|
this._cdr.markForCheck();
|
|
9714
10009
|
});
|
|
@@ -9755,7 +10050,7 @@ class TableHeadComponent {
|
|
|
9755
10050
|
}
|
|
9756
10051
|
ngOnInit() {
|
|
9757
10052
|
combineLatest([this._svc.columns, this._svc.hiddenColumns])
|
|
9758
|
-
.pipe(takeWhile
|
|
10053
|
+
.pipe(takeWhile(_ => this._alive))
|
|
9759
10054
|
.subscribe((values) => {
|
|
9760
10055
|
const [columns, hiddenColumns] = values;
|
|
9761
10056
|
this._hiddenColumns = hiddenColumns;
|
|
@@ -9766,11 +10061,11 @@ class TableHeadComponent {
|
|
|
9766
10061
|
this.lockedWidth = locked.reduce((prev, curr) => prev + curr.width, startWidth);
|
|
9767
10062
|
this._cdr.markForCheck();
|
|
9768
10063
|
});
|
|
9769
|
-
this._svc.state.pipe(takeWhile
|
|
10064
|
+
this._svc.state.pipe(takeWhile(_ => this._alive)).subscribe(_ => {
|
|
9770
10065
|
this.state = _;
|
|
9771
10066
|
this._cdr.markForCheck();
|
|
9772
10067
|
});
|
|
9773
|
-
this._svc.displayData.pipe(takeWhile
|
|
10068
|
+
this._svc.displayData.pipe(takeWhile(_ => this._alive)).subscribe(_ => {
|
|
9774
10069
|
this.data = _.map(_ => _.data);
|
|
9775
10070
|
this._cdr.markForCheck();
|
|
9776
10071
|
});
|
|
@@ -9842,34 +10137,34 @@ class TableComponent {
|
|
|
9842
10137
|
this._headElement.scrollLeft = event.target.scrollLeft;
|
|
9843
10138
|
};
|
|
9844
10139
|
this._svc.state
|
|
9845
|
-
.pipe(takeWhile
|
|
10140
|
+
.pipe(takeWhile(() => this._alive), filter$1(state => state !== this._state))
|
|
9846
10141
|
.subscribe((state) => this.stateChange.next(state));
|
|
9847
10142
|
this._svc.editCellStart
|
|
9848
|
-
.pipe(takeWhile
|
|
10143
|
+
.pipe(takeWhile(() => this._alive))
|
|
9849
10144
|
.subscribe((item) => this.cellEditStart.emit(this._svc.getCellInstance(item)));
|
|
9850
10145
|
this._svc.editCellStop
|
|
9851
|
-
.pipe(takeWhile
|
|
10146
|
+
.pipe(takeWhile(() => this._alive))
|
|
9852
10147
|
.subscribe((item) => this.cellEditEnd.emit(this._svc.getCellInstance(item)));
|
|
9853
10148
|
this._svc.editRowStart
|
|
9854
|
-
.pipe(takeWhile
|
|
10149
|
+
.pipe(takeWhile(() => this._alive))
|
|
9855
10150
|
.subscribe((item) => this.rowEditStart.emit(this._svc.getCellInstance(item)));
|
|
9856
10151
|
this._svc.editRowStop
|
|
9857
|
-
.pipe(takeWhile
|
|
10152
|
+
.pipe(takeWhile(() => this._alive))
|
|
9858
10153
|
.subscribe((item) => this.rowEditEnd.emit(this._svc.getRowByIndex(item?.row)));
|
|
9859
10154
|
this._svc.selectedRows
|
|
9860
|
-
.pipe(takeWhile
|
|
10155
|
+
.pipe(takeWhile(() => this._alive))
|
|
9861
10156
|
.subscribe((items) => {
|
|
9862
10157
|
this.selectedRowsList = items;
|
|
9863
10158
|
this.selectedRowsChange.emit(items);
|
|
9864
10159
|
});
|
|
9865
10160
|
this._svc.activeRow
|
|
9866
|
-
.pipe(takeWhile
|
|
10161
|
+
.pipe(takeWhile(() => this._alive))
|
|
9867
10162
|
.subscribe((item) => {
|
|
9868
10163
|
this.activeRow = item;
|
|
9869
10164
|
this.activeRowChange.emit(item);
|
|
9870
10165
|
});
|
|
9871
10166
|
this._svc.valueChanged
|
|
9872
|
-
.pipe(takeWhile
|
|
10167
|
+
.pipe(takeWhile(() => this._alive))
|
|
9873
10168
|
.subscribe((coordinates) => {
|
|
9874
10169
|
this.valueChange.emit(this._svc.getCellInstance(coordinates));
|
|
9875
10170
|
});
|
|
@@ -10306,47 +10601,16 @@ class DetailComponentBase {
|
|
|
10306
10601
|
* Components
|
|
10307
10602
|
*/
|
|
10308
10603
|
|
|
10309
|
-
class
|
|
10310
|
-
constructor() {
|
|
10311
|
-
|
|
10312
|
-
this.
|
|
10313
|
-
this.
|
|
10604
|
+
class ThemeSwitchComponent {
|
|
10605
|
+
constructor(_svc) {
|
|
10606
|
+
this._svc = _svc;
|
|
10607
|
+
this.palette = 'text';
|
|
10608
|
+
this.view = 'ghost';
|
|
10609
|
+
this.theme = this._svc.theme;
|
|
10314
10610
|
}
|
|
10611
|
+
ngOnInit() { }
|
|
10315
10612
|
switchTheme() {
|
|
10316
|
-
|
|
10317
|
-
this.saveTheme(value);
|
|
10318
|
-
this.theme$.next(value);
|
|
10319
|
-
}
|
|
10320
|
-
saveTheme(value) {
|
|
10321
|
-
localStorage.setItem('theme', value.toString());
|
|
10322
|
-
}
|
|
10323
|
-
restoreTheme() {
|
|
10324
|
-
const theme = localStorage.getItem('theme');
|
|
10325
|
-
if (theme) {
|
|
10326
|
-
return JSON.parse(theme);
|
|
10327
|
-
}
|
|
10328
|
-
return true;
|
|
10329
|
-
}
|
|
10330
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: ThemeSwitchService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
10331
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: ThemeSwitchService, providedIn: 'root' }); }
|
|
10332
|
-
}
|
|
10333
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: ThemeSwitchService, decorators: [{
|
|
10334
|
-
type: Injectable,
|
|
10335
|
-
args: [{
|
|
10336
|
-
providedIn: 'root',
|
|
10337
|
-
}]
|
|
10338
|
-
}], ctorParameters: () => [] });
|
|
10339
|
-
|
|
10340
|
-
class ThemeSwitchComponent {
|
|
10341
|
-
constructor(_svc) {
|
|
10342
|
-
this._svc = _svc;
|
|
10343
|
-
this.palette = 'text';
|
|
10344
|
-
this.view = 'ghost';
|
|
10345
|
-
this.theme = this._svc.theme;
|
|
10346
|
-
}
|
|
10347
|
-
ngOnInit() { }
|
|
10348
|
-
switchTheme() {
|
|
10349
|
-
this._svc.switchTheme();
|
|
10613
|
+
this._svc.switchTheme();
|
|
10350
10614
|
}
|
|
10351
10615
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: ThemeSwitchComponent, deps: [{ token: ThemeSwitchService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
10352
10616
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.5", type: ThemeSwitchComponent, isStandalone: true, selector: "teta-theme-switch", inputs: { palette: "palette", view: "view" }, ngImport: i0, template: "<button type=\"button\" teta-button [palette]=\"palette\" [view]=\"view\" [square]=\"true\" (click)=\"switchTheme()\">\n <teta-icon [name]=\"(theme | async) ? 'lightMode' : 'darkMode'\" [palette]=\"'text'\"></teta-icon>\n</button>\n", styles: [":host{display:flex;align-items:center}\n"], dependencies: [{ kind: "component", type: ButtonComponent, selector: "button[teta-button], teta-button", inputs: ["palette", "class", "view", "square", "viewType", "size"] }, { kind: "component", type: IconComponent, selector: "teta-icon", inputs: ["name", "size", "palette", "class"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
@@ -10364,258 +10628,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImpor
|
|
|
10364
10628
|
* Components
|
|
10365
10629
|
*/
|
|
10366
10630
|
|
|
10367
|
-
class Chart3dOptions {
|
|
10368
|
-
constructor(options) {
|
|
10369
|
-
this.axes = { ...options?.axes };
|
|
10370
|
-
this.series = options?.series || [];
|
|
10371
|
-
}
|
|
10372
|
-
}
|
|
10373
|
-
|
|
10374
|
-
class Chart3dComponent {
|
|
10375
|
-
constructor(_elementRef, _themeService) {
|
|
10376
|
-
this._elementRef = _elementRef;
|
|
10377
|
-
this._themeService = _themeService;
|
|
10378
|
-
this.SIDE_SIZE = 100;
|
|
10379
|
-
this._alive = true;
|
|
10380
|
-
}
|
|
10381
|
-
set config(config) {
|
|
10382
|
-
if (config) {
|
|
10383
|
-
this._config = config;
|
|
10384
|
-
this.init();
|
|
10385
|
-
}
|
|
10386
|
-
}
|
|
10387
|
-
get config() {
|
|
10388
|
-
return this._config;
|
|
10389
|
-
}
|
|
10390
|
-
get canvas() {
|
|
10391
|
-
return this.canvasRef.nativeElement;
|
|
10392
|
-
}
|
|
10393
|
-
ngOnInit() {
|
|
10394
|
-
this._themeService.theme
|
|
10395
|
-
.pipe(takeWhile$1(_ => this._alive), tap$1(_ => {
|
|
10396
|
-
this.gridColor = _ ? '#5d6a73' : '#bdbdc6';
|
|
10397
|
-
this.axesColor = _ ? '#8e8f9d' : '#7d8f9a';
|
|
10398
|
-
this.init();
|
|
10399
|
-
}))
|
|
10400
|
-
.subscribe();
|
|
10401
|
-
}
|
|
10402
|
-
ngAfterViewInit() {
|
|
10403
|
-
this.addResizeObserver();
|
|
10404
|
-
this.createScene();
|
|
10405
|
-
this.startRenderingLoop();
|
|
10406
|
-
this.init();
|
|
10407
|
-
}
|
|
10408
|
-
ngOnDestroy() {
|
|
10409
|
-
this._alive = false;
|
|
10410
|
-
this.removeResizeObserver();
|
|
10411
|
-
}
|
|
10412
|
-
init() {
|
|
10413
|
-
if (!this._scene) {
|
|
10414
|
-
return;
|
|
10415
|
-
}
|
|
10416
|
-
while (this._scene.children.length > 0) {
|
|
10417
|
-
this._scene.remove(this._scene.children[0]);
|
|
10418
|
-
}
|
|
10419
|
-
const { x, y, z } = this.getScales(this._config.series);
|
|
10420
|
-
this.config.series.forEach((data, idx) => {
|
|
10421
|
-
if (!data.points?.length) {
|
|
10422
|
-
return;
|
|
10423
|
-
}
|
|
10424
|
-
const points = data.points.map(_ => new THREE.Vector3(x(_.x), y(_.y), z(_.z)));
|
|
10425
|
-
const color = d3.scaleOrdinal(d3.schemeTableau10);
|
|
10426
|
-
const material = new THREE.LineBasicMaterial({
|
|
10427
|
-
color: data?.color ?? color(idx.toString()),
|
|
10428
|
-
});
|
|
10429
|
-
const tubeGeometry = new THREE.TubeGeometry(new THREE.CatmullRomCurve3(points), 1024, 0.5, 20, false);
|
|
10430
|
-
let tube = new THREE.Line(tubeGeometry, material);
|
|
10431
|
-
this._scene.add(tube);
|
|
10432
|
-
});
|
|
10433
|
-
const circles = x.ticks(this.SIDE_SIZE / 10);
|
|
10434
|
-
const material = new THREE.LineBasicMaterial({ color: this.axesColor });
|
|
10435
|
-
const pointsLines = [];
|
|
10436
|
-
pointsLines.push(new THREE.Vector3(0, 0, 0));
|
|
10437
|
-
pointsLines.push(new THREE.Vector3(0, 0, z(-z.domain()[1])));
|
|
10438
|
-
pointsLines.push(new THREE.Vector3(0, 0, 0));
|
|
10439
|
-
pointsLines.push(new THREE.Vector3(x(-x.domain()[1]), 0, 0));
|
|
10440
|
-
const geometryLines = new THREE.BufferGeometry().setFromPoints(pointsLines);
|
|
10441
|
-
const line = new THREE.Line(geometryLines, material);
|
|
10442
|
-
this._scene.add(line);
|
|
10443
|
-
circles.forEach(r => {
|
|
10444
|
-
const material = new THREE.LineDashedMaterial({
|
|
10445
|
-
color: this.gridColor,
|
|
10446
|
-
dashSize: 1,
|
|
10447
|
-
gapSize: 3,
|
|
10448
|
-
});
|
|
10449
|
-
const circleGeometry = new THREE.BufferGeometry().setFromPoints(new THREE.Path()
|
|
10450
|
-
.absarc(0, 0, x(r), 0, Math.PI * 2, false)
|
|
10451
|
-
.getSpacedPoints(100));
|
|
10452
|
-
const circle = new THREE.LineSegments(circleGeometry, material);
|
|
10453
|
-
circle.geometry.rotateX(-Math.PI / 2);
|
|
10454
|
-
this._scene.add(circle);
|
|
10455
|
-
});
|
|
10456
|
-
this.drawTicks(x, y, z);
|
|
10457
|
-
if (!this._controls) {
|
|
10458
|
-
this._controls = new OrbitControls(this._camera, this._renderer.domElement);
|
|
10459
|
-
this._controls.enableDamping = true;
|
|
10460
|
-
this._controls.enablePan = true;
|
|
10461
|
-
this._controls.dampingFactor = 0.25;
|
|
10462
|
-
this._controls.screenSpacePanning = true;
|
|
10463
|
-
this._controls.minDistance = 0;
|
|
10464
|
-
this._controls.maxDistance = 10000;
|
|
10465
|
-
this._controls.maxPolarAngle = Math.PI / 2;
|
|
10466
|
-
this._controls.enableZoom = true;
|
|
10467
|
-
}
|
|
10468
|
-
}
|
|
10469
|
-
createScene() {
|
|
10470
|
-
this._scene = new THREE.Scene();
|
|
10471
|
-
const aspectRatio = this._elementRef.nativeElement.clientWidth /
|
|
10472
|
-
this._elementRef.nativeElement.clientHeight;
|
|
10473
|
-
const fieldOfView = 10;
|
|
10474
|
-
const nearClippingPane = 1;
|
|
10475
|
-
const farClippingPane = 10000;
|
|
10476
|
-
this._camera = new THREE.PerspectiveCamera(fieldOfView, aspectRatio, nearClippingPane, farClippingPane);
|
|
10477
|
-
this._camera.position.set(1300, 1300, 1300).setLength(1300);
|
|
10478
|
-
this._scene.add(this._camera);
|
|
10479
|
-
}
|
|
10480
|
-
setSize(width, height) {
|
|
10481
|
-
this._camera.aspect = width / height;
|
|
10482
|
-
this._renderer.setSize(width, height);
|
|
10483
|
-
this._camera.updateProjectionMatrix();
|
|
10484
|
-
}
|
|
10485
|
-
render() {
|
|
10486
|
-
this._renderer.render(this._scene, this._camera);
|
|
10487
|
-
}
|
|
10488
|
-
startRenderingLoop() {
|
|
10489
|
-
this._renderer = new THREE.WebGLRenderer({
|
|
10490
|
-
antialias: true,
|
|
10491
|
-
canvas: this.canvas,
|
|
10492
|
-
alpha: true,
|
|
10493
|
-
preserveDrawingBuffer: true,
|
|
10494
|
-
});
|
|
10495
|
-
const animate = () => {
|
|
10496
|
-
requestAnimationFrame(animate);
|
|
10497
|
-
this._controls?.update();
|
|
10498
|
-
this.render();
|
|
10499
|
-
};
|
|
10500
|
-
animate();
|
|
10501
|
-
}
|
|
10502
|
-
addResizeObserver() {
|
|
10503
|
-
this._obs = new ResizeObserver(_ => {
|
|
10504
|
-
this.setSize(_[0]?.contentRect.width, _[0]?.contentRect.height);
|
|
10505
|
-
});
|
|
10506
|
-
this._obs.observe(this._elementRef.nativeElement);
|
|
10507
|
-
}
|
|
10508
|
-
removeResizeObserver() {
|
|
10509
|
-
this._obs.unobserve(this._elementRef.nativeElement);
|
|
10510
|
-
this._obs.disconnect();
|
|
10511
|
-
}
|
|
10512
|
-
makeSprite(text, opts) {
|
|
10513
|
-
const fontSize = 20;
|
|
10514
|
-
const canvas = document.createElement('canvas');
|
|
10515
|
-
const ctx = canvas.getContext('2d');
|
|
10516
|
-
const textWidth = text.length * 50;
|
|
10517
|
-
canvas.height = 50;
|
|
10518
|
-
canvas.width = 50;
|
|
10519
|
-
if (ctx) {
|
|
10520
|
-
ctx.font = `${fontSize}px Arial`;
|
|
10521
|
-
ctx.textAlign = 'center';
|
|
10522
|
-
ctx.textBaseline = 'middle';
|
|
10523
|
-
ctx.fillStyle = '#A0A0A0';
|
|
10524
|
-
ctx.fillText(text, 25, 25);
|
|
10525
|
-
}
|
|
10526
|
-
const texture = new THREE.Texture(canvas);
|
|
10527
|
-
texture.minFilter = THREE.LinearFilter;
|
|
10528
|
-
texture.needsUpdate = true;
|
|
10529
|
-
const spriteMaterial = new THREE.SpriteMaterial({
|
|
10530
|
-
map: texture,
|
|
10531
|
-
});
|
|
10532
|
-
const sprite = new THREE.Sprite(spriteMaterial);
|
|
10533
|
-
sprite.scale.set(0.4 * fontSize, 0.4 * fontSize, 0.4 * fontSize);
|
|
10534
|
-
return sprite;
|
|
10535
|
-
}
|
|
10536
|
-
drawTicks(x, y, z) {
|
|
10537
|
-
const ticks = new THREE.Object3D();
|
|
10538
|
-
const scalesExtrems = [];
|
|
10539
|
-
[x, y, z].forEach((scale, idx) => {
|
|
10540
|
-
const generatedTicks = scale.ticks(this.SIDE_SIZE / 10);
|
|
10541
|
-
scalesExtrems.push(d3.max(generatedTicks));
|
|
10542
|
-
generatedTicks.forEach((_) => {
|
|
10543
|
-
const sprite = this.makeSprite(_);
|
|
10544
|
-
if (idx === 0) {
|
|
10545
|
-
sprite.position.set(x(_), y(y.domain()[1]), 0);
|
|
10546
|
-
}
|
|
10547
|
-
if (idx === 1) {
|
|
10548
|
-
sprite.position.set(-10, y(_), 0);
|
|
10549
|
-
}
|
|
10550
|
-
if (idx === 2) {
|
|
10551
|
-
sprite.position.set(0, y(y.domain()[1]), z(_));
|
|
10552
|
-
}
|
|
10553
|
-
ticks.add(sprite);
|
|
10554
|
-
});
|
|
10555
|
-
});
|
|
10556
|
-
const northLabel = this.makeSprite('X', { fontSize: 28 });
|
|
10557
|
-
const westLabel = this.makeSprite('Y', { fontSize: 28 });
|
|
10558
|
-
const tvdLabel = this.makeSprite('TVD', { fontSize: 28 });
|
|
10559
|
-
northLabel.position.set(x(x.domain()[1]) + 5, 0, 0);
|
|
10560
|
-
westLabel.position.set(0, 0, y(y.domain()[0]) + 5);
|
|
10561
|
-
tvdLabel.position.set(0, z(z.domain()[1]) + 5, 0);
|
|
10562
|
-
ticks.add(northLabel, westLabel, tvdLabel);
|
|
10563
|
-
const axesHelper = new THREE.AxesHelper(this.SIDE_SIZE);
|
|
10564
|
-
axesHelper.setColors(this.axesColor, this.axesColor, this.axesColor);
|
|
10565
|
-
this._scene.add(axesHelper);
|
|
10566
|
-
this._scene.add(ticks);
|
|
10567
|
-
}
|
|
10568
|
-
getScales(series) {
|
|
10569
|
-
const extrems = series.map(_ => ({
|
|
10570
|
-
x: d3.extent(_.points, (p) => p.x),
|
|
10571
|
-
y: d3.extent(_.points, (p) => p.y),
|
|
10572
|
-
z: d3.extent(_.points, (p) => p.z),
|
|
10573
|
-
}));
|
|
10574
|
-
const flattenExtrems = extrems.reduce((acc, _) => {
|
|
10575
|
-
acc.x = acc.x.concat(_.x);
|
|
10576
|
-
acc.y = acc.y.concat(_.y);
|
|
10577
|
-
acc.z = acc.z.concat(_.z);
|
|
10578
|
-
return acc;
|
|
10579
|
-
}, { x: [], y: [], z: [] });
|
|
10580
|
-
const x = d3
|
|
10581
|
-
.scaleLinear()
|
|
10582
|
-
.domain([
|
|
10583
|
-
0,
|
|
10584
|
-
this._config?.axes?.max == null
|
|
10585
|
-
? parseInt(d3.max(flattenExtrems.x))
|
|
10586
|
-
: this._config.axes.max,
|
|
10587
|
-
])
|
|
10588
|
-
.range([0, this.SIDE_SIZE])
|
|
10589
|
-
.nice();
|
|
10590
|
-
const y = d3
|
|
10591
|
-
.scaleLinear()
|
|
10592
|
-
.domain([0, parseInt(d3.max(flattenExtrems.y), 10)])
|
|
10593
|
-
.range([this.SIDE_SIZE, 0]);
|
|
10594
|
-
const z = d3
|
|
10595
|
-
.scaleLinear()
|
|
10596
|
-
.domain([
|
|
10597
|
-
0,
|
|
10598
|
-
this._config?.axes?.max == null
|
|
10599
|
-
? parseInt(d3.max(flattenExtrems.z))
|
|
10600
|
-
: this._config.axes.max,
|
|
10601
|
-
])
|
|
10602
|
-
.range([0, this.SIDE_SIZE])
|
|
10603
|
-
.nice();
|
|
10604
|
-
return { x, y, z };
|
|
10605
|
-
}
|
|
10606
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: Chart3dComponent, deps: [{ token: i0.ElementRef }, { token: ThemeSwitchService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
10607
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.5", type: Chart3dComponent, isStandalone: true, selector: "teta-chart3d", inputs: { config: "config" }, viewQueries: [{ propertyName: "canvasRef", first: true, predicate: ["canvas"], descendants: true }], ngImport: i0, template: "<canvas #canvas></canvas>\n", styles: [":host{display:flex;width:100%;height:100%}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
10608
|
-
}
|
|
10609
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: Chart3dComponent, decorators: [{
|
|
10610
|
-
type: Component,
|
|
10611
|
-
args: [{ selector: 'teta-chart3d', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<canvas #canvas></canvas>\n", styles: [":host{display:flex;width:100%;height:100%}\n"] }]
|
|
10612
|
-
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: ThemeSwitchService }], propDecorators: { canvasRef: [{
|
|
10613
|
-
type: ViewChild,
|
|
10614
|
-
args: ['canvas']
|
|
10615
|
-
}], config: [{
|
|
10616
|
-
type: Input
|
|
10617
|
-
}] } });
|
|
10618
|
-
|
|
10619
10631
|
class DividerComponent {
|
|
10620
10632
|
constructor() { }
|
|
10621
10633
|
ngOnInit() { }
|
|
@@ -10809,7 +10821,7 @@ class AutoPositionDirective {
|
|
|
10809
10821
|
}
|
|
10810
10822
|
ngAfterViewInit() {
|
|
10811
10823
|
this.setPosition();
|
|
10812
|
-
this._zone.onStable.pipe(takeWhile
|
|
10824
|
+
this._zone.onStable.pipe(takeWhile(() => this._alive)).subscribe(() => {
|
|
10813
10825
|
this.setPosition();
|
|
10814
10826
|
});
|
|
10815
10827
|
}
|
|
@@ -11147,12 +11159,12 @@ class DragContainerDirective {
|
|
|
11147
11159
|
previewTemplate: this._previewTemplate?.templateRef,
|
|
11148
11160
|
viewContainer: this._viewContainerRef
|
|
11149
11161
|
});
|
|
11150
|
-
this._dragService.dropTarget.pipe(takeWhile
|
|
11162
|
+
this._dragService.dropTarget.pipe(takeWhile(() => this._alive))
|
|
11151
11163
|
.subscribe((target) => {
|
|
11152
11164
|
this.dropTarget = target;
|
|
11153
11165
|
this._cdr.detectChanges();
|
|
11154
11166
|
});
|
|
11155
|
-
this._dragService.dropped.pipe(takeWhile
|
|
11167
|
+
this._dragService.dropped.pipe(takeWhile(() => this._alive))
|
|
11156
11168
|
.subscribe((event) => {
|
|
11157
11169
|
this.tetaDrop.emit(event);
|
|
11158
11170
|
});
|
|
@@ -11259,7 +11271,7 @@ class DragDirective {
|
|
|
11259
11271
|
data: this.data,
|
|
11260
11272
|
});
|
|
11261
11273
|
this._dragService.dropTarget
|
|
11262
|
-
.pipe(takeWhile
|
|
11274
|
+
.pipe(takeWhile(() => this._alive))
|
|
11263
11275
|
.subscribe(target => {
|
|
11264
11276
|
this.dropTarget = target;
|
|
11265
11277
|
if (target === this.instance) {
|
|
@@ -11269,7 +11281,7 @@ class DragDirective {
|
|
|
11269
11281
|
this._cdr.markForCheck();
|
|
11270
11282
|
});
|
|
11271
11283
|
this._dragService.dropped
|
|
11272
|
-
.pipe(takeWhile
|
|
11284
|
+
.pipe(takeWhile(() => this._alive))
|
|
11273
11285
|
.pipe(filter$1((event) => {
|
|
11274
11286
|
return event.target === this.instance;
|
|
11275
11287
|
}))
|
|
@@ -11550,7 +11562,7 @@ class LoaderDirective {
|
|
|
11550
11562
|
this._alive = true;
|
|
11551
11563
|
this._loading = false;
|
|
11552
11564
|
this._element = this._elementRef.nativeElement;
|
|
11553
|
-
this._zone.onStable.pipe(takeWhile
|
|
11565
|
+
this._zone.onStable.pipe(takeWhile(_ => this._alive)).subscribe(_ => {
|
|
11554
11566
|
if (this._loading && this._loader) {
|
|
11555
11567
|
this.setPosition();
|
|
11556
11568
|
}
|
|
@@ -11634,7 +11646,7 @@ class TooltipDirective extends DynamicContentBaseDirective {
|
|
|
11634
11646
|
}
|
|
11635
11647
|
ngOnInit() {
|
|
11636
11648
|
merge(this._click.click, this._click.contextMenu)
|
|
11637
|
-
.pipe(takeWhile
|
|
11649
|
+
.pipe(takeWhile(() => this._alive), filter$1(() => this._open), filter$1(() => this._componentRef != null), filter$1((event) => !DomUtil.clickedInside(this._elementRef.nativeElement, event)), filter$1((event) => !DomUtil.clickedInside(this._componentRef?.location.nativeElement, event)), tap(_ => this.destroyContentRef()))
|
|
11638
11650
|
.subscribe();
|
|
11639
11651
|
}
|
|
11640
11652
|
setPosition() {
|