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.
@@ -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, signal, ViewContainerRef, isDevMode, SecurityContext, EventEmitter, ChangeDetectorRef, Renderer2, HostBinding, Output, HostListener, ViewChild, effect, 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, 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, shareReplay as shareReplay$1, switchMap as switchMap$1, catchError as catchError$1, merge as merge$1, pluck, mergeWith as mergeWith$1 } from 'rxjs/operators';
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
- icon = data.$Icon;
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 bgRgb = this.parseColor(bgMatch[1].trim());
4485
- if (bgRgb) {
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-BIBAUbnS.mjs').then((m) => m.BarsaReportPageModule),
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.mo.$State = 'Unchanged';
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.reason === 'TAB' || res.reason === 'CTRL+ENTER') {
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 = index;
14796
- if (!focusables.length || this._focusToFirstEidtableColumn) {
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
- this._focusToFirstEidtableColumn = true;
14800
- const lastFocusable = focusables[0];
15145
+ const firstFocusable = focusables[0];
14801
15146
  setTimeout(() => {
14802
- lastFocusable?.focus();
15147
+ firstFocusable?.focus();
14803
15148
  }, 0);
14804
15149
  }
14805
15150
  onTabKeyDown(e, index) {
14806
- if (index === this._lastEditableColumnIndex) {
14807
- if (this.index === this.moDataList.length - 1) {
15151
+ if (e.shiftKey && index === this._getFirstEditableColumnIndex()) {
15152
+ if (this.index === 0) {
14808
15153
  PreventDefaulEvent(e);
15154
+ return;
14809
15155
  }
14810
- this._saveEditedMo$.next('TAB');
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: true, saved: true });
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.portalService = inject(PortalService);
16199
- this._imageViewed$ = new Subject();
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
- const supports = 'loading' in HTMLImageElement.prototype;
16205
- if (supports) {
16206
- this.handleLoadEvent(this._imgEl);
16207
- this._imgEl.src = this.imgLazy;
16208
- this._imgEl.setAttribute('loading', 'lazy');
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
- const timer1 = timer(1000);
16212
- if (this.auto) {
16213
- const isCached = this.portalService.cachedImages[this.imgLazy];
16214
- if (isCached) {
16215
- this._imgEl.src = this.imgLazy;
16216
- return;
16217
- }
16218
- merge([timer1, fromEvent(window, 'scroll')])
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
- const imgEl = this._imgEl;
16225
- if (this.imgLazy === this._imgEl.src) {
16226
- imgEl.parentElement?.setAttribute('imgLoaded', 'true');
16684
+ if (!this.imgLazy) {
16685
+ return;
16686
+ }
16687
+ if (this._imgEl.getAttribute('src') === this.imgLazy) {
16227
16688
  return;
16228
16689
  }
16229
- this.portalService.cachedImages[this.imgLazy] = true;
16230
- imgEl.src = this.imgLazy;
16231
- this.handleLoadEvent(imgEl);
16232
- this._imageViewed$.next();
16690
+ this.imageLoadStarted.emit();
16691
+ this._imgEl.setAttribute('src', this.imgLazy);
16692
+ this._disconnectObserver();
16233
16693
  }
16234
- handleLoadEvent(imgEl) {
16235
- imgEl.addEventListener('load', () => {
16236
- imgEl.parentElement?.setAttribute('imgLoaded', 'true');
16237
- this.imageLoaded.emit();
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
- isInViewport() {
16241
- const rect = this._imgEl.getBoundingClientRect();
16242
- const isInViewport = rect.top >= 0 &&
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:block}\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 }); }
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:block}\n"] }]
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
- const isReuse = !!BarsaApi.Common.Util.TryGetValue(route, `data.pageData.${REUSE_PROPERTY}`);
19435
- if (route.routeConfig && isReuse) {
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
- const isReuse = !!BarsaApi.Common.Util.TryGetValue(route, `data.pageData.${REUSE_PROPERTY}`);
19449
- if (!route.routeConfig || !isReuse) {
20050
+ if (!route.routeConfig || !this._isReuse(route)) {
19450
20051
  return null;
19451
20052
  }
19452
- const keyPath = this._getKeyOfPath(route);
19453
- return routeStorage[keyPath] || null;
20053
+ return routeStorage[this._getKeyOfPath(route)] || null;
19454
20054
  }
19455
- // مهم‌ترین بخش: تصمیم می‌گیرد که آیا روَت فعلی باید برای روَت آینده بازاستفاده شود یا نه.
19456
- // اگر از یک روَت به روَت دیگری برویم (مثل 'Page1' به 'Page2')، این باید 'false' باشد تا بتواند Detach شود.
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 x = BarsaApi.Common.Util.TryGetValue(route, `data.pageData.ParentRoute`);
19466
- const y = BarsaApi.Common.Util.TryGetValue(route, `data.pageData.Route`);
19467
- const keyPath = `${x}${y}`;
19468
- return keyPath;
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-CKKXv9DX.mjs.map
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