barsa-novin-ray-core 2.3.143 → 2.3.145

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,6 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, inject, ElementRef, Input, ChangeDetectionStrategy, Component, Pipe, ComponentFactoryResolver, Injector, ApplicationRef, Compiler, DOCUMENT, NgModuleFactory, InjectionToken, NgZone, signal, ViewContainerRef, EventEmitter, ChangeDetectorRef, Renderer2, HostBinding, Output, HostListener, ViewChild, Directive, TemplateRef, input, NgModule, NO_ERRORS_SCHEMA, CUSTOM_ELEMENTS_SCHEMA, provideAppInitializer, ErrorHandler } from '@angular/core';
3
- import { Subject, from, BehaviorSubject, of, exhaustMap, map as map$1, timer, combineLatest, debounceTime as debounceTime$1, distinctUntilChanged as distinctUntilChanged$1, switchMap, forkJoin, shareReplay, withLatestFrom as withLatestFrom$1, tap as tap$1, fromEvent, throwError, merge, interval, filter as filter$1, lastValueFrom, timeout, catchError as catchError$1, takeUntil as takeUntil$1, take, skip, Observable, mergeWith, Subscription } from 'rxjs';
2
+ import { Injectable, inject, ElementRef, Input, ChangeDetectionStrategy, Component, Pipe, ComponentFactoryResolver, Injector, ApplicationRef, Compiler, DOCUMENT, NgModuleFactory, InjectionToken, NgZone, signal, ViewContainerRef, isDevMode, EventEmitter, ChangeDetectorRef, Renderer2, HostBinding, Output, HostListener, ViewChild, Directive, TemplateRef, input, NgModule, NO_ERRORS_SCHEMA, CUSTOM_ELEMENTS_SCHEMA, provideAppInitializer, ErrorHandler } from '@angular/core';
3
+ import { Subject, from, BehaviorSubject, of, exhaustMap, map as map$1, timer, combineLatest, debounceTime as debounceTime$1, distinctUntilChanged as distinctUntilChanged$1, switchMap, forkJoin, shareReplay, withLatestFrom as withLatestFrom$1, fromEvent, throwError, merge, interval, filter as filter$1, lastValueFrom, timeout, catchError as catchError$1, 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';
@@ -120,6 +120,9 @@ class BaseComponent {
120
120
  get el() {
121
121
  return this._el;
122
122
  }
123
+ get onDestroy$() {
124
+ return this._onDestroy$;
125
+ }
123
126
  ngAfterContentInit() {
124
127
  if (!BarsaApi.Common.Debug?.Data?.CustomUi) {
125
128
  return;
@@ -4314,7 +4317,6 @@ class DynamicDarkColorPipe {
4314
4317
  this.cache = new Map();
4315
4318
  this.darkBackground = [18, 18, 18]; // #121212
4316
4319
  this.minContrast = 4.5;
4317
- this.colorParseCache = new Map();
4318
4320
  }
4319
4321
  transform(styleStr) {
4320
4322
  if (!IsDarkMode() || !styleStr) {
@@ -4323,29 +4325,46 @@ class DynamicDarkColorPipe {
4323
4325
  if (this.cache.has(styleStr)) {
4324
4326
  return this.cache.get(styleStr);
4325
4327
  }
4326
- const regex = /color\s*:\s*([^;!]+)[;!]?/i;
4327
- const match = styleStr.match(regex);
4328
- if (!match) {
4329
- return styleStr;
4330
- }
4331
- const originalColor = match[1].trim();
4332
- const rgb = this.parseColor(originalColor);
4333
- if (!rgb) {
4334
- return styleStr;
4335
- }
4336
- this.colorParseCache.set(originalColor, rgb); // Cache the parsed color
4337
- const contrast = this.getContrastRatio(rgb, this.darkBackground);
4338
- // اگر کنتراست خوبه دست نزن
4339
- if (contrast >= this.minContrast) {
4340
- this.cache.set(styleStr, styleStr);
4341
- return styleStr;
4328
+ const colorRegex = /(?:^|;)\s*color\s*:\s*([^;!]+)[;!]?/i;
4329
+ const bgRegex = /(?:^|;)\s*background-color\s*:\s*([^;!]+)[;!]?/i;
4330
+ const colorMatch = styleStr.match(colorRegex);
4331
+ const bgMatch = styleStr.match(bgRegex);
4332
+ let newStyle = styleStr;
4333
+ // ---------------------------------------------------
4334
+ // BACKGROUND EXISTS BUT NO TEXT COLOR
4335
+ // ---------------------------------------------------
4336
+ if (bgMatch && !colorMatch) {
4337
+ const bgRgb = this.parseColor(bgMatch[1].trim());
4338
+ if (bgRgb) {
4339
+ const textColor = this.getReadableTextColor(bgRgb);
4340
+ newStyle += `; color: ${textColor};`;
4341
+ }
4342
+ this.cache.set(styleStr, newStyle);
4343
+ return newStyle;
4344
+ }
4345
+ // ---------------------------------------------------
4346
+ // NORMAL COLOR CONTRAST FIX
4347
+ // ---------------------------------------------------
4348
+ if (colorMatch) {
4349
+ const originalColor = colorMatch[1].trim();
4350
+ const rgb = this.parseColor(originalColor);
4351
+ if (!rgb) {
4352
+ return styleStr;
4353
+ }
4354
+ const contrast = this.getContrastRatio(rgb, this.darkBackground);
4355
+ if (contrast < this.minContrast) {
4356
+ const adjustedHex = this.adjustColorForDarkMode(rgb);
4357
+ newStyle = styleStr.replace(colorRegex, `; color: ${adjustedHex};`);
4358
+ }
4342
4359
  }
4343
- // ❌ اگر بد بود → اصلاح کن
4344
- const adjustedHex = this.adjustColorForDarkMode(rgb);
4345
- const newStyle = styleStr.replace(regex, `color: ${adjustedHex};`);
4346
4360
  this.cache.set(styleStr, newStyle);
4347
4361
  return newStyle;
4348
4362
  }
4363
+ getReadableTextColor(bgRgb) {
4364
+ const whiteContrast = this.getContrastRatio([255, 255, 255], bgRgb);
4365
+ const blackContrast = this.getContrastRatio([0, 0, 0], bgRgb);
4366
+ return whiteContrast > blackContrast ? '#ffffff' : '#000000';
4367
+ }
4349
4368
  // ---------------------------------------------------
4350
4369
  // 🎯 Adjust until contrast >= 4.5
4351
4370
  // ---------------------------------------------------
@@ -4641,6 +4660,35 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
4641
4660
  }]
4642
4661
  }], ctorParameters: () => [] });
4643
4662
 
4663
+ class GetCssVariableValuePipe {
4664
+ transform(cssVarName, removeUnit, element) {
4665
+ if (!cssVarName) {
4666
+ return null;
4667
+ }
4668
+ const target = element || document.documentElement;
4669
+ let value = getComputedStyle(target).getPropertyValue(cssVarName).trim();
4670
+ if (!value) {
4671
+ return null;
4672
+ }
4673
+ // remove unit
4674
+ if (removeUnit) {
4675
+ value = value.replace(removeUnit, '').trim();
4676
+ const numeric = Number(value);
4677
+ return isNaN(numeric) ? value : numeric;
4678
+ }
4679
+ return value;
4680
+ }
4681
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: GetCssVariableValuePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
4682
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.0.6", ngImport: i0, type: GetCssVariableValuePipe, isStandalone: false, name: "getCssVarValue" }); }
4683
+ }
4684
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: GetCssVariableValuePipe, decorators: [{
4685
+ type: Pipe,
4686
+ args: [{
4687
+ name: 'getCssVarValue',
4688
+ standalone: false
4689
+ }]
4690
+ }] });
4691
+
4644
4692
  class ApiService {
4645
4693
  constructor() {
4646
4694
  this.portalLoginUrl = `/api/auth/portal/login`;
@@ -5872,7 +5920,7 @@ class ApplicationCtrlrService {
5872
5920
  get systemCommandGroups$() {
5873
5921
  return this._selectedSystemNavUi$
5874
5922
  .asObservable()
5875
- .pipe(map$1((c) => (!c ? [] : this._mergeToSystemGroup(c.SystemData.CommandGroups) || [])));
5923
+ .pipe(map$1((c) => (!c ? [] : c.SystemData.CommandGroups || [])));
5876
5924
  }
5877
5925
  get selectedCommand$() {
5878
5926
  return combineLatest([this._selectedCommandId$, this._selectedSystemId$]).pipe(map$1(([selectedCommand, systemId]) => selectedCommand[systemId]));
@@ -5940,10 +5988,11 @@ class ApplicationCtrlrService {
5940
5988
  callback && callback(true);
5941
5989
  });
5942
5990
  this._document.documentElement.setAttribute('data-layout', 'vertical');
5943
- this._selectedSystemTitle$
5944
- .asObservable()
5945
- .pipe(tap$1((c) => this._titleService.setTitle(c)))
5946
- .subscribe();
5991
+ // با تغییر سیستم اسم تب مرورگر تغییر نکند
5992
+ // this._selectedSystemTitle$
5993
+ // .asObservable()
5994
+ // .pipe(tap((c) => this._titleService.setTitle(c)))
5995
+ // .subscribe();
5947
5996
  }
5948
5997
  systemChange(systemId) {
5949
5998
  const oldSystemId = this._selectedSystemId$.getValue();
@@ -6268,7 +6317,7 @@ function reportRoutes(authGuard = false) {
6268
6317
  return {
6269
6318
  path: 'report/:id',
6270
6319
  canActivate: authGuard ? [AuthGuard] : [],
6271
- loadChildren: () => import('./barsa-novin-ray-core-barsa-report-page.module-ObpSr8cc.mjs').then((m) => m.BarsaReportPageModule),
6320
+ loadChildren: () => import('./barsa-novin-ray-core-barsa-report-page.module-7QOR1HJT.mjs').then((m) => m.BarsaReportPageModule),
6272
6321
  resolve: {
6273
6322
  breadcrumb: ReportBreadcrumbResolver
6274
6323
  }
@@ -9223,14 +9272,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
9223
9272
  // src/app/services/idb.service.ts
9224
9273
  class IdbService {
9225
9274
  constructor() {
9226
- this.dbPromise = openDB('my-app-db', 1, {
9227
- upgrade(db) {
9275
+ this.dbPromise = openDB('my-app-db', 2, {
9276
+ upgrade(db, oldVersion) {
9228
9277
  if (!db.objectStoreNames.contains('subscription')) {
9229
9278
  db.createObjectStore('subscription');
9230
9279
  }
9231
9280
  if (!db.objectStoreNames.contains('settings')) {
9232
9281
  db.createObjectStore('settings');
9233
9282
  }
9283
+ if (oldVersion < 2 && !db.objectStoreNames.contains('runtimeNavState')) {
9284
+ db.createObjectStore('runtimeNavState');
9285
+ }
9234
9286
  }
9235
9287
  });
9236
9288
  }
@@ -9247,6 +9299,15 @@ class IdbService {
9247
9299
  const db = await this.dbPromise;
9248
9300
  await db.delete(store, key);
9249
9301
  }
9302
+ async getAllKeys(store) {
9303
+ const db = await this.dbPromise;
9304
+ const keys = await db.getAllKeys(store);
9305
+ return keys;
9306
+ }
9307
+ async clearStore(store) {
9308
+ const db = await this.dbPromise;
9309
+ await db.clear(store);
9310
+ }
9250
9311
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: IdbService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
9251
9312
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: IdbService, providedIn: 'root' }); }
9252
9313
  }
@@ -9740,6 +9801,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
9740
9801
  args: [{ providedIn: 'root' }]
9741
9802
  }] });
9742
9803
 
9804
+ class ScrollLayoutContextHolder {
9805
+ constructor() {
9806
+ this._mode = signal('root');
9807
+ this.mode = this._mode.asReadonly();
9808
+ }
9809
+ setMode(mode) {
9810
+ this._mode.set(mode);
9811
+ }
9812
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: ScrollLayoutContextHolder, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
9813
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: ScrollLayoutContextHolder }); }
9814
+ }
9815
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: ScrollLayoutContextHolder, decorators: [{
9816
+ type: Injectable
9817
+ }], ctorParameters: () => [] });
9818
+
9743
9819
  class ShellbarHeightService {
9744
9820
  constructor() {
9745
9821
  this._dict = new BehaviorSubject(['']);
@@ -9822,6 +9898,145 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
9822
9898
  args: [{ providedIn: 'root' }]
9823
9899
  }] });
9824
9900
 
