barsa-novin-ray-core 2.3.167 → 3.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/{barsa-novin-ray-core-barsa-novin-ray-core-CKKXv9DX.mjs → barsa-novin-ray-core-barsa-novin-ray-core-CakmZXPX.mjs} +748 -116
- package/fesm2022/barsa-novin-ray-core-barsa-novin-ray-core-CakmZXPX.mjs.map +1 -0
- package/fesm2022/{barsa-novin-ray-core-barsa-report-page.module-BIBAUbnS.mjs → barsa-novin-ray-core-barsa-report-page.module-DFDfT3fn.mjs} +2 -2
- package/fesm2022/{barsa-novin-ray-core-barsa-report-page.module-BIBAUbnS.mjs.map → barsa-novin-ray-core-barsa-report-page.module-DFDfT3fn.mjs.map} +1 -1
- package/fesm2022/barsa-novin-ray-core.mjs +1 -1
- package/package.json +1 -1
- package/types/barsa-novin-ray-core.d.ts +205 -19
- package/fesm2022/barsa-novin-ray-core-barsa-novin-ray-core-CKKXv9DX.mjs.map +0 -1
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { Injectable, inject, ElementRef, Input, ChangeDetectionStrategy, Component, Pipe, Injector, EnvironmentInjector, ApplicationRef, createComponent, InjectionToken, Compiler, DOCUMENT, NgZone,
|
|
3
|
-
import { Subject, from, BehaviorSubject, of, exhaustMap, map as map$1, shareReplay, catchError, timer, combineLatest, debounceTime as debounceTime$1, distinctUntilChanged as distinctUntilChanged$1, switchMap, forkJoin, withLatestFrom as withLatestFrom$1, fromEvent, throwError, merge, interval, filter as filter$1, lastValueFrom, timeout, takeUntil as takeUntil$1, take, skip, Observable, tap as tap$1, mergeWith, Subscription } from 'rxjs';
|
|
2
|
+
import { Injectable, inject, ElementRef, Input, ChangeDetectionStrategy, Component, Pipe, signal, ChangeDetectorRef, effect, Injector, EnvironmentInjector, ApplicationRef, createComponent, InjectionToken, Compiler, DOCUMENT as DOCUMENT$1, NgZone, ViewContainerRef, isDevMode, SecurityContext, EventEmitter, Renderer2, HostBinding, Output, HostListener, ViewChild, Directive, TemplateRef, input, booleanAttribute, NgModule, NO_ERRORS_SCHEMA, CUSTOM_ELEMENTS_SCHEMA, ErrorHandler, provideAppInitializer } from '@angular/core';
|
|
3
|
+
import { Subject, from, BehaviorSubject, of, exhaustMap, map as map$1, shareReplay, catchError, timer, combineLatest, debounceTime as debounceTime$1, distinctUntilChanged as distinctUntilChanged$1, switchMap, forkJoin, withLatestFrom as withLatestFrom$1, fromEvent, EMPTY, throwError, merge, interval, filter as filter$1, lastValueFrom, timeout, takeUntil as takeUntil$1, take, skip, Observable, tap as tap$1, mergeWith, Subscription } from 'rxjs';
|
|
4
4
|
import * as i1 from '@angular/router';
|
|
5
5
|
import { Router, NavigationEnd, ActivatedRoute, RouterEvent, NavigationStart, RouterModule, RouteReuseStrategy } from '@angular/router';
|
|
6
6
|
import { DomSanitizer, Title } from '@angular/platform-browser';
|
|
7
|
-
import { filter, startWith, map, tap, takeUntil, exhaustMap as exhaustMap$1, withLatestFrom, delay, debounceTime, distinctUntilChanged, concatMap, finalize, publishReplay, refCount,
|
|
7
|
+
import { filter, startWith, map, tap, takeUntil, exhaustMap as exhaustMap$1, withLatestFrom, delay, debounceTime, distinctUntilChanged, concatMap, finalize, publishReplay, refCount, switchMap as switchMap$1, shareReplay as shareReplay$1, catchError as catchError$1, merge as merge$1, pluck, mergeWith as mergeWith$1 } from 'rxjs/operators';
|
|
8
8
|
import moment from 'moment';
|
|
9
9
|
import moment$1 from 'moment-hijri';
|
|
10
10
|
import moment$2 from 'moment-jalaali';
|
|
11
11
|
import { _isNumberValue } from '@angular/cdk/coercion';
|
|
12
12
|
import { FormControl, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
13
|
-
import { HttpClient, HttpEventType, HttpErrorResponse, HttpHeaders, provideHttpClient, withXhr, withInterceptorsFromDi } from '@angular/common/http';
|
|
14
13
|
import * as i1$1 from '@angular/common';
|
|
15
|
-
import { Location, TitleCasePipe, CommonModule } from '@angular/common';
|
|
14
|
+
import { DOCUMENT, Location, TitleCasePipe, CommonModule } from '@angular/common';
|
|
15
|
+
import { HttpClient, HttpEventType, HttpErrorResponse, HttpHeaders, provideHttpClient, withXhr, withInterceptorsFromDi } from '@angular/common/http';
|
|
16
16
|
import RecordRTC from 'recordrtc';
|
|
17
17
|
import { SwUpdate, SwPush } from '@angular/service-worker';
|
|
18
18
|
import { openDB } from 'idb';
|
|
@@ -1749,6 +1749,40 @@ function calculateColumnWidthFitToContainer(container, canView, disableContextMe
|
|
|
1749
1749
|
// });
|
|
1750
1750
|
return { columns: [...columns], contextMenuWidth };
|
|
1751
1751
|
}
|
|
1752
|
+
/**
|
|
1753
|
+
* تشخیص میدهد که آیا جدول باید از حالتِ FitToContainer به FreeColumnSize (عرضِ طبیعی + اسکرولِ افقی)
|
|
1754
|
+
* سوییچ کند یا نه. برای اینکه یک ستونِ outlier کلِ جدول را اسکرولی نکند، فقط وقتی `true` میدهد که
|
|
1755
|
+
* **حداقل `threshold` ستون** در سهمِ برابرِ کانتینر بیش از `maxHiddenRatio` (پیشفرض ۳۰٪) پنهان بمانند.
|
|
1756
|
+
*/
|
|
1757
|
+
function shouldUseFreeColumnSize(containerWidth, columns, threshold = 2, maxHiddenRatio = 0.3, reservedWidth = 0) {
|
|
1758
|
+
if (!containerWidth || containerWidth <= 0 || !columns?.length) {
|
|
1759
|
+
return false;
|
|
1760
|
+
}
|
|
1761
|
+
// ستونِ رنگِ اولِ ردیف (FieldTypeId===41) و ستونهای مخفی را کنار میگذاریم (همراستا با FitToContainer)
|
|
1762
|
+
const visibleColumns = columns.filter((c, i) => !c.Hidden && !(i === 0 && c.FieldTypeId === 41));
|
|
1763
|
+
const visibleCount = visibleColumns.length;
|
|
1764
|
+
if (visibleCount === 0) {
|
|
1765
|
+
return false;
|
|
1766
|
+
}
|
|
1767
|
+
// فضای واقعیِ در دسترسِ ستونهای داده = عرضِ کانتینر منهای سربار (چکباکس/منوی زمینه/دکمهی view)
|
|
1768
|
+
const availableWidth = containerWidth - reservedWidth;
|
|
1769
|
+
if (availableWidth <= 0) {
|
|
1770
|
+
return true;
|
|
1771
|
+
}
|
|
1772
|
+
const fairShare = availableWidth / visibleCount;
|
|
1773
|
+
let crampedCount = 0;
|
|
1774
|
+
for (const col of visibleColumns) {
|
|
1775
|
+
const neededWidth = setColumnCaptionWidth(col);
|
|
1776
|
+
// «بیش از maxHiddenRatio پنهان» ⇔ سهمِ برابر < (۱-ratio)×عرضِ لازم
|
|
1777
|
+
if (neededWidth * (1 - maxHiddenRatio) > fairShare) {
|
|
1778
|
+
crampedCount++;
|
|
1779
|
+
if (crampedCount >= threshold) {
|
|
1780
|
+
return true;
|
|
1781
|
+
}
|
|
1782
|
+
}
|
|
1783
|
+
}
|
|
1784
|
+
return false;
|
|
1785
|
+
}
|
|
1752
1786
|
function calcContextMenuWidth(contextMenuItems, disableContextMenuOverflow) {
|
|
1753
1787
|
let contextMenuWidth = contextMenuItems.length > 1 ? 40 : 0;
|
|
1754
1788
|
const btnPadding = 14 + 2 + 10; // padding + border + if text is overflowed then add 5 pixel.so we always 5 px to it.
|
|
@@ -1869,6 +1903,20 @@ function measureTextBy(text, fontSize, fontName) {
|
|
|
1869
1903
|
function genrateInlineMoId() {
|
|
1870
1904
|
return (BarsaApi.idGenerator--).toString();
|
|
1871
1905
|
}
|
|
1906
|
+
/**
|
|
1907
|
+
* تبدیل مقدار زمانی با ساختار hh:mm که از سرور بهصورت عددِ اعشاریِ «ساعت.دقیقه» میآید، به میلیثانیه.
|
|
1908
|
+
* بخشِ صحیح = ساعت و دو رقمِ اعشار = دقیقه؛ مثلاً "0.01" = 00:01 = یک دقیقه، "1.30" = 01:30 = نود دقیقه.
|
|
1909
|
+
* برای مقدار نامعتبر، خالی یا صفر و منفی، عددِ 0 (یعنی «خاموش») برمیگرداند.
|
|
1910
|
+
*/
|
|
1911
|
+
function hhmmToMs(value) {
|
|
1912
|
+
const num = Number(value);
|
|
1913
|
+
if (!num || num <= 0) {
|
|
1914
|
+
return 0;
|
|
1915
|
+
}
|
|
1916
|
+
const hours = Math.floor(num);
|
|
1917
|
+
const minutes = Math.round((num - hours) * 100);
|
|
1918
|
+
return (hours * 60 + minutes) * 60 * 1000;
|
|
1919
|
+
}
|
|
1872
1920
|
function enumValueToStringSize(value, defaultValue) {
|
|
1873
1921
|
switch (value) {
|
|
1874
1922
|
case '1':
|
|
@@ -2642,14 +2690,13 @@ function getTargetRect(target) {
|
|
|
2642
2690
|
}
|
|
2643
2691
|
function getFieldValue(name, mo, caption) {
|
|
2644
2692
|
if (mo.GetFValueByCaption) {
|
|
2645
|
-
let result = mo.GetFValue(name);
|
|
2693
|
+
let result = mo.GetFValue(name) ?? mo.GetFValueByCaption(name);
|
|
2646
2694
|
if (caption) {
|
|
2647
2695
|
result = mo.GetFCaption(name);
|
|
2648
2696
|
}
|
|
2649
2697
|
if (typeof caption === 'undefined' && mo.InheritanceInfo && !(mo.$FieldDict && mo.$FieldDict[name])) {
|
|
2650
2698
|
const { ParentFieldName } = mo.InheritanceInfo;
|
|
2651
2699
|
const moParent = mo.GetFValue(ParentFieldName);
|
|
2652
|
-
let result = moParent.GetFValue(name);
|
|
2653
2700
|
if (caption) {
|
|
2654
2701
|
result = moParent.GetFCaption(name);
|
|
2655
2702
|
}
|
|
@@ -3325,6 +3372,52 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
3325
3372
|
}]
|
|
3326
3373
|
}], ctorParameters: () => [] });
|
|
3327
3374
|
|
|
3375
|
+
/**
|
|
3376
|
+
* پورتِ جاواسکریپتیِ DateTimeHelper.ToRelativeDate (سیشارپ).
|
|
3377
|
+
* فاصلهی تاریخِ ورودی تا «الان» را بهصورت متنِ نسبیِ فارسی برمیگرداند.
|
|
3378
|
+
*
|
|
3379
|
+
* نمونهها: «چند ثانیه پیش»، «۲ دقیقه پیش»، «۳ ساعت دیگر»، «فردا»، «۵ روز پیش»، «۲ ماه دیگر».
|
|
3380
|
+
*
|
|
3381
|
+
* @param value تاریخ ورودی (Date | رشته | timestamp میلیثانیه).
|
|
3382
|
+
* @param now مبنای «الان» بر حسب میلیثانیه؛ برای تستپذیری و بهروزرسانیِ سیگنالی قابل تزریق است.
|
|
3383
|
+
*/
|
|
3384
|
+
function toRelativeDate(value, now = Date.now()) {
|
|
3385
|
+
if (value === null || value === undefined || value === '') {
|
|
3386
|
+
return 'نامشخص';
|
|
3387
|
+
}
|
|
3388
|
+
const date = value instanceof Date ? value.getTime() : new Date(value).getTime();
|
|
3389
|
+
// تاریخِ نامعتبر یا مقدارِ پیشفرضِ DateTime (DateTime.MinValue)
|
|
3390
|
+
if (Number.isNaN(date)) {
|
|
3391
|
+
return 'نامشخص';
|
|
3392
|
+
}
|
|
3393
|
+
const tsSeconds = (date - now) / 1000; // مثبت => آینده، منفی => گذشته
|
|
3394
|
+
const delta = Math.abs(tsSeconds);
|
|
3395
|
+
const isFuture = tsSeconds > 0;
|
|
3396
|
+
const suffix = isFuture ? 'دیگر' : 'پیش';
|
|
3397
|
+
if (delta < 60) {
|
|
3398
|
+
return isFuture ? 'چند ثانیه دیگر' : 'چند ثانیه پیش';
|
|
3399
|
+
}
|
|
3400
|
+
if (delta < 3600) {
|
|
3401
|
+
return `${Math.floor(delta / 60)} دقیقه ${suffix}`;
|
|
3402
|
+
}
|
|
3403
|
+
if (delta < 86400) {
|
|
3404
|
+
return `${Math.floor(delta / 3600)} ساعت ${suffix}`;
|
|
3405
|
+
}
|
|
3406
|
+
if (delta < 172800) {
|
|
3407
|
+
return isFuture ? 'فردا' : 'دیروز';
|
|
3408
|
+
}
|
|
3409
|
+
if (delta < 604800) {
|
|
3410
|
+
return `${Math.floor(delta / 86400)} روز ${suffix}`;
|
|
3411
|
+
}
|
|
3412
|
+
if (delta < 2592000) {
|
|
3413
|
+
return `${Math.floor(delta / 604800)} هفته ${suffix}`;
|
|
3414
|
+
}
|
|
3415
|
+
if (delta < 31536000) {
|
|
3416
|
+
return `${Math.floor(delta / 2592000)} ماه ${suffix}`;
|
|
3417
|
+
}
|
|
3418
|
+
return `${Math.floor(delta / 31536000)} سال ${suffix}`;
|
|
3419
|
+
}
|
|
3420
|
+
|
|
3328
3421
|
class MoValuePipe {
|
|
3329
3422
|
constructor() { }
|
|
3330
3423
|
transform(name, mo, caption) {
|
|
@@ -4092,7 +4185,9 @@ class ColumnIconPipe {
|
|
|
4092
4185
|
const data = mo[colName];
|
|
4093
4186
|
let icon = mo[colName + '$Icon'];
|
|
4094
4187
|
if (typeof data === 'object' && data) {
|
|
4095
|
-
|
|
4188
|
+
// برای رابطهی تکی، آیکنِ خودِ آبجکت (data.$Icon) اولویت دارد؛
|
|
4189
|
+
// در غیر این صورت آیکنِ فیلد همسایه (mo[colName + '$Icon']) حفظ میشود.
|
|
4190
|
+
icon = data.$Icon ?? icon;
|
|
4096
4191
|
}
|
|
4097
4192
|
return icon;
|
|
4098
4193
|
}
|
|
@@ -4107,6 +4202,31 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
4107
4202
|
}]
|
|
4108
4203
|
}] });
|
|
4109
4204
|
|
|
4205
|
+
/** آیکن عمومیِ پیشفرض وقتی نه رکورد و نه موجودیت آیکن ندارند. */
|
|
4206
|
+
const DEFAULT_OBJECT_ICON = '/assets/Images/A/16/object.png';
|
|
4207
|
+
/**
|
|
4208
|
+
* آیکنِ یک رکورد را resolve میکند:
|
|
4209
|
+
* ۱- آیکنِ خودِ رکورد (`mo.$Icon`)
|
|
4210
|
+
* ۲- آیکنِ تعیینشده برای موجودیت (`Setting.Data.Icon`)
|
|
4211
|
+
* ۳- آیکنِ عمومیِ پیشفرض
|
|
4212
|
+
*
|
|
4213
|
+
* استفاده: `mo | moIcon: UlvMainCtrlr`
|
|
4214
|
+
*/
|
|
4215
|
+
class MoIconPipe {
|
|
4216
|
+
transform(mo, Setting) {
|
|
4217
|
+
return mo?.$Icon ?? Setting?.Data?.Icon ?? DEFAULT_OBJECT_ICON;
|
|
4218
|
+
}
|
|
4219
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: MoIconPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
4220
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "22.0.8", ngImport: i0, type: MoIconPipe, isStandalone: false, name: "moIcon" }); }
|
|
4221
|
+
}
|
|
4222
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: MoIconPipe, decorators: [{
|
|
4223
|
+
type: Pipe,
|
|
4224
|
+
args: [{
|
|
4225
|
+
name: 'moIcon',
|
|
4226
|
+
standalone: false
|
|
4227
|
+
}]
|
|
4228
|
+
}] });
|
|
4229
|
+
|
|
4110
4230
|
class RowNumberPipe {
|
|
4111
4231
|
transform(moId, setting, moDataList) {
|
|
4112
4232
|
if (!moId) {
|
|
@@ -4459,11 +4579,91 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
4459
4579
|
}]
|
|
4460
4580
|
}] });
|
|
4461
4581
|
|
|
4582
|
+
class ReadableTextColorPipe {
|
|
4583
|
+
constructor() {
|
|
4584
|
+
this._document = inject(DOCUMENT);
|
|
4585
|
+
}
|
|
4586
|
+
transform(backgroundColor, context) {
|
|
4587
|
+
if (typeof backgroundColor !== 'string' || !backgroundColor.trim()) {
|
|
4588
|
+
return null;
|
|
4589
|
+
}
|
|
4590
|
+
const rgb = this._resolveColor(backgroundColor.trim(), context);
|
|
4591
|
+
if (!rgb) {
|
|
4592
|
+
return null;
|
|
4593
|
+
}
|
|
4594
|
+
const blackContrast = this._getContrastRatio(rgb, [0, 0, 0]);
|
|
4595
|
+
const whiteContrast = this._getContrastRatio(rgb, [255, 255, 255]);
|
|
4596
|
+
return whiteContrast > blackContrast ? '#ffffff' : '#000000';
|
|
4597
|
+
}
|
|
4598
|
+
_resolveColor(color, context) {
|
|
4599
|
+
const view = this._document.defaultView;
|
|
4600
|
+
const host = context || this._document.body || this._document.documentElement;
|
|
4601
|
+
if (!view || !host) {
|
|
4602
|
+
return null;
|
|
4603
|
+
}
|
|
4604
|
+
if (view.CSS?.supports && !view.CSS.supports('color', color)) {
|
|
4605
|
+
return null;
|
|
4606
|
+
}
|
|
4607
|
+
const probe = this._document.createElement('span');
|
|
4608
|
+
probe.style.color = color;
|
|
4609
|
+
probe.style.display = 'none';
|
|
4610
|
+
if (!probe.style.color) {
|
|
4611
|
+
return null;
|
|
4612
|
+
}
|
|
4613
|
+
host.appendChild(probe);
|
|
4614
|
+
const resolvedColor = view.getComputedStyle(probe).color;
|
|
4615
|
+
probe.remove();
|
|
4616
|
+
if (!resolvedColor) {
|
|
4617
|
+
return null;
|
|
4618
|
+
}
|
|
4619
|
+
const canvas = this._document.createElement('canvas');
|
|
4620
|
+
canvas.width = 1;
|
|
4621
|
+
canvas.height = 1;
|
|
4622
|
+
const canvasContext = canvas.getContext('2d');
|
|
4623
|
+
if (!canvasContext) {
|
|
4624
|
+
return null;
|
|
4625
|
+
}
|
|
4626
|
+
canvasContext.clearRect(0, 0, 1, 1);
|
|
4627
|
+
canvasContext.fillStyle = resolvedColor;
|
|
4628
|
+
canvasContext.fillRect(0, 0, 1, 1);
|
|
4629
|
+
const [red, green, blue, alpha] = canvasContext.getImageData(0, 0, 1, 1).data;
|
|
4630
|
+
return alpha === 0 ? null : [red, green, blue];
|
|
4631
|
+
}
|
|
4632
|
+
_getContrastRatio(firstColor, secondColor) {
|
|
4633
|
+
const firstLuminance = this._getLuminance(firstColor);
|
|
4634
|
+
const secondLuminance = this._getLuminance(secondColor);
|
|
4635
|
+
const brightest = Math.max(firstLuminance, secondLuminance);
|
|
4636
|
+
const darkest = Math.min(firstLuminance, secondLuminance);
|
|
4637
|
+
return (brightest + 0.05) / (darkest + 0.05);
|
|
4638
|
+
}
|
|
4639
|
+
_getLuminance(rgb) {
|
|
4640
|
+
const [red, green, blue] = rgb.map((value) => {
|
|
4641
|
+
const channel = value / 255;
|
|
4642
|
+
return channel <= 0.03928 ? channel / 12.92 : Math.pow((channel + 0.055) / 1.055, 2.4);
|
|
4643
|
+
});
|
|
4644
|
+
return 0.2126 * red + 0.7152 * green + 0.0722 * blue;
|
|
4645
|
+
}
|
|
4646
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ReadableTextColorPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
4647
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "22.0.8", ngImport: i0, type: ReadableTextColorPipe, isStandalone: false, name: "readableTextColor" }); }
|
|
4648
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ReadableTextColorPipe, providedIn: 'root' }); }
|
|
4649
|
+
}
|
|
4650
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ReadableTextColorPipe, decorators: [{
|
|
4651
|
+
type: Injectable,
|
|
4652
|
+
args: [{ providedIn: 'root' }]
|
|
4653
|
+
}, {
|
|
4654
|
+
type: Pipe,
|
|
4655
|
+
args: [{
|
|
4656
|
+
name: 'readableTextColor',
|
|
4657
|
+
standalone: false
|
|
4658
|
+
}]
|
|
4659
|
+
}] });
|
|
4660
|
+
|
|
4462
4661
|
class DynamicDarkColorPipe {
|
|
4463
4662
|
constructor() {
|
|
4464
4663
|
this.cache = new Map();
|
|
4465
4664
|
this.darkBackground = [18, 18, 18]; // #121212
|
|
4466
4665
|
this.minContrast = 4.5;
|
|
4666
|
+
this._readableTextColorPipe = inject(ReadableTextColorPipe);
|
|
4467
4667
|
}
|
|
4468
4668
|
transform(styleStr) {
|
|
4469
4669
|
if (!IsDarkMode() || !styleStr) {
|
|
@@ -4481,9 +4681,8 @@ class DynamicDarkColorPipe {
|
|
|
4481
4681
|
// BACKGROUND EXISTS BUT NO TEXT COLOR
|
|
4482
4682
|
// ---------------------------------------------------
|
|
4483
4683
|
if (bgMatch && !colorMatch) {
|
|
4484
|
-
const
|
|
4485
|
-
if (
|
|
4486
|
-
const textColor = this.getReadableTextColor(bgRgb);
|
|
4684
|
+
const textColor = this._readableTextColorPipe.transform(bgMatch[1].trim());
|
|
4685
|
+
if (textColor) {
|
|
4487
4686
|
newStyle += `; color: ${textColor};`;
|
|
4488
4687
|
}
|
|
4489
4688
|
this.cache.set(styleStr, newStyle);
|
|
@@ -4507,11 +4706,6 @@ class DynamicDarkColorPipe {
|
|
|
4507
4706
|
this.cache.set(styleStr, newStyle);
|
|
4508
4707
|
return newStyle;
|
|
4509
4708
|
}
|
|
4510
|
-
getReadableTextColor(bgRgb) {
|
|
4511
|
-
const whiteContrast = this.getContrastRatio([255, 255, 255], bgRgb);
|
|
4512
|
-
const blackContrast = this.getContrastRatio([0, 0, 0], bgRgb);
|
|
4513
|
-
return whiteContrast > blackContrast ? '#ffffff' : '#000000';
|
|
4514
|
-
}
|
|
4515
4709
|
// ---------------------------------------------------
|
|
4516
4710
|
// 🎯 Adjust until contrast >= 4.5
|
|
4517
4711
|
// ---------------------------------------------------
|
|
@@ -4874,6 +5068,78 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
4874
5068
|
}]
|
|
4875
5069
|
}] });
|
|
4876
5070
|
|
|
5071
|
+
/**
|
|
5072
|
+
* یک ساعتِ سراسری بهصورت سیگنال؛ هر چند ثانیه یکبار «الان» را بهروز میکند
|
|
5073
|
+
* تا متنهای نسبیِ زمان (مثلِ «۲ دقیقه پیش») خودشان زنده بهروز شوند.
|
|
5074
|
+
*
|
|
5075
|
+
* چون یک تایمرِ مشترک برای کلِ برنامه استفاده میشود، تعدادِ زیادی متنِ نسبی
|
|
5076
|
+
* هم بدونِ ساختنِ تایمرِ جداگانه برای هرکدام، همزمان بهروز میمانند.
|
|
5077
|
+
*/
|
|
5078
|
+
class RelativeTimeService {
|
|
5079
|
+
constructor() {
|
|
5080
|
+
this._now = signal(Date.now(), /* @ts-ignore */
|
|
5081
|
+
...(ngDevMode ? [{ debugName: "_now" }] : /* istanbul ignore next */ []));
|
|
5082
|
+
this._nowReadonly = this._now.asReadonly();
|
|
5083
|
+
this.intervalId = setInterval(() => this._now.set(Date.now()), RelativeTimeService.TICK_MS);
|
|
5084
|
+
}
|
|
5085
|
+
/** فاصلهی بهروزرسانیِ «الان» بر حسبِ میلیثانیه. */
|
|
5086
|
+
static { this.TICK_MS = 10_000; }
|
|
5087
|
+
/** سیگنالِ «الان» (میلیثانیه)؛ بهصورتِ دورهای بهروز میشود. */
|
|
5088
|
+
get now() {
|
|
5089
|
+
return this._nowReadonly;
|
|
5090
|
+
}
|
|
5091
|
+
ngOnDestroy() {
|
|
5092
|
+
clearInterval(this.intervalId);
|
|
5093
|
+
}
|
|
5094
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: RelativeTimeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
5095
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: RelativeTimeService, providedIn: 'root' }); }
|
|
5096
|
+
}
|
|
5097
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: RelativeTimeService, decorators: [{
|
|
5098
|
+
type: Injectable,
|
|
5099
|
+
args: [{ providedIn: 'root' }]
|
|
5100
|
+
}] });
|
|
5101
|
+
|
|
5102
|
+
/**
|
|
5103
|
+
* تاریخ را به متنِ نسبیِ فارسی تبدیل میکند و با گذرِ زمان خودش زنده بهروز میشود.
|
|
5104
|
+
*
|
|
5105
|
+
* استفاده در قالب:
|
|
5106
|
+
* ```html
|
|
5107
|
+
* <span>{{ lastUpdateTime | relativeDate }}</span>
|
|
5108
|
+
* ```
|
|
5109
|
+
*
|
|
5110
|
+
* پایپ ناخالص (`pure: false`) است تا با تغییرِ زمان دوباره اجرا شود. زمانِ مرجع از
|
|
5111
|
+
* سیگنالِ مشترکِ {@link RelativeTimeService} میآید و در هر تیکِ آن، ویو برای بازبینی
|
|
5112
|
+
* علامت زده میشود (سازگار با OnPush و حالتِ zoneless). Angular خروجیِ درونیابی را
|
|
5113
|
+
* فقط وقتی متن **واقعاً تغییر کند** در DOM اعمال میکند، پس رندرِ بیهوده رخ نمیدهد.
|
|
5114
|
+
*/
|
|
5115
|
+
class RelativeDatePipe {
|
|
5116
|
+
constructor() {
|
|
5117
|
+
this.relativeTime = inject(RelativeTimeService);
|
|
5118
|
+
this.cdr = inject(ChangeDetectorRef);
|
|
5119
|
+
// The shared clock signal only drives periodic re-checks (OnPush/zoneless friendly).
|
|
5120
|
+
effect(() => {
|
|
5121
|
+
this.relativeTime.now();
|
|
5122
|
+
this.cdr.markForCheck();
|
|
5123
|
+
});
|
|
5124
|
+
}
|
|
5125
|
+
transform(value) {
|
|
5126
|
+
// Compare against the real wall clock, not the signal: the signal ticks every few
|
|
5127
|
+
// seconds and can lag behind "now", which would make a just-set timestamp read as
|
|
5128
|
+
// being in the future («چند ثانیه دیگر») until the next tick.
|
|
5129
|
+
return toRelativeDate(value);
|
|
5130
|
+
}
|
|
5131
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: RelativeDatePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
5132
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "22.0.8", ngImport: i0, type: RelativeDatePipe, isStandalone: false, name: "relativeDate", pure: false }); }
|
|
5133
|
+
}
|
|
5134
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: RelativeDatePipe, decorators: [{
|
|
5135
|
+
type: Pipe,
|
|
5136
|
+
args: [{
|
|
5137
|
+
name: 'relativeDate',
|
|
5138
|
+
pure: false,
|
|
5139
|
+
standalone: false
|
|
5140
|
+
}]
|
|
5141
|
+
}], ctorParameters: () => [] });
|
|
5142
|
+
|
|
4877
5143
|
class ApiService {
|
|
4878
5144
|
constructor() {
|
|
4879
5145
|
this.portalLoginUrl = `/api/auth/portal/login`;
|
|
@@ -5996,6 +6262,9 @@ function formRoutes(authGuard = false) {
|
|
|
5996
6262
|
return {
|
|
5997
6263
|
path: 'form',
|
|
5998
6264
|
canActivate: authGuard ? [AuthGuard] : [],
|
|
6265
|
+
// pageData را صریحاً null میکنیم تا صفحهی فرم، pageDataِ صفحهی والد را به ارث نبرد و
|
|
6266
|
+
// ماژولهای صفحهی والد داخل فرم رندر نشوند. (همراستا با reportRoutes.)
|
|
6267
|
+
data: { pageData: null },
|
|
5999
6268
|
loadChildren: () => Promise.resolve().then(function () { return barsaSapUiFormPage_module; }).then((m) => m.BarsaSapUiFormPageModule)
|
|
6000
6269
|
};
|
|
6001
6270
|
}
|
|
@@ -6155,7 +6424,7 @@ class ApplicationCtrlrService {
|
|
|
6155
6424
|
this._selectedSystemTitle$ = new Subject();
|
|
6156
6425
|
this._systemLocationHref$ = new BehaviorSubject({});
|
|
6157
6426
|
this._isMobile = getDeviceIsMobile();
|
|
6158
|
-
this._document = inject(DOCUMENT);
|
|
6427
|
+
this._document = inject(DOCUMENT$1);
|
|
6159
6428
|
this._router = inject(Router);
|
|
6160
6429
|
this._searchService = inject(SearchService);
|
|
6161
6430
|
this._titleService = inject(Title);
|
|
@@ -6567,7 +6836,11 @@ function reportRoutes(authGuard = false) {
|
|
|
6567
6836
|
return {
|
|
6568
6837
|
path: 'report/:id',
|
|
6569
6838
|
canActivate: authGuard ? [AuthGuard] : [],
|
|
6570
|
-
loadChildren: () => import('./barsa-novin-ray-core-barsa-report-page.module-
|
|
6839
|
+
loadChildren: () => import('./barsa-novin-ray-core-barsa-report-page.module-DFDfT3fn.mjs').then((m) => m.BarsaReportPageModule),
|
|
6840
|
+
// pageData را صریحاً null میکنیم تا صفحهی گزارش، pageDataِ صفحهی والد (مثل home) را
|
|
6841
|
+
// به ارث نبرد؛ در غیر این صورت PageBaseComponent.getData$ ماژولهای صفحهی والد را هم
|
|
6842
|
+
// داخل صفحهی گزارش رندر میکند (مثلاً shellbar). نگاه کن به CustomRouteReuseStrategy.
|
|
6843
|
+
data: { pageData: null },
|
|
6571
6844
|
resolve: {
|
|
6572
6845
|
breadcrumb: ReportBreadcrumbResolver
|
|
6573
6846
|
}
|
|
@@ -6597,7 +6870,7 @@ class PortalService {
|
|
|
6597
6870
|
this._router = inject(Router);
|
|
6598
6871
|
this._location = inject(Location);
|
|
6599
6872
|
this._localStorage = inject(LocalStorageService);
|
|
6600
|
-
this._document = inject(DOCUMENT);
|
|
6873
|
+
this._document = inject(DOCUMENT$1);
|
|
6601
6874
|
this._applicationCtrlrService = inject(ApplicationCtrlrService);
|
|
6602
6875
|
this._deviceSizeSource = new BehaviorSubject(this._initalizeDeviceSize());
|
|
6603
6876
|
this._loggedInSource = new BehaviorSubject(false);
|
|
@@ -7345,7 +7618,9 @@ class PortalService {
|
|
|
7345
7618
|
}
|
|
7346
7619
|
return params;
|
|
7347
7620
|
}
|
|
7348
|
-
ShowFormPanelControl(formpanelCtrlr, router, activatedRoute, dialogComponent, isPage, vcr, isReload = false
|
|
7621
|
+
ShowFormPanelControl(formpanelCtrlr, router, activatedRoute, dialogComponent, isPage, vcr, isReload = false,
|
|
7622
|
+
// اگر RoutingServiceِ فراخوان (فرمِ والد) خودش مودال باز شده باشد، فرمِ فرزند هم مودال باز میشود.
|
|
7623
|
+
callerIsModal = false) {
|
|
7349
7624
|
if (!formpanelCtrlr) {
|
|
7350
7625
|
console.warn('form panel controler is undefined!');
|
|
7351
7626
|
return;
|
|
@@ -7360,6 +7635,9 @@ class PortalService {
|
|
|
7360
7635
|
if (modalSetting) {
|
|
7361
7636
|
isModal = true;
|
|
7362
7637
|
}
|
|
7638
|
+
// «مودال، مودال میزاید»: اگر فرمِ والد مودال بود، این فرم هم مودال باز شود
|
|
7639
|
+
// تا با ناوبریِ صفحه، دیالوگِ والد بسته نشود.
|
|
7640
|
+
isModal = isModal || callerIsModal;
|
|
7363
7641
|
formpanelCtrlr.Setting.IsModal = isModal;
|
|
7364
7642
|
formpanelCtrlr.IsModal = isModal;
|
|
7365
7643
|
const id = getUniqueId(4);
|
|
@@ -7591,7 +7869,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
7591
7869
|
}], ctorParameters: () => [] });
|
|
7592
7870
|
|
|
7593
7871
|
class UlvMainService {
|
|
7594
|
-
/** Inserted by Angular inject() migration for backwards compatibility */
|
|
7595
7872
|
constructor() {
|
|
7596
7873
|
this.moDataListSource = new BehaviorSubject([]);
|
|
7597
7874
|
this._cartableTemplates$ = new BehaviorSubject({});
|
|
@@ -7673,6 +7950,7 @@ class UlvMainService {
|
|
|
7673
7950
|
this._parentHeightSource = new BehaviorSubject(0);
|
|
7674
7951
|
this._moveUpAccessSource = new BehaviorSubject(false);
|
|
7675
7952
|
this._reorderGroupbySource = new BehaviorSubject([]);
|
|
7953
|
+
this._pollingInterval = new BehaviorSubject(0);
|
|
7676
7954
|
this.context$ = this._contextSource
|
|
7677
7955
|
.asObservable()
|
|
7678
7956
|
.pipe(takeUntil(this._onDestroy$), tap((context) => (this.context = context)), tap((context) => this._initialize(context)), tap((context) => this._addEventListener(context)))
|
|
@@ -7693,6 +7971,12 @@ class UlvMainService {
|
|
|
7693
7971
|
this.searchPanelUi$ = this._searchPanelUiSource.asObservable().pipe(takeUntil(this._onDestroy$), tap((searchPanel) => this._addDefaultSearchPanelSettings(searchPanel)));
|
|
7694
7972
|
this.openSearchPanelHiddenSettings$ = this._openSearchPanelHiddenSettingsSource.asObservable();
|
|
7695
7973
|
this.pagingSetting$ = this._pagingSettingSource.asObservable().pipe(takeUntil(this._onDestroy$));
|
|
7974
|
+
this._pollingInterval
|
|
7975
|
+
.asObservable()
|
|
7976
|
+
.pipe(takeUntil(this._onDestroy$), distinctUntilChanged(),
|
|
7977
|
+
// با هر بار تغییر بازه، interval قبلی کنسل و از نو ساخته میشود؛ صفر یا منفی یعنی polling خاموش.
|
|
7978
|
+
switchMap$1((ms) => (ms > 0 ? timer(ms, ms) : EMPTY)), tap(() => this.executeToolbarButton('RefreshReport', {})))
|
|
7979
|
+
.subscribe();
|
|
7696
7980
|
this.toolbarButtons$ = combineLatest([
|
|
7697
7981
|
this._toolbarButtonsWorkflowButtons.asObservable(),
|
|
7698
7982
|
this._toolbarButtonsSource.asObservable()
|
|
@@ -7950,6 +8234,10 @@ class UlvMainService {
|
|
|
7950
8234
|
this._inlineEditModeSource
|
|
7951
8235
|
]).pipe(map(([moveUp, groupby, inlineEdit]) => moveUp === true && !groupby.length && !inlineEdit), distinctUntilChanged());
|
|
7952
8236
|
}
|
|
8237
|
+
setPollingInterval(pollingInterval) {
|
|
8238
|
+
// مقدار از سرور بهصورت عددِ اعشاریِ ساعت.دقیقه (hh:mm) میآید؛ به میلیثانیه تبدیل میشود.
|
|
8239
|
+
this._pollingInterval.next(hhmmToMs(pollingInterval));
|
|
8240
|
+
}
|
|
7953
8241
|
setReorderGroupby(groupby) {
|
|
7954
8242
|
this._reorderGroupbySource.next(groupby ?? []);
|
|
7955
8243
|
}
|
|
@@ -9964,6 +10252,8 @@ class RoutingService {
|
|
|
9964
10252
|
}
|
|
9965
10253
|
};
|
|
9966
10254
|
this.isFirstPage = true;
|
|
10255
|
+
/** true اگر فرمِ این RoutingService خودش بهصورت مودال (داخل دیالوگ) باز شده باشد. */
|
|
10256
|
+
this.isOpenedAsModal = false;
|
|
9967
10257
|
this.masterDetails = false;
|
|
9968
10258
|
this.isMobile = getDeviceIsMobile();
|
|
9969
10259
|
this._activatedRoute = inject(ActivatedRoute);
|
|
@@ -10018,7 +10308,7 @@ class RoutingService {
|
|
|
10018
10308
|
BarsaApi.Bw.FormHandler = this.parentContainer;
|
|
10019
10309
|
}
|
|
10020
10310
|
_showFormPanel(refreshOnly = false) {
|
|
10021
|
-
this._portalService.ShowFormPanelControl(this.formpanelCtrlr, this._router, this._activatedRoute, this._formDialogComponent, this.isFirstPage, this._vcr, refreshOnly);
|
|
10311
|
+
this._portalService.ShowFormPanelControl(this.formpanelCtrlr, this._router, this._activatedRoute, this._formDialogComponent, this.isFirstPage, this._vcr, refreshOnly, this.isOpenedAsModal);
|
|
10022
10312
|
}
|
|
10023
10313
|
navigate(navigation, isRelative, queryParams, state) {
|
|
10024
10314
|
if (this.masterDetails && !this.isMobile) {
|
|
@@ -10589,6 +10879,9 @@ class FieldBaseComponent extends BaseComponent {
|
|
|
10589
10879
|
get customFieldInfo() {
|
|
10590
10880
|
return this.context.Setting.CustomFieldInfo;
|
|
10591
10881
|
}
|
|
10882
|
+
get Mo() {
|
|
10883
|
+
return this._formPanelService.mo;
|
|
10884
|
+
}
|
|
10592
10885
|
constructor() {
|
|
10593
10886
|
super();
|
|
10594
10887
|
this.valueChange = new EventEmitter();
|
|
@@ -10619,6 +10912,7 @@ class FieldBaseComponent extends BaseComponent {
|
|
|
10619
10912
|
this._renderer2 = inject(Renderer2);
|
|
10620
10913
|
this._activatedRoute = inject(ActivatedRoute);
|
|
10621
10914
|
this._domSanitizer = inject(DomSanitizer);
|
|
10915
|
+
this._formPanelService = inject(FormPanelService);
|
|
10622
10916
|
this._uploadService = inject(UploadService, { self: true, optional: true });
|
|
10623
10917
|
this._dateService = inject(DateService, { self: true, optional: true });
|
|
10624
10918
|
this._audioRecorder = inject(AudioRecordingService, { self: true, optional: true });
|
|
@@ -13018,6 +13312,11 @@ class FormComponent extends BaseComponent {
|
|
|
13018
13312
|
if (this._routingService) {
|
|
13019
13313
|
this._routingService.FormPanelCtrlr = formpanelCtrlr;
|
|
13020
13314
|
formpanelCtrlr.Page = this._routingService;
|
|
13315
|
+
// اگر این فرم داخل دیالوگ (مودال) باز شده، RoutingServiceاش را مودال علامت میزنیم تا
|
|
13316
|
+
// فرمهای فرزندش هم مودال باز شوند (قانونِ «مودال، مودال میزاید» در ShowFormPanelControl).
|
|
13317
|
+
if (this.params && this.params.inDialog) {
|
|
13318
|
+
this._routingService.isOpenedAsModal = true;
|
|
13319
|
+
}
|
|
13021
13320
|
}
|
|
13022
13321
|
const nav = this._router.getCurrentNavigation();
|
|
13023
13322
|
formpanelCtrlr.FormRequestParams.state = nav?.extras.state;
|
|
@@ -13266,6 +13565,9 @@ class BaseColumnPropsComponent extends BaseComponent {
|
|
|
13266
13565
|
// eslint-disable-next-line
|
|
13267
13566
|
this.cancel = new EventEmitter();
|
|
13268
13567
|
this.tab = new EventEmitter();
|
|
13568
|
+
this.enter = new EventEmitter();
|
|
13569
|
+
this.arrowUp = new EventEmitter();
|
|
13570
|
+
this.arrowDown = new EventEmitter();
|
|
13269
13571
|
this.changeToEditMode = new EventEmitter();
|
|
13270
13572
|
this._columnService = inject(ColumnService, { optional: true, self: true });
|
|
13271
13573
|
if (this._columnService) {
|
|
@@ -13281,7 +13583,7 @@ class BaseColumnPropsComponent extends BaseComponent {
|
|
|
13281
13583
|
this.changeToEditMode.emit(this._el.nativeElement);
|
|
13282
13584
|
}
|
|
13283
13585
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: BaseColumnPropsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
13284
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: BaseColumnPropsComponent, isStandalone: false, selector: "bnrc-base-column-props", inputs: { allColumns: "allColumns", column: "column", attachmentViewType: "attachmentViewType", mo: "mo", index: "index", editMode: "editMode", isMobile: "isMobile", customRowHeight: "customRowHeight", controlUi: "controlUi", formLayoutShowLabel: "formLayoutShowLabel", isChecked: "isChecked", isdirty: "isdirty", isNewInlineMo: "isNewInlineMo", layout94: "layout94", detailsComponentSetting: "detailsComponentSetting", value: "value", icon: "icon", rtl: "rtl", cellEdit: "cellEdit", deviceName: "deviceName", deviceSize: "deviceSize", customComponent: "customComponent" }, outputs: { save: "save", cancel: "cancel", tab: "tab", changeToEditMode: "changeToEditMode" }, usesInheritance: true, ngImport: i0, template: ``, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
13586
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: BaseColumnPropsComponent, isStandalone: false, selector: "bnrc-base-column-props", inputs: { allColumns: "allColumns", column: "column", attachmentViewType: "attachmentViewType", mo: "mo", index: "index", editMode: "editMode", isMobile: "isMobile", customRowHeight: "customRowHeight", controlUi: "controlUi", formLayoutShowLabel: "formLayoutShowLabel", isChecked: "isChecked", isdirty: "isdirty", isNewInlineMo: "isNewInlineMo", layout94: "layout94", detailsComponentSetting: "detailsComponentSetting", value: "value", icon: "icon", rtl: "rtl", cellEdit: "cellEdit", deviceName: "deviceName", deviceSize: "deviceSize", customComponent: "customComponent" }, outputs: { save: "save", cancel: "cancel", tab: "tab", enter: "enter", arrowUp: "arrowUp", arrowDown: "arrowDown", changeToEditMode: "changeToEditMode" }, usesInheritance: true, ngImport: i0, template: ``, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
13285
13587
|
}
|
|
13286
13588
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: BaseColumnPropsComponent, decorators: [{
|
|
13287
13589
|
type: Component,
|
|
@@ -13297,6 +13599,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
13297
13599
|
type: Output
|
|
13298
13600
|
}], tab: [{
|
|
13299
13601
|
type: Output
|
|
13602
|
+
}], enter: [{
|
|
13603
|
+
type: Output
|
|
13604
|
+
}], arrowUp: [{
|
|
13605
|
+
type: Output
|
|
13606
|
+
}], arrowDown: [{
|
|
13607
|
+
type: Output
|
|
13300
13608
|
}], changeToEditMode: [{
|
|
13301
13609
|
type: Output
|
|
13302
13610
|
}], allColumns: [{
|
|
@@ -13873,6 +14181,14 @@ class FillEmptySpaceDirective extends BaseDirective {
|
|
|
13873
14181
|
const roTarget = this.getContainerElement();
|
|
13874
14182
|
this._ro = new ResizeObserver(() => this.scheduleMeasure());
|
|
13875
14183
|
this._ro.observe(roTarget);
|
|
14184
|
+
// Also observe the host itself. In `viewport` mode the container resolves to
|
|
14185
|
+
// `document.documentElement`, which never resizes when the host transitions from
|
|
14186
|
+
// hidden/0-size (e.g. an inactive tab) to visible — so the fill height would never
|
|
14187
|
+
// be (re)applied. Observing the host recovers the measurement once it gains a box.
|
|
14188
|
+
const host = this._el.nativeElement;
|
|
14189
|
+
if (host !== roTarget) {
|
|
14190
|
+
this._ro.observe(host);
|
|
14191
|
+
}
|
|
13876
14192
|
window.addEventListener('resize', this._onWindowResize);
|
|
13877
14193
|
}
|
|
13878
14194
|
teardownFillLayoutWatchers() {
|
|
@@ -13931,6 +14247,15 @@ class FillEmptySpaceDirective extends BaseDirective {
|
|
|
13931
14247
|
}
|
|
13932
14248
|
applyFillHeight(dom, px) {
|
|
13933
14249
|
const prop = this.getStyleProperty();
|
|
14250
|
+
const signature = `${prop}:${px}`;
|
|
14251
|
+
// Skip redundant writes. Because we now also observe the host element, applying the
|
|
14252
|
+
// same height again would leave the ResizeObserver firing on a no-op change (harmless,
|
|
14253
|
+
// but noisy) and re-emit `heightChanged`. Guarding keeps it idempotent and avoids
|
|
14254
|
+
// "ResizeObserver loop" warnings.
|
|
14255
|
+
if (signature === this._lastAppliedSignature) {
|
|
14256
|
+
return;
|
|
14257
|
+
}
|
|
14258
|
+
this._lastAppliedSignature = signature;
|
|
13934
14259
|
if (prop === 'min-height' || prop === 'max-height') {
|
|
13935
14260
|
this._renderer2.setStyle(dom, 'height', 'auto');
|
|
13936
14261
|
}
|
|
@@ -14279,7 +14604,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
14279
14604
|
|
|
14280
14605
|
class DynamicFormComponent extends BaseDynamicComponent {
|
|
14281
14606
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: DynamicFormComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
14282
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: DynamicFormComponent, isStandalone: false, selector: "bnrc-dynamic-form-component", inputs: { breadCrumbs: "breadCrumbs", toolbarVisible: "toolbarVisible", toolbarItems: "toolbarItems", layoutActions: "layoutActions", layoutActionsTemplateRef: "layoutActionsTemplateRef", workflowButtons: "workflowButtons", layout94: "layout94", footerDesign: "footerDesign", settings: "settings", workflowPanelUi: "workflowPanelUi", title: "title", subtitle: "subtitle", description: "description", facetList: "facetList", removeHeaderBorder: "removeHeaderBorder", removeContentPadding: "removeContentPadding", isMobile: "isMobile", isModal: "isModal", avatar: "avatar", rtl: "rtl", mask: "mask", mo: "mo", contentDensity: "contentDensity", deviceSize: "deviceSize", dirValue: "dirValue", fieldDict: "fieldDict", modernTabs: "modernTabs" }, usesInheritance: true, ngImport: i0, template: `<ng-container #componentContainer></ng-container>`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
14607
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: DynamicFormComponent, isStandalone: false, selector: "bnrc-dynamic-form-component", inputs: { breadCrumbs: "breadCrumbs", toolbarVisible: "toolbarVisible", toolbarItems: "toolbarItems", layoutActions: "layoutActions", layoutActionsTemplateRef: "layoutActionsTemplateRef", workflowButtons: "workflowButtons", layout94: "layout94", footerDesign: "footerDesign", settings: "settings", lastUpdateTime: "lastUpdateTime", workflowPanelUi: "workflowPanelUi", title: "title", subtitle: "subtitle", description: "description", facetList: "facetList", removeHeaderBorder: "removeHeaderBorder", removeContentPadding: "removeContentPadding", isMobile: "isMobile", isModal: "isModal", avatar: "avatar", rtl: "rtl", mask: "mask", mo: "mo", contentDensity: "contentDensity", deviceSize: "deviceSize", dirValue: "dirValue", fieldDict: "fieldDict", modernTabs: "modernTabs" }, usesInheritance: true, ngImport: i0, template: `<ng-container #componentContainer></ng-container>`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
14283
14608
|
}
|
|
14284
14609
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: DynamicFormComponent, decorators: [{
|
|
14285
14610
|
type: Component,
|
|
@@ -14307,6 +14632,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
14307
14632
|
type: Input
|
|
14308
14633
|
}], settings: [{
|
|
14309
14634
|
type: Input
|
|
14635
|
+
}], lastUpdateTime: [{
|
|
14636
|
+
type: Input
|
|
14310
14637
|
}], workflowPanelUi: [{
|
|
14311
14638
|
type: Input
|
|
14312
14639
|
}], title: [{
|
|
@@ -14651,7 +14978,6 @@ class BaseViewItemPropsComponent extends BaseViewPropsComponent {
|
|
|
14651
14978
|
this.actionListClick = new EventEmitter();
|
|
14652
14979
|
this.events = new EventEmitter();
|
|
14653
14980
|
this.hasError = false;
|
|
14654
|
-
this._focusToFirstEidtableColumn = false;
|
|
14655
14981
|
this.inlineEditInReport = true;
|
|
14656
14982
|
this.rewriteLayout = true;
|
|
14657
14983
|
this.hasCartableTemplate = false;
|
|
@@ -14667,17 +14993,21 @@ class BaseViewItemPropsComponent extends BaseViewPropsComponent {
|
|
|
14667
14993
|
this._parentFormPanelService = inject(FormPanelService, { optional: true, skipSelf: true });
|
|
14668
14994
|
this._formPanelService = inject(FormPanelService, { optional: true, self: true });
|
|
14669
14995
|
this._ulvMainService = inject(UlvMainService, { optional: true });
|
|
14996
|
+
this._renderer2 = inject(Renderer2);
|
|
14670
14997
|
this._saveEditedMo$ = new Subject();
|
|
14671
14998
|
this._formpanelValueChanged$ = new Subject();
|
|
14999
|
+
this._inlineNavigation = null;
|
|
14672
15000
|
this._saveEditedMo$
|
|
14673
15001
|
.asObservable()
|
|
14674
15002
|
.pipe(takeUntil$1(this._onDestroy$),
|
|
14675
15003
|
// debounceTime(500),
|
|
14676
15004
|
exhaustMap((reason) => this._inlineEditSaveFormPanel(reason)), catchError((err) => throwError(() => err)))
|
|
14677
15005
|
.subscribe((res) => {
|
|
14678
|
-
if (res.saved) {
|
|
15006
|
+
if (res.saved && res.succeed) {
|
|
14679
15007
|
this.mo.$IsChecked = false;
|
|
14680
|
-
this.
|
|
15008
|
+
if (!this.extraRelation || this.extraRelation.RelationType !== 'Composition') {
|
|
15009
|
+
this.mo.$State = 'Unchanged';
|
|
15010
|
+
}
|
|
14681
15011
|
this.editFormPanelValueChange.emit({ mo: this.mo, fieldDbName: '$InlineMoState' });
|
|
14682
15012
|
// this._formpanelValueChanged$.next('');
|
|
14683
15013
|
this._cdr.markForCheck();
|
|
@@ -14685,7 +15015,17 @@ class BaseViewItemPropsComponent extends BaseViewPropsComponent {
|
|
|
14685
15015
|
this.hasError && (this.mo.$InlineMoState = RowState.SaveFailed);
|
|
14686
15016
|
this.editFormPanelValueChange.emit({ mo: this.mo });
|
|
14687
15017
|
}
|
|
14688
|
-
if (res.
|
|
15018
|
+
else if (res.saved) {
|
|
15019
|
+
this.mo.$InlineMoState = RowState.SaveFailed;
|
|
15020
|
+
this.mo.$IsChecked = true;
|
|
15021
|
+
this.editFormPanelValueChange.emit({ mo: this.mo, fieldDbName: '$InlineMoState' });
|
|
15022
|
+
this._cdr.markForCheck();
|
|
15023
|
+
}
|
|
15024
|
+
if (res.succeed && (res.reason === 'TAB' || res.reason === 'CTRL+ENTER')) {
|
|
15025
|
+
if (this._inlineNavigation) {
|
|
15026
|
+
this.mo.$InlineEditNavigation = this._inlineNavigation;
|
|
15027
|
+
this._inlineNavigation = null;
|
|
15028
|
+
}
|
|
14689
15029
|
this.selectNextInlineRecord.emit(this.mo);
|
|
14690
15030
|
}
|
|
14691
15031
|
else if (res.reason === 'ESC') {
|
|
@@ -14726,10 +15066,11 @@ class BaseViewItemPropsComponent extends BaseViewPropsComponent {
|
|
|
14726
15066
|
this._log.error(nullOrUndefinedString('BaseViewItemPropsComponent=> _formPanelService'));
|
|
14727
15067
|
}
|
|
14728
15068
|
}
|
|
15069
|
+
this._addLastClass(this.last);
|
|
14729
15070
|
}
|
|
14730
15071
|
ngOnChanges(changes) {
|
|
14731
15072
|
super.ngOnChanges(changes);
|
|
14732
|
-
const { isChecked, inlineEditMode } = changes;
|
|
15073
|
+
const { isChecked, inlineEditMode, last } = changes;
|
|
14733
15074
|
let needToLoadForm = false;
|
|
14734
15075
|
if (this.inlineEditMode) {
|
|
14735
15076
|
if (isChecked) {
|
|
@@ -14743,6 +15084,9 @@ class BaseViewItemPropsComponent extends BaseViewPropsComponent {
|
|
|
14743
15084
|
}
|
|
14744
15085
|
}
|
|
14745
15086
|
}
|
|
15087
|
+
if (last) {
|
|
15088
|
+
this._addLastClass(last.currentValue);
|
|
15089
|
+
}
|
|
14746
15090
|
if (isChecked && !isChecked.firstChange) {
|
|
14747
15091
|
this._raiseWorkflowShareButtons(isChecked.currentValue);
|
|
14748
15092
|
}
|
|
@@ -14792,23 +15136,46 @@ class BaseViewItemPropsComponent extends BaseViewPropsComponent {
|
|
|
14792
15136
|
}
|
|
14793
15137
|
onColumnChangeToEditMode(elDom, index) {
|
|
14794
15138
|
const focusables = elDom.querySelectorAll(getFocusableTagNames());
|
|
14795
|
-
this._lastEditableColumnIndex =
|
|
14796
|
-
|
|
15139
|
+
this._lastEditableColumnIndex = this._getLastEditableColumnIndex();
|
|
15140
|
+
const activeColumn = this.activeColumn();
|
|
15141
|
+
const targetIndex = activeColumn ? this.columns.findIndex((column) => column === activeColumn) : 0;
|
|
15142
|
+
if (!focusables.length || index !== targetIndex) {
|
|
14797
15143
|
return;
|
|
14798
15144
|
}
|
|
14799
|
-
|
|
14800
|
-
const lastFocusable = focusables[0];
|
|
15145
|
+
const firstFocusable = focusables[0];
|
|
14801
15146
|
setTimeout(() => {
|
|
14802
|
-
|
|
15147
|
+
firstFocusable?.focus();
|
|
14803
15148
|
}, 0);
|
|
14804
15149
|
}
|
|
14805
15150
|
onTabKeyDown(e, index) {
|
|
14806
|
-
if (index === this.
|
|
14807
|
-
if (this.index ===
|
|
15151
|
+
if (e.shiftKey && index === this._getFirstEditableColumnIndex()) {
|
|
15152
|
+
if (this.index === 0) {
|
|
14808
15153
|
PreventDefaulEvent(e);
|
|
15154
|
+
return;
|
|
14809
15155
|
}
|
|
14810
|
-
this.
|
|
15156
|
+
this._queueInlineRecordNavigation(e, this._getLastEditableColumnIndex(), 'previous');
|
|
15157
|
+
return;
|
|
14811
15158
|
}
|
|
15159
|
+
if (!e.shiftKey && index === this._lastEditableColumnIndex) {
|
|
15160
|
+
this._queueInlineRecordNavigation(e, this._getFirstEditableColumnIndex(), 'next');
|
|
15161
|
+
}
|
|
15162
|
+
}
|
|
15163
|
+
onEnterKeyDown(e, index) {
|
|
15164
|
+
if (e.target?.tagName?.toLowerCase() === 'textarea') {
|
|
15165
|
+
return;
|
|
15166
|
+
}
|
|
15167
|
+
this._queueInlineRecordNavigation(e, index, 'next');
|
|
15168
|
+
}
|
|
15169
|
+
onVerticalNavigationKeyDown(e, index, direction) {
|
|
15170
|
+
const target = e.target;
|
|
15171
|
+
if (target?.tagName?.toLowerCase() === 'textarea' ||
|
|
15172
|
+
target?.getAttribute('aria-expanded') === 'true' ||
|
|
15173
|
+
(direction === 'previous' && this.index === 0) ||
|
|
15174
|
+
(direction === 'next' && this.last)) {
|
|
15175
|
+
PreventDefaulEvent(e);
|
|
15176
|
+
return;
|
|
15177
|
+
}
|
|
15178
|
+
this._queueInlineRecordNavigation(e, index, direction);
|
|
14812
15179
|
}
|
|
14813
15180
|
onEditFormPanelSave(_) {
|
|
14814
15181
|
this._saveEditedMo$.next('CTRL+ENTER');
|
|
@@ -14859,6 +15226,11 @@ class BaseViewItemPropsComponent extends BaseViewPropsComponent {
|
|
|
14859
15226
|
_trackByColumn(index, column) {
|
|
14860
15227
|
return `${column.Name}${index}`;
|
|
14861
15228
|
}
|
|
15229
|
+
_addLastClass(lastItem) {
|
|
15230
|
+
lastItem
|
|
15231
|
+
? this._renderer2.addClass(this._el.nativeElement, 'last-item')
|
|
15232
|
+
: this._renderer2.removeClass(this._el.nativeElement, 'last-item');
|
|
15233
|
+
}
|
|
14862
15234
|
_handleResetWorkflowState() {
|
|
14863
15235
|
this._resetBruleActionMessage();
|
|
14864
15236
|
this.workflowState.set({ state: '', error: null });
|
|
@@ -14931,6 +15303,14 @@ class BaseViewItemPropsComponent extends BaseViewPropsComponent {
|
|
|
14931
15303
|
// this._saveEditedMo$.next('TAB');
|
|
14932
15304
|
// }
|
|
14933
15305
|
}
|
|
15306
|
+
/** آخرین ستونی که در ردیفِ inline واقعاً میتواند مقصد Tab باشد. */
|
|
15307
|
+
_getLastEditableColumnIndex() {
|
|
15308
|
+
return (this.columns ?? []).reduce((lastEditableIndex, column, index) => (!column.Hidden && !column.IsReadonly ? index : lastEditableIndex), -1);
|
|
15309
|
+
}
|
|
15310
|
+
/** نخستین ستونی که مقصد ورود به ردیف بعد با Tab است. */
|
|
15311
|
+
_getFirstEditableColumnIndex() {
|
|
15312
|
+
return (this.columns ?? []).findIndex((column) => !column.Hidden && !column.IsReadonly);
|
|
15313
|
+
}
|
|
14934
15314
|
_rowCheck(onlyCheck) {
|
|
14935
15315
|
this.rowCheck.emit({ mo: this.mo, index: this.index, onlyCheck });
|
|
14936
15316
|
}
|
|
@@ -14955,6 +15335,22 @@ class BaseViewItemPropsComponent extends BaseViewPropsComponent {
|
|
|
14955
15335
|
}
|
|
14956
15336
|
this._formpanelValueChanged$.next(fieldCtrlr?.Setting?.ControlName);
|
|
14957
15337
|
}
|
|
15338
|
+
_handleAfterSave(_formPanelCtrl, _err) {
|
|
15339
|
+
let moForReport = BarsaApi.Common.Util.TryGetValue(_formPanelCtrl, '_afterSaveSetting.Data.MoForReport');
|
|
15340
|
+
const type = BarsaApi.Common.Util.TryGetValue(_formPanelCtrl, '_afterSaveSetting.Data.MoForReport.$Type');
|
|
15341
|
+
if (BarsaApi.Ext.isNotEmpty(type)) {
|
|
15342
|
+
moForReport.xtype = type;
|
|
15343
|
+
const obj = BarsaApi.Ext.create(moForReport);
|
|
15344
|
+
if (obj instanceof BarsaApi.Common.MetaObjectListWeb) {
|
|
15345
|
+
moForReport = obj.GetMoByIndex(0);
|
|
15346
|
+
}
|
|
15347
|
+
else if (obj instanceof BarsaApi.Common.MetaObjectWeb) {
|
|
15348
|
+
moForReport = obj;
|
|
15349
|
+
}
|
|
15350
|
+
this.mo.Id = moForReport.Id;
|
|
15351
|
+
this.mo.$Context = moForReport.$Context;
|
|
15352
|
+
}
|
|
15353
|
+
}
|
|
14958
15354
|
_syncMo() {
|
|
14959
15355
|
const syncWithFormpanelMo = this.mo;
|
|
14960
15356
|
const _isChecked = this.mo.$IsChecked;
|
|
@@ -15001,7 +15397,8 @@ class BaseViewItemPropsComponent extends BaseViewPropsComponent {
|
|
|
15001
15397
|
this.formPanelCtrlr.InlineEditInReport = true;
|
|
15002
15398
|
this.formPanelCtrlr.on({
|
|
15003
15399
|
bruleShowMessageAction: this._handleBruleShowMessageAction.bind(this),
|
|
15004
|
-
valueChange: this._handleValueChange.bind(this)
|
|
15400
|
+
valueChange: this._handleValueChange.bind(this),
|
|
15401
|
+
aftersave: this._handleAfterSave.bind(this)
|
|
15005
15402
|
});
|
|
15006
15403
|
return this.formPanelCtrlr;
|
|
15007
15404
|
}
|
|
@@ -15025,7 +15422,7 @@ class BaseViewItemPropsComponent extends BaseViewPropsComponent {
|
|
|
15025
15422
|
const customFormPanelUi = formPanelCtrlr.Adapter.Control;
|
|
15026
15423
|
const parentMo = this._parentFormPanelService ? this._parentFormPanelService.mo : null;
|
|
15027
15424
|
if (this.extraRelation && parentMo && this.extraRelation.RelationType === 'Composition') {
|
|
15028
|
-
formPanelCtrlr.Mo.SetFValue(this.extraRelation.ParentFdName, parentMo);
|
|
15425
|
+
formPanelCtrlr.Mo.SetFValue(this.extraRelation.ParentFdName, parentMo.Id);
|
|
15029
15426
|
// newFormSettings.Data.Mo[relation.ParentFdName] = parentMo.GetChangedObject();
|
|
15030
15427
|
// newFormSettings.Data.Mo[relation.ParentFdName].$State = parentMo.$State;
|
|
15031
15428
|
}
|
|
@@ -15083,10 +15480,15 @@ class BaseViewItemPropsComponent extends BaseViewPropsComponent {
|
|
|
15083
15480
|
}
|
|
15084
15481
|
this.formPanelCtrlr.SetIsChanged(false);
|
|
15085
15482
|
this._setSavingState(err);
|
|
15086
|
-
resolve({ reason, succeed:
|
|
15483
|
+
resolve({ reason, succeed: !err, saved: true });
|
|
15087
15484
|
});
|
|
15088
15485
|
});
|
|
15089
15486
|
}
|
|
15487
|
+
_queueInlineRecordNavigation(e, columnIndex, direction) {
|
|
15488
|
+
PreventDefaulEvent(e);
|
|
15489
|
+
this._inlineNavigation = { columnIndex, direction, rowIndex: this.index };
|
|
15490
|
+
this._saveEditedMo$.next('TAB');
|
|
15491
|
+
}
|
|
15090
15492
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: BaseViewItemPropsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
15091
15493
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: BaseViewItemPropsComponent, isStandalone: false, selector: "bnrc-base-view-item-props", inputs: { checkboxComponent: "checkboxComponent", disableEllapsis: "disableEllapsis", isslider: "isslider", attachmentViewType: "attachmentViewType", dirtyColumns: "dirtyColumns", contextMenuOverflowText: "contextMenuOverflowText", detailsComponent: "detailsComponent", detailsColumns: "detailsColumns", detailsText: "detailsText", mo: "mo", moDataListCount: "moDataListCount", index: "index", last: "last", hideHeader: "hideHeader", isdirty: "isdirty", isChecked: "isChecked", hideDetailsText: "hideDetailsText", showViewButton: "showViewButton", isNewInlineMo: "isNewInlineMo", extraRelation: "extraRelation", hideOpenIcon: "hideOpenIcon", inlineEditWithoutSelection: "inlineEditWithoutSelection", inDialog: "inDialog", isMobile: "isMobile", isMultiSelect: "isMultiSelect", rowIndicator: "rowIndicator", groupSummary: "groupSummary", isLastChildGroup: "isLastChildGroup", showRowNumber: "showRowNumber", rowNumber: "rowNumber", alternateRowMode: "alternateRowMode", noSaveInlineEditInServer: "noSaveInlineEditInServer", disableHyperLink: "disableHyperLink", columnsHyperLink: "columnsHyperLink", rowIndicatorColor: "rowIndicatorColor", alternateEditObjectColumn: "alternateEditObjectColumn", maxHeightHeader: "maxHeightHeader", UlvMainCtrlr: "UlvMainCtrlr", fieldDict: "fieldDict", actionList: "actionList", serializedRelatedMo: "serializedRelatedMo", cartableTemplate: "cartableTemplate", cartableMo: "cartableMo", cartableWorkflowData: "cartableWorkflowData" }, outputs: { actionListClick: "actionListClick", events: "events" }, viewQueries: [{ propertyName: "_cartableFormRef", first: true, predicate: ["cartableFormRef"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: ``, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
15092
15494
|
}
|
|
@@ -15830,10 +16232,30 @@ class RootPortalComponent extends PageBaseComponent {
|
|
|
15830
16232
|
xl:tw-grid-cols-9 xl:tw-grid-cols-10 xl:tw-grid-cols-11 xl:tw-grid-cols-12"
|
|
15831
16233
|
></div>
|
|
15832
16234
|
<div
|
|
15833
|
-
class="tw-hidden 2xl:grid-cols-0 2xl:tw-grid-cols-1 2xl:tw-grid-cols-2 2xl:tw-grid-cols-3
|
|
15834
|
-
2xl:tw-grid-cols-4 2xl:tw-grid-cols-5 2xl:tw-grid-cols-6 2xl:tw-grid-cols-7 2xl:tw-grid-cols-8 2xl:tw-grid-cols-9
|
|
16235
|
+
class="tw-hidden 2xl:grid-cols-0 2xl:tw-grid-cols-1 2xl:tw-grid-cols-2 2xl:tw-grid-cols-3
|
|
16236
|
+
2xl:tw-grid-cols-4 2xl:tw-grid-cols-5 2xl:tw-grid-cols-6 2xl:tw-grid-cols-7 2xl:tw-grid-cols-8 2xl:tw-grid-cols-9
|
|
15835
16237
|
2xl:tw-grid-cols-10 2xl:tw-grid-cols-11 2xl:tw-grid-cols-12"
|
|
15836
16238
|
></div>
|
|
16239
|
+
<div
|
|
16240
|
+
class="tw-hidden tw-col-span-1 tw-col-span-2 tw-col-span-3 tw-col-span-4 tw-col-span-5 tw-col-span-6
|
|
16241
|
+
tw-col-span-7 tw-col-span-8 tw-col-span-9 tw-col-span-10 tw-col-span-11 tw-col-span-12"
|
|
16242
|
+
></div>
|
|
16243
|
+
<div
|
|
16244
|
+
class="tw-hidden md:tw-col-span-1 md:tw-col-span-2 md:tw-col-span-3 md:tw-col-span-4 md:tw-col-span-5
|
|
16245
|
+
md:tw-col-span-6 md:tw-col-span-7 md:tw-col-span-8 md:tw-col-span-9 md:tw-col-span-10 md:tw-col-span-11 md:tw-col-span-12"
|
|
16246
|
+
></div>
|
|
16247
|
+
<div
|
|
16248
|
+
class="tw-hidden lg:tw-col-span-1 lg:tw-col-span-2 lg:tw-col-span-3 lg:tw-col-span-4 lg:tw-col-span-5
|
|
16249
|
+
lg:tw-col-span-6 lg:tw-col-span-7 lg:tw-col-span-8 lg:tw-col-span-9 lg:tw-col-span-10 lg:tw-col-span-11 lg:tw-col-span-12"
|
|
16250
|
+
></div>
|
|
16251
|
+
<div
|
|
16252
|
+
class="tw-hidden xl:tw-col-span-1 xl:tw-col-span-2 xl:tw-col-span-3 xl:tw-col-span-4 xl:tw-col-span-5
|
|
16253
|
+
xl:tw-col-span-6 xl:tw-col-span-7 xl:tw-col-span-8 xl:tw-col-span-9 xl:tw-col-span-10 xl:tw-col-span-11 xl:tw-col-span-12"
|
|
16254
|
+
></div>
|
|
16255
|
+
<div
|
|
16256
|
+
class="tw-hidden 2xl:tw-col-span-1 2xl:tw-col-span-2 2xl:tw-col-span-3 2xl:tw-col-span-4 2xl:tw-col-span-5
|
|
16257
|
+
2xl:tw-col-span-6 2xl:tw-col-span-7 2xl:tw-col-span-8 2xl:tw-col-span-9 2xl:tw-col-span-10 2xl:tw-col-span-11 2xl:tw-col-span-12"
|
|
16258
|
+
></div>
|
|
15837
16259
|
@if(inLocalMode()){
|
|
15838
16260
|
<div class="fd-toolbar" style="flex-wrap:wrap;padding:0.5rem;height:auto">
|
|
15839
16261
|
<button class="fd-button fd-button--attention is-compact" (click)="onRemoveOfflineData()">
|
|
@@ -15911,10 +16333,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
15911
16333
|
xl:tw-grid-cols-9 xl:tw-grid-cols-10 xl:tw-grid-cols-11 xl:tw-grid-cols-12"
|
|
15912
16334
|
></div>
|
|
15913
16335
|
<div
|
|
15914
|
-
class="tw-hidden 2xl:grid-cols-0 2xl:tw-grid-cols-1 2xl:tw-grid-cols-2 2xl:tw-grid-cols-3
|
|
15915
|
-
2xl:tw-grid-cols-4 2xl:tw-grid-cols-5 2xl:tw-grid-cols-6 2xl:tw-grid-cols-7 2xl:tw-grid-cols-8 2xl:tw-grid-cols-9
|
|
16336
|
+
class="tw-hidden 2xl:grid-cols-0 2xl:tw-grid-cols-1 2xl:tw-grid-cols-2 2xl:tw-grid-cols-3
|
|
16337
|
+
2xl:tw-grid-cols-4 2xl:tw-grid-cols-5 2xl:tw-grid-cols-6 2xl:tw-grid-cols-7 2xl:tw-grid-cols-8 2xl:tw-grid-cols-9
|
|
15916
16338
|
2xl:tw-grid-cols-10 2xl:tw-grid-cols-11 2xl:tw-grid-cols-12"
|
|
15917
16339
|
></div>
|
|
16340
|
+
<div
|
|
16341
|
+
class="tw-hidden tw-col-span-1 tw-col-span-2 tw-col-span-3 tw-col-span-4 tw-col-span-5 tw-col-span-6
|
|
16342
|
+
tw-col-span-7 tw-col-span-8 tw-col-span-9 tw-col-span-10 tw-col-span-11 tw-col-span-12"
|
|
16343
|
+
></div>
|
|
16344
|
+
<div
|
|
16345
|
+
class="tw-hidden md:tw-col-span-1 md:tw-col-span-2 md:tw-col-span-3 md:tw-col-span-4 md:tw-col-span-5
|
|
16346
|
+
md:tw-col-span-6 md:tw-col-span-7 md:tw-col-span-8 md:tw-col-span-9 md:tw-col-span-10 md:tw-col-span-11 md:tw-col-span-12"
|
|
16347
|
+
></div>
|
|
16348
|
+
<div
|
|
16349
|
+
class="tw-hidden lg:tw-col-span-1 lg:tw-col-span-2 lg:tw-col-span-3 lg:tw-col-span-4 lg:tw-col-span-5
|
|
16350
|
+
lg:tw-col-span-6 lg:tw-col-span-7 lg:tw-col-span-8 lg:tw-col-span-9 lg:tw-col-span-10 lg:tw-col-span-11 lg:tw-col-span-12"
|
|
16351
|
+
></div>
|
|
16352
|
+
<div
|
|
16353
|
+
class="tw-hidden xl:tw-col-span-1 xl:tw-col-span-2 xl:tw-col-span-3 xl:tw-col-span-4 xl:tw-col-span-5
|
|
16354
|
+
xl:tw-col-span-6 xl:tw-col-span-7 xl:tw-col-span-8 xl:tw-col-span-9 xl:tw-col-span-10 xl:tw-col-span-11 xl:tw-col-span-12"
|
|
16355
|
+
></div>
|
|
16356
|
+
<div
|
|
16357
|
+
class="tw-hidden 2xl:tw-col-span-1 2xl:tw-col-span-2 2xl:tw-col-span-3 2xl:tw-col-span-4 2xl:tw-col-span-5
|
|
16358
|
+
2xl:tw-col-span-6 2xl:tw-col-span-7 2xl:tw-col-span-8 2xl:tw-col-span-9 2xl:tw-col-span-10 2xl:tw-col-span-11 2xl:tw-col-span-12"
|
|
16359
|
+
></div>
|
|
15918
16360
|
@if(inLocalMode()){
|
|
15919
16361
|
<div class="fd-toolbar" style="flex-wrap:wrap;padding:0.5rem;height:auto">
|
|
15920
16362
|
<button class="fd-button fd-button--attention is-compact" (click)="onRemoveOfflineData()">
|
|
@@ -16194,59 +16636,88 @@ class ImageLazyDirective extends BaseDirective {
|
|
|
16194
16636
|
super();
|
|
16195
16637
|
this.auto = true;
|
|
16196
16638
|
this.threshold = 20;
|
|
16639
|
+
this.imageLoadStarted = new EventEmitter();
|
|
16197
16640
|
this.imageLoaded = new EventEmitter();
|
|
16198
|
-
this.
|
|
16199
|
-
this.
|
|
16641
|
+
this.imageLoadError = new EventEmitter();
|
|
16642
|
+
this._observer = null;
|
|
16643
|
+
this._initialized = false;
|
|
16644
|
+
this._loadHandler = () => {
|
|
16645
|
+
if (!this.imgLazy || this._imgEl.getAttribute('src') !== this.imgLazy) {
|
|
16646
|
+
return;
|
|
16647
|
+
}
|
|
16648
|
+
this._portalService.cachedImages[this.imgLazy] = true;
|
|
16649
|
+
this._imgEl.parentElement?.setAttribute('imgLoaded', 'true');
|
|
16650
|
+
this.imageLoaded.emit();
|
|
16651
|
+
};
|
|
16652
|
+
this._errorHandler = () => {
|
|
16653
|
+
if (!this.imgLazy || this._imgEl.getAttribute('src') !== this.imgLazy) {
|
|
16654
|
+
return;
|
|
16655
|
+
}
|
|
16656
|
+
this.imageLoadError.emit();
|
|
16657
|
+
};
|
|
16200
16658
|
this._imgEl = this._el.nativeElement;
|
|
16201
16659
|
}
|
|
16202
16660
|
ngOnInit() {
|
|
16203
16661
|
super.ngOnInit();
|
|
16204
|
-
|
|
16205
|
-
|
|
16206
|
-
|
|
16207
|
-
|
|
16208
|
-
|
|
16662
|
+
this._initialized = true;
|
|
16663
|
+
this._imgEl.setAttribute('loading', 'lazy');
|
|
16664
|
+
this._imgEl.setAttribute('decoding', 'async');
|
|
16665
|
+
this._imgEl.addEventListener('load', this._loadHandler);
|
|
16666
|
+
this._imgEl.addEventListener('error', this._errorHandler);
|
|
16667
|
+
this._observeCurrentImage();
|
|
16668
|
+
}
|
|
16669
|
+
ngOnChanges(changes) {
|
|
16670
|
+
super.ngOnChanges(changes);
|
|
16671
|
+
if (!this._initialized || !changes['imgLazy']) {
|
|
16209
16672
|
return;
|
|
16210
16673
|
}
|
|
16211
|
-
|
|
16212
|
-
|
|
16213
|
-
|
|
16214
|
-
|
|
16215
|
-
|
|
16216
|
-
|
|
16217
|
-
|
|
16218
|
-
|
|
16219
|
-
.pipe(takeUntil(this._imageViewed$), takeUntil(this._onDestroy$), debounceTime(20), filter(() => this.isInViewport()), tap(() => this.showImage()))
|
|
16220
|
-
.subscribe();
|
|
16221
|
-
}
|
|
16674
|
+
this._resetImage();
|
|
16675
|
+
this._observeCurrentImage();
|
|
16676
|
+
}
|
|
16677
|
+
ngOnDestroy() {
|
|
16678
|
+
this._disconnectObserver();
|
|
16679
|
+
this._imgEl.removeEventListener('load', this._loadHandler);
|
|
16680
|
+
this._imgEl.removeEventListener('error', this._errorHandler);
|
|
16681
|
+
super.ngOnDestroy();
|
|
16222
16682
|
}
|
|
16223
16683
|
showImage() {
|
|
16224
|
-
|
|
16225
|
-
|
|
16226
|
-
|
|
16684
|
+
if (!this.imgLazy) {
|
|
16685
|
+
return;
|
|
16686
|
+
}
|
|
16687
|
+
if (this._imgEl.getAttribute('src') === this.imgLazy) {
|
|
16227
16688
|
return;
|
|
16228
16689
|
}
|
|
16229
|
-
this.
|
|
16230
|
-
|
|
16231
|
-
this.
|
|
16232
|
-
this._imageViewed$.next();
|
|
16690
|
+
this.imageLoadStarted.emit();
|
|
16691
|
+
this._imgEl.setAttribute('src', this.imgLazy);
|
|
16692
|
+
this._disconnectObserver();
|
|
16233
16693
|
}
|
|
16234
|
-
|
|
16235
|
-
|
|
16236
|
-
|
|
16237
|
-
|
|
16238
|
-
}
|
|
16694
|
+
_observeCurrentImage() {
|
|
16695
|
+
this._disconnectObserver();
|
|
16696
|
+
if (!this.auto || !this.imgLazy) {
|
|
16697
|
+
return;
|
|
16698
|
+
}
|
|
16699
|
+
if (typeof IntersectionObserver === 'undefined') {
|
|
16700
|
+
this.showImage();
|
|
16701
|
+
return;
|
|
16702
|
+
}
|
|
16703
|
+
this._observer = new IntersectionObserver((entries) => {
|
|
16704
|
+
if (entries.some((entry) => entry.isIntersecting)) {
|
|
16705
|
+
this.showImage();
|
|
16706
|
+
}
|
|
16707
|
+
}, { rootMargin: `${Math.max(0, this.threshold)}px` });
|
|
16708
|
+
this._observer.observe(this._imgEl);
|
|
16709
|
+
}
|
|
16710
|
+
_resetImage() {
|
|
16711
|
+
this._disconnectObserver();
|
|
16712
|
+
this._imgEl.removeAttribute('src');
|
|
16713
|
+
this._imgEl.parentElement?.removeAttribute('imgLoaded');
|
|
16239
16714
|
}
|
|
16240
|
-
|
|
16241
|
-
|
|
16242
|
-
|
|
16243
|
-
rect.left >= 0 &&
|
|
16244
|
-
rect.bottom - this.threshold <= (window.innerHeight || document.documentElement.clientHeight) &&
|
|
16245
|
-
rect.right <= (window.innerWidth || document.documentElement.clientWidth);
|
|
16246
|
-
return isInViewport;
|
|
16715
|
+
_disconnectObserver() {
|
|
16716
|
+
this._observer?.disconnect();
|
|
16717
|
+
this._observer = null;
|
|
16247
16718
|
}
|
|
16248
16719
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ImageLazyDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
16249
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: ImageLazyDirective, isStandalone: false, selector: "[imgLazy]", inputs: { auto: "auto", threshold: "threshold", imgLazy: "imgLazy" }, outputs: { imageLoaded: "imageLoaded" }, usesInheritance: true, ngImport: i0 }); }
|
|
16720
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: ImageLazyDirective, isStandalone: false, selector: "[imgLazy]", inputs: { auto: "auto", threshold: "threshold", imgLazy: "imgLazy" }, outputs: { imageLoadStarted: "imageLoadStarted", imageLoaded: "imageLoaded", imageLoadError: "imageLoadError" }, usesInheritance: true, usesOnChanges: true, ngImport: i0 }); }
|
|
16250
16721
|
}
|
|
16251
16722
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ImageLazyDirective, decorators: [{
|
|
16252
16723
|
type: Directive,
|
|
@@ -16258,8 +16729,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
16258
16729
|
type: Input
|
|
16259
16730
|
}], threshold: [{
|
|
16260
16731
|
type: Input
|
|
16732
|
+
}], imageLoadStarted: [{
|
|
16733
|
+
type: Output
|
|
16261
16734
|
}], imageLoaded: [{
|
|
16262
16735
|
type: Output
|
|
16736
|
+
}], imageLoadError: [{
|
|
16737
|
+
type: Output
|
|
16263
16738
|
}], imgLazy: [{
|
|
16264
16739
|
type: Input
|
|
16265
16740
|
}] } });
|
|
@@ -17113,7 +17588,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
17113
17588
|
class BodyClickDirective extends BaseDirective {
|
|
17114
17589
|
constructor() {
|
|
17115
17590
|
super(...arguments);
|
|
17116
|
-
this._document = inject(DOCUMENT);
|
|
17591
|
+
this._document = inject(DOCUMENT$1);
|
|
17117
17592
|
}
|
|
17118
17593
|
onClick() {
|
|
17119
17594
|
if (this.disableBodyClick) {
|
|
@@ -17366,7 +17841,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
17366
17841
|
class LabelmandatoryDirective extends BaseDirective {
|
|
17367
17842
|
constructor() {
|
|
17368
17843
|
super(...arguments);
|
|
17369
|
-
this._document = inject(DOCUMENT);
|
|
17844
|
+
this._document = inject(DOCUMENT$1);
|
|
17370
17845
|
}
|
|
17371
17846
|
ngOnInit() {
|
|
17372
17847
|
super.ngOnInit();
|
|
@@ -18145,7 +18620,7 @@ class TooltipDirective {
|
|
|
18145
18620
|
...(ngDevMode ? [{ debugName: "bnrcTooltip" }] : /* istanbul ignore next */ []));
|
|
18146
18621
|
this.hostRef = inject(ElementRef);
|
|
18147
18622
|
this.renderer = inject(Renderer2);
|
|
18148
|
-
this.document = inject(DOCUMENT);
|
|
18623
|
+
this.document = inject(DOCUMENT$1);
|
|
18149
18624
|
this.tooltipEl = null;
|
|
18150
18625
|
}
|
|
18151
18626
|
ngOnDestroy() {
|
|
@@ -18356,6 +18831,132 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
18356
18831
|
type: Input
|
|
18357
18832
|
}] } });
|
|
18358
18833
|
|
|
18834
|
+
/**
|
|
18835
|
+
* یک container-query دستیِ قابلِاستفادهی مجدد: عرضِ خودِ المان (نه viewport) را با
|
|
18836
|
+
* `ResizeObserver` رصد میکند و بر اساس آن، تعدادِ ستونهای گریدِ ۱۲تاییِ فاندامنتال را
|
|
18837
|
+
* محاسبه و از طریقِ `(colSpanChange)` منتشر میکند. همچنین با `exportAs` قابلِ خواندنِ
|
|
18838
|
+
* مستقیمِ `colSpan`/`breakpoint` در همان قالب است.
|
|
18839
|
+
*
|
|
18840
|
+
* نمونه:
|
|
18841
|
+
* ```html
|
|
18842
|
+
* <fd-layout-grid
|
|
18843
|
+
* [bsuResponsiveGridCols]="{ s: 1, m: 2, l: 3, xl: 4 }"
|
|
18844
|
+
* (colSpanChange)="colSpan = $event">
|
|
18845
|
+
* <div [fdLayoutGridCol]="colSpan">...</div>
|
|
18846
|
+
* </fd-layout-grid>
|
|
18847
|
+
* ```
|
|
18848
|
+
*/
|
|
18849
|
+
class ResponsiveGridColsDirective {
|
|
18850
|
+
constructor() {
|
|
18851
|
+
/** تعدادِ کارت در ردیف بهازای هر breakpoint. */
|
|
18852
|
+
this.config = null;
|
|
18853
|
+
/** آستانهها؛ پیشفرض همراستا با گریدِ فاندامنتال. */
|
|
18854
|
+
this.breakpoints = { m: 601, l: 1025, xl: 1441 };
|
|
18855
|
+
/** span مؤثرِ گریدِ ۱۲تاییِ فاندامنتال (۱..۱۲) بر اساس عرضِ کانتینر. */
|
|
18856
|
+
this.colSpanChange = new EventEmitter();
|
|
18857
|
+
/** تعدادِ ستون در ردیف (برای گریدهای غیرِ ۱۲تایی مثل CSS/Tailwind grid). */
|
|
18858
|
+
this.colsPerRowChange = new EventEmitter();
|
|
18859
|
+
/** breakpoint فعلیِ کانتینر. */
|
|
18860
|
+
this.breakpointChange = new EventEmitter();
|
|
18861
|
+
this.breakpoint = 's';
|
|
18862
|
+
this.colSpan = 12;
|
|
18863
|
+
this.colsPerRow = 1;
|
|
18864
|
+
this._el = inject(ElementRef);
|
|
18865
|
+
this._cdr = inject(ChangeDetectorRef);
|
|
18866
|
+
this._zone = inject(NgZone);
|
|
18867
|
+
}
|
|
18868
|
+
ngAfterViewInit() {
|
|
18869
|
+
this._apply(this._width());
|
|
18870
|
+
try {
|
|
18871
|
+
this._ro = new ResizeObserver((entries) => {
|
|
18872
|
+
const width = entries[0]?.contentRect?.width ?? this._width();
|
|
18873
|
+
this._zone.run(() => this._apply(width));
|
|
18874
|
+
});
|
|
18875
|
+
this._ro.observe(this._el.nativeElement);
|
|
18876
|
+
}
|
|
18877
|
+
catch {
|
|
18878
|
+
// مرورگرِ خیلی قدیمی بدونِ ResizeObserver → فقط اندازهی اولیه اعمال میشود
|
|
18879
|
+
}
|
|
18880
|
+
}
|
|
18881
|
+
ngOnChanges(changes) {
|
|
18882
|
+
// تغییرِ config/breakpoints در زمانِ اجرا هم دوباره اعمال شود
|
|
18883
|
+
if ((changes.config && !changes.config.firstChange) ||
|
|
18884
|
+
(changes.breakpoints && !changes.breakpoints.firstChange)) {
|
|
18885
|
+
this._apply(this._width());
|
|
18886
|
+
}
|
|
18887
|
+
}
|
|
18888
|
+
ngOnDestroy() {
|
|
18889
|
+
this._ro?.disconnect();
|
|
18890
|
+
}
|
|
18891
|
+
_width() {
|
|
18892
|
+
return this._el.nativeElement.getBoundingClientRect().width;
|
|
18893
|
+
}
|
|
18894
|
+
_resolveBreakpoint(width) {
|
|
18895
|
+
const { m, l, xl } = this.breakpoints;
|
|
18896
|
+
return width < m ? 's' : width < l ? 'm' : width < xl ? 'l' : 'xl';
|
|
18897
|
+
}
|
|
18898
|
+
/** تعدادِ کارت در ردیف برای این breakpoint، با fallback به breakpointهای کوچکتر. */
|
|
18899
|
+
_colsPerRow(bp) {
|
|
18900
|
+
const c = this.config || {};
|
|
18901
|
+
const chain = {
|
|
18902
|
+
s: [c.s],
|
|
18903
|
+
m: [c.m, c.s],
|
|
18904
|
+
l: [c.l, c.m, c.s],
|
|
18905
|
+
xl: [c.xl, c.l, c.m, c.s]
|
|
18906
|
+
};
|
|
18907
|
+
const value = chain[bp].find((v) => v != null && +v > 0);
|
|
18908
|
+
return value && +value > 0 ? +value : 1;
|
|
18909
|
+
}
|
|
18910
|
+
_apply(width) {
|
|
18911
|
+
if (!width) {
|
|
18912
|
+
return;
|
|
18913
|
+
}
|
|
18914
|
+
const bp = this._resolveBreakpoint(width);
|
|
18915
|
+
const perRow = this._colsPerRow(bp);
|
|
18916
|
+
const span = Math.max(1, Math.min(12, Math.round(12 / perRow)));
|
|
18917
|
+
const bpChanged = bp !== this.breakpoint;
|
|
18918
|
+
const perRowChanged = perRow !== this.colsPerRow;
|
|
18919
|
+
const spanChanged = span !== this.colSpan;
|
|
18920
|
+
if (!bpChanged && !perRowChanged && !spanChanged) {
|
|
18921
|
+
return;
|
|
18922
|
+
}
|
|
18923
|
+
this.breakpoint = bp;
|
|
18924
|
+
this.colsPerRow = perRow;
|
|
18925
|
+
this.colSpan = span;
|
|
18926
|
+
this._cdr.markForCheck();
|
|
18927
|
+
if (spanChanged) {
|
|
18928
|
+
this.colSpanChange.emit(span);
|
|
18929
|
+
}
|
|
18930
|
+
if (perRowChanged) {
|
|
18931
|
+
this.colsPerRowChange.emit(perRow);
|
|
18932
|
+
}
|
|
18933
|
+
if (bpChanged) {
|
|
18934
|
+
this.breakpointChange.emit(bp);
|
|
18935
|
+
}
|
|
18936
|
+
}
|
|
18937
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ResponsiveGridColsDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
18938
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: ResponsiveGridColsDirective, isStandalone: false, selector: "[bsuResponsiveGridCols]", inputs: { config: ["bsuResponsiveGridCols", "config"], breakpoints: "breakpoints" }, outputs: { colSpanChange: "colSpanChange", colsPerRowChange: "colsPerRowChange", breakpointChange: "breakpointChange" }, exportAs: ["bsuResponsiveGridCols"], usesOnChanges: true, ngImport: i0 }); }
|
|
18939
|
+
}
|
|
18940
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ResponsiveGridColsDirective, decorators: [{
|
|
18941
|
+
type: Directive,
|
|
18942
|
+
args: [{
|
|
18943
|
+
selector: '[bsuResponsiveGridCols]',
|
|
18944
|
+
exportAs: 'bsuResponsiveGridCols',
|
|
18945
|
+
standalone: false
|
|
18946
|
+
}]
|
|
18947
|
+
}], propDecorators: { config: [{
|
|
18948
|
+
type: Input,
|
|
18949
|
+
args: ['bsuResponsiveGridCols']
|
|
18950
|
+
}], breakpoints: [{
|
|
18951
|
+
type: Input
|
|
18952
|
+
}], colSpanChange: [{
|
|
18953
|
+
type: Output
|
|
18954
|
+
}], colsPerRowChange: [{
|
|
18955
|
+
type: Output
|
|
18956
|
+
}], breakpointChange: [{
|
|
18957
|
+
type: Output
|
|
18958
|
+
}] } });
|
|
18959
|
+
|
|
18359
18960
|
class SafeBottomDirective extends BaseDirective {
|
|
18360
18961
|
constructor() {
|
|
18361
18962
|
super(...arguments);
|
|
@@ -18820,6 +19421,9 @@ class ReportContainerComponent extends BaseComponent {
|
|
|
18820
19421
|
}
|
|
18821
19422
|
ngOnInit() {
|
|
18822
19423
|
super.ngOnInit();
|
|
19424
|
+
this._addUlvMainUi();
|
|
19425
|
+
}
|
|
19426
|
+
_addUlvMainUi() {
|
|
18823
19427
|
let ulvParam;
|
|
18824
19428
|
if (!this.settings.RelatedReport) {
|
|
18825
19429
|
const id = this._activatedRoute.snapshot.params['id'];
|
|
@@ -18851,7 +19455,12 @@ class ReportContainerComponent extends BaseComponent {
|
|
|
18851
19455
|
UlvParams: ulvParam
|
|
18852
19456
|
}, this.vcr, this._injector, this._environmentInjector, this.settings.IsReportPage)
|
|
18853
19457
|
.pipe(takeUntil(this._onDestroy$), catchError$1((err) => throwError(err)), finalize(() => this._loadingSource.next(false)))
|
|
18854
|
-
.subscribe();
|
|
19458
|
+
.subscribe((ulvMainCtrl) => (this._ulvMainCtrlr = ulvMainCtrl));
|
|
19459
|
+
}
|
|
19460
|
+
ReloadReport() {
|
|
19461
|
+
this.vcr.clear();
|
|
19462
|
+
this._ulvMainCtrlr && this._ulvMainCtrlr.Destroy();
|
|
19463
|
+
this._addUlvMainUi();
|
|
18855
19464
|
}
|
|
18856
19465
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ReportContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
18857
19466
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: ReportContainerComponent, isStandalone: false, selector: "bnrc-report-container", inputs: { settings: "settings" }, usesInheritance: true, ngImport: i0, template: "@if ((loading$ | async)!!) {\r\n<bsu-mask></bsu-mask>\r\n}\r\n", styles: [":host{display:block}\n"], dependencies: [{ kind: "pipe", type: i1$1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
@@ -19300,7 +19909,7 @@ class ReportEmptyPageComponent extends PageWithFormHandlerBaseComponent {
|
|
|
19300
19909
|
</ng-template>
|
|
19301
19910
|
<ng-container #containerRef></ng-container>
|
|
19302
19911
|
<router-outlet></router-outlet>
|
|
19303
|
-
`, isInline: true, styles: [":host{display:
|
|
19912
|
+
`, isInline: true, styles: [":host{display:flex;min-height:0;height:100%;flex-direction:column;flex:1}\n"], dependencies: [{ kind: "directive", type: i1.RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: ReportNavigatorComponent, selector: "bnrc-report-navigator" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
19304
19913
|
}
|
|
19305
19914
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ReportEmptyPageComponent, decorators: [{
|
|
19306
19915
|
type: Component,
|
|
@@ -19310,7 +19919,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
19310
19919
|
</ng-template>
|
|
19311
19920
|
<ng-container #containerRef></ng-container>
|
|
19312
19921
|
<router-outlet></router-outlet>
|
|
19313
|
-
`, providers: [RoutingService, ContainerService], changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, styles: [":host{display:
|
|
19922
|
+
`, providers: [RoutingService, ContainerService], changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, styles: [":host{display:flex;min-height:0;height:100%;flex-direction:column;flex:1}\n"] }]
|
|
19314
19923
|
}], propDecorators: { blockTemplate: [{
|
|
19315
19924
|
type: ViewChild,
|
|
19316
19925
|
args: ['block', { static: true }]
|
|
@@ -19423,49 +20032,60 @@ const routeStorage = {};
|
|
|
19423
20032
|
const REUSE_PROPERTY = 'ReuseRoute';
|
|
19424
20033
|
class CustomRouteReuseStrategy {
|
|
19425
20034
|
// تصمیم میگیرد که آیا یک روَت باید Detach و ذخیره شود یا نه.
|
|
19426
|
-
// ما فقط روَتهایی را که در data مشخص شدهاند، Detach میکنیم.
|
|
19427
20035
|
shouldDetach(route) {
|
|
19428
|
-
|
|
19429
|
-
const isReuse = !!BarsaApi.Common.Util.TryGetValue(route, `data.pageData.${REUSE_PROPERTY}`);
|
|
19430
|
-
return isReuse;
|
|
20036
|
+
return this._isReuse(route);
|
|
19431
20037
|
}
|
|
19432
20038
|
// کامپوننت Detach شده را ذخیره میکند.
|
|
19433
20039
|
store(route, handle) {
|
|
19434
|
-
|
|
19435
|
-
|
|
19436
|
-
const keyPath = this._getKeyOfPath(route);
|
|
19437
|
-
routeStorage[keyPath] = handle;
|
|
20040
|
+
if (route.routeConfig && this._isReuse(route)) {
|
|
20041
|
+
routeStorage[this._getKeyOfPath(route)] = handle;
|
|
19438
20042
|
}
|
|
19439
20043
|
}
|
|
19440
20044
|
// تصمیم میگیرد که آیا کامپوننت ذخیره شده باید بازیابی (Attach) شود یا نه.
|
|
19441
20045
|
shouldAttach(route) {
|
|
19442
|
-
|
|
19443
|
-
const keyPath = this._getKeyOfPath(route);
|
|
19444
|
-
return !!route.routeConfig && !!routeStorage[keyPath];
|
|
20046
|
+
return !!route.routeConfig && this._isReuse(route) && !!routeStorage[this._getKeyOfPath(route)];
|
|
19445
20047
|
}
|
|
19446
20048
|
// کامپوننت ذخیره شده را بازیابی میکند.
|
|
19447
20049
|
retrieve(route) {
|
|
19448
|
-
|
|
19449
|
-
if (!route.routeConfig || !isReuse) {
|
|
20050
|
+
if (!route.routeConfig || !this._isReuse(route)) {
|
|
19450
20051
|
return null;
|
|
19451
20052
|
}
|
|
19452
|
-
|
|
19453
|
-
return routeStorage[keyPath] || null;
|
|
20053
|
+
return routeStorage[this._getKeyOfPath(route)] || null;
|
|
19454
20054
|
}
|
|
19455
|
-
//
|
|
19456
|
-
//
|
|
19457
|
-
// اما اگر پارامترها و Query Params یکسان باشند، شاید بخواهید 'true' باشد.
|
|
19458
|
-
// برای حالت شما (نویگیشن بین روَتهای اصلی)، معمولاً 'false' است مگر اینکه روَتها کاملاً یکسان باشند.
|
|
20055
|
+
// اگر از یک روَت به روَت دیگری برویم، این باید 'false' باشد تا بتواند Detach شود؛
|
|
20056
|
+
// در صورت یکسان بودنِ routeConfig، همان ActivatedRoute بازاستفاده میشود.
|
|
19459
20057
|
shouldReuseRoute(future, curr) {
|
|
19460
|
-
// این کار باعث میشود روَتهای خواهر (sibling) به عنوان روَتهای جدید در نظر گرفته شوند
|
|
19461
|
-
// تا بتوانند Detach و Attach شوند.
|
|
19462
20058
|
return future.routeConfig === curr.routeConfig;
|
|
19463
20059
|
}
|
|
20060
|
+
// کلیدِ ذخیرهسازی از pageDataِ «خودِ» روَت ساخته میشود تا برای هر صفحه یکتا باشد و با
|
|
20061
|
+
// فرزندانِ ارثبَرَندهی همان صفحه تداخل نکند.
|
|
19464
20062
|
_getKeyOfPath(route) {
|
|
19465
|
-
const
|
|
19466
|
-
|
|
19467
|
-
|
|
19468
|
-
|
|
20063
|
+
const pageData = this._ownPageData(route) || {};
|
|
20064
|
+
return `${pageData.ParentRoute}${pageData.Route}`;
|
|
20065
|
+
}
|
|
20066
|
+
// pageDataِ «خودِ» این روَت را برمیگرداند — از routeConfig.data، نه از snapshot.data.
|
|
20067
|
+
// نکتهی کلیدی: snapshot.data بهصورت ارثبریشده (merged با والد) است، پس همهی روَتهای
|
|
20068
|
+
// فرزندِ یک صفحهی Reuse (مثل report/:id و form و صفحهی empty) همان pageDataِ والد را
|
|
20069
|
+
// نشان میدهند. اگر بر اساس آن تصمیم بگیریم، کلیدِ ذخیرهسازی برای همهی این روَتها یکسان
|
|
20070
|
+
// میشود و handleِ یک روَت برای روَتِ دیگری Attach میشود → حلقه در درختِ ActivatedRoute و
|
|
20071
|
+
// خطای «Maximum call stack size exceeded» در setRouterState.
|
|
20072
|
+
_ownPageData(route) {
|
|
20073
|
+
return route?.routeConfig?.data?.['pageData'] ?? null;
|
|
20074
|
+
}
|
|
20075
|
+
// آیا این روَت باید Detach/Store/Attach شود؟
|
|
20076
|
+
// فقط روَتهایی که «خودِ» routeConfig-شان ReuseRoute=True دارد. چون از pageDataِ خودِ روَت
|
|
20077
|
+
// (نه snapshot.dataِ ارثبریشده) میخوانیم، روَتهای report/:id و form و صفحهی empty که
|
|
20078
|
+
// pageDataشان null است اینجا false میگیرند و در reuse دخالت نمیکنند.
|
|
20079
|
+
_isReuse(route) {
|
|
20080
|
+
const pageData = this._ownPageData(route);
|
|
20081
|
+
if (!pageData) {
|
|
20082
|
+
return false;
|
|
20083
|
+
}
|
|
20084
|
+
const reuse = pageData[REUSE_PROPERTY];
|
|
20085
|
+
if (reuse !== true && reuse !== 'True') {
|
|
20086
|
+
return false;
|
|
20087
|
+
}
|
|
20088
|
+
return true;
|
|
19469
20089
|
}
|
|
19470
20090
|
}
|
|
19471
20091
|
|
|
@@ -19493,7 +20113,7 @@ class ResizableDirective {
|
|
|
19493
20113
|
constructor() {
|
|
19494
20114
|
this.resizableComplete = new EventEmitter();
|
|
19495
20115
|
this.resizableStart = new EventEmitter();
|
|
19496
|
-
this.documentRef = inject(DOCUMENT);
|
|
20116
|
+
this.documentRef = inject(DOCUMENT$1);
|
|
19497
20117
|
this.elementRef = inject(ElementRef);
|
|
19498
20118
|
this.resizable = fromEvent(this.elementRef.nativeElement, 'mousedown').pipe(tap((e) => e.preventDefault()), tap(() => this.resizableStart.emit()), switchMap$1(() => {
|
|
19499
20119
|
const elDom = this.elementRef.nativeElement;
|
|
@@ -20108,6 +20728,7 @@ const directives = [
|
|
|
20108
20728
|
SimplebarDirective,
|
|
20109
20729
|
LeafletLongPressDirective,
|
|
20110
20730
|
ResizeHandlerDirective,
|
|
20731
|
+
ResponsiveGridColsDirective,
|
|
20111
20732
|
SafeBottomDirective,
|
|
20112
20733
|
MoLinkerDirective
|
|
20113
20734
|
];
|
|
@@ -20147,6 +20768,7 @@ const pipes = [
|
|
|
20147
20768
|
EnumCaptionPipe,
|
|
20148
20769
|
CanUploadFilePipe,
|
|
20149
20770
|
RemoveNewlinePipe,
|
|
20771
|
+
RelativeDatePipe,
|
|
20150
20772
|
ConvertToStylePipe,
|
|
20151
20773
|
FilterPipe,
|
|
20152
20774
|
FilterTabPipe,
|
|
@@ -20181,6 +20803,7 @@ const pipes = [
|
|
|
20181
20803
|
SanitizeTextPipe,
|
|
20182
20804
|
ColumnCustomComponentPipe,
|
|
20183
20805
|
ColumnIconPipe,
|
|
20806
|
+
MoIconPipe,
|
|
20184
20807
|
ColumnValuePipe,
|
|
20185
20808
|
RowNumberPipe,
|
|
20186
20809
|
ComboRowImagePipe,
|
|
@@ -20200,6 +20823,7 @@ const pipes = [
|
|
|
20200
20823
|
LabelStarTrimPipe,
|
|
20201
20824
|
SplitPipe,
|
|
20202
20825
|
DynamicDarkColorPipe,
|
|
20826
|
+
ReadableTextColorPipe,
|
|
20203
20827
|
ChunkArrayPipe,
|
|
20204
20828
|
MapToChatMessagePipe,
|
|
20205
20829
|
PicturesByGroupIdPipe,
|
|
@@ -20349,6 +20973,7 @@ class BarsaNovinRayCoreModule extends BaseModule {
|
|
|
20349
20973
|
EnumCaptionPipe,
|
|
20350
20974
|
CanUploadFilePipe,
|
|
20351
20975
|
RemoveNewlinePipe,
|
|
20976
|
+
RelativeDatePipe,
|
|
20352
20977
|
ConvertToStylePipe,
|
|
20353
20978
|
FilterPipe,
|
|
20354
20979
|
FilterTabPipe,
|
|
@@ -20383,6 +21008,7 @@ class BarsaNovinRayCoreModule extends BaseModule {
|
|
|
20383
21008
|
SanitizeTextPipe,
|
|
20384
21009
|
ColumnCustomComponentPipe,
|
|
20385
21010
|
ColumnIconPipe,
|
|
21011
|
+
MoIconPipe,
|
|
20386
21012
|
ColumnValuePipe,
|
|
20387
21013
|
RowNumberPipe,
|
|
20388
21014
|
ComboRowImagePipe,
|
|
@@ -20402,6 +21028,7 @@ class BarsaNovinRayCoreModule extends BaseModule {
|
|
|
20402
21028
|
LabelStarTrimPipe,
|
|
20403
21029
|
SplitPipe,
|
|
20404
21030
|
DynamicDarkColorPipe,
|
|
21031
|
+
ReadableTextColorPipe,
|
|
20405
21032
|
ChunkArrayPipe,
|
|
20406
21033
|
MapToChatMessagePipe,
|
|
20407
21034
|
PicturesByGroupIdPipe,
|
|
@@ -20460,6 +21087,7 @@ class BarsaNovinRayCoreModule extends BaseModule {
|
|
|
20460
21087
|
SimplebarDirective,
|
|
20461
21088
|
LeafletLongPressDirective,
|
|
20462
21089
|
ResizeHandlerDirective,
|
|
21090
|
+
ResponsiveGridColsDirective,
|
|
20463
21091
|
SafeBottomDirective,
|
|
20464
21092
|
MoLinkerDirective], imports: [CommonModule,
|
|
20465
21093
|
BarsaNovinRayCoreRoutingModule,
|
|
@@ -20498,6 +21126,7 @@ class BarsaNovinRayCoreModule extends BaseModule {
|
|
|
20498
21126
|
EnumCaptionPipe,
|
|
20499
21127
|
CanUploadFilePipe,
|
|
20500
21128
|
RemoveNewlinePipe,
|
|
21129
|
+
RelativeDatePipe,
|
|
20501
21130
|
ConvertToStylePipe,
|
|
20502
21131
|
FilterPipe,
|
|
20503
21132
|
FilterTabPipe,
|
|
@@ -20532,6 +21161,7 @@ class BarsaNovinRayCoreModule extends BaseModule {
|
|
|
20532
21161
|
SanitizeTextPipe,
|
|
20533
21162
|
ColumnCustomComponentPipe,
|
|
20534
21163
|
ColumnIconPipe,
|
|
21164
|
+
MoIconPipe,
|
|
20535
21165
|
ColumnValuePipe,
|
|
20536
21166
|
RowNumberPipe,
|
|
20537
21167
|
ComboRowImagePipe,
|
|
@@ -20551,6 +21181,7 @@ class BarsaNovinRayCoreModule extends BaseModule {
|
|
|
20551
21181
|
LabelStarTrimPipe,
|
|
20552
21182
|
SplitPipe,
|
|
20553
21183
|
DynamicDarkColorPipe,
|
|
21184
|
+
ReadableTextColorPipe,
|
|
20554
21185
|
ChunkArrayPipe,
|
|
20555
21186
|
MapToChatMessagePipe,
|
|
20556
21187
|
PicturesByGroupIdPipe,
|
|
@@ -20609,6 +21240,7 @@ class BarsaNovinRayCoreModule extends BaseModule {
|
|
|
20609
21240
|
SimplebarDirective,
|
|
20610
21241
|
LeafletLongPressDirective,
|
|
20611
21242
|
ResizeHandlerDirective,
|
|
21243
|
+
ResponsiveGridColsDirective,
|
|
20612
21244
|
SafeBottomDirective,
|
|
20613
21245
|
MoLinkerDirective] }); }
|
|
20614
21246
|
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: BarsaNovinRayCoreModule, providers: [provideHttpClient(withXhr(), withInterceptorsFromDi())], imports: [CommonModule,
|
|
@@ -20640,5 +21272,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
20640
21272
|
* Generated bundle index. Do not edit.
|
|
20641
21273
|
*/
|
|
20642
21274
|
|
|
20643
|
-
export { ColSetting as $, APP_VERSION as A, BaseModule as B, BaseFormToolbaritemPropsComponent as C, DynamicComponentService as D, BaseItemContentPropsComponent as E, BaseReportModel as F, BaseSettingsService as G, BaseUlvSettingComponent as H, BaseViewContentPropsComponent as I, BaseViewItemPropsComponent as J, BaseViewPropsComponent as K, BbbTranslatePipe as L, BodyClickDirective as M, BoolControlInfoModel as N, BreadcrumbService as O, ButtonLoadingComponent as P, CalculateControlInfoModel as Q, ReportEmptyPageComponent as R, CalendarSettingsStore as S, CanUploadFilePipe as T, CardBaseItemContentPropsComponent as U, CardDynamicItemComponent as V, CardMediaSizePipe as W, CardViewService as X, ChangeLayoutInfoCustomUi as Y, ChunkArrayPipe as Z, CodeEditorControlInfoModel as _, AbsoluteDivBodyDirective as a, FileInfoCountPipe as a$, ColumnCustomComponentPipe as a0, ColumnCustomUiPipe as a1, ColumnIconPipe as a2, ColumnRendererBase as a3, ColumnRendererViewBase as a4, ColumnResizerDirective as a5, ColumnService as a6, ColumnValueDirective as a7, ColumnValueOfParametersPipe as a8, ColumnValuePipe as a9, DynamicDarkColorPipe as aA, DynamicFormComponent as aB, DynamicFormToolbaritemComponent as aC, DynamicItemComponent as aD, DynamicLayoutComponent as aE, DynamicRootVariableDirective as aF, DynamicStyleDirective as aG, DynamicUlvPagingComponent as aH, DynamicUlvToolbarComponent as aI, EllapsisTextDirective as aJ, EllipsifyDirective as aK, EmptyPageComponent as aL, EmptyPageWithRouterAndRouterOutletComponent as aM, EntitySettingsStore as aN, EnumCaptionPipe as aO, EnumControlInfoModel as aP, ExecuteDynamicCommand as aQ, ExecuteWorkflowChoiceDef as aR, ExistsColumnsPipe as aS, FORM_DIALOG_COMPONENT as aT, FieldBaseComponent as aU, FieldBaseController as aV, FieldDirective as aW, FieldInfoTypeEnum as aX, FieldUiComponent as aY, FieldViewBase as aZ, FileControlInfoModel as a_, ComboRowImagePipe as aa, CommandControlInfoModel as ab, ContainerComponent as ac, ContainerService as ad, ContextMenuPipe as ae, ControlUiPipe as af, ConvertToStylePipe as ag, CopyDirective as ah, CountDownDirective as ai, CustomCommand as aj, CustomInjector as ak, CustomRouteReuseStrategy as al, CustomUiRegistryService as am, DEFAULT_REPORT_LAYOUT_POLICY as an, DIALOG_SERVICE as ao, DateHijriService as ap, DateMiladiService as aq, DateRanges as ar, DateService as as, DateShamsiService as at, DateTimeControlInfoModel as au, DefaultCommandsAccessValue as av, DefaultGridSetting as aw, DeviceWidth as ax, DialogParams as ay, DynamicCommandDirective as az, AddDynamicFormStyles as b, ItemsRendererDirective as b$, FilePictureInfoModel as b0, FilesValidationHelper as b1, FillAllLayoutControls as b2, FillEmptySpaceDirective as b3, FilterColumnsByDetailsPipe as b4, FilterInlineActionListPipe as b5, FilterPipe as b6, FilterStringPipe as b7, FilterTabPipe as b8, FilterToolbarControlPipe as b9, GetDefaultMoObjectInfo as bA, GetImgTags as bB, GetViewableExtensions as bC, GetVisibleValue as bD, GridSetting as bE, GroupBy as bF, GroupByPipe as bG, GroupByService as bH, HeaderFacetValuePipe as bI, HideAcceptCancelButtonsPipe as bJ, HideColumnsInmobilePipe as bK, HistoryControlInfoModel as bL, HorizontalLayoutService as bM, HorizontalResponsiveDirective as bN, IconControlInfoModel as bO, IdbService as bP, ImageLazyDirective as bQ, ImageMimeType as bR, ImagetoPrint as bS, InMemoryStorageService as bT, IndexedDbService as bU, InputNumber as bV, IntersectionObserverDirective as bW, IntersectionStatus as bX, IsDarkMode as bY, IsExpandedNodePipe as bZ, IsImagePipe as b_, FilterWorkflowInMobilePipe as ba, FindColumnByDbNamePipe as bb, FindColumnsPipe as bc, FindGroup as bd, FindLayoutSettingFromLayout94 as be, FindPreviewColumnPipe as bf, FindToolbarItem as bg, FioriIconPipe as bh, FormBaseComponent as bi, FormCloseDirective as bj, FormComponent as bk, FormFieldReportPageComponent as bl, FormNewComponent as bm, FormPageBaseComponent as bn, FormPageComponent as bo, FormPanelService as bp, FormPropsBaseComponent as bq, FormService as br, FormToolbarBaseComponent as bs, FormToolbarButton as bt, GaugeControlInfoModel as bu, GeneralControlInfoModel as bv, GetAllColumnsSorted as bw, GetAllHorizontalFromLayout94 as bx, GetContentType as by, GetCssVariableValuePipe as bz, AffixRespondEvents as c, PromptUpdateService as c$, LabelStarTrimPipe as c0, LabelmandatoryDirective as c1, LayoutItemBaseComponent as c2, LayoutMainContentService as c3, LayoutPanelBaseComponent as c4, LayoutService as c5, LeafletLongPressDirective as c6, LinearListControlInfoModel as c7, LinearListHelper as c8, ListCountPipe as c9, NetworkStatusService as cA, NotFoundComponent as cB, NotificationService as cC, NowraptextDirective as cD, NumberBaseComponent as cE, NumberControlInfoModel as cF, NumbersOnlyInputDirective as cG, NumeralPipe as cH, OverflowTextDirective as cI, PageBaseComponent as cJ, PageWithFormHandlerBaseComponent as cK, PdfMimeType as cL, PictureFieldSourcePipe as cM, PictureFileControlInfoModel as cN, PicturesByGroupIdPipe as cO, PlaceHolderDirective as cP, PortalDynamicPageResolver as cQ, PortalFormPageResolver as cR, PortalPageComponent as cS, PortalPageResolver as cT, PortalPageSidebarComponent as cU, PortalReportPageResolver as cV, PortalService as cW, PreventDefaulEvent as cX, PreventDefaultDirective as cY, PrintFilesDirective as cZ, PrintImage as c_, ListRelationModel as ca, LoadExternalFilesDirective as cb, LocalStorageService as cc, LogService as cd, LoginSettingsResolver as ce, MapToChatMessagePipe as cf, MasterDetailsPageComponent as cg, MeasureFormTitleWidthDirective as ch, MergeFieldsToColumnsPipe as ci, MetaobjectDataModel as cj, MetaobjectRelationModel as ck, MimeTypes as cl, MoForReportModel as cm, MoForReportModelBase as cn, MoInfoUlvMoListPipe as co, MoInfoUlvPagingPipe as cp, MoLinkerDirective as cq, MoReportValueConcatPipe as cr, MoReportValuePipe as cs, MoValuePipe as ct, MobileDirective as cu, ModalRootComponent as cv, MultipleGroupByPipe as cw, NATIVE_FEDERATION_RUNTIME as cx, NOTIFICATAION_POPUP_SERVER as cy, NOTIFICATION_WEBWORKER_FACTORY as cz, AllFilesMimeType as d, ShortcutHandlerDirective as d$, PushBannerComponent as d0, PushCheckService as d1, PushNotificationService as d2, REPORT_GRID_VIEWPORT_CLASS as d3, REPORT_TYPE_DEFAULT_POLICIES as d4, RUNTIME_NAV_STATE_SCHEMA_V1 as d5, RabetehAkseTakiListiControlInfoModel as d6, RedirectHomeGuard as d7, RelatedReportControlInfoModel as d8, RelationListControlInfoModel as d9, ResizeHandlerDirective as dA, ResizeObserverDirective as dB, ReversePipe as dC, RichStringControlInfoModel as dD, RootPageComponent as dE, RootPortalComponent as dF, RotateImage as dG, RouteFormChangeDirective as dH, RoutingService as dI, RowDataOption as dJ, RowNumberPipe as dK, RowState as dL, RuntimeNavStateCacheService as dM, SafeBottomDirective as dN, SanitizeTextPipe as dO, SaveImageDirective as dP, SaveImageToFile as dQ, SaveScrollPositionService as dR, ScopedCssPipe as dS, ScrollLayoutContextHolder as dT, ScrollPersistDirective as dU, ScrollToSelectedDirective as dV, SelectionMode as dW, SeperatorFixPipe as dX, ServiceWorkerCommuncationService as dY, ServiceWorkerNotificationService as dZ, ShellbarHeightService as d_, RemoveDynamicFormStyles as da, RemoveNewlinePipe as db, RenderUlvDirective as dc, RenderUlvPaginDirective as dd, RenderUlvViewerDirective as de, ReplacePipe as df, ReportActionListPipe as dg, ReportBaseComponent as dh, ReportBaseInfo as di, ReportBreadcrumbResolver as dj, ReportCalendarModel as dk, ReportContainerComponent as dl, ReportExtraInfo as dm, ReportField as dn, ReportFormModel as dp, ReportItemBaseComponent as dq, ReportListModel as dr, ReportModel as ds, ReportNavigatorComponent as dt, ReportTreeModel as du, ReportViewBaseComponent as dv, ReportViewColumn as dw, ResizableComponent as dx, ResizableDirective as dy, ResizableModule as dz, AnchorScrollDirective as e, fixUnclosedParentheses as e$, ShortcutRegisterDirective as e0, SimpleTemplateEngine as e1, SimplebarDirective as e2, SingleRelationControlInfoModel as e3, SortDirection as e4, SortPipe as e5, SortSetting as e6, SplideSliderDirective as e7, SplitPipe as e8, SplitterComponent as e9, ViewBase as eA, VisibleValuePipe as eB, WebOtpDirective as eC, WordMimeType as eD, WorfkflowwChoiceCommandDirective as eE, addCssVariableToRoot as eF, addDynamicVariableTo as eG, availablePrefixes as eH, bodyClick as eI, buildRuntimeNavStateCacheKey as eJ, calcContextMenuWidth as eK, calculateColumnContent as eL, calculateColumnWidth as eM, calculateColumnWidthFitToContainer as eN, calculateFreeColumnSize as eO, calculateMoDataListContentWidthByColumnName as eP, cancelRequestAnimationFrame as eQ, checkPermission as eR, compareVersions as eS, contextDefaultsFromEnvironment as eT, createFormPanelMetaConditions as eU, createGridEditorFormPanel as eV, easeInOutCubic as eW, elementInViewport2 as eX, enumValueToStringSize as eY, executeUlvCommandHandler as eZ, extractLayoutPolicyFromView as e_, StopPropagationDirective as ea, StringControlInfoModel as eb, StringToNumberPipe as ec, SubformControlInfoModel as ed, SystemBaseComponent as ee, TEMPLATE_ENGINE as ef, TOAST_SERVICE as eg, TableHeaderWidthMode as eh, TableResizerDirective as ei, TabpageService as ej, ThImageOrIconePipe as ek, TileGroupBreadcrumResolver as el, TilePropsComponent as em, TlbButtonsPipe as en, ToolbarSettingsPipe as eo, TooltipDirective as ep, TotalSummaryPipe as eq, UiService as er, UlvCommandDirective as es, UlvHeightSizeType as et, UlvMainService as eu, UnlimitSessionComponent as ev, UntilInViewDirective as ew, UploadService as ex, VideoMimeType as ey, VideoRecordingService as ez, formRoutes as f, sortEx as f$, flattenTree as f0, forbiddenValidator as f1, formatBytes as f2, fromEntries as f3, fromIntersectionObserver as f4, genrateInlineMoId as f5, getAllItemsPerChildren as f6, getColumnValueOfMoDataList as f7, getComponentDefined as f8, getControlList as f9, isFirefox as fA, isFunction as fB, isIOS as fC, isImage as fD, isInLocalMode as fE, isSafari as fF, isTargetWindow as fG, isVersionBiggerThan as fH, measureText as fI, measureText2 as fJ, measureTextBy as fK, mobile_regex as fL, multilevelSort as fM, nullOrUndefinedString as fN, number_only as fO, removeDynamicStyle as fP, requestAnimationFramePolyfill as fQ, resolveFinalScroll as fR, resolveReportLayoutPolicy as fS, scrollLayoutModeToContextEnvironment as fT, scrollToElement as fU, searchEx as fV, setColumnWidthByMaxMoContentWidth as fW, setOneDepthLevel as fX, setTableThWidth as fY, shallowEqual as fZ, sort as f_, getControlSizeMode as fa, getDateService as fb, getDeviceIsDesktop as fc, getDeviceIsMobile as fd, getDeviceIsPhone as fe, getDeviceIsTablet as ff, getFieldValue as fg, getFocusableTagNames as fh, getFormSettings as fi, getGridSettings as fj, getHeaderValue as fk, getIcon as fl, getImagePath as fm, getLabelWidth as fn, getLayout94ObjectInfo as fo, getLayoutControl as fp, getNestedValue as fq, getNewMoGridEditor as fr, getParentHeight as fs, getReportTypeDefaultPolicy as ft, getRequestAnimationFrame as fu, getResetGridSettings as fv, getTargetRect as fw, getUniqueId as fx, getValidExtension as fy, isFF as fz, ApiService as g, stopPropagation as g0, throwIfAlreadyLoaded as g1, toNumber as g2, validateAllFormFields as g3, ApplicationBaseComponent as h, ApplicationCtrlrService as i, AttrRtlDirective as j, AudioMimeType as k, AudioRecordingService as l, AuthGuard as m, BarsaApi as n, BarsaDialogService as o, BarsaIconDictPipe as p, BarsaNovinRayCoreModule as q, reportRoutes as r, BarsaReadonlyDirective as s, BarsaSapUiFormPageModule as t, BarsaStorageService as u, BaseColumnPropsComponent as v, BaseComponent as w, BaseController as x, BaseDirective as y, BaseDynamicComponent as z };
|
|
20644
|
-
//# sourceMappingURL=barsa-novin-ray-core-barsa-novin-ray-core-
|
|
21275
|
+
export { ColSetting as $, APP_VERSION as A, BaseModule as B, BaseFormToolbaritemPropsComponent as C, DynamicComponentService as D, BaseItemContentPropsComponent as E, BaseReportModel as F, BaseSettingsService as G, BaseUlvSettingComponent as H, BaseViewContentPropsComponent as I, BaseViewItemPropsComponent as J, BaseViewPropsComponent as K, BbbTranslatePipe as L, BodyClickDirective as M, BoolControlInfoModel as N, BreadcrumbService as O, ButtonLoadingComponent as P, CalculateControlInfoModel as Q, ReportEmptyPageComponent as R, CalendarSettingsStore as S, CanUploadFilePipe as T, CardBaseItemContentPropsComponent as U, CardDynamicItemComponent as V, CardMediaSizePipe as W, CardViewService as X, ChangeLayoutInfoCustomUi as Y, ChunkArrayPipe as Z, CodeEditorControlInfoModel as _, AbsoluteDivBodyDirective as a, FileControlInfoModel as a$, ColumnCustomComponentPipe as a0, ColumnCustomUiPipe as a1, ColumnIconPipe as a2, ColumnRendererBase as a3, ColumnRendererViewBase as a4, ColumnResizerDirective as a5, ColumnService as a6, ColumnValueDirective as a7, ColumnValueOfParametersPipe as a8, ColumnValuePipe as a9, DynamicCommandDirective as aA, DynamicDarkColorPipe as aB, DynamicFormComponent as aC, DynamicFormToolbaritemComponent as aD, DynamicItemComponent as aE, DynamicLayoutComponent as aF, DynamicRootVariableDirective as aG, DynamicStyleDirective as aH, DynamicUlvPagingComponent as aI, DynamicUlvToolbarComponent as aJ, EllapsisTextDirective as aK, EllipsifyDirective as aL, EmptyPageComponent as aM, EmptyPageWithRouterAndRouterOutletComponent as aN, EntitySettingsStore as aO, EnumCaptionPipe as aP, EnumControlInfoModel as aQ, ExecuteDynamicCommand as aR, ExecuteWorkflowChoiceDef as aS, ExistsColumnsPipe as aT, FORM_DIALOG_COMPONENT as aU, FieldBaseComponent as aV, FieldBaseController as aW, FieldDirective as aX, FieldInfoTypeEnum as aY, FieldUiComponent as aZ, FieldViewBase as a_, ComboRowImagePipe as aa, CommandControlInfoModel as ab, ContainerComponent as ac, ContainerService as ad, ContextMenuPipe as ae, ControlUiPipe as af, ConvertToStylePipe as ag, CopyDirective as ah, CountDownDirective as ai, CustomCommand as aj, CustomInjector as ak, CustomRouteReuseStrategy as al, CustomUiRegistryService as am, DEFAULT_OBJECT_ICON as an, DEFAULT_REPORT_LAYOUT_POLICY as ao, DIALOG_SERVICE as ap, DateHijriService as aq, DateMiladiService as ar, DateRanges as as, DateService as at, DateShamsiService as au, DateTimeControlInfoModel as av, DefaultCommandsAccessValue as aw, DefaultGridSetting as ax, DeviceWidth as ay, DialogParams as az, AddDynamicFormStyles as b, IsImagePipe as b$, FileInfoCountPipe as b0, FilePictureInfoModel as b1, FilesValidationHelper as b2, FillAllLayoutControls as b3, FillEmptySpaceDirective as b4, FilterColumnsByDetailsPipe as b5, FilterInlineActionListPipe as b6, FilterPipe as b7, FilterStringPipe as b8, FilterTabPipe as b9, GetCssVariableValuePipe as bA, GetDefaultMoObjectInfo as bB, GetImgTags as bC, GetViewableExtensions as bD, GetVisibleValue as bE, GridSetting as bF, GroupBy as bG, GroupByPipe as bH, GroupByService as bI, HeaderFacetValuePipe as bJ, HideAcceptCancelButtonsPipe as bK, HideColumnsInmobilePipe as bL, HistoryControlInfoModel as bM, HorizontalLayoutService as bN, HorizontalResponsiveDirective as bO, IconControlInfoModel as bP, IdbService as bQ, ImageLazyDirective as bR, ImageMimeType as bS, ImagetoPrint as bT, InMemoryStorageService as bU, IndexedDbService as bV, InputNumber as bW, IntersectionObserverDirective as bX, IntersectionStatus as bY, IsDarkMode as bZ, IsExpandedNodePipe as b_, FilterToolbarControlPipe as ba, FilterWorkflowInMobilePipe as bb, FindColumnByDbNamePipe as bc, FindColumnsPipe as bd, FindGroup as be, FindLayoutSettingFromLayout94 as bf, FindPreviewColumnPipe as bg, FindToolbarItem as bh, FioriIconPipe as bi, FormBaseComponent as bj, FormCloseDirective as bk, FormComponent as bl, FormFieldReportPageComponent as bm, FormNewComponent as bn, FormPageBaseComponent as bo, FormPageComponent as bp, FormPanelService as bq, FormPropsBaseComponent as br, FormService as bs, FormToolbarBaseComponent as bt, FormToolbarButton as bu, GaugeControlInfoModel as bv, GeneralControlInfoModel as bw, GetAllColumnsSorted as bx, GetAllHorizontalFromLayout94 as by, GetContentType as bz, AffixRespondEvents as c, PrintFilesDirective as c$, ItemsRendererDirective as c0, LabelStarTrimPipe as c1, LabelmandatoryDirective as c2, LayoutItemBaseComponent as c3, LayoutMainContentService as c4, LayoutPanelBaseComponent as c5, LayoutService as c6, LeafletLongPressDirective as c7, LinearListControlInfoModel as c8, LinearListHelper as c9, NOTIFICATAION_POPUP_SERVER as cA, NOTIFICATION_WEBWORKER_FACTORY as cB, NetworkStatusService as cC, NotFoundComponent as cD, NotificationService as cE, NowraptextDirective as cF, NumberBaseComponent as cG, NumberControlInfoModel as cH, NumbersOnlyInputDirective as cI, NumeralPipe as cJ, OverflowTextDirective as cK, PageBaseComponent as cL, PageWithFormHandlerBaseComponent as cM, PdfMimeType as cN, PictureFieldSourcePipe as cO, PictureFileControlInfoModel as cP, PicturesByGroupIdPipe as cQ, PlaceHolderDirective as cR, PortalDynamicPageResolver as cS, PortalFormPageResolver as cT, PortalPageComponent as cU, PortalPageResolver as cV, PortalPageSidebarComponent as cW, PortalReportPageResolver as cX, PortalService as cY, PreventDefaulEvent as cZ, PreventDefaultDirective as c_, ListCountPipe as ca, ListRelationModel as cb, LoadExternalFilesDirective as cc, LocalStorageService as cd, LogService as ce, LoginSettingsResolver as cf, MapToChatMessagePipe as cg, MasterDetailsPageComponent as ch, MeasureFormTitleWidthDirective as ci, MergeFieldsToColumnsPipe as cj, MetaobjectDataModel as ck, MetaobjectRelationModel as cl, MimeTypes as cm, MoForReportModel as cn, MoForReportModelBase as co, MoIconPipe as cp, MoInfoUlvMoListPipe as cq, MoInfoUlvPagingPipe as cr, MoLinkerDirective as cs, MoReportValueConcatPipe as ct, MoReportValuePipe as cu, MoValuePipe as cv, MobileDirective as cw, ModalRootComponent as cx, MultipleGroupByPipe as cy, NATIVE_FEDERATION_RUNTIME as cz, AllFilesMimeType as d, ScrollToSelectedDirective as d$, PrintImage as d0, PromptUpdateService as d1, PushBannerComponent as d2, PushCheckService as d3, PushNotificationService as d4, REPORT_GRID_VIEWPORT_CLASS as d5, REPORT_TYPE_DEFAULT_POLICIES as d6, RUNTIME_NAV_STATE_SCHEMA_V1 as d7, RabetehAkseTakiListiControlInfoModel as d8, ReadableTextColorPipe as d9, ReportViewBaseComponent as dA, ReportViewColumn as dB, ResizableComponent as dC, ResizableDirective as dD, ResizableModule as dE, ResizeHandlerDirective as dF, ResizeObserverDirective as dG, ResponsiveGridColsDirective as dH, ReversePipe as dI, RichStringControlInfoModel as dJ, RootPageComponent as dK, RootPortalComponent as dL, RotateImage as dM, RouteFormChangeDirective as dN, RoutingService as dO, RowDataOption as dP, RowNumberPipe as dQ, RowState as dR, RuntimeNavStateCacheService as dS, SafeBottomDirective as dT, SanitizeTextPipe as dU, SaveImageDirective as dV, SaveImageToFile as dW, SaveScrollPositionService as dX, ScopedCssPipe as dY, ScrollLayoutContextHolder as dZ, ScrollPersistDirective as d_, RedirectHomeGuard as da, RelatedReportControlInfoModel as db, RelationListControlInfoModel as dc, RelativeDatePipe as dd, RelativeTimeService as de, RemoveDynamicFormStyles as df, RemoveNewlinePipe as dg, RenderUlvDirective as dh, RenderUlvPaginDirective as di, RenderUlvViewerDirective as dj, ReplacePipe as dk, ReportActionListPipe as dl, ReportBaseComponent as dm, ReportBaseInfo as dn, ReportBreadcrumbResolver as dp, ReportCalendarModel as dq, ReportContainerComponent as dr, ReportExtraInfo as ds, ReportField as dt, ReportFormModel as du, ReportItemBaseComponent as dv, ReportListModel as dw, ReportModel as dx, ReportNavigatorComponent as dy, ReportTreeModel as dz, AnchorScrollDirective as e, createGridEditorFormPanel as e$, SelectionMode as e0, SeperatorFixPipe as e1, ServiceWorkerCommuncationService as e2, ServiceWorkerNotificationService as e3, ShellbarHeightService as e4, ShortcutHandlerDirective as e5, ShortcutRegisterDirective as e6, SimpleTemplateEngine as e7, SimplebarDirective as e8, SingleRelationControlInfoModel as e9, UlvMainService as eA, UnlimitSessionComponent as eB, UntilInViewDirective as eC, UploadService as eD, VideoMimeType as eE, VideoRecordingService as eF, ViewBase as eG, VisibleValuePipe as eH, WebOtpDirective as eI, WordMimeType as eJ, WorfkflowwChoiceCommandDirective as eK, addCssVariableToRoot as eL, addDynamicVariableTo as eM, availablePrefixes as eN, bodyClick as eO, buildRuntimeNavStateCacheKey as eP, calcContextMenuWidth as eQ, calculateColumnContent as eR, calculateColumnWidth as eS, calculateColumnWidthFitToContainer as eT, calculateFreeColumnSize as eU, calculateMoDataListContentWidthByColumnName as eV, cancelRequestAnimationFrame as eW, checkPermission as eX, compareVersions as eY, contextDefaultsFromEnvironment as eZ, createFormPanelMetaConditions as e_, SortDirection as ea, SortPipe as eb, SortSetting as ec, SplideSliderDirective as ed, SplitPipe as ee, SplitterComponent as ef, StopPropagationDirective as eg, StringControlInfoModel as eh, StringToNumberPipe as ei, SubformControlInfoModel as ej, SystemBaseComponent as ek, TEMPLATE_ENGINE as el, TOAST_SERVICE as em, TableHeaderWidthMode as en, TableResizerDirective as eo, TabpageService as ep, ThImageOrIconePipe as eq, TileGroupBreadcrumResolver as er, TilePropsComponent as es, TlbButtonsPipe as et, ToolbarSettingsPipe as eu, TooltipDirective as ev, TotalSummaryPipe as ew, UiService as ex, UlvCommandDirective as ey, UlvHeightSizeType as ez, formRoutes as f, scrollToElement as f$, easeInOutCubic as f0, elementInViewport2 as f1, enumValueToStringSize as f2, executeUlvCommandHandler as f3, extractLayoutPolicyFromView as f4, fixUnclosedParentheses as f5, flattenTree as f6, forbiddenValidator as f7, formatBytes as f8, fromEntries as f9, getRequestAnimationFrame as fA, getResetGridSettings as fB, getTargetRect as fC, getUniqueId as fD, getValidExtension as fE, hhmmToMs as fF, isFF as fG, isFirefox as fH, isFunction as fI, isIOS as fJ, isImage as fK, isInLocalMode as fL, isSafari as fM, isTargetWindow as fN, isVersionBiggerThan as fO, measureText as fP, measureText2 as fQ, measureTextBy as fR, mobile_regex as fS, multilevelSort as fT, nullOrUndefinedString as fU, number_only as fV, removeDynamicStyle as fW, requestAnimationFramePolyfill as fX, resolveFinalScroll as fY, resolveReportLayoutPolicy as fZ, scrollLayoutModeToContextEnvironment as f_, fromIntersectionObserver as fa, genrateInlineMoId as fb, getAllItemsPerChildren as fc, getColumnValueOfMoDataList as fd, getComponentDefined as fe, getControlList as ff, getControlSizeMode as fg, getDateService as fh, getDeviceIsDesktop as fi, getDeviceIsMobile as fj, getDeviceIsPhone as fk, getDeviceIsTablet as fl, getFieldValue as fm, getFocusableTagNames as fn, getFormSettings as fo, getGridSettings as fp, getHeaderValue as fq, getIcon as fr, getImagePath as fs, getLabelWidth as ft, getLayout94ObjectInfo as fu, getLayoutControl as fv, getNestedValue as fw, getNewMoGridEditor as fx, getParentHeight as fy, getReportTypeDefaultPolicy as fz, ApiService as g, searchEx as g0, setColumnWidthByMaxMoContentWidth as g1, setOneDepthLevel as g2, setTableThWidth as g3, shallowEqual as g4, shouldUseFreeColumnSize as g5, sort as g6, sortEx as g7, stopPropagation as g8, throwIfAlreadyLoaded as g9, toNumber as ga, toRelativeDate as gb, validateAllFormFields as gc, ApplicationBaseComponent as h, ApplicationCtrlrService as i, AttrRtlDirective as j, AudioMimeType as k, AudioRecordingService as l, AuthGuard as m, BarsaApi as n, BarsaDialogService as o, BarsaIconDictPipe as p, BarsaNovinRayCoreModule as q, reportRoutes as r, BarsaReadonlyDirective as s, BarsaSapUiFormPageModule as t, BarsaStorageService as u, BaseColumnPropsComponent as v, BaseComponent as w, BaseController as x, BaseDirective as y, BaseDynamicComponent as z };
|
|
21276
|
+
//# sourceMappingURL=barsa-novin-ray-core-barsa-novin-ray-core-CakmZXPX.mjs.map
|