barsa-novin-ray-core 2.3.165 → 3.0.1

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,19 +1,18 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, inject, ElementRef, Input, ChangeDetectionStrategy, Component, Pipe, Injector, EnvironmentInjector, ApplicationRef, createComponent, Compiler, DOCUMENT, InjectionToken, 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
- import { loadRemoteModule } from '@angular-architects/native-federation';
15
13
  import * as i1$1 from '@angular/common';
16
- 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';
17
16
  import RecordRTC from 'recordrtc';
18
17
  import { SwUpdate, SwPush } from '@angular/service-worker';
19
18
  import { openDB } from 'idb';
@@ -1750,6 +1749,40 @@ function calculateColumnWidthFitToContainer(container, canView, disableContextMe
1750
1749
  // });
1751
1750
  return { columns: [...columns], contextMenuWidth };
1752
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
+ }
1753
1786
  function calcContextMenuWidth(contextMenuItems, disableContextMenuOverflow) {
1754
1787
  let contextMenuWidth = contextMenuItems.length > 1 ? 40 : 0;
1755
1788
  const btnPadding = 14 + 2 + 10; // padding + border + if text is overflowed then add 5 pixel.so we always 5 px to it.
@@ -1870,6 +1903,20 @@ function measureTextBy(text, fontSize, fontName) {
1870
1903
  function genrateInlineMoId() {
1871
1904
  return (BarsaApi.idGenerator--).toString();
1872
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
+ }
1873
1920
  function enumValueToStringSize(value, defaultValue) {
1874
1921
  switch (value) {
1875
1922
  case '1':
@@ -3326,6 +3373,52 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
3326
3373
  }]
3327
3374
  }], ctorParameters: () => [] });
3328
3375
 
3376
+ /**
3377
+ * پورتِ جاواسکریپتیِ DateTimeHelper.ToRelativeDate (سی‌شارپ).
3378
+ * فاصله‌ی تاریخِ ورودی تا «الان» را به‌صورت متنِ نسبیِ فارسی برمی‌گرداند.
3379
+ *
3380
+ * نمونه‌ها: «چند ثانیه پیش»، «۲ دقیقه پیش»، «۳ ساعت دیگر»، «فردا»، «۵ روز پیش»، «۲ ماه دیگر».
3381
+ *
3382
+ * @param value تاریخ ورودی (Date | رشته | timestamp میلی‌ثانیه).
3383
+ * @param now مبنای «الان» بر حسب میلی‌ثانیه؛ برای تست‌پذیری و به‌روزرسانیِ سیگنالی قابل تزریق است.
3384
+ */
3385
+ function toRelativeDate(value, now = Date.now()) {
3386
+ if (value === null || value === undefined || value === '') {
3387
+ return 'نامشخص';
3388
+ }
3389
+ const date = value instanceof Date ? value.getTime() : new Date(value).getTime();
3390
+ // تاریخِ نامعتبر یا مقدارِ پیش‌فرضِ DateTime (DateTime.MinValue)
3391
+ if (Number.isNaN(date)) {
3392
+ return 'نامشخص';
3393
+ }
3394
+ const tsSeconds = (date - now) / 1000; // مثبت => آینده، منفی => گذشته
3395
+ const delta = Math.abs(tsSeconds);
3396
+ const isFuture = tsSeconds > 0;
3397
+ const suffix = isFuture ? 'دیگر' : 'پیش';
3398
+ if (delta < 60) {
3399
+ return isFuture ? 'چند ثانیه دیگر' : 'چند ثانیه پیش';
3400
+ }
3401
+ if (delta < 3600) {
3402
+ return `${Math.floor(delta / 60)} دقیقه ${suffix}`;
3403
+ }
3404
+ if (delta < 86400) {
3405
+ return `${Math.floor(delta / 3600)} ساعت ${suffix}`;
3406
+ }
3407
+ if (delta < 172800) {
3408
+ return isFuture ? 'فردا' : 'دیروز';
3409
+ }
3410
+ if (delta < 604800) {
3411
+ return `${Math.floor(delta / 86400)} روز ${suffix}`;
3412
+ }
3413
+ if (delta < 2592000) {
3414
+ return `${Math.floor(delta / 604800)} هفته ${suffix}`;
3415
+ }
3416
+ if (delta < 31536000) {
3417
+ return `${Math.floor(delta / 2592000)} ماه ${suffix}`;
3418
+ }
3419
+ return `${Math.floor(delta / 31536000)} سال ${suffix}`;
3420
+ }
3421
+
3329
3422
  class MoValuePipe {
3330
3423
  constructor() { }
3331
3424
  transform(name, mo, caption) {
@@ -4093,7 +4186,9 @@ class ColumnIconPipe {
4093
4186
  const data = mo[colName];
4094
4187
  let icon = mo[colName + '$Icon'];
4095
4188
  if (typeof data === 'object' && data) {
4096
- icon = data.$Icon;
4189
+ // برای رابطه‌ی تکی، آیکنِ خودِ آبجکت (data.$Icon) اولویت دارد؛
4190
+ // در غیر این صورت آیکنِ فیلد همسایه (mo[colName + '$Icon']) حفظ می‌شود.
4191
+ icon = data.$Icon ?? icon;
4097
4192
  }
4098
4193
  return icon;
4099
4194
  }
@@ -4108,6 +4203,31 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
4108
4203
  }]
4109
4204
  }] });
4110
4205
 
4206
+ /** آیکن عمومیِ پیش‌فرض وقتی نه رکورد و نه موجودیت آیکن ندارند. */
4207
+ const DEFAULT_OBJECT_ICON = '/assets/Images/A/16/object.png';
4208
+ /**
4209
+ * آیکنِ یک رکورد را resolve می‌کند:
4210
+ * ۱- آیکنِ خودِ رکورد (`mo.$Icon`)
4211
+ * ۲- آیکنِ تعیین‌شده برای موجودیت (`Setting.Data.Icon`)
4212
+ * ۳- آیکنِ عمومیِ پیش‌فرض
4213
+ *
4214
+ * استفاده: `mo | moIcon: UlvMainCtrlr`
4215
+ */
4216
+ class MoIconPipe {
4217
+ transform(mo, Setting) {
4218
+ return mo?.$Icon ?? Setting?.Data?.Icon ?? DEFAULT_OBJECT_ICON;
4219
+ }
4220
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: MoIconPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
4221
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "22.0.8", ngImport: i0, type: MoIconPipe, isStandalone: false, name: "moIcon" }); }
4222
+ }
4223
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: MoIconPipe, decorators: [{
4224
+ type: Pipe,
4225
+ args: [{
4226
+ name: 'moIcon',
4227
+ standalone: false
4228
+ }]
4229
+ }] });
4230
+
4111
4231
  class RowNumberPipe {
4112
4232
  transform(moId, setting, moDataList) {
4113
4233
  if (!moId) {
@@ -4460,11 +4580,91 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
4460
4580
  }]
4461
4581
  }] });
4462
4582
 
4583
+ class ReadableTextColorPipe {
4584
+ constructor() {
4585
+ this._document = inject(DOCUMENT);
4586
+ }
4587
+ transform(backgroundColor, context) {
4588
+ if (typeof backgroundColor !== 'string' || !backgroundColor.trim()) {
4589
+ return null;
4590
+ }
4591
+ const rgb = this._resolveColor(backgroundColor.trim(), context);
4592
+ if (!rgb) {
4593
+ return null;
4594
+ }
4595
+ const blackContrast = this._getContrastRatio(rgb, [0, 0, 0]);
4596
+ const whiteContrast = this._getContrastRatio(rgb, [255, 255, 255]);
4597
+ return whiteContrast > blackContrast ? '#ffffff' : '#000000';
4598
+ }
4599
+ _resolveColor(color, context) {
4600
+ const view = this._document.defaultView;
4601
+ const host = context || this._document.body || this._document.documentElement;
4602
+ if (!view || !host) {
4603
+ return null;
4604
+ }
4605
+ if (view.CSS?.supports && !view.CSS.supports('color', color)) {
4606
+ return null;
4607
+ }
4608
+ const probe = this._document.createElement('span');
4609
+ probe.style.color = color;
4610
+ probe.style.display = 'none';
4611
+ if (!probe.style.color) {
4612
+ return null;
4613
+ }
4614
+ host.appendChild(probe);
4615
+ const resolvedColor = view.getComputedStyle(probe).color;
4616
+ probe.remove();
4617
+ if (!resolvedColor) {
4618
+ return null;
4619
+ }
4620
+ const canvas = this._document.createElement('canvas');
4621
+ canvas.width = 1;
4622
+ canvas.height = 1;
4623
+ const canvasContext = canvas.getContext('2d');
4624
+ if (!canvasContext) {
4625
+ return null;
4626
+ }
4627
+ canvasContext.clearRect(0, 0, 1, 1);
4628
+ canvasContext.fillStyle = resolvedColor;
4629
+ canvasContext.fillRect(0, 0, 1, 1);
4630
+ const [red, green, blue, alpha] = canvasContext.getImageData(0, 0, 1, 1).data;
4631
+ return alpha === 0 ? null : [red, green, blue];
4632
+ }
4633
+ _getContrastRatio(firstColor, secondColor) {
4634
+ const firstLuminance = this._getLuminance(firstColor);
4635
+ const secondLuminance = this._getLuminance(secondColor);
4636
+ const brightest = Math.max(firstLuminance, secondLuminance);
4637
+ const darkest = Math.min(firstLuminance, secondLuminance);
4638
+ return (brightest + 0.05) / (darkest + 0.05);
4639
+ }
4640
+ _getLuminance(rgb) {
4641
+ const [red, green, blue] = rgb.map((value) => {
4642
+ const channel = value / 255;
4643
+ return channel <= 0.03928 ? channel / 12.92 : Math.pow((channel + 0.055) / 1.055, 2.4);
4644
+ });
4645
+ return 0.2126 * red + 0.7152 * green + 0.0722 * blue;
4646
+ }
4647
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ReadableTextColorPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
4648
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "22.0.8", ngImport: i0, type: ReadableTextColorPipe, isStandalone: false, name: "readableTextColor" }); }
4649
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ReadableTextColorPipe, providedIn: 'root' }); }
4650
+ }
4651
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ReadableTextColorPipe, decorators: [{
4652
+ type: Injectable,
4653
+ args: [{ providedIn: 'root' }]
4654
+ }, {
4655
+ type: Pipe,
4656
+ args: [{
4657
+ name: 'readableTextColor',
4658
+ standalone: false
4659
+ }]
4660
+ }] });
4661
+
4463
4662
  class DynamicDarkColorPipe {
4464
4663
  constructor() {
4465
4664
  this.cache = new Map();
4466
4665
  this.darkBackground = [18, 18, 18]; // #121212
4467
4666
  this.minContrast = 4.5;
4667
+ this._readableTextColorPipe = inject(ReadableTextColorPipe);
4468
4668
  }
4469
4669
  transform(styleStr) {
4470
4670
  if (!IsDarkMode() || !styleStr) {
@@ -4482,9 +4682,8 @@ class DynamicDarkColorPipe {
4482
4682
  // BACKGROUND EXISTS BUT NO TEXT COLOR
4483
4683
  // ---------------------------------------------------
4484
4684
  if (bgMatch && !colorMatch) {
4485
- const bgRgb = this.parseColor(bgMatch[1].trim());
4486
- if (bgRgb) {
4487
- const textColor = this.getReadableTextColor(bgRgb);
4685
+ const textColor = this._readableTextColorPipe.transform(bgMatch[1].trim());
4686
+ if (textColor) {
4488
4687
  newStyle += `; color: ${textColor};`;
4489
4688
  }
4490
4689
  this.cache.set(styleStr, newStyle);
@@ -4508,11 +4707,6 @@ class DynamicDarkColorPipe {
4508
4707
  this.cache.set(styleStr, newStyle);
4509
4708
  return newStyle;
4510
4709
  }
4511
- getReadableTextColor(bgRgb) {
4512
- const whiteContrast = this.getContrastRatio([255, 255, 255], bgRgb);
4513
- const blackContrast = this.getContrastRatio([0, 0, 0], bgRgb);
4514
- return whiteContrast > blackContrast ? '#ffffff' : '#000000';
4515
- }
4516
4710
  // ---------------------------------------------------
4517
4711
  // 🎯 Adjust until contrast >= 4.5
4518
4712
  // ---------------------------------------------------
@@ -4875,6 +5069,78 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
4875
5069
  }]
4876
5070
  }] });