9901
+ /** Discriminator for migrations and mixed payload kinds. */
9902
+ const RUNTIME_NAV_STATE_SCHEMA_V1 = 'report-nav-runtime/v1';
9903
+ /**
9904
+ * Stable cache key: report-scoped MO identity.
9905
+ * Future: prefix with navigationScopeId for split/compare/popup (architecture note only in v1).
9906
+ */
9907
+ function buildRuntimeNavStateCacheKey(reportIdSeg, moId, typeDefId) {
9908
+ return `runtime:${reportIdSeg}:${moId}:${typeDefId}`;
9909
+ }
9910
+
9911
+ const RUNTIME_NAV_STORE = 'runtimeNavState';
9912
+ const SESSION_STORAGE_KEY = 'runtime-session-id';
9913
+ const MAX_MEMORY_ENTRIES = 100;
9914
+ function cloneForPersist(value) {
9915
+ try {
9916
+ return structuredClone(value);
9917
+ }
9918
+ catch {
9919
+ return JSON.parse(JSON.stringify(value));
9920
+ }
9921
+ }
9922
+ class RuntimeNavStateCacheService {
9923
+ constructor() {
9924
+ this._idb = inject(IdbService);
9925
+ this._memory = new Map();
9926
+ this._sessionId = this._ensureSessionId();
9927
+ void this._purgeStaleFromIdb();
9928
+ if (isDevMode() && typeof window !== 'undefined') {
9929
+ window.__runtimeNavCache = this;
9930
+ }
9931
+ }
9932
+ /** @internal tests / diagnostics */
9933
+ get currentSessionId() {
9934
+ return this._sessionId;
9935
+ }
9936
+ save(key, envelope) {
9937
+ const snapshot = cloneForPersist({
9938
+ ...envelope,
9939
+ sessionId: this._sessionId,
9940
+ createdAt: envelope.createdAt ?? Date.now()
9941
+ });
9942
+ return (async () => {
9943
+ await this._idb.set(RUNTIME_NAV_STORE, key, snapshot);
9944
+ this._memory.set(key, snapshot);
9945
+ this._evictMemoryIfNeeded();
9946
+ })();
9947
+ }
9948
+ get(key) {
9949
+ const mem = this._memory.get(key);
9950
+ if (mem !== undefined) {
9951
+ return Promise.resolve(mem);
9952
+ }
9953
+ return (async () => {
9954
+ const row = await this._idb.get(RUNTIME_NAV_STORE, key);
9955
+ if (row == null) {
9956
+ return null;
9957
+ }
9958
+ if (row.sessionId !== this._sessionId) {
9959
+ return null;
9960
+ }
9961
+ this._memory.set(key, row);
9962
+ this._evictMemoryIfNeeded();
9963
+ return row;
9964
+ })();
9965
+ }
9966
+ remove(key) {
9967
+ return (async () => {
9968
+ this._memory.delete(key);
9969
+ await this._idb.delete(RUNTIME_NAV_STORE, key);
9970
+ })();
9971
+ }
9972
+ clear() {
9973
+ return (async () => {
9974
+ this._memory.clear();
9975
+ await this._idb.clearStore(RUNTIME_NAV_STORE);
9976
+ })();
9977
+ }
9978
+ /** Optional contract: snapshot of keys ? serialized envelopes (for debugging). */
9979
+ getAllEntries() {
9980
+ return (async () => {
9981
+ const out = {};
9982
+ for (const [k, v] of this._memory.entries()) {
9983
+ out[k] = cloneForPersist(v);
9984
+ }
9985
+ const keys = await this._idb.getAllKeys(RUNTIME_NAV_STORE);
9986
+ for (const key of keys) {
9987
+ if (out[key] !== undefined) {
9988
+ continue;
9989
+ }
9990
+ const row = await this._idb.get(RUNTIME_NAV_STORE, key);
9991
+ if (row?.sessionId === this._sessionId) {
9992
+ out[key] = cloneForPersist(row);
9993
+ }
9994
+ }
9995
+ return out;
9996
+ })();
9997
+ }
9998
+ _ensureSessionId() {
9999
+ if (typeof sessionStorage === 'undefined') {
10000
+ return `ssr-${crypto.randomUUID()}`;
10001
+ }
10002
+ let id = sessionStorage.getItem(SESSION_STORAGE_KEY);
10003
+ if (!id) {
10004
+ id = crypto.randomUUID();
10005
+ sessionStorage.setItem(SESSION_STORAGE_KEY, id);
10006
+ }
10007
+ return id;
10008
+ }
10009
+ _evictMemoryIfNeeded() {
10010
+ while (this._memory.size > MAX_MEMORY_ENTRIES) {
10011
+ const first = this._memory.keys().next().value;
10012
+ if (first === undefined) {
10013
+ break;
10014
+ }
10015
+ this._memory.delete(first);
10016
+ }
10017
+ }
10018
+ async _purgeStaleFromIdb() {
10019
+ try {
10020
+ const keys = await this._idb.getAllKeys(RUNTIME_NAV_STORE);
10021
+ for (const key of keys) {
10022
+ const row = await this._idb.get(RUNTIME_NAV_STORE, key);
10023
+ if (row == null || row.sessionId !== this._sessionId) {
10024
+ await this._idb.delete(RUNTIME_NAV_STORE, key);
10025
+ }
10026
+ }
10027
+ }
10028
+ catch {
10029
+ /* ignore IDB errors during purge */
10030
+ }
10031
+ }
10032
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: RuntimeNavStateCacheService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
10033
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: RuntimeNavStateCacheService, providedIn: 'root' }); }
10034
+ }
10035
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: RuntimeNavStateCacheService, decorators: [{
10036
+ type: Injectable,
10037
+ args: [{ providedIn: 'root' }]
10038
+ }], ctorParameters: () => [] });
10039
+
9825
10040
  class CardViewService {
9826
10041
  constructor() {
9827
10042
  this._maxHeaderTitleHeight$ = new BehaviorSubject(0);
@@ -9854,6 +10069,9 @@ class BaseSettingsService {
9854
10069
  saveSetting(key, value) {
9855
10070
  return from(this.idb.set('settings', key, value));
9856
10071
  }
10072
+ removeSetting(key) {
10073
+ return from(this.idb.delete('settings', key));
10074
+ }
9857
10075
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: BaseSettingsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
9858
10076
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: BaseSettingsService, providedIn: 'root' }); }
9859
10077
  }
@@ -9862,40 +10080,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
9862
10080
  args: [{ providedIn: 'root' }]
9863
10081
  }] });
9864
10082
 
9865
- class CalendarSettingsService extends BaseSettingsService {
9866
- constructor() {
9867
- super(...arguments);
9868
- this.CALENDAR_KEY_PREFIX = 'cal_cfg_';
9869
- // نگهداری وضعیت فعلی برای دسترسی سریع در UI
9870
- this.configSubject = new BehaviorSubject(null);
9871
- }
9872
- get config$() {
9873
- return this.configSubject.asObservable();
9874
- }
9875
- /**
9876
- * بارگذاری تنظیمات و آپدیت کردن استریم
9877
- */
9878
- getSetting(reportId) {
9879
- // ۱. اول متد اصلی (پدر) را صدا می‌زنیم تا دیتا از IDB بیاید
9880
- const key = `${this.CALENDAR_KEY_PREFIX}${reportId}`;
9881
- return super.getSetting(key).pipe(tap$1((c) => this.configSubject.next(c)));
9882
- }
9883
- /**
9884
- * ذخیره تنظیمات و اطلاع‌رسانی به تمام Subscribe کننده‌ها
9885
- */
9886
- saveSetting(reportId, newConfig) {
9887
- const key = `${this.CALENDAR_KEY_PREFIX}${reportId}`;
9888
- const updatedConfig = { ...this.configSubject.value, ...newConfig };
9889
- return super.saveSetting(key, updatedConfig).pipe(tap$1(() => this.configSubject.next(updatedConfig)));
9890
- }
9891
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: CalendarSettingsService, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
9892
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: CalendarSettingsService, providedIn: 'root' }); }
9893
- }
9894
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: CalendarSettingsService, decorators: [{
9895
- type: Injectable,
9896
- args: [{ providedIn: 'root' }]
9897
- }] });
9898
-
9899
10083
  class SimpleTemplateEngine {
9900
10084
  constructor() {
9901
10085
  this.cache = new Map();
@@ -10545,7 +10729,9 @@ class ReportBaseComponent extends BaseComponent {
10545
10729
  this.deviceSize$
10546
10730
  .pipe(takeUntil(this._onDestroy$), tap((deviceSize) => this._deviceSizeChanged(deviceSize)))
10547
10731
  .subscribe();
10548
- this._portalService.windowResize$.pipe(takeUntil(this._onDestroy$)).subscribe(() => this._windowResized());
10732
+ merge(this._portalService.windowResize$, timer(1000))
10733
+ .pipe(takeUntil(this._onDestroy$))
10734
+ .subscribe(() => this._windowResized());
10549
10735
  this.context?.fireEvent('afterrender', this);
10550
10736
  }
10551
10737
  ngOnDestroy() {
@@ -11634,7 +11820,7 @@ class ReportViewBaseComponent extends BaseComponent {
11634
11820
  this.rowIndicator = Number(columns[0].MetaFieldTypeId) === 41;
11635
11821
  }
11636
11822
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: ReportViewBaseComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
11637
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.0.6", type: ReportViewBaseComponent, isStandalone: false, selector: "bnrc-report-view-base", inputs: { contextView: "contextView", viewSetting: "viewSetting", allColumns: "allColumns", isCheckList: "isCheckList", simpleInlineEdit: "simpleInlineEdit", inlineEditWithoutSelection: "inlineEditWithoutSelection", hideToolbar: "hideToolbar", hideTitle: "hideTitle", toolbarButtons: "toolbarButtons", allChecked: "allChecked", moDataList: "moDataList", UlvMainCtrlr: "UlvMainCtrlr", access: "access", 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", contentDensity: "contentDensity", rtl: "rtl", showOkCancelButtons: "showOkCancelButtons", title: "title", hasInlineDeleteButton: "hasInlineDeleteButton", hasInlineEditButton: "hasInlineEditButton", contextSetting: "contextSetting", gridFreeColumnSizing: "gridFreeColumnSizing", navigationArrow: "navigationArrow", cartableTemplates: "cartableTemplates", cartableChildsMo: "cartableChildsMo", pagingSetting: "pagingSetting", 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 }); }
11823
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.0.6", type: ReportViewBaseComponent, isStandalone: false, selector: "bnrc-report-view-base", inputs: { contextView: "contextView", viewSetting: "viewSetting", allColumns: "allColumns", isCheckList: "isCheckList", simpleInlineEdit: "simpleInlineEdit", inlineEditWithoutSelection: "inlineEditWithoutSelection", hideToolbar: "hideToolbar", hideTitle: "hideTitle", toolbarButtons: "toolbarButtons", allChecked: "allChecked", moDataList: "moDataList", UlvMainCtrlr: "UlvMainCtrlr", access: "access", 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", 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", 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 }); }
11638
11824
  }