4877
5071
 
5072
+ /**
5073
+ * یک ساعتِ سراسری به‌صورت سیگنال؛ هر چند ثانیه یک‌بار «الان» را به‌روز می‌کند
5074
+ * تا متن‌های نسبیِ زمان (مثلِ «۲ دقیقه پیش») خودشان زنده به‌روز شوند.
5075
+ *
5076
+ * چون یک تایمرِ مشترک برای کلِ برنامه استفاده می‌شود، تعدادِ زیادی متنِ نسبی
5077
+ * هم بدونِ ساختنِ تایمرِ جداگانه برای هرکدام، هم‌زمان به‌روز می‌مانند.
5078
+ */
5079
+ class RelativeTimeService {
5080
+ constructor() {
5081
+ this._now = signal(Date.now(), /* @ts-ignore */
5082
+ ...(ngDevMode ? [{ debugName: "_now" }] : /* istanbul ignore next */ []));
5083
+ this._nowReadonly = this._now.asReadonly();
5084
+ this.intervalId = setInterval(() => this._now.set(Date.now()), RelativeTimeService.TICK_MS);
5085
+ }
5086
+ /** فاصله‌ی به‌روزرسانیِ «الان» بر حسبِ میلی‌ثانیه. */
5087
+ static { this.TICK_MS = 10_000; }
5088
+ /** سیگنالِ «الان» (میلی‌ثانیه)؛ به‌صورتِ دوره‌ای به‌روز می‌شود. */
5089
+ get now() {
5090
+ return this._nowReadonly;
5091
+ }
5092
+ ngOnDestroy() {
5093
+ clearInterval(this.intervalId);
5094
+ }
5095
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: RelativeTimeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
5096
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: RelativeTimeService, providedIn: 'root' }); }
5097
+ }
5098
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: RelativeTimeService, decorators: [{
5099
+ type: Injectable,
5100
+ args: [{ providedIn: 'root' }]
5101
+ }] });
5102
+
5103
+ /**
5104
+ * تاریخ را به متنِ نسبیِ فارسی تبدیل می‌کند و با گذرِ زمان خودش زنده به‌روز می‌شود.
5105
+ *
5106
+ * استفاده در قالب:
5107
+ * ```html
5108
+ * <span>{{ lastUpdateTime | relativeDate }}</span>
5109
+ * ```
5110
+ *
5111
+ * پایپ ناخالص (`pure: false`) است تا با تغییرِ زمان دوباره اجرا شود. زمانِ مرجع از
5112
+ * سیگنالِ مشترکِ {@link RelativeTimeService} می‌آید و در هر تیکِ آن، ویو برای بازبینی
5113
+ * علامت زده می‌شود (سازگار با OnPush و حالتِ zoneless). Angular خروجیِ درون‌یابی را
5114
+ * فقط وقتی متن **واقعاً تغییر کند** در DOM اعمال می‌کند، پس رندرِ بیهوده رخ نمی‌دهد.
5115
+ */
5116
+ class RelativeDatePipe {
5117
+ constructor() {
5118
+ this.relativeTime = inject(RelativeTimeService);
5119
+ this.cdr = inject(ChangeDetectorRef);
5120
+ // The shared clock signal only drives periodic re-checks (OnPush/zoneless friendly).
5121
+ effect(() => {
5122
+ this.relativeTime.now();
5123
+ this.cdr.markForCheck();
5124
+ });
5125
+ }
5126
+ transform(value) {
5127
+ // Compare against the real wall clock, not the signal: the signal ticks every few
5128
+ // seconds and can lag behind "now", which would make a just-set timestamp read as
5129
+ // being in the future («چند ثانیه دیگر») until the next tick.
5130
+ return toRelativeDate(value);
5131
+ }
5132
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: RelativeDatePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
5133
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "22.0.8", ngImport: i0, type: RelativeDatePipe, isStandalone: false, name: "relativeDate", pure: false }); }
5134
+ }
5135
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: RelativeDatePipe, decorators: [{
5136
+ type: Pipe,
5137
+ args: [{
5138
+ name: 'relativeDate',
5139
+ pure: false,
5140
+ standalone: false
5141
+ }]
5142
+ }], ctorParameters: () => [] });
5143
+
4878
5144
  class ApiService {
4879
5145
  constructor() {
4880
5146
  this.portalLoginUrl = `/api/auth/portal/login`;
@@ -5132,11 +5398,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
5132
5398
  type: Input
5133
5399
  }] } });
5134
5400
 
5401
+ const APP_VERSION = new InjectionToken('AppVersion');
5402
+ const DIALOG_SERVICE = new InjectionToken('DIALOG_SERVICE');
5403
+ const FORM_DIALOG_COMPONENT = new InjectionToken('FORM_DIALOG_COMPONENT');
5404
+ const NOTIFICATAION_POPUP_SERVER = new InjectionToken('NOTIFICATAION_POPUP_SERVER');
5405
+ const TOAST_SERVICE = new InjectionToken('TOAST_SERVICE');
5406
+ const NATIVE_FEDERATION_RUNTIME = new InjectionToken('NativeFederationRuntime');
5407
+ const NOTIFICATION_WEBWORKER_FACTORY = new InjectionToken('notificaion-worker');
5408
+
5135
5409
  class DynamicComponentService {
5136
5410
  constructor() {
5137
5411
  this._injector = inject(Injector);
5138
5412
  this._compiler = inject(Compiler);
5139
5413
  this._environmentInjector = inject(EnvironmentInjector);
5414
+ this._nativeFederationRuntime = inject(NATIVE_FEDERATION_RUNTIME, { optional: true });
5140
5415
  // NgModule های لود شده (روش قدیمی)
5141
5416
  this._dynamicModuleWithComponents = {};
5142
5417
  // cache برای remote های standalone که قبلاً لود شدن
@@ -5212,12 +5487,7 @@ class DynamicComponentService {
5212
5487
  const cacheKey = remoteEntry;
5213
5488
  let componentMap$ = this._remoteCache.get(cacheKey);
5214
5489
  if (!componentMap$) {
5215
- componentMap$ = from(loadRemoteModule({
5216
- // Native Federation نام remote رو از خود remoteEntry.json می‌خونه؛
5217
- // فقط آدرس مانیفست و ماژول expose شده لازمه.
5218
- remoteEntry, // .../remoteEntry.json
5219
- exposedModule: './ComponentMap' // ثابت — طبق public-api.ts remote
5220
- })).pipe(map$1((m) => m.COMPONENT_MAP), shareReplay(1));
5490
+ componentMap$ = from(this._loadRemoteComponentMap(remoteEntry, component.Module)).pipe(shareReplay(1));
5221
5491
  this._remoteCache.set(cacheKey, componentMap$);
5222
5492
  }
5223
5493
  return componentMap$.pipe(map$1((componentMap) => {
@@ -5241,6 +5511,18 @@ class DynamicComponentService {
5241
5511
  return of(componentRef);
5242
5512
  }));
5243
5513
  }
5514
+ async _loadRemoteComponentMap(remoteEntry, remoteName) {
5515
+ const runtime = this._nativeFederationRuntime;
5516
+ if (!runtime) {
5517
+ throw new Error(`runtime مربوط به Native Federation برای remote "${remoteName}" در هاست provide نشده است.`);
5518
+ }
5519
+ await runtime.initRemoteEntry(remoteEntry, remoteName);
5520
+ const remoteModule = await runtime.loadRemoteModule(remoteName, './ComponentMap');
5521
+ if (!remoteModule?.COMPONENT_MAP) {
5522
+ throw new Error(`خروجی COMPONENT_MAP در remote "${remoteName}" از آدرس "${remoteEntry}" پیدا نشد.`);
5523
+ }
5524
+ return remoteModule.COMPONENT_MAP;
5525
+ }
5244
5526
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: DynamicComponentService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
5245
5527
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: DynamicComponentService, providedIn: 'root' }); }
5246
5528
  }