11639
11825
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: ReportViewBaseComponent, decorators: [{
11640
11826
  type: Component,
@@ -11766,6 +11952,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
11766
11952
  type: Input
11767
11953
  }], contentHeight: [{
11768
11954
  type: Input
11955
+ }], effectiveReportLayout: [{
11956
+ type: Input
11769
11957
  }], contentDensity: [{
11770
11958
  type: Input
11771
11959
  }], rtl: [{
@@ -12917,6 +13105,7 @@ class SplitterComponent extends BaseComponent {
12917
13105
  super(...arguments);
12918
13106
  this.emptyClass = true;
12919
13107
  this.isBig = false;
13108
+ this.spliterResized = new EventEmitter();
12920
13109
  this._renderer = inject(Renderer2);
12921
13110
  this._portalService = inject(PortalService);
12922
13111
  }
@@ -12950,7 +13139,7 @@ class SplitterComponent extends BaseComponent {
12950
13139
  }), switchMap(() => {
12951
13140
  // تشخیص جهت در لحظه شروع درگ
12952
13141
  const isRtl = getComputedStyle(this.el.nativeElement).direction === 'rtl';
12953
- let previousElementSibling = this.el.nativeElement.previousElementSibling;
13142
+ let previousElementSibling = this.elDom || this.el.nativeElement.previousElementSibling;
12954
13143
  while (previousElementSibling &&
12955
13144
  previousElementSibling.tagName.toLocaleLowerCase() === 'bnrc-dynamic-layout') {
12956
13145
  previousElementSibling &&
@@ -12984,9 +13173,11 @@ class SplitterComponent extends BaseComponent {
12984
13173
  newWidth = event.clientX - rect.left;
12985
13174
  }
12986
13175
  if ((!this.minWidth || newWidth >= this.minWidth) && (!this.maxWidth || newWidth <= this.maxWidth)) {
12987
- this._renderer.setStyle(nextSibling, 'overflow', `hidden`);
12988
- this._renderer.setStyle(sibling, 'width', `${newWidth}px`);
13176
+ nextSibling && this._renderer.setStyle(nextSibling, 'overflow', `hidden`);
13177
+ const value = `${newWidth}px`;
13178
+ this._renderer.setStyle(sibling, 'width', value);
12989
13179
  this._renderer.setStyle(sibling, 'flex', 'none');
13180
+ this.spliterResized.emit(value);
12990
13181
  }
12991
13182
  }
12992
13183
  toggleResizingState(isResizing, nextSibling) {
@@ -12994,15 +13185,15 @@ class SplitterComponent extends BaseComponent {
12994
13185
  this._renderer[action](document.body, 'resizing-active');
12995
13186
  this._renderer[action](this.el.nativeElement, 'is-resizing');
12996
13187
  if (!isResizing) {
12997
- this._renderer.removeClass(nextSibling, 'tw-overflow-hidden');
13188
+ nextSibling && this._renderer.removeClass(nextSibling, 'tw-overflow-hidden');
12998
13189
  this._portalService.windowResize();
12999
13190
  }
13000
13191
  else {
13001
- this._renderer.addClass(nextSibling, 'tw-overflow-hidden');
13192
+ nextSibling && this._renderer.addClass(nextSibling, 'tw-overflow-hidden');
13002
13193
  }
13003
13194
  }
13004
13195
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: SplitterComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
13005
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.0.6", type: SplitterComponent, isStandalone: false, selector: "bnrc-splitter", inputs: { minWidth: "minWidth", maxWidth: "maxWidth", config: "config" }, host: { properties: { "class.empty-space": "this.emptyClass", "class.big": "this.isBig", "style.flex": "this.flex", "style.max-width.px": "this.elMaxWidth", "style.height.px": "this.elHeight" } }, usesInheritance: true, ngImport: i0, template: `<div class="splitter-container">
13196
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.0.6", type: SplitterComponent, isStandalone: false, selector: "bnrc-splitter", inputs: { minWidth: "minWidth", maxWidth: "maxWidth", config: "config", elDom: "elDom" }, outputs: { spliterResized: "spliterResized" }, host: { properties: { "class.empty-space": "this.emptyClass", "class.big": "this.isBig", "style.flex": "this.flex", "style.max-width.px": "this.elMaxWidth", "style.height.px": "this.elHeight" } }, usesInheritance: true, ngImport: i0, template: `<div class="splitter-container">
13006
13197
  <div class="splitter-line"></div>
13007
13198
  <div class="grip-handle">
13008
13199
  <svg viewBox="0 0 24 24" fill="currentColor">
@@ -13014,7 +13205,7 @@ class SplitterComponent extends BaseComponent {
13014
13205
  <circle cx="15" cy="16" r="1.5" />
13015
13206
  </svg>
13016
13207
  </div>
13017
- </div>`, isInline: true, styles: [":host{display:flex;align-items:center;justify-content:center;width:12px;cursor:col-resize;z-index:50;-webkit-user-select:none;user-select:none;position:relative;background:var(--sapBackgroundColor)}.splitter-container{height:100%;width:100%;display:flex;align-items:center;justify-content:center;position:relative}.splitter-line{width:1px;height:90%;background:linear-gradient(to bottom,transparent 0%,rgba(203,213,225,1) 15%,rgba(203,213,225,1) 85%,transparent 100%);transition:all .2s}.grip-handle{position:absolute;width:24px;height:32px;background:#fff;border:1px solid #e2e8f0;border-radius:6px;display:flex;align-items:center;justify-content:center;box-shadow:0 2px 4px #0000000d;transition:all .2s;color:#94a3b8}.grip-handle svg{width:14px;height:14px}:host:hover .splitter-line,.is-resizing .splitter-line{background:linear-gradient(to bottom,transparent 0%,#3b82f6 15%,#3b82f6 85%,transparent 100%);width:2px}:host:hover .grip-handle,.is-resizing .grip-handle{border-color:#3b82f6;color:#3b82f6;box-shadow:0 4px 6px -1px #3b82f633;transform:scale(1.05)}\n"] }); }
13208
+ </div>`, isInline: true, styles: [":host{display:flex;align-items:center;justify-content:center;width:12px;cursor:col-resize;z-index:50;-webkit-user-select:none;user-select:none;position:relative;background:var(--sapBackgroundColor)}.splitter-container{height:100%;width:100%;display:flex;align-items:center;justify-content:center;position:relative}.splitter-line{width:1px;height:90%;background:linear-gradient(to bottom,transparent 0%,rgba(203,213,225,1) 15%,rgba(203,213,225,1) 85%,transparent 100%);transition:all .2s}.grip-handle{position:absolute;width:17px;height:20px;background:#fff;border:1px solid #e2e8f0;border-radius:6px;display:flex;align-items:center;justify-content:center;box-shadow:0 2px 4px #0000000d;transition:all .2s;color:#94a3b8}.grip-handle svg{width:14px;height:14px}:host:hover .splitter-line,.is-resizing .splitter-line{background:linear-gradient(to bottom,transparent 0%,#3b82f6 15%,#3b82f6 85%,transparent 100%);width:2px}:host:hover .grip-handle,.is-resizing .grip-handle{border-color:#3b82f6;color:#3b82f6;box-shadow:0 4px 6px -1px #3b82f633;transform:scale(1.05)}\n"] }); }
13018
13209
  }
13019
13210
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: SplitterComponent, decorators: [{
13020
13211
  type: Component,
@@ -13030,7 +13221,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
13030
13221
  <circle cx="15" cy="16" r="1.5" />
13031
13222
  </svg>
13032
13223
  </div>
13033
- </div>`, styles: [":host{display:flex;align-items:center;justify-content:center;width:12px;cursor:col-resize;z-index:50;-webkit-user-select:none;user-select:none;position:relative;background:var(--sapBackgroundColor)}.splitter-container{height:100%;width:100%;display:flex;align-items:center;justify-content:center;position:relative}.splitter-line{width:1px;height:90%;background:linear-gradient(to bottom,transparent 0%,rgba(203,213,225,1) 15%,rgba(203,213,225,1) 85%,transparent 100%);transition:all .2s}.grip-handle{position:absolute;width:24px;height:32px;background:#fff;border:1px solid #e2e8f0;border-radius:6px;display:flex;align-items:center;justify-content:center;box-shadow:0 2px 4px #0000000d;transition:all .2s;color:#94a3b8}.grip-handle svg{width:14px;height:14px}:host:hover .splitter-line,.is-resizing .splitter-line{background:linear-gradient(to bottom,transparent 0%,#3b82f6 15%,#3b82f6 85%,transparent 100%);width:2px}:host:hover .grip-handle,.is-resizing .grip-handle{border-color:#3b82f6;color:#3b82f6;box-shadow:0 4px 6px -1px #3b82f633;transform:scale(1.05)}\n"] }]
13224
+ </div>`, styles: [":host{display:flex;align-items:center;justify-content:center;width:12px;cursor:col-resize;z-index:50;-webkit-user-select:none;user-select:none;position:relative;background:var(--sapBackgroundColor)}.splitter-container{height:100%;width:100%;display:flex;align-items:center;justify-content:center;position:relative}.splitter-line{width:1px;height:90%;background:linear-gradient(to bottom,transparent 0%,rgba(203,213,225,1) 15%,rgba(203,213,225,1) 85%,transparent 100%);transition:all .2s}.grip-handle{position:absolute;width:17px;height:20px;background:#fff;border:1px solid #e2e8f0;border-radius:6px;display:flex;align-items:center;justify-content:center;box-shadow:0 2px 4px #0000000d;transition:all .2s;color:#94a3b8}.grip-handle svg{width:14px;height:14px}:host:hover .splitter-line,.is-resizing .splitter-line{background:linear-gradient(to bottom,transparent 0%,#3b82f6 15%,#3b82f6 85%,transparent 100%);width:2px}:host:hover .grip-handle,.is-resizing .grip-handle{border-color:#3b82f6;color:#3b82f6;box-shadow:0 4px 6px -1px #3b82f633;transform:scale(1.05)}\n"] }]
13034
13225
  }], propDecorators: { emptyClass: [{
13035
13226
  type: HostBinding,
13036
13227
  args: ['class.empty-space']
@@ -13046,12 +13237,237 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
13046
13237
  }], elHeight: [{
13047
13238
  type: HostBinding,
13048
13239
  args: ['style.height.px']
13240
+ }], spliterResized: [{
13241
+ type: Output
13049
13242
  }], minWidth: [{
13050
13243
  type: Input
13051
13244
  }], maxWidth: [{
13052
13245
  type: Input
13053
13246
  }], config: [{
13054
13247
  type: Input
13248
+ }], elDom: [{
13249
+ type: Input
13250
+ }] } });
13251
+
13252
+ /**
13253
+ * Fills remaining vertical space for the host element.
13254
+ *
13255
+ * - **viewport** — page-level: uses `window.innerHeight` and offset from the top of the viewport.
13256
+ * - **container** — nested layouts: bounds from the **resolved container** (`[containerDom]` if set,
13257
+ * else nearest ancestor with `fillEmptySpace`, else `document.documentElement`).
13258
+ *
13259
+ * Vertical scroll ownership is **not** decided here; use `ScrollLayoutContextHolder` (`nested` | `isolated` | `root`)
13260
+ * from `barsa-novin-ray-core` on the page shell.
13261
+ *
13262
+ * @deprecated Do not use this directive as the primary way to **size individual reports** (grids, calendars).
13263
+ * Prefer the report layout policy / scroll shell (`resolveReportLayoutPolicy`, `report-grid-wrapper`). Filling
13264
+ * **page or shell containers** remains an appropriate use case.
13265
+ **/
13266
+ class FillEmptySpaceDirective extends BaseDirective {
13267
+ constructor() {
13268
+ super(...arguments);
13269
+ /**
13270
+ * `viewport` — fill against the browser viewport (default).
13271
+ * `container` — fill inside resolved container: optional `[containerDom]`, else nearest parent `[fillEmptySpace]`, else document root.
13272
+ */
13273
+ this.mode = 'viewport';
13274
+ this.heightChanged = new EventEmitter();
13275
+ this._rafId = null;
13276
+ this._viewReady = false;
13277
+ this._onWindowResize = () => this.scheduleMeasure();
13278
+ }
13279
+ ngAfterViewInit() {
13280
+ this._viewReady = true;
13281
+ this.syncFillWatchersAndMeasure();
13282
+ }
13283
+ ngOnChanges(_changes) {
13284
+ if (!this._viewReady) {
13285
+ return;
13286
+ }
13287
+ this.syncFillWatchersAndMeasure();
13288
+ }
13289
+ ngOnDestroy() {
13290
+ this.cancelScheduledMeasure();
13291
+ this.teardownFillLayoutWatchers();
13292
+ super.ngOnDestroy();
13293
+ }
13294
+ Refresh() {
13295
+ this.measureAndApply();
13296
+ }
13297
+ scheduleMeasure() {
13298
+ if (this._rafId !== null) {
13299
+ cancelAnimationFrame(this._rafId);
13300
+ }
13301
+ this._rafId = requestAnimationFrame(() => {
13302
+ this._rafId = null;
13303
+ this.measureAndApply();
13304
+ });
13305
+ }
13306
+ cancelScheduledMeasure() {
13307
+ if (this._rafId !== null) {
13308
+ cancelAnimationFrame(this._rafId);
13309
+ this._rafId = null;
13310
+ }
13311
+ }
13312
+ syncFillWatchersAndMeasure() {
13313
+ this.teardownFillLayoutWatchers();
13314
+ this.cancelScheduledMeasure();
13315
+ if (this.disable) {
13316
+ return;
13317
+ }
13318
+ if (this.height != null) {
13319
+ this.measureAndApply();
13320
+ return;
13321
+ }
13322
+ this.setupFillLayoutWatchers();
13323
+ this.scheduleMeasure();
13324
+ }
13325
+ setupFillLayoutWatchers() {
13326
+ if (typeof ResizeObserver === 'undefined') {
13327
+ window.addEventListener('resize', this._onWindowResize);
13328
+ return;
13329
+ }
13330
+ const roTarget = this.getContainerElement();
13331
+ this._ro = new ResizeObserver(() => this.scheduleMeasure());
13332
+ this._ro.observe(roTarget);
13333
+ window.addEventListener('resize', this._onWindowResize);
13334
+ }
13335
+ teardownFillLayoutWatchers() {
13336
+ this._ro?.disconnect();
13337
+ this._ro = undefined;
13338
+ window.removeEventListener('resize', this._onWindowResize);
13339
+ }
13340
+ measureAndApply() {
13341
+ if (this.disable) {
13342
+ return;
13343
+ }
13344
+ const dom = this._el.nativeElement;
13345
+ if (dom.getClientRects().length === 0) {
13346
+ return;
13347
+ }
13348
+ if (this.height != null) {
13349
+ this.applyFixedHeight(dom);
13350
+ return;
13351
+ }
13352
+ const hostRect = dom.getBoundingClientRect();
13353
+ const containerRect = this.getContainerMetrics();
13354
+ const offsetTop = this.getOffsetTop(hostRect, containerRect);
13355
+ const decrementPx = this.parseCssSize(this.decrement);
13356
+ const available = this.calculateAvailableHeight(containerRect.height, offsetTop, decrementPx);
13357
+ this.applyFillHeight(dom, available);
13358
+ }
13359
+ /**
13360
+ * Element used for ResizeObserver and for `container` mode metrics:
13361
+ * `[containerDom]` → parent `closest('[fillEmptySpace]')` → `document.documentElement`.
13362
+ * Uses `parentElement` before `closest` so the host itself is not selected.
13363
+ */
13364
+ getContainerElement() {
13365
+ if (this.containerDom) {
13366
+ return this.containerDom;
13367
+ }
13368
+ const host = this._el.nativeElement;
13369
+ const parentFill = host.parentElement?.closest('[fillEmptySpace]');
13370
+ if (parentFill) {
13371
+ return parentFill;
13372
+ }
13373
+ return document.documentElement;
13374
+ }
13375
+ getContainerMetrics() {
13376
+ if (this.mode === 'viewport') {
13377
+ // Same spirit as legacy `100svh`: viewport height; explicit container is not used for sizing.
13378
+ return { top: 0, height: window.innerHeight };
13379
+ }
13380
+ const r = this.getContainerElement().getBoundingClientRect();
13381
+ return { top: r.top, height: r.height };
13382
+ }
13383
+ getOffsetTop(hostRect, containerRect) {
13384
+ return this.dontUseTopBound ? 0 : hostRect.top - containerRect.top;
13385
+ }
13386
+ calculateAvailableHeight(containerHeight, offsetTop, decrementPx) {
13387
+ return Math.max(0, containerHeight - offsetTop - decrementPx);
13388
+ }
13389
+ applyFillHeight(dom, px) {
13390
+ const prop = this.getStyleProperty();
13391
+ if (prop === 'min-height' || prop === 'max-height') {
13392
+ this._renderer2.setStyle(dom, 'height', 'auto');
13393
+ }
13394
+ this._renderer2.setStyle(dom, prop, `${px}px`);
13395
+ this.heightChanged.emit();
13396
+ }
13397
+ applyFixedHeight(dom) {
13398
+ if (this.setMinHeight) {
13399
+ this._renderer2.setStyle(dom, 'height', 'auto');
13400
+ }
13401
+ if (this.setMaxHeight) {
13402
+ this._renderer2.setStyle(dom, 'height', 'auto');
13403
+ }
13404
+ const prop = this.setMinHeight ? 'min-height' : this.setMaxHeight ? 'max-height' : 'height';
13405
+ this._renderer2.setStyle(dom, prop, `${this.height}px`);
13406
+ this.heightChanged.emit();
13407
+ }
13408
+ getStyleProperty() {
13409
+ if (this.setMinHeight) {
13410
+ return 'min-height';
13411
+ }
13412
+ if (this.setMaxHeight) {
13413
+ return 'max-height';
13414
+ }
13415
+ return 'height';
13416
+ }
13417
+ parseCssSize(value) {
13418
+ if (value == null || value === '') {
13419
+ return 0;
13420
+ }
13421
+ if (typeof value === 'number' && !Number.isNaN(value)) {
13422
+ return value;
13423
+ }
13424
+ const s = String(value).trim().toLowerCase();
13425
+ if (!s) {
13426
+ return 0;
13427
+ }
13428
+ if (s.endsWith('rem')) {
13429
+ const n = parseFloat(s);
13430
+ if (Number.isNaN(n)) {
13431
+ return 0;
13432
+ }
13433
+ const rootPx = parseFloat(getComputedStyle(document.documentElement).fontSize) || 16;
13434
+ return n * rootPx;
13435
+ }
13436
+ if (s.endsWith('px')) {
13437
+ const n = parseFloat(s);
13438
+ return Number.isNaN(n) ? 0 : n;
13439
+ }
13440
+ const n = parseFloat(s);
13441
+ return Number.isNaN(n) ? 0 : n;
13442
+ }
13443
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: FillEmptySpaceDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
13444
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.0.6", type: FillEmptySpaceDirective, isStandalone: false, selector: "[fillEmptySpace]", inputs: { mode: "mode", containerDom: "containerDom", decrement: "decrement", disable: "disable", height: "height", dontUseTopBound: "dontUseTopBound", setMinHeight: "setMinHeight", setMaxHeight: "setMaxHeight" }, outputs: { heightChanged: "heightChanged" }, exportAs: ["fillEmptySpace"], usesInheritance: true, usesOnChanges: true, ngImport: i0 }); }
13445
+ }
13446
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: FillEmptySpaceDirective, decorators: [{
13447
+ type: Directive,
13448
+ args: [{
13449
+ selector: '[fillEmptySpace]',
13450
+ exportAs: 'fillEmptySpace',
13451
+ standalone: false
13452
+ }]
13453
+ }], propDecorators: { mode: [{
13454
+ type: Input
13455
+ }], containerDom: [{
13456
+ type: Input
13457
+ }], decrement: [{
13458
+ type: Input
13459
+ }], disable: [{
13460
+ type: Input
13461
+ }], height: [{
13462
+ type: Input
13463
+ }], dontUseTopBound: [{
13464
+ type: Input
13465
+ }], setMinHeight: [{
13466
+ type: Input
13467
+ }], setMaxHeight: [{
13468
+ type: Input
13469
+ }], heightChanged: [{
13470
+ type: Output
13055
13471
  }] } });