@@ -5656,6 +5938,7 @@ class FormPanelService extends BaseComponent {
5656
5938
  }
5657
5939
  _refresh(context) {
5658
5940
  this.context = context;
5941
+ this._context = context;
5659
5942
  const isModal = BarsaApi.Common.Util.TryGetValue(this, '_context.Setting.IsModal', false);
5660
5943
  if (this._context?.IsSubForm || isModal || this._isModal.getValue()) {
5661
5944
  return;
@@ -6139,7 +6422,7 @@ class ApplicationCtrlrService {
6139
6422
  this._selectedSystemTitle$ = new Subject();
6140
6423
  this._systemLocationHref$ = new BehaviorSubject({});
6141
6424
  this._isMobile = getDeviceIsMobile();
6142
- this._document = inject(DOCUMENT);
6425
+ this._document = inject(DOCUMENT$1);
6143
6426
  this._router = inject(Router);
6144
6427
  this._searchService = inject(SearchService);
6145
6428
  this._titleService = inject(Title);
@@ -6551,7 +6834,7 @@ function reportRoutes(authGuard = false) {
6551
6834
  return {
6552
6835
  path: 'report/:id',
6553
6836
  canActivate: authGuard ? [AuthGuard] : [],
6554
- loadChildren: () => import('./barsa-novin-ray-core-barsa-report-page.module-DKTPWXYB.mjs').then((m) => m.BarsaReportPageModule),
6837
+ loadChildren: () => import('./barsa-novin-ray-core-barsa-report-page.module-CpACJpmQ.mjs').then((m) => m.BarsaReportPageModule),
6555
6838
  resolve: {
6556
6839
  breadcrumb: ReportBreadcrumbResolver
6557
6840
  }
@@ -6581,7 +6864,7 @@ class PortalService {
6581
6864
  this._router = inject(Router);
6582
6865
  this._location = inject(Location);
6583
6866
  this._localStorage = inject(LocalStorageService);
6584
- this._document = inject(DOCUMENT);
6867
+ this._document = inject(DOCUMENT$1);
6585
6868
  this._applicationCtrlrService = inject(ApplicationCtrlrService);
6586
6869
  this._deviceSizeSource = new BehaviorSubject(this._initalizeDeviceSize());
6587
6870
  this._loggedInSource = new BehaviorSubject(false);
@@ -7329,7 +7612,9 @@ class PortalService {
7329
7612
  }
7330
7613
  return params;
7331
7614
  }
7332
- ShowFormPanelControl(formpanelCtrlr, router, activatedRoute, dialogComponent, isPage, vcr, isReload = false) {
7615
+ ShowFormPanelControl(formpanelCtrlr, router, activatedRoute, dialogComponent, isPage, vcr, isReload = false,
7616
+ // اگر RoutingServiceِ فراخوان (فرمِ والد) خودش مودال باز شده باشد، فرمِ فرزند هم مودال باز می‌شود.
7617
+ callerIsModal = false) {
7333
7618
  if (!formpanelCtrlr) {
7334
7619
  console.warn('form panel controler is undefined!');
7335
7620
  return;
@@ -7344,6 +7629,9 @@ class PortalService {
7344
7629
  if (modalSetting) {
7345
7630
  isModal = true;
7346
7631
  }
7632
+ // «مودال، مودال می‌زاید»: اگر فرمِ والد مودال بود، این فرم هم مودال باز شود
7633
+ // تا با ناوبریِ صفحه، دیالوگِ والد بسته نشود.
7634
+ isModal = isModal || callerIsModal;
7347
7635
  formpanelCtrlr.Setting.IsModal = isModal;
7348
7636
  formpanelCtrlr.IsModal = isModal;
7349
7637
  const id = getUniqueId(4);
@@ -7575,7 +7863,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
7575
7863
  }], ctorParameters: () => [] });
7576
7864
 
7577
7865
  class UlvMainService {
7578
- /** Inserted by Angular inject() migration for backwards compatibility */
7579
7866
  constructor() {
7580
7867
  this.moDataListSource = new BehaviorSubject([]);
7581
7868
  this._cartableTemplates$ = new BehaviorSubject({});
@@ -7657,6 +7944,7 @@ class UlvMainService {
7657
7944
  this._parentHeightSource = new BehaviorSubject(0);
7658
7945
  this._moveUpAccessSource = new BehaviorSubject(false);
7659
7946
  this._reorderGroupbySource = new BehaviorSubject([]);
7947
+ this._pollingInterval = new BehaviorSubject(0);
7660
7948
  this.context$ = this._contextSource
7661
7949
  .asObservable()
7662
7950
  .pipe(takeUntil(this._onDestroy$), tap((context) => (this.context = context)), tap((context) => this._initialize(context)), tap((context) => this._addEventListener(context)))
@@ -7677,6 +7965,12 @@ class UlvMainService {
7677
7965
  this.searchPanelUi$ = this._searchPanelUiSource.asObservable().pipe(takeUntil(this._onDestroy$), tap((searchPanel) => this._addDefaultSearchPanelSettings(searchPanel)));
7678
7966
  this.openSearchPanelHiddenSettings$ = this._openSearchPanelHiddenSettingsSource.asObservable();
7679
7967
  this.pagingSetting$ = this._pagingSettingSource.asObservable().pipe(takeUntil(this._onDestroy$));
7968
+ this._pollingInterval
7969
+ .asObservable()
7970
+ .pipe(takeUntil(this._onDestroy$), distinctUntilChanged(),
7971
+ // با هر بار تغییر بازه، interval قبلی کنسل و از نو ساخته می‌شود؛ صفر یا منفی یعنی polling خاموش.
7972
+ switchMap$1((ms) => (ms > 0 ? timer(ms, ms) : EMPTY)), tap(() => this.executeToolbarButton('RefreshReport', {})))
7973
+ .subscribe();
7680
7974
  this.toolbarButtons$ = combineLatest([
7681
7975
  this._toolbarButtonsWorkflowButtons.asObservable(),
7682
7976
  this._toolbarButtonsSource.asObservable()
@@ -7934,6 +8228,10 @@ class UlvMainService {
7934
8228
  this._inlineEditModeSource
7935
8229
  ]).pipe(map(([moveUp, groupby, inlineEdit]) => moveUp === true && !groupby.length && !inlineEdit), distinctUntilChanged());
7936
8230
  }
8231
+ setPollingInterval(pollingInterval) {
8232
+ // مقدار از سرور به‌صورت عددِ اعشاریِ ساعت.دقیقه (hh:mm) می‌آید؛ به میلی‌ثانیه تبدیل می‌شود.
8233
+ this._pollingInterval.next(hhmmToMs(pollingInterval));
8234
+ }
7937
8235
  setReorderGroupby(groupby) {
7938
8236
  this._reorderGroupbySource.next(groupby ?? []);
7939
8237
  }
@@ -9228,13 +9526,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
9228
9526
  type: Injectable
9229
9527
  }], ctorParameters: () => [] });
9230
9528
 
9231
- const APP_VERSION = new InjectionToken('AppVersion');
9232
- const DIALOG_SERVICE = new InjectionToken('DIALOG_SERVICE');
9233
- const FORM_DIALOG_COMPONENT = new InjectionToken('FORM_DIALOG_COMPONENT');
9234
- const NOTIFICATAION_POPUP_SERVER = new InjectionToken('NOTIFICATAION_POPUP_SERVER');
9235
- const TOAST_SERVICE = new InjectionToken('TOAST_SERVICE');
9236
- const NOTIFICATION_WEBWORKER_FACTORY = new InjectionToken('notificaion-worker');
9237
-
9238
9529
  class ServiceWorkerNotificationService {
9239
9530
  constructor() {
9240
9531
  this.hasRegistration = false;
@@ -9955,6 +10246,8 @@ class RoutingService {
9955
10246
  }
9956
10247
  };
9957
10248
  this.isFirstPage = true;
10249
+ /** true اگر فرمِ این RoutingService خودش به‌صورت مودال (داخل دیالوگ) باز شده باشد. */
10250
+ this.isOpenedAsModal = false;
9958
10251
  this.masterDetails = false;
9959
10252
  this.isMobile = getDeviceIsMobile();
9960
10253
  this._activatedRoute = inject(ActivatedRoute);
@@ -10009,7 +10302,7 @@ class RoutingService {
10009
10302
  BarsaApi.Bw.FormHandler = this.parentContainer;
10010
10303
  }
10011
10304
  _showFormPanel(refreshOnly = false) {
10012
- this._portalService.ShowFormPanelControl(this.formpanelCtrlr, this._router, this._activatedRoute, this._formDialogComponent, this.isFirstPage, this._vcr, refreshOnly);
10305
+ this._portalService.ShowFormPanelControl(this.formpanelCtrlr, this._router, this._activatedRoute, this._formDialogComponent, this.isFirstPage, this._vcr, refreshOnly, this.isOpenedAsModal);
10013
10306
  }
10014
10307
  navigate(navigation, isRelative, queryParams, state) {
10015
10308
  if (this.masterDetails && !this.isMobile) {
@@ -10580,6 +10873,9 @@ class FieldBaseComponent extends BaseComponent {
10580
10873
  get customFieldInfo() {
10581
10874
  return this.context.Setting.CustomFieldInfo;
10582
10875
  }
10876
+ get Mo() {
10877
+ return this._formPanelService.mo;
10878
+ }
10583
10879
  constructor() {
10584
10880
  super();
10585
10881
  this.valueChange = new EventEmitter();
@@ -10610,6 +10906,7 @@ class FieldBaseComponent extends BaseComponent {
10610
10906
  this._renderer2 = inject(Renderer2);
10611
10907
  this._activatedRoute = inject(ActivatedRoute);
10612
10908
  this._domSanitizer = inject(DomSanitizer);
10909
+ this._formPanelService = inject(FormPanelService);
10613
10910
  this._uploadService = inject(UploadService, { self: true, optional: true });
10614
10911
  this._dateService = inject(DateService, { self: true, optional: true });
10615
10912
  this._audioRecorder = inject(AudioRecordingService, { self: true, optional: true });
@@ -12330,7 +12627,7 @@ class ReportViewBaseComponent extends BaseComponent {
12330
12627
  this.rowIndicator = Number(columns[0].MetaFieldTypeId) === 41;
12331
12628
  }
12332
12629
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ReportViewBaseComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
12333
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: ReportViewBaseComponent, isStandalone: false, selector: "bnrc-report-view-base", inputs: { contextView: "contextView", viewSetting: "viewSetting", allColumns: "allColumns", isCheckList: "isCheckList", simpleInlineEdit: "simpleInlineEdit", alternateRowMode: "alternateRowMode", inlineEditWithoutSelection: "inlineEditWithoutSelection", hideToolbar: "hideToolbar", hideTitle: "hideTitle", toolbarButtons: "toolbarButtons", allChecked: "allChecked", moDataList: "moDataList", UlvMainCtrlr: "UlvMainCtrlr", access: "access", allowRecordReorder: "allowRecordReorder", groupby: "groupby", selectedCount: "selectedCount", conditionalFormats: "conditionalFormats", parentHeight: "parentHeight", deviceName: "deviceName", deviceSize: "deviceSize", contextMenuItems: "contextMenuItems", columns: "columns", allowInlineEdit: "allowInlineEdit", secondaryColumns: "secondaryColumns", popin: "popin", customFieldInfo: "customFieldInfo", hasSummary: "hasSummary", layoutInfo: "layoutInfo", hasSelected: "hasSelected", hideIcon: "hideIcon", columnsCount: "columnsCount", hideOpenIcon: "hideOpenIcon", openOnClick: "openOnClick", typeDefId: "typeDefId", reportId: "reportId", listEditViewId: "listEditViewId", typeViewId: "typeViewId", extraRelation: "extraRelation", relationList: "relationList", disableResponsive: "disableResponsive", rowItem: "rowItem", mobileOrTablet: "mobileOrTablet", inDialog: "inDialog", isMultiSelect: "isMultiSelect", fullscreen: "fullscreen", hideSearchpanel: "hideSearchpanel", newInlineEditMo: "newInlineEditMo", selectedMo: "selectedMo", inlineEditMode: "inlineEditMode", onlyInlineEdit: "onlyInlineEdit", rowHoverable: "rowHoverable", groupSummary: "groupSummary", tlbButtons: "tlbButtons", formSetting: "formSetting", disableOverflowContextMenu: "disableOverflowContextMenu", rowActivable: "rowActivable", isReportPage: "isReportPage", ulvHeightSizeType: "ulvHeightSizeType", contentHeight: "contentHeight", alternateEditObjectColumn: "alternateEditObjectColumn", disableHyperLink: "disableHyperLink", columnsHyperLink: "columnsHyperLink", effectiveReportLayout: "effectiveReportLayout", contentDensity: "contentDensity", rtl: "rtl", showOkCancelButtons: "showOkCancelButtons", title: "title", hasInlineDeleteButton: "hasInlineDeleteButton", hasInlineEditButton: "hasInlineEditButton", contextSetting: "contextSetting", gridFreeColumnSizing: "gridFreeColumnSizing", navigationArrow: "navigationArrow", cartableTemplates: "cartableTemplates", cartableChildsMo: "cartableChildsMo", pagingSetting: "pagingSetting", minEmptyRows: "minEmptyRows", containerWidth: "containerWidth" }, outputs: { columnSummary: "columnSummary", escapeKey: "escapeKey", resetWorkflowState: "resetWorkflowState", deselectAll: "deselectAll", editFormPanelCancel: "editFormPanelCancel", editFormPanelSave: "editFormPanelSave", selectNextInlineRecord: "selectNextInlineRecord", editFormPanelValueChange: "editFormPanelValueChange", ulvCommandClick: "ulvCommandClick", sortAscending: "sortAscending", workflowShareButtons: "workflowShareButtons", sortDescending: "sortDescending", filter: "filter", executeToolbarButton: "executeToolbarButton", resetGridSettings: "resetGridSettings", sortSettingsChange: "sortSettingsChange", rowCheck: "rowCheck", rowClick: "rowClick", cartableFormClosed: "cartableFormClosed", createNewMo: "createNewMo", updateMo: "updateMo", expandClick: "expandClick", trackBySelectedFn: "trackBySelectedFn", allCheckbox: "allCheckbox", mandatory: "mandatory", columnResized: "columnResized", hasDetailsInRow: "hasDetailsInRow" }, host: { properties: { "class.report-view": "this._reportView", "style.visibility": "this._visibility" } }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
12630
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.8", type: ReportViewBaseComponent, isStandalone: false, selector: "bnrc-report-view-base", inputs: { contextView: "contextView", viewSetting: "viewSetting", allColumns: "allColumns", isCheckList: "isCheckList", simpleInlineEdit: "simpleInlineEdit", alternateRowMode: "alternateRowMode", inlineEditWithoutSelection: "inlineEditWithoutSelection", hideToolbar: "hideToolbar", hideTitle: "hideTitle", toolbarButtons: "toolbarButtons", allChecked: "allChecked", moDataList: "moDataList", UlvMainCtrlr: "UlvMainCtrlr", access: "access", allowRecordReorder: "allowRecordReorder", groupby: "groupby", selectedCount: "selectedCount", conditionalFormats: "conditionalFormats", parentHeight: "parentHeight", deviceName: "deviceName", deviceSize: "deviceSize", contextMenuItems: "contextMenuItems", columns: "columns", allowInlineEdit: "allowInlineEdit", secondaryColumns: "secondaryColumns", popin: "popin", customFieldInfo: "customFieldInfo", hasSummary: "hasSummary", layoutInfo: "layoutInfo", hasSelected: "hasSelected", hideIcon: "hideIcon", columnsCount: "columnsCount", hideOpenIcon: "hideOpenIcon", openOnClick: "openOnClick", typeDefId: "typeDefId", reportId: "reportId", listEditViewId: "listEditViewId", typeViewId: "typeViewId", extraRelation: "extraRelation", relationList: "relationList", disableResponsive: "disableResponsive", rowItem: "rowItem", mobileOrTablet: "mobileOrTablet", inDialog: "inDialog", isMultiSelect: "isMultiSelect", fullscreen: "fullscreen", hideSearchpanel: "hideSearchpanel", newInlineEditMo: "newInlineEditMo", selectedMo: "selectedMo", inlineEditMode: "inlineEditMode", onlyInlineEdit: "onlyInlineEdit", rowHoverable: "rowHoverable", groupSummary: "groupSummary", tlbButtons: "tlbButtons", formSetting: "formSetting", disableOverflowContextMenu: "disableOverflowContextMenu", rowActivable: "rowActivable", isReportPage: "isReportPage", ulvHeightSizeType: "ulvHeightSizeType", contentHeight: "contentHeight", alternateEditObjectColumn: "alternateEditObjectColumn", disableHyperLink: "disableHyperLink", columnsHyperLink: "columnsHyperLink", effectiveReportLayout: "effectiveReportLayout", contentDensity: "contentDensity", rtl: "rtl", showOkCancelButtons: "showOkCancelButtons", title: "title", hasInlineDeleteButton: "hasInlineDeleteButton", hasInlineEditButton: "hasInlineEditButton", contextSetting: "contextSetting", gridFreeColumnSizing: "gridFreeColumnSizing", navigationArrow: "navigationArrow", cartableTemplates: "cartableTemplates", $Component: "$Component", cartableChildsMo: "cartableChildsMo", pagingSetting: "pagingSetting", minEmptyRows: "minEmptyRows", containerWidth: "containerWidth" }, outputs: { columnSummary: "columnSummary", escapeKey: "escapeKey", resetWorkflowState: "resetWorkflowState", deselectAll: "deselectAll", editFormPanelCancel: "editFormPanelCancel", editFormPanelSave: "editFormPanelSave", selectNextInlineRecord: "selectNextInlineRecord", editFormPanelValueChange: "editFormPanelValueChange", ulvCommandClick: "ulvCommandClick", sortAscending: "sortAscending", workflowShareButtons: "workflowShareButtons", sortDescending: "sortDescending", filter: "filter", executeToolbarButton: "executeToolbarButton", resetGridSettings: "resetGridSettings", sortSettingsChange: "sortSettingsChange", rowCheck: "rowCheck", rowClick: "rowClick", cartableFormClosed: "cartableFormClosed", createNewMo: "createNewMo", updateMo: "updateMo", expandClick: "expandClick", trackBySelectedFn: "trackBySelectedFn", allCheckbox: "allCheckbox", mandatory: "mandatory", columnResized: "columnResized", hasDetailsInRow: "hasDetailsInRow" }, host: { properties: { "class.report-view": "this._reportView", "style.visibility": "this._visibility" } }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
12334
12631
  }
12335
12632
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ReportViewBaseComponent, decorators: [{
12336
12633
  type: Component,
@@ -12494,6 +12791,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
12494
12791
  type: Input
12495
12792
  }], cartableTemplates: [{
12496
12793
  type: Input
12794
+ }], $Component: [{
12795
+ type: Input
12497
12796
  }], cartableChildsMo: [{
12498
12797
  type: Input
12499
12798
  }], pagingSetting: [{
@@ -13007,6 +13306,11 @@ class FormComponent extends BaseComponent {
13007
13306
  if (this._routingService) {
13008
13307
  this._routingService.FormPanelCtrlr = formpanelCtrlr;
13009
13308
  formpanelCtrlr.Page = this._routingService;
13309
+ // اگر این فرم داخل دیالوگ (مودال) باز شده، RoutingServiceاش را مودال علامت می‌زنیم تا
13310
+ // فرم‌های فرزندش هم مودال باز شوند (قانونِ «مودال، مودال می‌زاید» در ShowFormPanelControl).
13311
+ if (this.params && this.params.inDialog) {
13312
+ this._routingService.isOpenedAsModal = true;
13313
+ }
13010
13314
  }
13011
13315
  const nav = this._router.getCurrentNavigation();
13012
13316
  formpanelCtrlr.FormRequestParams.state = nav?.extras.state;
@@ -13862,6 +14166,14 @@ class FillEmptySpaceDirective extends BaseDirective {
13862
14166
  const roTarget = this.getContainerElement();
13863
14167
  this._ro = new ResizeObserver(() => this.scheduleMeasure());
13864
14168
  this._ro.observe(roTarget);
14169
+ // Also observe the host itself. In `viewport` mode the container resolves to
14170
+ // `document.documentElement`, which never resizes when the host transitions from
14171
+ // hidden/0-size (e.g. an inactive tab) to visible — so the fill height would never
14172
+ // be (re)applied. Observing the host recovers the measurement once it gains a box.
14173
+ const host = this._el.nativeElement;
14174
+ if (host !== roTarget) {
14175
+ this._ro.observe(host);
14176
+ }
13865
14177
  window.addEventListener('resize', this._onWindowResize);
13866
14178
  }
13867
14179
  teardownFillLayoutWatchers() {
@@ -13920,6 +14232,15 @@ class FillEmptySpaceDirective extends BaseDirective {
13920
14232
  }
13921
14233
  applyFillHeight(dom, px) {
13922
14234
  const prop = this.getStyleProperty();
14235
+ const signature = `${prop}:${px}`;
14236
+ // Skip redundant writes. Because we now also observe the host element, applying the
14237
+ // same height again would leave the ResizeObserver firing on a no-op change (harmless,
14238
+ // but noisy) and re-emit `heightChanged`. Guarding keeps it idempotent and avoids
14239
+ // "ResizeObserver loop" warnings.
14240
+ if (signature === this._lastAppliedSignature) {
14241
+ return;
14242
+ }
14243
+ this._lastAppliedSignature = signature;
13923
14244
  if (prop === 'min-height' || prop === 'max-height') {
13924
14245
  this._renderer2.setStyle(dom, 'height', 'auto');
13925
14246
  }
@@ -14656,6 +14977,7 @@ class BaseViewItemPropsComponent extends BaseViewPropsComponent {
14656
14977
  this._parentFormPanelService = inject(FormPanelService, { optional: true, skipSelf: true });
14657
14978
  this._formPanelService = inject(FormPanelService, { optional: true, self: true });
14658
14979
  this._ulvMainService = inject(UlvMainService, { optional: true });
14980
+ this._renderer2 = inject(Renderer2);
14659
14981
  this._saveEditedMo$ = new Subject();
14660
14982
  this._formpanelValueChanged$ = new Subject();
14661
14983
  this._saveEditedMo$
@@ -14666,7 +14988,9 @@ class BaseViewItemPropsComponent extends BaseViewPropsComponent {
14666
14988
  .subscribe((res) => {
14667
14989
  if (res.saved) {
14668
14990
  this.mo.$IsChecked = false;
14669
- this.mo.$State = 'Unchanged';
14991
+ if (this.extraRelation && this.extraRelation.RelationType !== 'Composition') {
14992
+ this.mo.$State = 'Unchanged';
14993
+ }
14670
14994
  this.editFormPanelValueChange.emit({ mo: this.mo, fieldDbName: '$InlineMoState' });
14671
14995
  // this._formpanelValueChanged$.next('');
14672
14996
  this._cdr.markForCheck();
@@ -14715,10 +15039,11 @@ class BaseViewItemPropsComponent extends BaseViewPropsComponent {
14715
15039
  this._log.error(nullOrUndefinedString('BaseViewItemPropsComponent=> _formPanelService'));
14716
15040
  }
14717
15041
  }
15042
+ this._addLastClass(this.last);
14718
15043
  }
14719
15044
  ngOnChanges(changes) {
14720
15045
  super.ngOnChanges(changes);
14721
- const { isChecked, inlineEditMode } = changes;
15046
+ const { isChecked, inlineEditMode, last } = changes;
14722
15047
  let needToLoadForm = false;
14723
15048
  if (this.inlineEditMode) {
14724
15049
  if (isChecked) {
@@ -14732,6 +15057,9 @@ class BaseViewItemPropsComponent extends BaseViewPropsComponent {
14732
15057
  }
14733
15058
  }
14734
15059
  }
15060
+ if (last) {
15061
+ this._addLastClass(last.currentValue);
15062
+ }
14735
15063
  if (isChecked && !isChecked.firstChange) {
14736
15064
  this._raiseWorkflowShareButtons(isChecked.currentValue);
14737
15065
  }
@@ -14848,6 +15176,11 @@ class BaseViewItemPropsComponent extends BaseViewPropsComponent {
14848
15176
  _trackByColumn(index, column) {
14849
15177
  return `${column.Name}${index}`;
14850
15178
  }
15179
+ _addLastClass(lastItem) {
15180
+ lastItem
15181
+ ? this._renderer2.addClass(this._el.nativeElement, 'last-item')
15182
+ : this._renderer2.removeClass(this._el.nativeElement, 'last-item');
15183
+ }
14851
15184
  _handleResetWorkflowState() {
14852
15185
  this._resetBruleActionMessage();
14853
15186
  this.workflowState.set({ state: '', error: null });
@@ -15014,7 +15347,7 @@ class BaseViewItemPropsComponent extends BaseViewPropsComponent {
15014
15347
  const customFormPanelUi = formPanelCtrlr.Adapter.Control;
15015
15348
  const parentMo = this._parentFormPanelService ? this._parentFormPanelService.mo : null;
15016
15349
  if (this.extraRelation && parentMo && this.extraRelation.RelationType === 'Composition') {
15017
- formPanelCtrlr.Mo.SetFValue(this.extraRelation.ParentFdName, parentMo);
15350
+ formPanelCtrlr.Mo.SetFValue(this.extraRelation.ParentFdName, parentMo.Id);
15018
15351
  // newFormSettings.Data.Mo[relation.ParentFdName] = parentMo.GetChangedObject();
15019
15352
  // newFormSettings.Data.Mo[relation.ParentFdName].$State = parentMo.$State;
15020
15353
  }
@@ -15819,10 +16152,30 @@ class RootPortalComponent extends PageBaseComponent {
15819
16152
  xl:tw-grid-cols-9 xl:tw-grid-cols-10 xl:tw-grid-cols-11 xl:tw-grid-cols-12"
15820
16153
  ></div>
15821
16154
  <div
15822
- class="tw-hidden 2xl:grid-cols-0 2xl:tw-grid-cols-1 2xl:tw-grid-cols-2 2xl:tw-grid-cols-3
15823
- 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
16155
+ class="tw-hidden 2xl:grid-cols-0 2xl:tw-grid-cols-1 2xl:tw-grid-cols-2 2xl:tw-grid-cols-3
16156
+ 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
15824
16157
  2xl:tw-grid-cols-10 2xl:tw-grid-cols-11 2xl:tw-grid-cols-12"
15825
16158
  ></div>
16159
+ <div
16160
+ 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
16161
+ tw-col-span-7 tw-col-span-8 tw-col-span-9 tw-col-span-10 tw-col-span-11 tw-col-span-12"
16162
+ ></div>
16163
+ <div
16164
+ 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
16165
+ 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"
16166
+ ></div>
16167
+ <div
16168
+ 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
16169
+ 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"
16170
+ ></div>
16171
+ <div
16172
+ 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
16173
+ 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"
16174
+ ></div>
16175
+ <div
16176
+ 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
16177
+ 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"
16178
+ ></div>
15826
16179
  @if(inLocalMode()){
15827
16180
  <div class="fd-toolbar" style="flex-wrap:wrap;padding:0.5rem;height:auto">
15828
16181
  <button class="fd-button fd-button--attention is-compact" (click)="onRemoveOfflineData()">
@@ -15900,10 +16253,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
15900
16253
  xl:tw-grid-cols-9 xl:tw-grid-cols-10 xl:tw-grid-cols-11 xl:tw-grid-cols-12"
15901
16254
  ></div>
15902
16255
  <div
15903
- class="tw-hidden 2xl:grid-cols-0 2xl:tw-grid-cols-1 2xl:tw-grid-cols-2 2xl:tw-grid-cols-3
15904
- 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
16256
+ class="tw-hidden 2xl:grid-cols-0 2xl:tw-grid-cols-1 2xl:tw-grid-cols-2 2xl:tw-grid-cols-3
16257
+ 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
15905
16258
  2xl:tw-grid-cols-10 2xl:tw-grid-cols-11 2xl:tw-grid-cols-12"
15906
16259
  ></div>
16260
+ <div
16261
+ 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
16262
+ tw-col-span-7 tw-col-span-8 tw-col-span-9 tw-col-span-10 tw-col-span-11 tw-col-span-12"
16263
+ ></div>
16264
+ <div
16265
+ 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
16266
+ 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"
16267
+ ></div>
16268
+ <div
16269
+ 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
16270
+ 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"
16271
+ ></div>
16272
+ <div
16273
+ 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
16274
+ 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"
16275
+ ></div>
16276
+ <div
16277
+ 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
16278
+ 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"
16279
+ ></div>
15907
16280
  @if(inLocalMode()){
15908
16281
  <div class="fd-toolbar" style="flex-wrap:wrap;padding:0.5rem;height:auto">
15909
16282
  <button class="fd-button fd-button--attention is-compact" (click)="onRemoveOfflineData()">
@@ -16183,59 +16556,88 @@ class ImageLazyDirective extends BaseDirective {
16183
16556
  super();
16184
16557
  this.auto = true;
16185
16558
  this.threshold = 20;
16559
+ this.imageLoadStarted = new EventEmitter();
16186
16560
  this.imageLoaded = new EventEmitter();
16187
- this.portalService = inject(PortalService);
16188
- this._imageViewed$ = new Subject();
16561
+ this.imageLoadError = new EventEmitter();
16562
+ this._observer = null;
16563
+ this._initialized = false;
16564
+ this._loadHandler = () => {
16565
+ if (!this.imgLazy || this._imgEl.getAttribute('src') !== this.imgLazy) {
16566
+ return;
16567
+ }
16568
+ this._portalService.cachedImages[this.imgLazy] = true;
16569
+ this._imgEl.parentElement?.setAttribute('imgLoaded', 'true');
16570
+ this.imageLoaded.emit();
16571
+ };
16572
+ this._errorHandler = () => {
16573
+ if (!this.imgLazy || this._imgEl.getAttribute('src') !== this.imgLazy) {
16574
+ return;
16575
+ }
16576
+ this.imageLoadError.emit();
16577
+ };
16189
16578
  this._imgEl = this._el.nativeElement;
16190
16579
  }
16191
16580
  ngOnInit() {
16192
16581
  super.ngOnInit();
16193
- const supports = 'loading' in HTMLImageElement.prototype;
16194
- if (supports) {
16195
- this.handleLoadEvent(this._imgEl);
16196
- this._imgEl.src = this.imgLazy;
16197
- this._imgEl.setAttribute('loading', 'lazy');
16582
+ this._initialized = true;
16583
+ this._imgEl.setAttribute('loading', 'lazy');
16584
+ this._imgEl.setAttribute('decoding', 'async');
16585
+ this._imgEl.addEventListener('load', this._loadHandler);
16586
+ this._imgEl.addEventListener('error', this._errorHandler);
16587
+ this._observeCurrentImage();
16588
+ }
16589
+ ngOnChanges(changes) {
16590
+ super.ngOnChanges(changes);
16591
+ if (!this._initialized || !changes['imgLazy']) {
16198
16592
  return;
16199
16593
  }
16200
- const timer1 = timer(1000);
16201
- if (this.auto) {
16202
- const isCached = this.portalService.cachedImages[this.imgLazy];
16203
- if (isCached) {
16204
- this._imgEl.src = this.imgLazy;
16205
- return;
16206
- }
16207
- merge([timer1, fromEvent(window, 'scroll')])
16208
- .pipe(takeUntil(this._imageViewed$), takeUntil(this._onDestroy$), debounceTime(20), filter(() => this.isInViewport()), tap(() => this.showImage()))
16209
- .subscribe();
16210
- }
16594
+ this._resetImage();
16595
+ this._observeCurrentImage();
16596
+ }
16597
+ ngOnDestroy() {
16598
+ this._disconnectObserver();
16599
+ this._imgEl.removeEventListener('load', this._loadHandler);
16600
+ this._imgEl.removeEventListener('error', this._errorHandler);
16601
+ super.ngOnDestroy();
16211
16602
  }
16212
16603
  showImage() {
16213
- const imgEl = this._imgEl;
16214
- if (this.imgLazy === this._imgEl.src) {
16215
- imgEl.parentElement?.setAttribute('imgLoaded', 'true');
16604
+ if (!this.imgLazy) {
16605
+ return;
16606
+ }
16607
+ if (this._imgEl.getAttribute('src') === this.imgLazy) {
16216
16608
  return;
16217
16609
  }
16218
- this.portalService.cachedImages[this.imgLazy] = true;
16219
- imgEl.src = this.imgLazy;
16220
- this.handleLoadEvent(imgEl);
16221
- this._imageViewed$.next();
16610
+ this.imageLoadStarted.emit();
16611
+ this._imgEl.setAttribute('src', this.imgLazy);
16612
+ this._disconnectObserver();
16222
16613
  }
16223
- handleLoadEvent(imgEl) {
16224
- imgEl.addEventListener('load', () => {
16225
- imgEl.parentElement?.setAttribute('imgLoaded', 'true');
16226
- this.imageLoaded.emit();
16227
- });
16614
+ _observeCurrentImage() {
16615
+ this._disconnectObserver();
16616
+ if (!this.auto || !this.imgLazy) {
16617
+ return;
16618
+ }
16619
+ if (typeof IntersectionObserver === 'undefined') {
16620
+ this.showImage();
16621
+ return;
16622
+ }
16623
+ this._observer = new IntersectionObserver((entries) => {
16624
+ if (entries.some((entry) => entry.isIntersecting)) {
16625
+ this.showImage();
16626
+ }
16627
+ }, { rootMargin: `${Math.max(0, this.threshold)}px` });
16628
+ this._observer.observe(this._imgEl);
16228
16629
  }
16229
- isInViewport() {
16230
- const rect = this._imgEl.getBoundingClientRect();
16231
- const isInViewport = rect.top >= 0 &&
16232
- rect.left >= 0 &&
16233
- rect.bottom - this.threshold <= (window.innerHeight || document.documentElement.clientHeight) &&
16234
- rect.right <= (window.innerWidth || document.documentElement.clientWidth);
16235
- return isInViewport;
16630
+ _resetImage() {
16631
+ this._disconnectObserver();
16632
+ this._imgEl.removeAttribute('src');
16633
+ this._imgEl.parentElement?.removeAttribute('imgLoaded');
16634
+ }
16635
+ _disconnectObserver() {
16636
+ this._observer?.disconnect();
16637
+ this._observer = null;
16236
16638
  }
16237
16639
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ImageLazyDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
16238
- 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 }); }
16640
+ 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 }); }
16239
16641
  }
16240
16642
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ImageLazyDirective, decorators: [{
16241
16643
  type: Directive,
@@ -16247,8 +16649,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
16247
16649
  type: Input
16248
16650
  }], threshold: [{
16249
16651
  type: Input
16652
+ }], imageLoadStarted: [{
16653
+ type: Output
16250
16654
  }], imageLoaded: [{
16251
16655
  type: Output
16656
+ }], imageLoadError: [{
16657
+ type: Output
16252
16658
  }], imgLazy: [{
16253
16659
  type: Input
16254
16660
  }] } });
@@ -17102,7 +17508,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
17102
17508
  class BodyClickDirective extends BaseDirective {
17103
17509
  constructor() {
17104
17510
  super(...arguments);
17105
- this._document = inject(DOCUMENT);
17511
+ this._document = inject(DOCUMENT$1);
17106
17512
  }
17107
17513
  onClick() {
17108
17514
  if (this.disableBodyClick) {
@@ -17355,7 +17761,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
17355
17761
  class LabelmandatoryDirective extends BaseDirective {
17356
17762
  constructor() {
17357
17763
  super(...arguments);
17358
- this._document = inject(DOCUMENT);
17764
+ this._document = inject(DOCUMENT$1);
17359
17765
  }
17360
17766
  ngOnInit() {
17361
17767
  super.ngOnInit();
@@ -18134,7 +18540,7 @@ class TooltipDirective {
18134
18540
  ...(ngDevMode ? [{ debugName: "bnrcTooltip" }] : /* istanbul ignore next */ []));
18135
18541
  this.hostRef = inject(ElementRef);
18136
18542
  this.renderer = inject(Renderer2);
18137
- this.document = inject(DOCUMENT);
18543
+ this.document = inject(DOCUMENT$1);
18138
18544
  this.tooltipEl = null;
18139
18545
  }
18140
18546
  ngOnDestroy() {
@@ -18345,6 +18751,132 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
18345
18751
  type: Input
18346
18752
  }] } });
18347
18753
 
18754
+ /**
18755
+ * یک container-query دستیِ قابلِ‌استفاده‌ی مجدد: عرضِ خودِ المان (نه viewport) را با
18756
+ * `ResizeObserver` رصد می‌کند و بر اساس آن، تعدادِ ستون‌های گریدِ ۱۲تاییِ فاندامنتال را
18757
+ * محاسبه و از طریقِ `(colSpanChange)` منتشر می‌کند. همچنین با `exportAs` قابلِ خواندنِ
18758
+ * مستقیمِ `colSpan`/`breakpoint` در همان قالب است.
18759
+ *
18760
+ * نمونه:
18761
+ * ```html
18762
+ * <fd-layout-grid
18763
+ * [bsuResponsiveGridCols]="{ s: 1, m: 2, l: 3, xl: 4 }"
18764
+ * (colSpanChange)="colSpan = $event">
18765
+ * <div [fdLayoutGridCol]="colSpan">...</div>
18766
+ * </fd-layout-grid>
18767
+ * ```
18768
+ */
18769
+ class ResponsiveGridColsDirective {
18770
+ constructor() {
18771
+ /** تعدادِ کارت در ردیف به‌ازای هر breakpoint. */
18772
+ this.config = null;
18773
+ /** آستانه‌ها؛ پیش‌فرض هم‌راستا با گریدِ فاندامنتال. */
18774
+ this.breakpoints = { m: 601, l: 1025, xl: 1441 };
18775
+ /** span مؤثرِ گریدِ ۱۲تاییِ فاندامنتال (۱..۱۲) بر اساس عرضِ کانتینر. */
18776
+ this.colSpanChange = new EventEmitter();
18777
+ /** تعدادِ ستون در ردیف (برای گریدهای غیرِ ۱۲تایی مثل CSS/Tailwind grid). */
18778
+ this.colsPerRowChange = new EventEmitter();
18779
+ /** breakpoint فعلیِ کانتینر. */
18780
+ this.breakpointChange = new EventEmitter();
18781
+ this.breakpoint = 's';
18782
+ this.colSpan = 12;
18783
+ this.colsPerRow = 1;
18784
+ this._el = inject(ElementRef);
18785
+ this._cdr = inject(ChangeDetectorRef);
18786
+ this._zone = inject(NgZone);
18787
+ }
18788
+ ngAfterViewInit() {
18789
+ this._apply(this._width());
18790
+ try {
18791
+ this._ro = new ResizeObserver((entries) => {
18792
+ const width = entries[0]?.contentRect?.width ?? this._width();
18793
+ this._zone.run(() => this._apply(width));
18794
+ });
18795
+ this._ro.observe(this._el.nativeElement);
18796
+ }
18797
+ catch {
18798
+ // مرورگرِ خیلی قدیمی بدونِ ResizeObserver → فقط اندازه‌ی اولیه اعمال می‌شود
18799
+ }
18800
+ }
18801
+ ngOnChanges(changes) {
18802
+ // تغییرِ config/breakpoints در زمانِ اجرا هم دوباره اعمال شود
18803
+ if ((changes.config && !changes.config.firstChange) ||
18804
+ (changes.breakpoints && !changes.breakpoints.firstChange)) {
18805
+ this._apply(this._width());
18806
+ }
18807
+ }
18808
+ ngOnDestroy() {
18809
+ this._ro?.disconnect();
18810
+ }
18811
+ _width() {
18812
+ return this._el.nativeElement.getBoundingClientRect().width;
18813
+ }
18814
+ _resolveBreakpoint(width) {
18815
+ const { m, l, xl } = this.breakpoints;
18816
+ return width < m ? 's' : width < l ? 'm' : width < xl ? 'l' : 'xl';
18817
+ }
18818
+ /** تعدادِ کارت در ردیف برای این breakpoint، با fallback به breakpointهای کوچک‌تر. */
18819
+ _colsPerRow(bp) {
18820
+ const c = this.config || {};
18821
+ const chain = {
18822
+ s: [c.s],
18823
+ m: [c.m, c.s],
18824
+ l: [c.l, c.m, c.s],
18825
+ xl: [c.xl, c.l, c.m, c.s]
18826
+ };
18827
+ const value = chain[bp].find((v) => v != null && +v > 0);
18828
+ return value && +value > 0 ? +value : 1;
18829
+ }
18830
+ _apply(width) {
18831
+ if (!width) {
18832
+ return;
18833
+ }
18834
+ const bp = this._resolveBreakpoint(width);
18835
+ const perRow = this._colsPerRow(bp);
18836
+ const span = Math.max(1, Math.min(12, Math.round(12 / perRow)));
18837
+ const bpChanged = bp !== this.breakpoint;
18838
+ const perRowChanged = perRow !== this.colsPerRow;
18839
+ const spanChanged = span !== this.colSpan;
18840
+ if (!bpChanged && !perRowChanged && !spanChanged) {
18841
+ return;
18842
+ }
18843
+ this.breakpoint = bp;
18844
+ this.colsPerRow = perRow;
18845
+ this.colSpan = span;
18846
+ this._cdr.markForCheck();
18847
+ if (spanChanged) {
18848
+ this.colSpanChange.emit(span);
18849
+ }
18850
+ if (perRowChanged) {
18851
+ this.colsPerRowChange.emit(perRow);
18852
+ }
18853
+ if (bpChanged) {
18854
+ this.breakpointChange.emit(bp);
18855
+ }
18856
+ }
18857
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ResponsiveGridColsDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
18858
+ 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 }); }
18859
+ }
18860
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ResponsiveGridColsDirective, decorators: [{
18861
+ type: Directive,
18862
+ args: [{
18863
+ selector: '[bsuResponsiveGridCols]',
18864
+ exportAs: 'bsuResponsiveGridCols',
18865
+ standalone: false
18866
+ }]
18867
+ }], propDecorators: { config: [{
18868
+ type: Input,
18869
+ args: ['bsuResponsiveGridCols']
18870
+ }], breakpoints: [{
18871
+ type: Input
18872
+ }], colSpanChange: [{
18873
+ type: Output
18874
+ }], colsPerRowChange: [{
18875
+ type: Output
18876
+ }], breakpointChange: [{
18877
+ type: Output
18878
+ }] } });
18879
+
18348
18880
  class SafeBottomDirective extends BaseDirective {
18349
18881
  constructor() {
18350
18882
  super(...arguments);
@@ -18809,6 +19341,9 @@ class ReportContainerComponent extends BaseComponent {
18809
19341
  }
18810
19342
  ngOnInit() {
18811
19343
  super.ngOnInit();
19344
+ this._addUlvMainUi();
19345
+ }
19346
+ _addUlvMainUi() {
18812
19347
  let ulvParam;
18813
19348
  if (!this.settings.RelatedReport) {
18814
19349
  const id = this._activatedRoute.snapshot.params['id'];
@@ -18840,7 +19375,12 @@ class ReportContainerComponent extends BaseComponent {
18840
19375
  UlvParams: ulvParam
18841
19376
  }, this.vcr, this._injector, this._environmentInjector, this.settings.IsReportPage)
18842
19377
  .pipe(takeUntil(this._onDestroy$), catchError$1((err) => throwError(err)), finalize(() => this._loadingSource.next(false)))
18843
- .subscribe();
19378
+ .subscribe((ulvMainCtrl) => (this._ulvMainCtrlr = ulvMainCtrl));
19379
+ }
19380
+ ReloadReport() {
19381
+ this.vcr.clear();
19382
+ this._ulvMainCtrlr && this._ulvMainCtrlr.Destroy();
19383
+ this._addUlvMainUi();
18844
19384
  }
18845
19385
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ReportContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
18846
19386
  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 }); }
@@ -19120,10 +19660,12 @@ class ReportNavigatorComponent extends BaseComponent {
19120
19660
  // tap((c) => (c.isReportPage ? (this.minheight = 'auto') : '100vh')),
19121
19661
  tap((c) => (c.ReportId = !c.ReportId ? c.ReportId2 : c.ReportId)), tap((_c) => this.containerRef.clear()), tap((navItem) => this._applicationCtrlService.selectNavGroupItem(navItem.Id)), tap((navItem) => this._applicationCtrlService.selectedReportId(navItem.ReportId)), tap((navItem) => this._applicationCtrlService.selectReportCaption(navItem.ReportId2)), tap((navItem) => (this._navItemParams = navItem)), switchMap$1((navItem) => from(this._finalizeNavItemFromCache(navItem)).pipe(switchMap$1((resolved) => this._portalService
19122
19662
  .renderUlvMainUi(resolved, this.containerRef, this._injector, this._environmentInjector, resolved.isReportPage)
19123
- .pipe(catchError$1((_err) =>
19124
- // this._location.back();
19125
- // return throwError(() => new Error(err));
19126
- of(true)))))), tap((ulv) => this._setActiveReport(ulv)), finalize(() => {
19663
+ .pipe(catchError$1((_err) => {
19664
+ // this._location.back();
19665
+ // return throwError(() => new Error(err));
19666
+ console.error('Error rendering ULV main UI, rendering NotFoundComponent instead.', _err);
19667
+ return of(true);
19668
+ }))))), tap((ulv) => this._setActiveReport(ulv)), finalize(() => {
19127
19669
  this._setLoading(false);
19128
19670
  }))
19129
19671
  .subscribe(() => {
@@ -19287,7 +19829,7 @@ class ReportEmptyPageComponent extends PageWithFormHandlerBaseComponent {
19287
19829
  </ng-template>
19288
19830
  <ng-container #containerRef></ng-container>
19289
19831
  <router-outlet></router-outlet>
19290
- `, 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 }); }
19832
+ `, 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 }); }
19291
19833
  }
19292
19834
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: ReportEmptyPageComponent, decorators: [{
19293
19835
  type: Component,
@@ -19297,7 +19839,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
19297
19839
  </ng-template>
19298
19840
  <ng-container #containerRef></ng-container>
19299
19841
  <router-outlet></router-outlet>
19300
- `, providers: [RoutingService, ContainerService], changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, styles: [":host{display:block}\n"] }]
19842
+ `, providers: [RoutingService, ContainerService], changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, styles: [":host{display:flex;min-height:0;height:100%;flex-direction:column;flex:1}\n"] }]
19301
19843
  }], propDecorators: { blockTemplate: [{
19302
19844
  type: ViewChild,
19303
19845
  args: ['block', { static: true }]
@@ -19480,7 +20022,7 @@ class ResizableDirective {
19480
20022
  constructor() {
19481
20023
  this.resizableComplete = new EventEmitter();
19482
20024
  this.resizableStart = new EventEmitter();
19483
- this.documentRef = inject(DOCUMENT);
20025
+ this.documentRef = inject(DOCUMENT$1);
19484
20026
  this.elementRef = inject(ElementRef);
19485
20027
  this.resizable = fromEvent(this.elementRef.nativeElement, 'mousedown').pipe(tap((e) => e.preventDefault()), tap(() => this.resizableStart.emit()), switchMap$1(() => {
19486
20028
  const elDom = this.elementRef.nativeElement;
@@ -20095,6 +20637,7 @@ const directives = [
20095
20637
  SimplebarDirective,
20096
20638
  LeafletLongPressDirective,
20097
20639
  ResizeHandlerDirective,
20640
+ ResponsiveGridColsDirective,
20098
20641
  SafeBottomDirective,
20099
20642
  MoLinkerDirective
20100
20643
  ];
@@ -20134,6 +20677,7 @@ const pipes = [
20134
20677
  EnumCaptionPipe,
20135
20678
  CanUploadFilePipe,
20136
20679
  RemoveNewlinePipe,
20680
+ RelativeDatePipe,
20137
20681
  ConvertToStylePipe,
20138
20682
  FilterPipe,
20139
20683
  FilterTabPipe,
@@ -20168,6 +20712,7 @@ const pipes = [
20168
20712
  SanitizeTextPipe,
20169
20713
  ColumnCustomComponentPipe,
20170
20714
  ColumnIconPipe,
20715
+ MoIconPipe,
20171
20716
  ColumnValuePipe,
20172
20717
  RowNumberPipe,
20173
20718
  ComboRowImagePipe,
@@ -20187,6 +20732,7 @@ const pipes = [
20187
20732
  LabelStarTrimPipe,
20188
20733
  SplitPipe,
20189
20734
  DynamicDarkColorPipe,
20735
+ ReadableTextColorPipe,
20190
20736
  ChunkArrayPipe,
20191
20737
  MapToChatMessagePipe,
20192
20738
  PicturesByGroupIdPipe,
@@ -20336,6 +20882,7 @@ class BarsaNovinRayCoreModule extends BaseModule {
20336
20882
  EnumCaptionPipe,
20337
20883
  CanUploadFilePipe,
20338
20884
  RemoveNewlinePipe,
20885
+ RelativeDatePipe,
20339
20886
  ConvertToStylePipe,
20340
20887
  FilterPipe,
20341
20888
  FilterTabPipe,
@@ -20370,6 +20917,7 @@ class BarsaNovinRayCoreModule extends BaseModule {
20370
20917
  SanitizeTextPipe,
20371
20918
  ColumnCustomComponentPipe,
20372
20919
  ColumnIconPipe,
20920
+ MoIconPipe,
20373
20921
  ColumnValuePipe,
20374
20922
  RowNumberPipe,
20375
20923
  ComboRowImagePipe,
@@ -20389,6 +20937,7 @@ class BarsaNovinRayCoreModule extends BaseModule {
20389
20937
  LabelStarTrimPipe,
20390
20938
  SplitPipe,
20391
20939
  DynamicDarkColorPipe,
20940
+ ReadableTextColorPipe,
20392
20941
  ChunkArrayPipe,
20393
20942
  MapToChatMessagePipe,
20394
20943
  PicturesByGroupIdPipe,
@@ -20447,6 +20996,7 @@ class BarsaNovinRayCoreModule extends BaseModule {
20447
20996
  SimplebarDirective,
20448
20997
  LeafletLongPressDirective,
20449
20998
  ResizeHandlerDirective,
20999
+ ResponsiveGridColsDirective,
20450
21000
  SafeBottomDirective,
20451
21001
  MoLinkerDirective], imports: [CommonModule,
20452
21002
  BarsaNovinRayCoreRoutingModule,
@@ -20485,6 +21035,7 @@ class BarsaNovinRayCoreModule extends BaseModule {
20485
21035
  EnumCaptionPipe,
20486
21036
  CanUploadFilePipe,
20487
21037
  RemoveNewlinePipe,
21038
+ RelativeDatePipe,
20488
21039
  ConvertToStylePipe,
20489
21040
  FilterPipe,
20490
21041
  FilterTabPipe,
@@ -20519,6 +21070,7 @@ class BarsaNovinRayCoreModule extends BaseModule {
20519
21070
  SanitizeTextPipe,
20520
21071
  ColumnCustomComponentPipe,
20521
21072
  ColumnIconPipe,
21073
+ MoIconPipe,
20522
21074
  ColumnValuePipe,
20523
21075
  RowNumberPipe,
20524
21076
  ComboRowImagePipe,
@@ -20538,6 +21090,7 @@ class BarsaNovinRayCoreModule extends BaseModule {
20538
21090
  LabelStarTrimPipe,
20539
21091
  SplitPipe,
20540
21092
  DynamicDarkColorPipe,
21093
+ ReadableTextColorPipe,
20541
21094
  ChunkArrayPipe,
20542
21095
  MapToChatMessagePipe,
20543
21096
  PicturesByGroupIdPipe,
@@ -20596,6 +21149,7 @@ class BarsaNovinRayCoreModule extends BaseModule {
20596
21149
  SimplebarDirective,
20597
21150
  LeafletLongPressDirective,
20598
21151
  ResizeHandlerDirective,
21152
+ ResponsiveGridColsDirective,
20599
21153
  SafeBottomDirective,
20600
21154
  MoLinkerDirective] }); }
20601
21155
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: BarsaNovinRayCoreModule, providers: [provideHttpClient(withXhr(), withInterceptorsFromDi())], imports: [CommonModule,
@@ -20627,5 +21181,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
20627
21181
  * Generated bundle index. Do not edit.
20628
21182
  */
20629
21183
 
20630
- 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, PushBannerComponent 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, NotFoundComponent as cA, NotificationService as cB, NowraptextDirective as cC, NumberBaseComponent as cD, NumberControlInfoModel as cE, NumbersOnlyInputDirective as cF, NumeralPipe as cG, OverflowTextDirective as cH, PageBaseComponent as cI, PageWithFormHandlerBaseComponent as cJ, PdfMimeType as cK, PictureFieldSourcePipe as cL, PictureFileControlInfoModel as cM, PicturesByGroupIdPipe as cN, PlaceHolderDirective as cO, PortalDynamicPageResolver as cP, PortalFormPageResolver as cQ, PortalPageComponent as cR, PortalPageResolver as cS, PortalPageSidebarComponent as cT, PortalReportPageResolver as cU, PortalService as cV, PreventDefaulEvent as cW, PreventDefaultDirective as cX, PrintFilesDirective as cY, PrintImage as cZ, PromptUpdateService 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, NOTIFICATAION_POPUP_SERVER as cx, NOTIFICATION_WEBWORKER_FACTORY as cy, NetworkStatusService as cz, AllFilesMimeType as d, ShortcutRegisterDirective as d$, PushCheckService as d0, PushNotificationService as d1, REPORT_GRID_VIEWPORT_CLASS as d2, REPORT_TYPE_DEFAULT_POLICIES as d3, RUNTIME_NAV_STATE_SCHEMA_V1 as d4, RabetehAkseTakiListiControlInfoModel as d5, RedirectHomeGuard as d6, RelatedReportControlInfoModel as d7, RelationListControlInfoModel as d8, RemoveDynamicFormStyles as d9, ResizeObserverDirective as dA, ReversePipe as dB, RichStringControlInfoModel as dC, RootPageComponent as dD, RootPortalComponent as dE, RotateImage as dF, RouteFormChangeDirective as dG, RoutingService as dH, RowDataOption as dI, RowNumberPipe as dJ, RowState as dK, RuntimeNavStateCacheService as dL, SafeBottomDirective as dM, SanitizeTextPipe as dN, SaveImageDirective as dO, SaveImageToFile as dP, SaveScrollPositionService as dQ, ScopedCssPipe as dR, ScrollLayoutContextHolder as dS, ScrollPersistDirective as dT, ScrollToSelectedDirective as dU, SelectionMode as dV, SeperatorFixPipe as dW, ServiceWorkerCommuncationService as dX, ServiceWorkerNotificationService as dY, ShellbarHeightService as dZ, ShortcutHandlerDirective as d_, RemoveNewlinePipe as da, RenderUlvDirective as db, RenderUlvPaginDirective as dc, RenderUlvViewerDirective as dd, ReplacePipe as de, ReportActionListPipe as df, ReportBaseComponent as dg, ReportBaseInfo as dh, ReportBreadcrumbResolver as di, ReportCalendarModel as dj, ReportContainerComponent as dk, ReportExtraInfo as dl, ReportField as dm, ReportFormModel as dn, ReportItemBaseComponent as dp, ReportListModel as dq, ReportModel as dr, ReportNavigatorComponent as ds, ReportTreeModel as dt, ReportViewBaseComponent as du, ReportViewColumn as dv, ResizableComponent as dw, ResizableDirective as dx, ResizableModule as dy, ResizeHandlerDirective as dz, AnchorScrollDirective as e, flattenTree as e$, SimpleTemplateEngine as e0, SimplebarDirective as e1, SingleRelationControlInfoModel as e2, SortDirection as e3, SortPipe as e4, SortSetting as e5, SplideSliderDirective as e6, SplitPipe as e7, SplitterComponent as e8, StopPropagationDirective as e9, VisibleValuePipe as eA, WebOtpDirective as eB, WordMimeType as eC, WorfkflowwChoiceCommandDirective as eD, addCssVariableToRoot as eE, addDynamicVariableTo as eF, availablePrefixes as eG, bodyClick as eH, buildRuntimeNavStateCacheKey as eI, calcContextMenuWidth as eJ, calculateColumnContent as eK, calculateColumnWidth as eL, calculateColumnWidthFitToContainer as eM, calculateFreeColumnSize as eN, calculateMoDataListContentWidthByColumnName as eO, cancelRequestAnimationFrame as eP, checkPermission as eQ, compareVersions as eR, contextDefaultsFromEnvironment as eS, createFormPanelMetaConditions as eT, createGridEditorFormPanel as eU, easeInOutCubic as eV, elementInViewport2 as eW, enumValueToStringSize as eX, executeUlvCommandHandler as eY, extractLayoutPolicyFromView as eZ, fixUnclosedParentheses as e_, StringControlInfoModel as ea, StringToNumberPipe as eb, SubformControlInfoModel as ec, SystemBaseComponent as ed, TEMPLATE_ENGINE as ee, TOAST_SERVICE as ef, TableHeaderWidthMode as eg, TableResizerDirective as eh, TabpageService as ei, ThImageOrIconePipe as ej, TileGroupBreadcrumResolver as ek, TilePropsComponent as el, TlbButtonsPipe as em, ToolbarSettingsPipe as en, TooltipDirective as eo, TotalSummaryPipe as ep, UiService as eq, UlvCommandDirective as er, UlvHeightSizeType as es, UlvMainService as et, UnlimitSessionComponent as eu, UntilInViewDirective as ev, UploadService as ew, VideoMimeType as ex, VideoRecordingService as ey, ViewBase as ez, formRoutes as f, stopPropagation as f$, forbiddenValidator as f0, formatBytes as f1, fromEntries as f2, fromIntersectionObserver as f3, genrateInlineMoId as f4, getAllItemsPerChildren as f5, getColumnValueOfMoDataList as f6, getComponentDefined as f7, getControlList as f8, getControlSizeMode as f9, isFunction as fA, isIOS as fB, isImage as fC, isInLocalMode as fD, isSafari as fE, isTargetWindow as fF, isVersionBiggerThan as fG, measureText as fH, measureText2 as fI, measureTextBy as fJ, mobile_regex as fK, multilevelSort as fL, nullOrUndefinedString as fM, number_only as fN, removeDynamicStyle as fO, requestAnimationFramePolyfill as fP, resolveFinalScroll as fQ, resolveReportLayoutPolicy as fR, scrollLayoutModeToContextEnvironment as fS, scrollToElement as fT, searchEx as fU, setColumnWidthByMaxMoContentWidth as fV, setOneDepthLevel as fW, setTableThWidth as fX, shallowEqual as fY, sort as fZ, sortEx as f_, getDateService as fa, getDeviceIsDesktop as fb, getDeviceIsMobile as fc, getDeviceIsPhone as fd, getDeviceIsTablet as fe, getFieldValue as ff, getFocusableTagNames as fg, getFormSettings as fh, getGridSettings as fi, getHeaderValue as fj, getIcon as fk, getImagePath as fl, getLabelWidth as fm, getLayout94ObjectInfo as fn, getLayoutControl as fo, getNestedValue as fp, getNewMoGridEditor as fq, getParentHeight as fr, getReportTypeDefaultPolicy as fs, getRequestAnimationFrame as ft, getResetGridSettings as fu, getTargetRect as fv, getUniqueId as fw, getValidExtension as fx, isFF as fy, isFirefox as fz, ApiService as g, throwIfAlreadyLoaded as g0, toNumber as g1, validateAllFormFields as g2, 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 };
20631
- //# sourceMappingURL=barsa-novin-ray-core-barsa-novin-ray-core-Q1H9o6KT.mjs.map
21184
+ 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 };
21185
+ //# sourceMappingURL=barsa-novin-ray-core-barsa-novin-ray-core-BneCvL2Z.mjs.map