13056
13472
 
13057
13473
  class MasterDetailsPageComponent extends PageWithFormHandlerBaseComponent {
@@ -13061,8 +13477,10 @@ class MasterDetailsPageComponent extends PageWithFormHandlerBaseComponent {
13061
13477
  this.sectionClass = true;
13062
13478
  this.ismodal = false;
13063
13479
  this.isinsideview = false;
13480
+ this._scrollLayoutContext = inject(ScrollLayoutContextHolder);
13064
13481
  }
13065
13482
  ngOnInit() {
13483
+ this._scrollLayoutContext.setMode('isolated');
13066
13484
  this.settings = BarsaApi.Common.Util.TryGetValue(this._activatedRoute, 'data._value.pageData.Component.Settings', null);
13067
13485
  const isModal = this.settings?.IsModal;
13068
13486
  if (isModal) {
@@ -13091,42 +13509,56 @@ class MasterDetailsPageComponent extends PageWithFormHandlerBaseComponent {
13091
13509
  ngOnDestroy() {
13092
13510
  super.ngOnDestroy();
13093
13511
  // add ngondestroy because to call routingservice ngondestroy.
13094
- // if i dont add this ngondestroy in routingservice do not call.
13512
+ // if i dont add this ngondestroy in routingservice do not call.
13095
13513
  }
13096
13514
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: MasterDetailsPageComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
13097
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.0.6", type: MasterDetailsPageComponent, isStandalone: false, selector: "bnrc-master-details-page", host: { properties: { "style.position": "this._position", "class.section": "this.sectionClass", "class.modal": "this.ismodal", "class.insideview": "this.isinsideview" } }, providers: [RoutingService, ContainerService], usesInheritance: true, ngImport: i0, template: `
13098
- <div class="tw-flex tw-h-full tw-w-full tw-flex-col md:tw-flex-row">
13515
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.0.6", type: MasterDetailsPageComponent, isStandalone: false, selector: "bnrc-master-details-page", host: { properties: { "style.position": "this._position", "class.section": "this.sectionClass", "class.modal": "this.ismodal", "class.insideview": "this.isinsideview" } }, providers: [RoutingService, ContainerService, ScrollLayoutContextHolder], usesInheritance: true, ngImport: i0, template: `
13516
+ <div
13517
+ class="tw-flex tw-h-full tw-w-full tw-flex-col md:tw-flex-row tw-p-2"
13518
+ fillEmptySpace
13519
+ style="box-sizing: border-box;"
13520
+ >
13099
13521
  <!-- لیست -->
13100
13522
  <div class="tw-w-full md:tw-w-96 master">
13101
13523
  <ng-container #containerRef></ng-container>
13102
13524
  </div>
13103
13525
  <bnrc-splitter></bnrc-splitter>
13104
13526
  <!-- جزئیات -->
13105
- <div class="fd-dynamic-page__content tw-w-full md:tw-flex-1 !tw-overflow-hidden details tw-min-w-0 tw-p-0">
13527
+ <div
13528
+ class="fd-dynamic-page__content tw-flex tw-flex-1 tw-flex-col tw-h-full tw-min-h-0 tw-w-full md:tw-flex-1
13529
+ !tw-overflow-hidden details tw-min-w-0 tw-p-0"
13530
+ >
13106
13531
  <router-outlet name="details"></router-outlet>
13107
13532
  </div>
13108
13533
  </div>
13109
13534
  <router-outlet></router-outlet>
13110
13535
  <router-outlet name="dialog"></router-outlet>
13111
- `, 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: SplitterComponent, selector: "bnrc-splitter", inputs: ["minWidth", "maxWidth", "config"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
13536
+ `, isInline: true, styles: [":host{display:block;box-sizing:border-box}:host .fd-dynamic-page__content ::ng-deep bnrc-empty-page{flex:1 1 auto;min-height:0}\n"], dependencies: [{ kind: "directive", type: i1.RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: SplitterComponent, selector: "bnrc-splitter", inputs: ["minWidth", "maxWidth", "config", "elDom"], outputs: ["spliterResized"] }, { kind: "directive", type: FillEmptySpaceDirective, selector: "[fillEmptySpace]", inputs: ["mode", "containerDom", "decrement", "disable", "height", "dontUseTopBound", "setMinHeight", "setMaxHeight"], outputs: ["heightChanged"], exportAs: ["fillEmptySpace"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
13112
13537
  }
13113
13538
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: MasterDetailsPageComponent, decorators: [{
13114
13539
  type: Component,
13115
13540
  args: [{ selector: 'bnrc-master-details-page', template: `
13116
- <div class="tw-flex tw-h-full tw-w-full tw-flex-col md:tw-flex-row">
13541
+ <div
13542
+ class="tw-flex tw-h-full tw-w-full tw-flex-col md:tw-flex-row tw-p-2"
13543
+ fillEmptySpace
13544
+ style="box-sizing: border-box;"
13545
+ >
13117
13546
  <!-- لیست -->
13118
13547
  <div class="tw-w-full md:tw-w-96 master">
13119
13548
  <ng-container #containerRef></ng-container>
13120
13549
  </div>
13121
13550
  <bnrc-splitter></bnrc-splitter>
13122
13551
  <!-- جزئیات -->
13123
- <div class="fd-dynamic-page__content tw-w-full md:tw-flex-1 !tw-overflow-hidden details tw-min-w-0 tw-p-0">
13552
+ <div
13553
+ class="fd-dynamic-page__content tw-flex tw-flex-1 tw-flex-col tw-h-full tw-min-h-0 tw-w-full md:tw-flex-1
13554
+ !tw-overflow-hidden details tw-min-w-0 tw-p-0"
13555
+ >
13124
13556
  <router-outlet name="details"></router-outlet>
13125
13557
  </div>
13126
13558
  </div>
13127
13559
  <router-outlet></router-outlet>
13128
13560
  <router-outlet name="dialog"></router-outlet>
13129
- `, providers: [RoutingService, ContainerService], changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, styles: [":host{display:block}\n"] }]
13561
+ `, providers: [RoutingService, ContainerService, ScrollLayoutContextHolder], changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, styles: [":host{display:block;box-sizing:border-box}:host .fd-dynamic-page__content ::ng-deep bnrc-empty-page{flex:1 1 auto;min-height:0}\n"] }]
13130
13562
  }], propDecorators: { _position: [{
13131
13563
  type: HostBinding,
13132
13564
  args: ['style.position']
@@ -13158,123 +13590,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
13158
13590
  <ng-container #containerBottomRef></ng-container> `, changeDetection: ChangeDetectionStrategy.OnPush, providers: [RoutingService], standalone: false, styles: [":host{min-height:100svh}\n"] }]
13159
13591
  }] });
13160
13592
 
13161
- class FillEmptySpaceDirective extends BaseDirective {
13162
- constructor() {
13163
- super(...arguments);
13164
- this.heightChanged = new EventEmitter();
13165
- this._height = '100svh';
13166
- this.topBound = '';
13167
- this.oldTopBound = '';
13168
- }
13169
- ngAfterViewInit() {
13170
- super.ngAfterViewInit();
13171
- if (this.disable) {
13172
- return;
13173
- }
13174
- this._handleResize();
13175
- }
13176
- ngOnDestroy() {
13177
- super.ngOnDestroy();
13178
- this._ro?.disconnect();
13179
- }
13180
- Refresh() {
13181
- this._setHeightOfFormContent();
13182
- }
13183
- _setHeight() {
13184
- setTimeout(() => {
13185
- this._setHeightOfFormContent();
13186
- if (this.topBound === '0px') {
13187
- setTimeout(() => {
13188
- this._setHeightOfFormContent();
13189
- }, 1000);
13190
- }
13191
- }, 100);
13192
- }
13193
- _handleResize() {
13194
- if (typeof ResizeObserver === 'undefined') {
13195
- return;
13196
- } // چک کردن پشتیبانی مرورگر به جای try-catch
13197
- this._ro = new ResizeObserver((entries) => {
13198
- const entry = entries[0];
13199
- // چک می‌کنیم که المنت مخفی (display: none) نباشد
13200
- if (entry && entry.contentRect.height > 0) {
13201
- requestAnimationFrame(() => {
13202
- this._setHeight();
13203
- });
13204
- }
13205
- });
13206
- if (this._el?.nativeElement) {
13207
- this._ro.observe(this._el.nativeElement);
13208
- }
13209
- }
13210
- _setHeightOfFormContent() {
13211
- const dom = this._el.nativeElement;
13212
- const bound = dom.getBoundingClientRect();
13213
- this.topBound = `${bound.top}px`;
13214
- let decrement = this.decrement;
13215
- if (this.oldTopBound && this.oldTopBound === this.topBound) {
13216
- return;
13217
- }
13218
- if (this.setMinHeight) {
13219
- this._renderer2.setStyle(dom, 'height', `auto`);
13220
- }
13221
- if (this.setMaxHeight) {
13222
- this._renderer2.setStyle(dom, 'height', `auto`);
13223
- }
13224
- if (this.height) {
13225
- let prop = 'height';
13226
- this.setMinHeight && (prop = 'min-height');
13227
- this.setMaxHeight && (prop = 'max-height');
13228
- this._renderer2.setStyle(dom, prop, `${this.height}px`);
13229
- this.heightChanged.emit();
13230
- return;
13231
- }
13232
- if (this.containerDom) {
13233
- this._height = `${this.containerDom.getBoundingClientRect().height}px`;
13234
- }
13235
- if (decrement) {
13236
- decrement = ` - ${decrement}`;
13237
- }
13238
- else {
13239
- decrement = '';
13240
- }
13241
- if (this.dontUseTopBound) {
13242
- this.topBound = '0px';
13243
- }
13244
- this.oldTopBound = this.topBound;
13245
- if (bound) {
13246
- this._renderer2.setStyle(dom, this.setMinHeight ? 'min-height' : 'height', `calc(${this._height} - ${this.topBound}${decrement})`);
13247
- }
13248
- this.heightChanged.emit();
13249
- }
13250
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: FillEmptySpaceDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
13251
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.0.6", type: FillEmptySpaceDirective, isStandalone: false, selector: "[fillEmptySpace]", inputs: { containerDom: "containerDom", decrement: "decrement", disable: "disable", height: "height", dontUseTopBound: "dontUseTopBound", setMinHeight: "setMinHeight", setMaxHeight: "setMaxHeight" }, outputs: { heightChanged: "heightChanged" }, exportAs: ["fillEmptySpace"], usesInheritance: true, ngImport: i0 }); }
13252
- }
13253
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: FillEmptySpaceDirective, decorators: [{
13254
- type: Directive,
13255
- args: [{
13256
- selector: '[fillEmptySpace]',
13257
- exportAs: 'fillEmptySpace',
13258
- standalone: false
13259
- }]
13260
- }], propDecorators: { containerDom: [{
13261
- type: Input
13262
- }], decrement: [{
13263
- type: Input
13264
- }], disable: [{
13265
- type: Input
13266
- }], height: [{
13267
- type: Input
13268
- }], dontUseTopBound: [{
13269
- type: Input
13270
- }], setMinHeight: [{
13271
- type: Input
13272
- }], setMaxHeight: [{
13273
- type: Input
13274
- }], heightChanged: [{
13275
- type: Output
13276
- }] } });
13277
-
13278
13593
  class PortalPageSidebarComponent extends PageBaseComponent {
13279
13594
  constructor() {
13280
13595
  super(...arguments);
@@ -13289,7 +13604,7 @@ class PortalPageSidebarComponent extends PageBaseComponent {
13289
13604
  <div class="sidebar" fillEmptySpace><ng-container #containerRef></ng-container></div>
13290
13605
  <div class="mainside"><router-outlet name="mainside"></router-outlet></div>
13291
13606
  </div>
13292
- <router-outlet></router-outlet>`, isInline: true, dependencies: [{ kind: "directive", type: i1.RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "directive", type: FillEmptySpaceDirective, selector: "[fillEmptySpace]", inputs: ["containerDom", "decrement", "disable", "height", "dontUseTopBound", "setMinHeight", "setMaxHeight"], outputs: ["heightChanged"], exportAs: ["fillEmptySpace"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
13607
+ <router-outlet></router-outlet>`, isInline: true, dependencies: [{ kind: "directive", type: i1.RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "directive", type: FillEmptySpaceDirective, selector: "[fillEmptySpace]", inputs: ["mode", "containerDom", "decrement", "disable", "height", "dontUseTopBound", "setMinHeight", "setMaxHeight"], outputs: ["heightChanged"], exportAs: ["fillEmptySpace"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
13293
13608
  }
13294
13609
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: PortalPageSidebarComponent, decorators: [{
13295
13610
  type: Component,
@@ -14577,69 +14892,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
14577
14892
  type: Input
14578
14893
  }] } });
14579
14894
 
14580
- class DynamicTileGroupComponent extends BaseDynamicComponent {
14581
- constructor() {
14582
- super(...arguments);
14583
- this.tilesDropped = new EventEmitter();
14584
- this.hideAppTileClick = new EventEmitter();
14585
- this.renameAppTileClick = new EventEmitter();
14586
- this.changeGroupAppTileClick = new EventEmitter();
14587
- this.toggleGroup = new EventEmitter();
14588
- this.resetGroup = new EventEmitter();
14589
- this.deleteGroup = new EventEmitter();
14590
- }
14591
- ngOnChanges(changes) {
14592
- super.ngOnChanges(changes);
14593
- const { appTileGroup } = changes;
14594
- if (appTileGroup && !appTileGroup.firstChange) {
14595
- this._renderComponentInstance();
14596
- }
14597
- }
14598
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: DynamicTileGroupComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
14599
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.0.6", type: DynamicTileGroupComponent, isStandalone: false, selector: "bnrc-dynamic-tile-group,[dynamictilegroup]", inputs: { appTileGroup: "appTileGroup", tabRef: "tabRef", stackContent: "stackContent", cssStyles: "cssStyles", edit: "edit", rtl: "rtl", isAppTileSubGroup: "isAppTileSubGroup", deviceSize: "deviceSize", isLast: "isLast" }, outputs: { tilesDropped: "tilesDropped", hideAppTileClick: "hideAppTileClick", renameAppTileClick: "renameAppTileClick", changeGroupAppTileClick: "changeGroupAppTileClick", toggleGroup: "toggleGroup", resetGroup: "resetGroup", deleteGroup: "deleteGroup" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: `<ng-container #componentContainer></ng-container>`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
14600
- }
14601
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: DynamicTileGroupComponent, decorators: [{
14602
- type: Component,
14603
- args: [{
14604
- selector: 'bnrc-dynamic-tile-group,[dynamictilegroup]',
14605
- template: `<ng-container #componentContainer></ng-container>`,
14606
- changeDetection: ChangeDetectionStrategy.OnPush,
14607
- standalone: false
14608
- }]
14609
- }], propDecorators: { appTileGroup: [{
14610
- type: Input
14611
- }], tabRef: [{
14612
- type: Input
14613
- }], stackContent: [{
14614
- type: Input
14615
- }], cssStyles: [{
14616
- type: Input
14617
- }], edit: [{
14618
- type: Input
14619
- }], rtl: [{
14620
- type: Input
14621
- }], isAppTileSubGroup: [{
14622
- type: Input
14623
- }], deviceSize: [{
14624
- type: Input
14625
- }], isLast: [{
14626
- type: Input
14627
- }], tilesDropped: [{
14628
- type: Output
14629
- }], hideAppTileClick: [{
14630
- type: Output
14631
- }], renameAppTileClick: [{
14632
- type: Output
14633
- }], changeGroupAppTileClick: [{
14634
- type: Output
14635
- }], toggleGroup: [{
14636
- type: Output
14637
- }], resetGroup: [{
14638
- type: Output
14639
- }], deleteGroup: [{
14640
- type: Output
14641
- }] } });
14642
-
14643
14895
  class DynamicUlvToolbarComponent extends BaseDynamicComponent {
14644
14896
  constructor() {
14645
14897
  super(...arguments);
@@ -15641,6 +15893,7 @@ class RenderUlvViewerDirective extends BaseDirective {
15641
15893
  this._injector = inject(Injector);
15642
15894
  this._vcr = inject(ViewContainerRef);
15643
15895
  this._cdr = inject(ChangeDetectorRef);
15896
+ this._renderer = inject(Renderer2);
15644
15897
  }
15645
15898
  ngAfterViewInit() {
15646
15899
  super.ngAfterViewInit();
@@ -15671,6 +15924,7 @@ class RenderUlvViewerDirective extends BaseDirective {
15671
15924
  .getComponent(moduleName, modulePath, componentName, selector, this._injector)
15672
15925
  .pipe(takeUntil(this._onDestroy$), tap((component) => {
15673
15926
  component.instance.id = getUniqueId(4);
15927
+ this._renderer.addClass(component.location.nativeElement, 'ulv-viewer');
15674
15928
  component.instance.context = context;
15675
15929
  component.instance.isReportPage = this.isReportPage;
15676
15930
  component.instance.layoutInfo = this.layoutInfo;
@@ -17694,6 +17948,109 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
17694
17948
  args: [{ providedIn: 'root' }]
17695
17949
  }], ctorParameters: () => [] });
17696
17950
 
17951
+ class EntitySettingsStore {
17952
+ constructor() {
17953
+ this.settingsService = inject(BaseSettingsService);
17954
+ this.subjects = new Map();
17955
+ }
17956
+ // ---------------------------------------------------
17957
+ // Subject
17958
+ // ---------------------------------------------------
17959
+ // ---------------------------------------------------
17960
+ // Observable
17961
+ // ---------------------------------------------------
17962
+ select$(entityId) {
17963
+ return this.getSubject(entityId).asObservable();
17964
+ }
17965
+ // ---------------------------------------------------
17966
+ // Snapshot
17967
+ // ---------------------------------------------------
17968
+ getSnapshot(entityId) {
17969
+ return this.getSubject(entityId).value;
17970
+ }
17971
+ // ---------------------------------------------------
17972
+ // Load
17973
+ // ---------------------------------------------------
17974
+ load(entityId) {
17975
+ const key = this.buildKey(entityId);
17976
+ const subject = this.getSubject(entityId);
17977
+ return this.settingsService.getSetting(key).pipe(tap$1((config) => {
17978
+ subject.next(config);
17979
+ }));
17980
+ }
17981
+ // ---------------------------------------------------
17982
+ // Save
17983
+ // ---------------------------------------------------
17984
+ save(entityId, partial) {
17985
+ const key = this.buildKey(entityId);
17986
+ const subject = this.getSubject(entityId);
17987
+ const current = subject.value ?? {};
17988
+ const updated = {
17989
+ ...current,
17990
+ ...partial
17991
+ };
17992
+ return this.settingsService.saveSetting(key, updated).pipe(tap$1(() => {
17993
+ subject.next(updated);
17994
+ }));
17995
+ }
17996
+ // ---------------------------------------------------
17997
+ // Replace
17998
+ // ---------------------------------------------------
17999
+ replace(entityId, value) {
18000
+ const key = this.buildKey(entityId);
18001
+ const subject = this.getSubject(entityId);
18002
+ return this.settingsService.saveSetting(key, value).pipe(tap$1(() => {
18003
+ subject.next(value);
18004
+ }));
18005
+ }
18006
+ // ---------------------------------------------------
18007
+ // Reset
18008
+ // ---------------------------------------------------
18009
+ reset(entityId) {
18010
+ const key = this.buildKey(entityId);
18011
+ const subject = this.getSubject(entityId);
18012
+ subject.next(null);
18013
+ return this.settingsService.removeSetting(key);
18014
+ }
18015
+ // ---------------------------------------------------
18016
+ // Cleanup
18017
+ // ---------------------------------------------------
18018
+ destroy(entityId) {
18019
+ const subject = this.subjects.get(entityId);
18020
+ if (subject) {
18021
+ subject.complete();
18022
+ this.subjects.delete(entityId);
18023
+ }
18024
+ }
18025
+ getSubject(entityId) {
18026
+ if (!this.subjects.has(entityId)) {
18027
+ this.subjects.set(entityId, new BehaviorSubject(null));
18028
+ }
18029
+ return this.subjects.get(entityId);
18030
+ }
18031
+ // ---------------------------------------------------
18032
+ // Utils
18033
+ // ---------------------------------------------------
18034
+ buildKey(entityId) {
18035
+ return `${this.keyPrefix}${entityId}`;
18036
+ }
18037
+ }
18038
+
18039
+ class CalendarSettingsStore extends EntitySettingsStore {
18040
+ constructor() {
18041
+ super(...arguments);
18042
+ this.keyPrefix = 'cal_cfg_';
18043
+ }
18044
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: CalendarSettingsStore, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
18045
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: CalendarSettingsStore, providedIn: 'root' }); }
18046
+ }
18047
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: CalendarSettingsStore, decorators: [{
18048
+ type: Injectable,
18049
+ args: [{
18050
+ providedIn: 'root'
18051
+ }]
18052
+ }] });
18053
+
17697
18054
  class FormNewComponent extends BaseComponent {
17698
18055
  constructor() {
17699
18056
  super(...arguments);
@@ -18045,7 +18402,6 @@ class ReportNavigatorComponent extends BaseComponent {
18045
18402
  /** Inserted by Angular inject() migration for backwards compatibility */
18046
18403
  constructor() {
18047
18404
  super();
18048
- this.minheight = '100svh';
18049
18405
  this.isMobile = getDeviceIsDesktop();
18050
18406
  this._activatedRoute = inject(ActivatedRoute);
18051
18407
  this._portalService = inject(PortalService);
@@ -18054,17 +18410,20 @@ class ReportNavigatorComponent extends BaseComponent {
18054
18410
  this._cdr = inject(ChangeDetectorRef);
18055
18411
  this._loadingSource = new BehaviorSubject(false);
18056
18412
  this._routingService = inject(RoutingService, { optional: true, skipSelf: true });
18413
+ this._runtimeNavCache = inject(RuntimeNavStateCacheService);
18057
18414
  this.loading$ = this._loadingSource.asObservable().pipe(takeUntil(this._onDestroy$), debounceTime(200));
18058
18415
  }
18059
18416
  ngOnInit() {
18060
18417
  super.ngOnInit();
18061
18418
  this._activatedRoute.params
18062
- .pipe(takeUntil(this._onDestroy$), tap(() => this._setLoading(true)), map((params) => this._extractIds(params)), tap((c) => (c.isReportPage ? (this.minheight = 'auto') : '100vh')), 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) => this._portalService
18063
- .renderUlvMainUi(navItem, this.containerRef, this._injector, navItem.isReportPage)
18419
+ .pipe(takeUntil(this._onDestroy$), tap(() => this._setLoading(true)), map((params) => this._extractIds(params)),
18420
+ // tap((c) => (c.isReportPage ? (this.minheight = 'auto') : '100vh')),
18421
+ 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
18422
+ .renderUlvMainUi(resolved, this.containerRef, this._injector, resolved.isReportPage)
18064
18423
  .pipe(catchError((_err) =>
18065
18424
  // this._location.back();
18066
18425
  // return throwError(() => new Error(err));
18067
- of(true)))), tap((ulv) => this._setActiveReport(ulv)), finalize(() => {
18426
+ of(true)))))), tap((ulv) => this._setActiveReport(ulv)), finalize(() => {
18068
18427
  this._setLoading(false);
18069
18428
  }))
18070
18429
  .subscribe(() => {
@@ -18098,18 +18457,28 @@ class ReportNavigatorComponent extends BaseComponent {
18098
18457
  const navIdOrFieldDefId = params.id.split('__')[0];
18099
18458
  const reportId2OrLevelReportId = params.id.split('__').length > 1 ? params.id.split('__')[1] : '';
18100
18459
  const reportIdOrMoId = params.id.split('__').length > 2 ? params.id.split('__')[2] : '';
18460
+ const typeDefFromUrl = lastText.startsWith('in') ? lastText.replace('in', '') : '';
18461
+ const cacheKey = lastText.startsWith('in') && typeDefFromUrl && reportIdOrMoId
18462
+ ? buildRuntimeNavStateCacheKey(reportId2OrLevelReportId, reportIdOrMoId, typeDefFromUrl)
18463
+ : undefined;
18101
18464
  return {
18102
18465
  Id: navIdOrFieldDefId,
18103
18466
  ReportId: reportIdOrMoId,
18104
18467
  ReportId2: reportId2OrLevelReportId,
18105
18468
  isReportPage: lastText === '' || this._masterDetailsPage(lastText),
18469
+ cacheKey,
18106
18470
  OtherData: !lastText.startsWith('in')
18107
18471
  ? undefined
18108
18472
  : {
18109
18473
  FieldId: navIdOrFieldDefId,
18110
18474
  IsInsideViewResult: true,
18111
18475
  LevelReportId: reportId2OrLevelReportId,
18112
- Mo: { Id: reportIdOrMoId, $Caption: '', $TypeDefId: lastText.replace('in', '') }
18476
+ Mo: {
18477
+ Id: reportIdOrMoId,
18478
+ $Caption: '',
18479
+ $TypeDefId: typeDefFromUrl,
18480
+ $LevelReportId: reportId2OrLevelReportId
18481
+ }
18113
18482
  }
18114
18483
  };
18115
18484
  }
@@ -18121,19 +18490,78 @@ class ReportNavigatorComponent extends BaseComponent {
18121
18490
  this._cdr.detectChanges();
18122
18491
  }
18123
18492
  _onSelectionAdapter_SelectionChange() {
18124
- if (this._routingService?.masterDetails && this._ulvMainCtrlr) {
18125
- const fieldId = this._navItemParams.ReportId2;
18126
- const mo = this._ulvMainCtrlr.GetSelectedMetaObject();
18127
- if (!mo) {
18128
- return;
18493
+ const routing = this._routingService;
18494
+ if (!routing?.masterDetails || !this._ulvMainCtrlr) {
18495
+ return;
18496
+ }
18497
+ const fieldId = this._navItemParams.ReportId2;
18498
+ const mo = this._ulvMainCtrlr.GetSelectedMetaObject();
18499
+ if (!mo) {
18500
+ return;
18501
+ }
18502
+ const moId = `${mo.Id}`;
18503
+ const levelReportId = mo.$LevelReportId || '';
18504
+ const typeDefId = `${mo.$TypeDefId}`;
18505
+ const cacheKey = buildRuntimeNavStateCacheKey(levelReportId, moId, typeDefId);
18506
+ const envelope = {
18507
+ version: 1,
18508
+ sessionId: '',
18509
+ createdAt: Date.now(),
18510
+ schema: RUNTIME_NAV_STATE_SCHEMA_V1,
18511
+ serializationMode: 'dto',
18512
+ payload: {
18513
+ OtherData: {
18514
+ FieldId: fieldId,
18515
+ IsInsideViewResult: true,
18516
+ LevelReportId: levelReportId,
18517
+ Mo: mo
18518
+ }
18129
18519
  }
18130
- const moId = `${mo.Id}`;
18131
- const levelReportId = mo.$LevelReportId || '';
18132
- this._routingService.navigate(['details', `${fieldId}__${levelReportId}__${moId}__in${mo.$TypeDefId}`], true, null, null);
18520
+ };
18521
+ void this._runtimeNavCache.save(cacheKey, envelope).finally(() => {
18522
+ routing.navigate(['details', `${fieldId}__${levelReportId}__${moId}__in${mo.$TypeDefId}`], true, null, null);
18523
+ });
18524
+ }
18525
+ /**
18526
+ * URL parse → cache get → merge/hydrate → finalized navItem (before renderUlvMainUi).
18527
+ */
18528
+ async _finalizeNavItemFromCache(nav) {
18529
+ if (!nav.cacheKey || !nav.OtherData) {
18530
+ return nav;
18531
+ }
18532
+ const env = await this._runtimeNavCache.get(nav.cacheKey);
18533
+ return this._applyCachedEnvelope(nav, env);
18534
+ }
18535
+ _applyCachedEnvelope(nav, env) {
18536
+ if (!env?.payload || !nav.OtherData) {
18537
+ return nav;
18538
+ }
18539
+ if (env.schema !== RUNTIME_NAV_STATE_SCHEMA_V1 || env.version !== 1) {
18540
+ return nav;
18541
+ }
18542
+ if (env.expiresAt != null && Date.now() > env.expiresAt) {
18543
+ return nav;
18544
+ }
18545
+ const p = env.payload;
18546
+ if (env.serializationMode === 'dto' || env.serializationMode === 'hydrated') {
18547
+ const mergedOther = p.OtherData != null
18548
+ ? {
18549
+ ...nav.OtherData,
18550
+ ...p.OtherData,
18551
+ Mo: p.OtherData.Mo ?? nav.OtherData.Mo
18552
+ }
18553
+ : nav.OtherData;
18554
+ return {
18555
+ ...nav,
18556
+ OtherData: mergedOther,
18557
+ RuntimeState: p.RuntimeState ?? nav.RuntimeState,
18558
+ Context: p.Context ?? nav.Context
18559
+ };
18133
18560
  }
18561
+ return nav;
18134
18562
  }
18135
18563
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: ReportNavigatorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
18136
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.0.6", type: ReportNavigatorComponent, isStandalone: false, selector: "bnrc-report-navigator", host: { properties: { "style.min-height": "this.minheight" } }, viewQueries: [{ propertyName: "containerRef", first: true, predicate: ["containerRef"], descendants: true, read: ViewContainerRef, static: true }], usesInheritance: true, ngImport: i0, template: `<ng-container #containerRef></ng-container>`, isInline: true, styles: [":host{display:block;width:100%;background:var(--sapBaseColor)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
18564
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.0.6", type: ReportNavigatorComponent, isStandalone: false, selector: "bnrc-report-navigator", viewQueries: [{ propertyName: "containerRef", first: true, predicate: ["containerRef"], descendants: true, read: ViewContainerRef, static: true }], usesInheritance: true, ngImport: i0, template: `<ng-container #containerRef></ng-container>`, isInline: true, styles: [":host{display:block;width:100%;background:var(--sapBaseColor)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
18137
18565
  }
18138
18566
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: ReportNavigatorComponent, decorators: [{
18139
18567
  type: Component,
@@ -18141,9 +18569,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
18141
18569
  }], ctorParameters: () => [], propDecorators: { containerRef: [{
18142
18570
  type: ViewChild,
18143
18571
  args: ['containerRef', { static: true, read: ViewContainerRef }]
18144
- }], minheight: [{
18145
- type: HostBinding,
18146
- args: ['style.min-height']
18147
18572
  }] } });
18148
18573
 
18149
18574
  class ReportEmptyPageComponent extends PageWithFormHandlerBaseComponent {
@@ -18417,6 +18842,88 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
18417
18842
  }]
18418
18843
  }] });
18419
18844
 
18845
+ /** Default CSS viewport wrapper class for report bodies (table, calendar, �) */
18846
+ const REPORT_GRID_VIEWPORT_CLASS = 'report-grid-wrapper';
18847
+ const DEFAULT_REPORT_LAYOUT_POLICY = Object.freeze({
18848
+ layout: 'inline',
18849
+ scroll: 'inherit'
18850
+ });
18851
+ /** Per-selector defaults (extend in app code if needed). Keys match `UiReportViewBase.UiComponent.Selector`. */
18852
+ const REPORT_TYPE_DEFAULT_POLICIES = Object.freeze({
18853
+ 'bsu-ui-calendar': { layout: 'fill', scroll: 'self' }
18854
+ });
18855
+ function scrollLayoutModeToContextEnvironment(mode) {
18856
+ switch (mode) {
18857
+ case 'nested':
18858
+ return { scrollContainerDepth: 1, shell: 'page' };
18859
+ case 'isolated':
18860
+ return { scrollContainerDepth: 0, shell: 'page', viewportIsolation: true };
18861
+ default:
18862
+ return { scrollContainerDepth: 0, shell: 'page' };
18863
+ }
18864
+ }
18865
+ function contextDefaultsFromEnvironment(env) {
18866
+ if (env.scrollContainerDepth > 0) {
18867
+ return { scroll: 'inherit', layout: 'inline' };
18868
+ }
18869
+ return {};
18870
+ }
18871
+ function mergePolicyLayers(...layers) {
18872
+ let layout;
18873
+ let scroll;
18874
+ for (const layer of layers) {
18875
+ if (!layer) {
18876
+ continue;
18877
+ }
18878
+ if (layer.layout !== undefined) {
18879
+ layout = layer.layout;
18880
+ }
18881
+ if (layer.scroll !== undefined) {
18882
+ scroll = layer.scroll;
18883
+ }
18884
+ }
18885
+ return {
18886
+ layout: layout ?? DEFAULT_REPORT_LAYOUT_POLICY.layout,
18887
+ scroll: scroll ?? DEFAULT_REPORT_LAYOUT_POLICY.scroll
18888
+ };
18889
+ }
18890
+ /**
18891
+ * Final scroll arbitration (pure). Call after merge so registry/explicit `self` wins over nested inherit defaults.
18892
+ */
18893
+ function resolveFinalScroll(merged, env) {
18894
+ if (merged.scroll === 'self') {
18895
+ return 'self';
18896
+ }
18897
+ if (env.scrollContainerDepth > 0) {
18898
+ return 'inherit';
18899
+ }
18900
+ return 'self';
18901
+ }
18902
+ /**
18903
+ * Pure, framework-agnostic policy resolution. Later layers in `extraPartials` override earlier ones.
18904
+ * Order: DEFAULT, contextDefaults(env), registryDefault, ...extraPartials (each partial last-wins on its own keys).
18905
+ */
18906
+ function resolveReportLayoutPolicy(env, registryDefault, ...extraPartials) {
18907
+ const merged = mergePolicyLayers({ layout: DEFAULT_REPORT_LAYOUT_POLICY.layout, scroll: DEFAULT_REPORT_LAYOUT_POLICY.scroll }, contextDefaultsFromEnvironment(env), registryDefault, ...extraPartials);
18908
+ const scroll = resolveFinalScroll(merged, env);
18909
+ return Object.freeze({
18910
+ layout: merged.layout,
18911
+ scroll
18912
+ });
18913
+ }
18914
+ function getReportTypeDefaultPolicy(selector) {
18915
+ if (!selector) {
18916
+ return undefined;
18917
+ }
18918
+ return REPORT_TYPE_DEFAULT_POLICIES[selector];
18919
+ }
18920
+ /** Optional metadata path on view settings (low-code / future designer) */
18921
+ function extractLayoutPolicyFromView(view) {
18922
+ const s = view?.UiComponent?.Settings;
18923
+ const raw = s?.['ReportLayoutPolicy'];
18924
+ return raw;
18925
+ }
18926
+
18420
18927
  class NoInternetComponent extends BaseComponent {
18421
18928
  /** Inserted by Angular inject() migration for backwards compatibility */
18422
18929
  constructor() {
@@ -18824,7 +19331,6 @@ const components = [
18824
19331
  FormFieldReportPageComponent,
18825
19332
  ButtonLoadingComponent,
18826
19333
  UnlimitSessionComponent,
18827
- DynamicTileGroupComponent,
18828
19334
  PushBannerComponent,
18829
19335
  ReportNavigatorComponent,
18830
19336
  SplitterComponent
@@ -18883,6 +19389,7 @@ const directives = [
18883
19389
  ResizeHandlerDirective,
18884
19390
  SafeBottomDirective
18885
19391
  ];
19392
+ const stores = [CalendarSettingsStore];
18886
19393
  const services = [
18887
19394
  PortalService,
18888
19395
  UploadService,
@@ -18910,8 +19417,7 @@ const services = [
18910
19417
  BarsaStorageService,
18911
19418
  ServiceWorkerCommuncationService,
18912
19419
  ApplicationCtrlrService,
18913
- PushNotificationService,
18914
- CalendarSettingsService
19420
+ PushNotificationService
18915
19421
  ];
18916
19422
  const pipes = [
18917
19423
  NumeralPipe,
@@ -18974,7 +19480,8 @@ const pipes = [
18974
19480
  MapToChatMessagePipe,
18975
19481
  PicturesByGroupIdPipe,
18976
19482
  ScopedCssPipe,
18977
- ReportActionListPipe
19483
+ ReportActionListPipe,
19484
+ GetCssVariableValuePipe
18978
19485
  ];
18979
19486
  const functionL1 = async function () {
18980
19487
  if (BarsaApi.LoginFormData.Culture === 'fa-IR') {
@@ -19071,7 +19578,8 @@ class BarsaNovinRayCoreModule extends BaseModule {
19071
19578
  useClass: SimpleTemplateEngine
19072
19579
  },
19073
19580
  ...pipes,
19074
- ...services
19581
+ ...services,
19582
+ ...stores
19075
19583
  ]
19076
19584
  };
19077
19585
  }
@@ -19102,7 +19610,6 @@ class BarsaNovinRayCoreModule extends BaseModule {
19102
19610
  FormFieldReportPageComponent,
19103
19611
  ButtonLoadingComponent,
19104
19612
  UnlimitSessionComponent,
19105
- DynamicTileGroupComponent,
19106
19613
  PushBannerComponent,
19107
19614
  ReportNavigatorComponent,
19108
19615
  SplitterComponent, NumeralPipe,
@@ -19165,7 +19672,8 @@ class BarsaNovinRayCoreModule extends BaseModule {
19165
19672
  MapToChatMessagePipe,
19166
19673
  PicturesByGroupIdPipe,
19167
19674
  ScopedCssPipe,
19168
- ReportActionListPipe, PlaceHolderDirective,
19675
+ ReportActionListPipe,
19676
+ GetCssVariableValuePipe, PlaceHolderDirective,
19169
19677
  NumbersOnlyInputDirective,
19170
19678
  RenderUlvViewerDirective,
19171
19679
  RenderUlvPaginDirective,
@@ -19247,7 +19755,6 @@ class BarsaNovinRayCoreModule extends BaseModule {
19247
19755
  FormFieldReportPageComponent,
19248
19756
  ButtonLoadingComponent,
19249
19757
  UnlimitSessionComponent,
19250
- DynamicTileGroupComponent,
19251
19758
  PushBannerComponent,
19252
19759
  ReportNavigatorComponent,
19253
19760
  SplitterComponent, NumeralPipe,
@@ -19310,7 +19817,8 @@ class BarsaNovinRayCoreModule extends BaseModule {
19310
19817
  MapToChatMessagePipe,
19311
19818
  PicturesByGroupIdPipe,
19312
19819
  ScopedCssPipe,
19313
- ReportActionListPipe, PlaceHolderDirective,
19820
+ ReportActionListPipe,
19821
+ GetCssVariableValuePipe, PlaceHolderDirective,
19314
19822
  NumbersOnlyInputDirective,
19315
19823
  RenderUlvViewerDirective,
19316
19824
  RenderUlvPaginDirective,
@@ -19391,5 +19899,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
19391
19899
  * Generated bundle index. Do not edit.
19392
19900
  */
19393
19901
 
19394
- export { PreventDefaultDirective as $, AnchorScrollDirective as A, BaseModule as B, CardDynamicItemComponent as C, DynamicComponentService as D, EmptyPageWithRouterAndRouterOutletComponent as E, FieldDirective as F, IntersectionObserverDirective as G, ItemsRendererDirective as H, ImageLazyDirective as I, NumbersOnlyInputDirective as J, PlaceHolderDirective as K, RenderUlvViewerDirective as L, MasterDetailsPageComponent as M, NotFoundComponent as N, RenderUlvPaginDirective as O, PortalPageComponent as P, UntilInViewDirective as Q, ReportEmptyPageComponent as R, CopyDirective as S, TableResizerDirective as T, UlvCommandDirective as U, EllapsisTextDirective as V, WorfkflowwChoiceCommandDirective as W, FillEmptySpaceDirective as X, FormCloseDirective as Y, MobileDirective as Z, BodyClickDirective as _, EmptyPageComponent as a, MoInfoUlvPagingPipe as a$, StopPropagationDirective as a0, CountDownDirective as a1, RouteFormChangeDirective as a2, DynamicStyleDirective as a3, NowraptextDirective as a4, LabelmandatoryDirective as a5, AbsoluteDivBodyDirective as a6, LoadExternalFilesDirective as a7, RenderUlvDirective as a8, PrintFilesDirective as a9, TlbButtonsPipe as aA, RemoveNewlinePipe as aB, MoValuePipe as aC, FilterPipe as aD, FilterTabPipe as aE, MoReportValueConcatPipe as aF, FilterStringPipe as aG, SortPipe as aH, BbbTranslatePipe as aI, BarsaIconDictPipe as aJ, FileInfoCountPipe as aK, ControlUiPipe as aL, VisibleValuePipe as aM, FilterToolbarControlPipe as aN, MultipleGroupByPipe as aO, PictureFieldSourcePipe as aP, FioriIconPipe as aQ, CanUploadFilePipe as aR, ListCountPipe as aS, TotalSummaryPipe as aT, MergeFieldsToColumnsPipe as aU, FindColumnByDbNamePipe as aV, FilterColumnsByDetailsPipe as aW, MoInfoUlvMoListPipe as aX, ReversePipe as aY, ColumnCustomUiPipe as aZ, SanitizeTextPipe as a_, SaveImageDirective as aa, WebOtpDirective as ab, SplideSliderDirective as ac, DynamicRootVariableDirective as ad, HorizontalResponsiveDirective as ae, MeasureFormTitleWidthDirective as af, OverflowTextDirective as ag, ShortcutRegisterDirective as ah, ShortcutHandlerDirective as ai, BarsaReadonlyDirective as aj, ResizeObserverDirective as ak, ColumnValueDirective as al, ScrollToSelectedDirective as am, ScrollPersistDirective as an, TooltipDirective as ao, SimplebarDirective as ap, LeafletLongPressDirective as aq, ResizeHandlerDirective as ar, SafeBottomDirective as as, MoReportValuePipe as at, NumeralPipe as au, GroupByPipe as av, ContextMenuPipe as aw, HeaderFacetValuePipe as ax, SeperatorFixPipe as ay, ConvertToStylePipe as az, PortalPageSidebarComponent as b, CardViewService as b$, ColumnCustomComponentPipe as b0, ColumnValuePipe as b1, ColumnIconPipe as b2, RowNumberPipe as b3, ComboRowImagePipe as b4, IsExpandedNodePipe as b5, ThImageOrIconePipe as b6, FindPreviewColumnPipe as b7, ReplacePipe as b8, FilterWorkflowInMobilePipe as b9, LogService as bA, PortalService as bB, UiService as bC, UlvMainService as bD, UploadService as bE, NetworkStatusService as bF, AudioRecordingService as bG, VideoRecordingService as bH, LocalStorageService as bI, IndexedDbService as bJ, BarsaStorageService as bK, PromptUpdateService as bL, NotificationService as bM, ServiceWorkerNotificationService as bN, ColumnService as bO, ServiceWorkerCommuncationService as bP, SaveScrollPositionService as bQ, RoutingService as bR, GroupByService as bS, LayoutMainContentService as bT, TabpageService as bU, InMemoryStorageService as bV, ShellbarHeightService as bW, ApplicationCtrlrService as bX, PushCheckService as bY, IdbService as bZ, PushNotificationService as b_, HideColumnsInmobilePipe as ba, StringToNumberPipe as bb, ColumnValueOfParametersPipe as bc, HideAcceptCancelButtonsPipe as bd, FilterInlineActionListPipe as be, IsImagePipe as bf, ToolbarSettingsPipe as bg, CardMediaSizePipe as bh, LabelStarTrimPipe as bi, SplitPipe as bj, DynamicDarkColorPipe as bk, ChunkArrayPipe as bl, MapToChatMessagePipe as bm, PicturesByGroupIdPipe as bn, ScopedCssPipe as bo, ReportActionListPipe as bp, ApiService as bq, BreadcrumbService as br, CustomInjector as bs, DialogParams as bt, BarsaDialogService as bu, FormPanelService as bv, FormService as bw, ContainerService as bx, HorizontalLayoutService as by, LayoutService as bz, BaseDynamicComponent as c, ReportExtraInfo as c$, BaseSettingsService as c0, CalendarSettingsService as c1, SimpleTemplateEngine as c2, TEMPLATE_ENGINE as c3, PortalDynamicPageResolver as c4, PortalFormPageResolver as c5, PortalPageResolver as c6, PortalReportPageResolver as c7, TileGroupBreadcrumResolver as c8, LoginSettingsResolver as c9, RichStringControlInfoModel as cA, NumberControlInfoModel as cB, FilePictureInfoModel as cC, FileControlInfoModel as cD, CommandControlInfoModel as cE, IconControlInfoModel as cF, PictureFileControlInfoModel as cG, GaugeControlInfoModel as cH, RelationListControlInfoModel as cI, HistoryControlInfoModel as cJ, RabetehAkseTakiListiControlInfoModel as cK, RelatedReportControlInfoModel as cL, CodeEditorControlInfoModel as cM, EnumControlInfoModel as cN, RowDataOption as cO, DateTimeControlInfoModel as cP, BoolControlInfoModel as cQ, CalculateControlInfoModel as cR, SubformControlInfoModel as cS, LinearListControlInfoModel as cT, ListRelationModel as cU, SingleRelationControlInfoModel as cV, MetaobjectDataModel as cW, MoForReportModelBase as cX, MoForReportModel as cY, ReportBaseInfo as cZ, FormToolbarButton as c_, ReportBreadcrumbResolver as ca, DateService as cb, DateHijriService as cc, DateMiladiService as cd, DateShamsiService as ce, FormNewComponent as cf, ReportContainerComponent as cg, FormComponent as ch, FieldUiComponent as ci, BarsaSapUiFormPageModule as cj, ReportNavigatorComponent as ck, BaseController as cl, FieldBaseController as cm, ViewBase as cn, ModalRootComponent as co, ButtonLoadingComponent as cp, UnlimitSessionComponent as cq, SplitterComponent as cr, APP_VERSION as cs, DIALOG_SERVICE as ct, FORM_DIALOG_COMPONENT as cu, NOTIFICATAION_POPUP_SERVER as cv, TOAST_SERVICE as cw, NOTIFICATION_WEBWORKER_FACTORY as cx, GeneralControlInfoModel as cy, StringControlInfoModel as cz, DynamicFormComponent as d, measureTextBy as d$, MetaobjectRelationModel as d0, FieldInfoTypeEnum as d1, BaseReportModel as d2, DefaultCommandsAccessValue as d3, CustomCommand as d4, ReportModel as d5, ReportListModel as d6, ReportFormModel as d7, ReportCalendarModel as d8, ReportTreeModel as d9, FormPropsBaseComponent as dA, LinearListHelper as dB, PageWithFormHandlerBaseComponent as dC, FormPageBaseComponent as dD, FormPageComponent as dE, BaseColumnPropsComponent as dF, TilePropsComponent as dG, FormFieldReportPageComponent as dH, ColumnRendererBase as dI, ColumnRendererViewBase as dJ, BaseUlvSettingComponent as dK, TableHeaderWidthMode as dL, setTableThWidth as dM, calculateColumnContent as dN, calculateColumnWidth as dO, setColumnWidthByMaxMoContentWidth as dP, calculateMoDataListContentWidthByColumnName as dQ, calculateFreeColumnSize as dR, calculateColumnWidthFitToContainer as dS, calcContextMenuWidth as dT, RotateImage as dU, isInLocalMode as dV, getLabelWidth as dW, getColumnValueOfMoDataList as dX, throwIfAlreadyLoaded as dY, measureText2 as dZ, measureText as d_, ReportViewColumn as da, DefaultGridSetting as db, GridSetting as dc, ColSetting as dd, SortSetting as de, ReportField as df, DateRanges as dg, SortDirection as dh, SelectionMode as di, UlvHeightSizeType as dj, FieldBaseComponent as dk, FieldViewBase as dl, FormBaseComponent as dm, FormToolbarBaseComponent as dn, SystemBaseComponent as dp, ReportBaseComponent as dq, ReportItemBaseComponent as dr, ApplicationBaseComponent as ds, LayoutItemBaseComponent as dt, LayoutPanelBaseComponent as du, PageBaseComponent as dv, NumberBaseComponent as dw, FilesValidationHelper as dx, BarsaApi as dy, ReportViewBaseComponent as dz, DynamicItemComponent as e, cancelRequestAnimationFrame as e$, genrateInlineMoId as e0, enumValueToStringSize as e1, isVersionBiggerThan as e2, compareVersions as e3, scrollToElement as e4, executeUlvCommandHandler as e5, getUniqueId as e6, getDateService as e7, getAllItemsPerChildren as e8, setOneDepthLevel as e9, FindGroup as eA, FillAllLayoutControls as eB, FindToolbarItem as eC, FindLayoutSettingFromLayout94 as eD, GetAllHorizontalFromLayout94 as eE, getGridSettings as eF, getResetGridSettings as eG, GetDefaultMoObjectInfo as eH, getLayout94ObjectInfo as eI, getFormSettings as eJ, createFormPanelMetaConditions as eK, getNewMoGridEditor as eL, createGridEditorFormPanel as eM, getLayoutControl as eN, getControlList as eO, shallowEqual as eP, toNumber as eQ, InputNumber as eR, AffixRespondEvents as eS, isTargetWindow as eT, getTargetRect as eU, getFieldValue as eV, availablePrefixes as eW, requestAnimationFramePolyfill as eX, ExecuteDynamicCommand as eY, ExecuteWorkflowChoiceDef as eZ, getRequestAnimationFrame as e_, isFirefox as ea, getImagePath as eb, checkPermission as ec, fixUnclosedParentheses as ed, isFunction as ee, DeviceWidth as ef, getHeaderValue as eg, elementInViewport2 as eh, PreventDefaulEvent as ei, stopPropagation as ej, getParentHeight as ek, getComponentDefined as el, isSafari as em, isFF as en, getDeviceIsPhone as eo, getDeviceIsDesktop as ep, getDeviceIsTablet as eq, getDeviceIsMobile as er, getControlSizeMode as es, formatBytes as et, getValidExtension as eu, getIcon as ev, isImage as ew, GetAllColumnsSorted as ex, GetVisibleValue as ey, GroupBy as ez, formRoutes as f, easeInOutCubic as f0, WordMimeType as f1, ImageMimeType as f2, PdfMimeType as f3, AllFilesMimeType as f4, VideoMimeType as f5, AudioMimeType as f6, MimeTypes as f7, GetContentType as f8, GetViewableExtensions as f9, RootPageComponent as fA, ResizableComponent as fB, ResizableDirective as fC, ResizableModule as fD, PushBannerComponent as fE, BarsaNovinRayCoreModule as fF, ChangeLayoutInfoCustomUi as fa, mobile_regex as fb, number_only as fc, forbiddenValidator as fd, GetImgTags as fe, ImagetoPrint as ff, PrintImage as fg, SaveImageToFile as fh, validateAllFormFields as fi, getFocusableTagNames as fj, addCssVariableToRoot as fk, flattenTree as fl, IsDarkMode as fm, nullOrUndefinedString as fn, fromEntries as fo, bodyClick as fp, removeDynamicStyle as fq, addDynamicVariableTo as fr, AddDynamicFormStyles as fs, RemoveDynamicFormStyles as ft, ContainerComponent as fu, IntersectionStatus as fv, fromIntersectionObserver as fw, CustomRouteReuseStrategy as fx, AuthGuard as fy, RedirectHomeGuard as fz, BaseViewPropsComponent as g, BaseViewContentPropsComponent as h, BaseViewItemPropsComponent as i, RowState as j, BaseItemContentPropsComponent as k, CardBaseItemContentPropsComponent as l, BaseFormToolbaritemPropsComponent as m, DynamicFormToolbaritemComponent as n, DynamicLayoutComponent as o, DynamicTileGroupComponent as p, DynamicUlvToolbarComponent as q, reportRoutes as r, DynamicUlvPagingComponent as s, RootPortalComponent as t, BaseComponent as u, AttrRtlDirective as v, BaseDirective as w, ColumnResizerDirective as x, DynamicCommandDirective as y, EllipsifyDirective as z };
19395
- //# sourceMappingURL=barsa-novin-ray-core-barsa-novin-ray-core-ZCx7VjiV.mjs.map
19902
+ export { StopPropagationDirective as $, AnchorScrollDirective as A, BaseModule as B, CardDynamicItemComponent as C, DynamicComponentService as D, EmptyPageWithRouterAndRouterOutletComponent as E, FieldDirective as F, ItemsRendererDirective as G, NumbersOnlyInputDirective as H, ImageLazyDirective as I, PlaceHolderDirective as J, RenderUlvViewerDirective as K, RenderUlvPaginDirective as L, MasterDetailsPageComponent as M, NotFoundComponent as N, UntilInViewDirective as O, PortalPageComponent as P, CopyDirective as Q, ReportEmptyPageComponent as R, EllapsisTextDirective as S, TableResizerDirective as T, UlvCommandDirective as U, FillEmptySpaceDirective as V, WorfkflowwChoiceCommandDirective as W, FormCloseDirective as X, MobileDirective as Y, BodyClickDirective as Z, PreventDefaultDirective as _, EmptyPageComponent as a, ColumnCustomComponentPipe as a$, CountDownDirective as a0, RouteFormChangeDirective as a1, DynamicStyleDirective as a2, NowraptextDirective as a3, LabelmandatoryDirective as a4, AbsoluteDivBodyDirective as a5, LoadExternalFilesDirective as a6, RenderUlvDirective as a7, PrintFilesDirective as a8, SaveImageDirective as a9, RemoveNewlinePipe as aA, MoValuePipe as aB, FilterPipe as aC, FilterTabPipe as aD, MoReportValueConcatPipe as aE, FilterStringPipe as aF, SortPipe as aG, BbbTranslatePipe as aH, BarsaIconDictPipe as aI, FileInfoCountPipe as aJ, ControlUiPipe as aK, VisibleValuePipe as aL, FilterToolbarControlPipe as aM, MultipleGroupByPipe as aN, PictureFieldSourcePipe as aO, FioriIconPipe as aP, CanUploadFilePipe as aQ, ListCountPipe as aR, TotalSummaryPipe as aS, MergeFieldsToColumnsPipe as aT, FindColumnByDbNamePipe as aU, FilterColumnsByDetailsPipe as aV, MoInfoUlvMoListPipe as aW, ReversePipe as aX, ColumnCustomUiPipe as aY, SanitizeTextPipe as aZ, MoInfoUlvPagingPipe as a_, WebOtpDirective as aa, SplideSliderDirective as ab, DynamicRootVariableDirective as ac, HorizontalResponsiveDirective as ad, MeasureFormTitleWidthDirective as ae, OverflowTextDirective as af, ShortcutRegisterDirective as ag, ShortcutHandlerDirective as ah, BarsaReadonlyDirective as ai, ResizeObserverDirective as aj, ColumnValueDirective as ak, ScrollToSelectedDirective as al, ScrollPersistDirective as am, TooltipDirective as an, SimplebarDirective as ao, LeafletLongPressDirective as ap, ResizeHandlerDirective as aq, SafeBottomDirective as ar, MoReportValuePipe as as, NumeralPipe as at, GroupByPipe as au, ContextMenuPipe as av, HeaderFacetValuePipe as aw, SeperatorFixPipe as ax, ConvertToStylePipe as ay, TlbButtonsPipe as az, PortalPageSidebarComponent as b, RUNTIME_NAV_STATE_SCHEMA_V1 as b$, ColumnValuePipe as b0, ColumnIconPipe as b1, RowNumberPipe as b2, ComboRowImagePipe as b3, IsExpandedNodePipe as b4, ThImageOrIconePipe as b5, FindPreviewColumnPipe as b6, ReplacePipe as b7, FilterWorkflowInMobilePipe as b8, HideColumnsInmobilePipe as b9, LogService as bA, PortalService as bB, UiService as bC, UlvMainService as bD, UploadService as bE, NetworkStatusService as bF, AudioRecordingService as bG, VideoRecordingService as bH, LocalStorageService as bI, IndexedDbService as bJ, BarsaStorageService as bK, PromptUpdateService as bL, NotificationService as bM, ServiceWorkerNotificationService as bN, ColumnService as bO, ServiceWorkerCommuncationService as bP, SaveScrollPositionService as bQ, RoutingService as bR, GroupByService as bS, LayoutMainContentService as bT, TabpageService as bU, InMemoryStorageService as bV, ScrollLayoutContextHolder as bW, ShellbarHeightService as bX, ApplicationCtrlrService as bY, PushCheckService as bZ, IdbService as b_, StringToNumberPipe as ba, ColumnValueOfParametersPipe as bb, HideAcceptCancelButtonsPipe as bc, FilterInlineActionListPipe as bd, IsImagePipe as be, ToolbarSettingsPipe as bf, CardMediaSizePipe as bg, LabelStarTrimPipe as bh, SplitPipe as bi, DynamicDarkColorPipe as bj, ChunkArrayPipe as bk, MapToChatMessagePipe as bl, PicturesByGroupIdPipe as bm, ScopedCssPipe as bn, ReportActionListPipe as bo, GetCssVariableValuePipe as bp, ApiService as bq, BreadcrumbService as br, CustomInjector as bs, DialogParams as bt, BarsaDialogService as bu, FormPanelService as bv, FormService as bw, ContainerService as bx, HorizontalLayoutService as by, LayoutService as bz, BaseDynamicComponent as c, MetaobjectDataModel as c$, buildRuntimeNavStateCacheKey as c0, RuntimeNavStateCacheService as c1, PushNotificationService as c2, CardViewService as c3, BaseSettingsService as c4, SimpleTemplateEngine as c5, TEMPLATE_ENGINE as c6, PortalDynamicPageResolver as c7, PortalFormPageResolver as c8, PortalPageResolver as c9, NOTIFICATAION_POPUP_SERVER as cA, TOAST_SERVICE as cB, NOTIFICATION_WEBWORKER_FACTORY as cC, GeneralControlInfoModel as cD, StringControlInfoModel as cE, RichStringControlInfoModel as cF, NumberControlInfoModel as cG, FilePictureInfoModel as cH, FileControlInfoModel as cI, CommandControlInfoModel as cJ, IconControlInfoModel as cK, PictureFileControlInfoModel as cL, GaugeControlInfoModel as cM, RelationListControlInfoModel as cN, HistoryControlInfoModel as cO, RabetehAkseTakiListiControlInfoModel as cP, RelatedReportControlInfoModel as cQ, CodeEditorControlInfoModel as cR, EnumControlInfoModel as cS, RowDataOption as cT, DateTimeControlInfoModel as cU, BoolControlInfoModel as cV, CalculateControlInfoModel as cW, SubformControlInfoModel as cX, LinearListControlInfoModel as cY, ListRelationModel as cZ, SingleRelationControlInfoModel as c_, PortalReportPageResolver as ca, TileGroupBreadcrumResolver as cb, LoginSettingsResolver as cc, ReportBreadcrumbResolver as cd, DateService as ce, DateHijriService as cf, DateMiladiService as cg, DateShamsiService as ch, EntitySettingsStore as ci, CalendarSettingsStore as cj, FormNewComponent as ck, ReportContainerComponent as cl, FormComponent as cm, FieldUiComponent as cn, BarsaSapUiFormPageModule as co, ReportNavigatorComponent as cp, BaseController as cq, FieldBaseController as cr, ViewBase as cs, ModalRootComponent as ct, ButtonLoadingComponent as cu, UnlimitSessionComponent as cv, SplitterComponent as cw, APP_VERSION as cx, DIALOG_SERVICE as cy, FORM_DIALOG_COMPONENT as cz, DynamicFormComponent as d, getLabelWidth as d$, MoForReportModelBase as d0, MoForReportModel as d1, ReportBaseInfo as d2, FormToolbarButton as d3, ReportExtraInfo as d4, MetaobjectRelationModel as d5, FieldInfoTypeEnum as d6, BaseReportModel as d7, DefaultCommandsAccessValue as d8, CustomCommand as d9, PageBaseComponent as dA, NumberBaseComponent as dB, FilesValidationHelper as dC, BarsaApi as dD, ReportViewBaseComponent as dE, FormPropsBaseComponent as dF, LinearListHelper as dG, PageWithFormHandlerBaseComponent as dH, FormPageBaseComponent as dI, FormPageComponent as dJ, BaseColumnPropsComponent as dK, TilePropsComponent as dL, FormFieldReportPageComponent as dM, ColumnRendererBase as dN, ColumnRendererViewBase as dO, BaseUlvSettingComponent as dP, TableHeaderWidthMode as dQ, setTableThWidth as dR, calculateColumnContent as dS, calculateColumnWidth as dT, setColumnWidthByMaxMoContentWidth as dU, calculateMoDataListContentWidthByColumnName as dV, calculateFreeColumnSize as dW, calculateColumnWidthFitToContainer as dX, calcContextMenuWidth as dY, RotateImage as dZ, isInLocalMode as d_, ReportModel as da, ReportListModel as db, ReportFormModel as dc, ReportCalendarModel as dd, ReportTreeModel as de, ReportViewColumn as df, DefaultGridSetting as dg, GridSetting as dh, ColSetting as di, SortSetting as dj, ReportField as dk, DateRanges as dl, SortDirection as dm, SelectionMode as dn, UlvHeightSizeType as dp, FieldBaseComponent as dq, FieldViewBase as dr, FormBaseComponent as ds, FormToolbarBaseComponent as dt, SystemBaseComponent as du, ReportBaseComponent as dv, ReportItemBaseComponent as dw, ApplicationBaseComponent as dx, LayoutItemBaseComponent as dy, LayoutPanelBaseComponent as dz, DynamicItemComponent as e, availablePrefixes as e$, getColumnValueOfMoDataList as e0, throwIfAlreadyLoaded as e1, measureText2 as e2, measureText as e3, measureTextBy as e4, genrateInlineMoId as e5, enumValueToStringSize as e6, isVersionBiggerThan as e7, compareVersions as e8, scrollToElement as e9, getIcon as eA, isImage as eB, GetAllColumnsSorted as eC, GetVisibleValue as eD, GroupBy as eE, FindGroup as eF, FillAllLayoutControls as eG, FindToolbarItem as eH, FindLayoutSettingFromLayout94 as eI, GetAllHorizontalFromLayout94 as eJ, getGridSettings as eK, getResetGridSettings as eL, GetDefaultMoObjectInfo as eM, getLayout94ObjectInfo as eN, getFormSettings as eO, createFormPanelMetaConditions as eP, getNewMoGridEditor as eQ, createGridEditorFormPanel as eR, getLayoutControl as eS, getControlList as eT, shallowEqual as eU, toNumber as eV, InputNumber as eW, AffixRespondEvents as eX, isTargetWindow as eY, getTargetRect as eZ, getFieldValue as e_, executeUlvCommandHandler as ea, getUniqueId as eb, getDateService as ec, getAllItemsPerChildren as ed, setOneDepthLevel as ee, isFirefox as ef, getImagePath as eg, checkPermission as eh, fixUnclosedParentheses as ei, isFunction as ej, DeviceWidth as ek, getHeaderValue as el, elementInViewport2 as em, PreventDefaulEvent as en, stopPropagation as eo, getParentHeight as ep, getComponentDefined as eq, isSafari as er, isFF as es, getDeviceIsPhone as et, getDeviceIsDesktop as eu, getDeviceIsTablet as ev, getDeviceIsMobile as ew, getControlSizeMode as ex, formatBytes as ey, getValidExtension as ez, formRoutes as f, requestAnimationFramePolyfill as f0, ExecuteDynamicCommand as f1, ExecuteWorkflowChoiceDef as f2, getRequestAnimationFrame as f3, cancelRequestAnimationFrame as f4, easeInOutCubic as f5, WordMimeType as f6, ImageMimeType as f7, PdfMimeType as f8, AllFilesMimeType as f9, IntersectionStatus as fA, fromIntersectionObserver as fB, CustomRouteReuseStrategy as fC, AuthGuard as fD, RedirectHomeGuard as fE, RootPageComponent as fF, ResizableComponent as fG, ResizableDirective as fH, ResizableModule as fI, PushBannerComponent as fJ, REPORT_GRID_VIEWPORT_CLASS as fK, DEFAULT_REPORT_LAYOUT_POLICY as fL, REPORT_TYPE_DEFAULT_POLICIES as fM, scrollLayoutModeToContextEnvironment as fN, contextDefaultsFromEnvironment as fO, resolveFinalScroll as fP, resolveReportLayoutPolicy as fQ, getReportTypeDefaultPolicy as fR, extractLayoutPolicyFromView as fS, BarsaNovinRayCoreModule as fT, VideoMimeType as fa, AudioMimeType as fb, MimeTypes as fc, GetContentType as fd, GetViewableExtensions as fe, ChangeLayoutInfoCustomUi as ff, mobile_regex as fg, number_only as fh, forbiddenValidator as fi, GetImgTags as fj, ImagetoPrint as fk, PrintImage as fl, SaveImageToFile as fm, validateAllFormFields as fn, getFocusableTagNames as fo, addCssVariableToRoot as fp, flattenTree as fq, IsDarkMode as fr, nullOrUndefinedString as fs, fromEntries as ft, bodyClick as fu, removeDynamicStyle as fv, addDynamicVariableTo as fw, AddDynamicFormStyles as fx, RemoveDynamicFormStyles as fy, ContainerComponent as fz, BaseViewPropsComponent as g, BaseViewContentPropsComponent as h, BaseViewItemPropsComponent as i, RowState as j, BaseItemContentPropsComponent as k, CardBaseItemContentPropsComponent as l, BaseFormToolbaritemPropsComponent as m, DynamicFormToolbaritemComponent as n, DynamicLayoutComponent as o, DynamicUlvToolbarComponent as p, DynamicUlvPagingComponent as q, reportRoutes as r, RootPortalComponent as s, BaseComponent as t, AttrRtlDirective as u, BaseDirective as v, ColumnResizerDirective as w, DynamicCommandDirective as x, EllipsifyDirective as y, IntersectionObserverDirective as z };
19903
+ //# sourceMappingURL=barsa-novin-ray-core-barsa-novin-ray-core-D50KRKKo.mjs.map