barsa-novin-ray-core 2.3.144 → 2.3.148

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';
@@ -4317,7 +4317,6 @@ class DynamicDarkColorPipe {
4317
4317
  this.cache = new Map();
4318
4318
  this.darkBackground = [18, 18, 18]; // #121212
4319
4319
  this.minContrast = 4.5;
4320
- this.colorParseCache = new Map();
4321
4320
  }
4322
4321
  transform(styleStr) {
4323
4322
  if (!IsDarkMode() || !styleStr) {
@@ -4326,29 +4325,46 @@ class DynamicDarkColorPipe {
4326
4325
  if (this.cache.has(styleStr)) {
4327
4326
  return this.cache.get(styleStr);
4328
4327
  }
4329
- const regex = /color\s*:\s*([^;!]+)[;!]?/i;
4330
- const match = styleStr.match(regex);
4331
- if (!match) {
4332
- return styleStr;
4333
- }
4334
- const originalColor = match[1].trim();
4335
- const rgb = this.parseColor(originalColor);
4336
- if (!rgb) {
4337
- return styleStr;
4338
- }
4339
- this.colorParseCache.set(originalColor, rgb); // Cache the parsed color
4340
- const contrast = this.getContrastRatio(rgb, this.darkBackground);
4341
- // اگر کنتراست خوبه دست نزن
4342
- if (contrast >= this.minContrast) {
4343
- this.cache.set(styleStr, styleStr);
4344
- 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
+ }
4345
4359
  }
4346
- // ❌ اگر بد بود → اصلاح کن
4347
- const adjustedHex = this.adjustColorForDarkMode(rgb);
4348
- const newStyle = styleStr.replace(regex, `color: ${adjustedHex};`);
4349
4360
  this.cache.set(styleStr, newStyle);
4350
4361
  return newStyle;
4351
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
+ }
4352
4368
  // ---------------------------------------------------
4353
4369
  // 🎯 Adjust until contrast >= 4.5
4354
4370
  // ---------------------------------------------------
@@ -4644,6 +4660,73 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
4644
4660
  }]
4645
4661
  }], ctorParameters: () => [] });
4646
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
+
4692
+ class FindColumnsPipe {
4693
+ transform(columns, columnsToFind) {
4694
+ if (!columns?.length || !columnsToFind) {
4695
+ return columns;
4696
+ }
4697
+ const arrOfColumns = columnsToFind.split(',');
4698
+ const x = columns.filter((column, _i) => arrOfColumns.indexOf(column.Caption) !== -1 || arrOfColumns.indexOf(column.Name) !== -1);
4699
+ return x;
4700
+ }
4701
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: FindColumnsPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
4702
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.0.6", ngImport: i0, type: FindColumnsPipe, isStandalone: false, name: "findColumns" }); }
4703
+ }
4704
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: FindColumnsPipe, decorators: [{
4705
+ type: Pipe,
4706
+ args: [{
4707
+ name: 'findColumns',
4708
+ standalone: false
4709
+ }]
4710
+ }] });
4711
+
4712
+ class ExistsColumnsPipe {
4713
+ transform(columns, column) {
4714
+ if (!columns?.length || !column) {
4715
+ return columns;
4716
+ }
4717
+ return columns.filter((col) => col.Name === column.Name || col.Caption === column.Caption);
4718
+ }
4719
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: ExistsColumnsPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
4720
+ static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.0.6", ngImport: i0, type: ExistsColumnsPipe, isStandalone: false, name: "existsColumns" }); }
4721
+ }
4722
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: ExistsColumnsPipe, decorators: [{
4723
+ type: Pipe,
4724
+ args: [{
4725
+ name: 'existsColumns',
4726
+ standalone: false
4727
+ }]
4728
+ }] });
4729
+
4647
4730
  class ApiService {
4648
4731
  constructor() {
4649
4732
  this.portalLoginUrl = `/api/auth/portal/login`;
@@ -5943,10 +6026,11 @@ class ApplicationCtrlrService {
5943
6026
  callback && callback(true);
5944
6027
  });
5945
6028
  this._document.documentElement.setAttribute('data-layout', 'vertical');
5946
- this._selectedSystemTitle$
5947
- .asObservable()
5948
- .pipe(tap$1((c) => this._titleService.setTitle(c)))
5949
- .subscribe();
6029
+ // با تغییر سیستم اسم تب مرورگر تغییر نکند
6030
+ // this._selectedSystemTitle$
6031
+ // .asObservable()
6032
+ // .pipe(tap((c) => this._titleService.setTitle(c)))
6033
+ // .subscribe();
5950
6034
  }
5951
6035
  systemChange(systemId) {
5952
6036
  const oldSystemId = this._selectedSystemId$.getValue();
@@ -6271,7 +6355,7 @@ function reportRoutes(authGuard = false) {
6271
6355
  return {
6272
6356
  path: 'report/:id',
6273
6357
  canActivate: authGuard ? [AuthGuard] : [],
6274
- loadChildren: () => import('./barsa-novin-ray-core-barsa-report-page.module-BnBF1-gh.mjs').then((m) => m.BarsaReportPageModule),
6358
+ loadChildren: () => import('./barsa-novin-ray-core-barsa-report-page.module-pdaEOMh7.mjs').then((m) => m.BarsaReportPageModule),
6275
6359
  resolve: {
6276
6360
  breadcrumb: ReportBreadcrumbResolver
6277
6361
  }
@@ -7031,6 +7115,24 @@ class PortalService {
7031
7115
  reject('error in get server startup data.');
7032
7116
  }, null);
7033
7117
  }
7118
+ buildNavigationParams(formpanelCtrlr, mo, headerLayout, id, isPage) {
7119
+ const breadCrumb = getHeaderValue(headerLayout?.BreadCrumb);
7120
+ const params = {
7121
+ id: mo.$State === 'New' ? '0' : mo.Id,
7122
+ tyid: mo.$TypeDefId,
7123
+ tycp: mo.$Caption ? mo.$Caption : null,
7124
+ repid: mo.$ReportId,
7125
+ vid: formpanelCtrlr?.Setting?.View?.TypeViewId,
7126
+ bc: breadCrumb ? breadCrumb : mo.$State === 'New' ? mo.$TypeDefName : mo.$Caption,
7127
+ formPanelCtrlrId: id,
7128
+ mo: mo
7129
+ };
7130
+ // اگر کامپوننت به صورت Page باز شود، فلگ isFirst هم اضافه می‌شود
7131
+ if (isPage) {
7132
+ params.isFirst = true;
7133
+ }
7134
+ return params;
7135
+ }
7034
7136
  ShowFormPanelControl(formpanelCtrlr, router, activatedRoute, dialogComponent, isPage, vcr, isReload = false) {
7035
7137
  if (!formpanelCtrlr) {
7036
7138
  console.warn('form panel controler is undefined!');
@@ -7060,10 +7162,11 @@ class PortalService {
7060
7162
  const id = getUniqueId(4);
7061
7163
  this.addFormPanelCtrlr(id, formpanelCtrlr);
7062
7164
  this.openForm$.next(); // event emit for other components to know form open
7165
+ const navigationParams = this.buildNavigationParams(formpanelCtrlr, mo, headerLayout, id, isPage);
7063
7166
  if (isModal) {
7064
7167
  if (dialogComponent) {
7065
7168
  this.dialogService.showForm(dialogComponent, {
7066
- ...queryParams,
7169
+ ...navigationParams,
7067
7170
  formpanelCtrlr
7068
7171
  }, vcr);
7069
7172
  }
@@ -7078,7 +7181,7 @@ class PortalService {
7078
7181
  'form',
7079
7182
  {
7080
7183
  outlets: {
7081
- main: ['show', { ...queryParams, formPanelCtrlrId: id, isFirst: true }]
7184
+ main: ['show', { ...navigationParams }]
7082
7185
  }
7083
7186
  }
7084
7187
  ], {
@@ -7092,7 +7195,7 @@ class PortalService {
7092
7195
  'popup',
7093
7196
  {
7094
7197
  outlets: {
7095
- main: ['show', { ...queryParams, formPanelCtrlrId: id }]
7198
+ main: ['show', { ...navigationParams }]
7096
7199
  }
7097
7200
  }
7098
7201
  ], {
@@ -9132,12 +9235,14 @@ class NotificationService {
9132
9235
  Notification.permission === 'granted');
9133
9236
  }
9134
9237
  showNotification(notificationItem, mo, uiOptions, otherOptions) {
9135
- if (notificationItem.Title && notificationItem.Title.startsWith('[') && notificationItem.Title.endsWith(']')) {
9136
- return;
9137
- }
9138
- if (notificationItem.Title && notificationItem.Title.startsWith('{') && notificationItem.Title.endsWith('}')) {
9139
- return;
9140
- }
9238
+ // if (notificationItem.Title && notificationItem.Title.startsWith('[') && notificationItem.Title.endsWith(']')) {
9239
+ // return;
9240
+ // }
9241
+ // if (notificationItem.Title && notificationItem.Title.startsWith('{') && notificationItem.Title.endsWith('}')) {
9242
+ // return;
9243
+ // } زمانی که سیستم مدیریت کارتابل جدید نباشد نوتفیکشن های قدیمی نمایش داده نمیشدند
9244
+ // فعلا کامنت شد و جایی که سیستم مدیریت کارتابل جدید دارد و کار میکند
9245
+ // باعث نمایش دوتا پاپ اپ میشود
9141
9246
  if (mo && !mo.ShowPopup) {
9142
9247
  return;
9143
9248
  }
@@ -9226,14 +9331,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
9226
9331
  // src/app/services/idb.service.ts
9227
9332
  class IdbService {
9228
9333
  constructor() {
9229
- this.dbPromise = openDB('my-app-db', 1, {
9230
- upgrade(db) {
9334
+ this.dbPromise = openDB('my-app-db', 2, {
9335
+ upgrade(db, oldVersion) {
9231
9336
  if (!db.objectStoreNames.contains('subscription')) {
9232
9337
  db.createObjectStore('subscription');
9233
9338
  }
9234
9339
  if (!db.objectStoreNames.contains('settings')) {
9235
9340
  db.createObjectStore('settings');
9236
9341
  }
9342
+ if (oldVersion < 2 && !db.objectStoreNames.contains('runtimeNavState')) {
9343
+ db.createObjectStore('runtimeNavState');
9344
+ }
9237
9345
  }
9238
9346
  });
9239
9347
  }
@@ -9250,6 +9358,15 @@ class IdbService {
9250
9358
  const db = await this.dbPromise;
9251
9359
  await db.delete(store, key);
9252
9360
  }
9361
+ async getAllKeys(store) {
9362
+ const db = await this.dbPromise;
9363
+ const keys = await db.getAllKeys(store);
9364
+ return keys;
9365
+ }
9366
+ async clearStore(store) {
9367
+ const db = await this.dbPromise;
9368
+ await db.clear(store);
9369
+ }
9253
9370
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: IdbService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
9254
9371
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: IdbService, providedIn: 'root' }); }
9255
9372
  }
@@ -9743,6 +9860,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
9743
9860
  args: [{ providedIn: 'root' }]
9744
9861
  }] });
9745
9862
 
9863
+ class ScrollLayoutContextHolder {
9864
+ constructor() {
9865
+ this._mode = signal('root');
9866
+ this.mode = this._mode.asReadonly();
9867
+ }
9868
+ setMode(mode) {
9869
+ this._mode.set(mode);
9870
+ }
9871
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: ScrollLayoutContextHolder, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
9872
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: ScrollLayoutContextHolder }); }
9873
+ }
9874
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: ScrollLayoutContextHolder, decorators: [{
9875
+ type: Injectable
9876
+ }], ctorParameters: () => [] });
9877
+
9746
9878
  class ShellbarHeightService {
9747
9879
  constructor() {
9748
9880
  this._dict = new BehaviorSubject(['']);
@@ -9825,6 +9957,145 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
9825
9957
  args: [{ providedIn: 'root' }]
9826
9958
  }] });
9827
9959
 
9960
+ /** Discriminator for migrations and mixed payload kinds. */
9961
+ const RUNTIME_NAV_STATE_SCHEMA_V1 = 'report-nav-runtime/v1';
9962
+ /**
9963
+ * Stable cache key: report-scoped MO identity.
9964
+ * Future: prefix with navigationScopeId for split/compare/popup (architecture note only in v1).
9965
+ */
9966
+ function buildRuntimeNavStateCacheKey(reportIdSeg, moId, typeDefId) {
9967
+ return `runtime:${reportIdSeg}:${moId}:${typeDefId}`;
9968
+ }
9969
+
9970
+ const RUNTIME_NAV_STORE = 'runtimeNavState';
9971
+ const SESSION_STORAGE_KEY = 'runtime-session-id';
9972
+ const MAX_MEMORY_ENTRIES = 100;
9973
+ function cloneForPersist(value) {
9974
+ try {
9975
+ return structuredClone(value);
9976
+ }
9977
+ catch {
9978
+ return JSON.parse(JSON.stringify(value));
9979
+ }
9980
+ }
9981
+ class RuntimeNavStateCacheService {
9982
+ constructor() {
9983
+ this._idb = inject(IdbService);
9984
+ this._memory = new Map();
9985
+ this._sessionId = this._ensureSessionId();
9986
+ void this._purgeStaleFromIdb();
9987
+ if (isDevMode() && typeof window !== 'undefined') {
9988
+ window.__runtimeNavCache = this;
9989
+ }
9990
+ }
9991
+ /** @internal tests / diagnostics */
9992
+ get currentSessionId() {
9993
+ return this._sessionId;
9994
+ }
9995
+ save(key, envelope) {
9996
+ const snapshot = cloneForPersist({
9997
+ ...envelope,
9998
+ sessionId: this._sessionId,
9999
+ createdAt: envelope.createdAt ?? Date.now()
10000
+ });
10001
+ return (async () => {
10002
+ await this._idb.set(RUNTIME_NAV_STORE, key, snapshot);
10003
+ this._memory.set(key, snapshot);
10004
+ this._evictMemoryIfNeeded();
10005
+ })();
10006
+ }
10007
+ get(key) {
10008
+ const mem = this._memory.get(key);
10009
+ if (mem !== undefined) {
10010
+ return Promise.resolve(mem);
10011
+ }
10012
+ return (async () => {
10013
+ const row = await this._idb.get(RUNTIME_NAV_STORE, key);
10014
+ if (row == null) {
10015
+ return null;
10016
+ }
10017
+ if (row.sessionId !== this._sessionId) {
10018
+ return null;
10019
+ }
10020
+ this._memory.set(key, row);
10021
+ this._evictMemoryIfNeeded();
10022
+ return row;
10023
+ })();
10024
+ }
10025
+ remove(key) {
10026
+ return (async () => {
10027
+ this._memory.delete(key);
10028
+ await this._idb.delete(RUNTIME_NAV_STORE, key);
10029
+ })();
10030
+ }
10031
+ clear() {
10032
+ return (async () => {
10033
+ this._memory.clear();
10034
+ await this._idb.clearStore(RUNTIME_NAV_STORE);
10035
+ })();
10036
+ }
10037
+ /** Optional contract: snapshot of keys ? serialized envelopes (for debugging). */
10038
+ getAllEntries() {
10039
+ return (async () => {
10040
+ const out = {};
10041
+ for (const [k, v] of this._memory.entries()) {
10042
+ out[k] = cloneForPersist(v);
10043
+ }
10044
+ const keys = await this._idb.getAllKeys(RUNTIME_NAV_STORE);
10045
+ for (const key of keys) {
10046
+ if (out[key] !== undefined) {
10047
+ continue;
10048
+ }
10049
+ const row = await this._idb.get(RUNTIME_NAV_STORE, key);
10050
+ if (row?.sessionId === this._sessionId) {
10051
+ out[key] = cloneForPersist(row);
10052
+ }
10053
+ }
10054
+ return out;
10055
+ })();
10056
+ }
10057
+ _ensureSessionId() {
10058
+ if (typeof sessionStorage === 'undefined') {
10059
+ return `ssr-${crypto.randomUUID()}`;
10060
+ }
10061
+ let id = sessionStorage.getItem(SESSION_STORAGE_KEY);
10062
+ if (!id) {
10063
+ id = crypto.randomUUID();
10064
+ sessionStorage.setItem(SESSION_STORAGE_KEY, id);
10065
+ }
10066
+ return id;
10067
+ }
10068
+ _evictMemoryIfNeeded() {
10069
+ while (this._memory.size > MAX_MEMORY_ENTRIES) {
10070
+ const first = this._memory.keys().next().value;
10071
+ if (first === undefined) {
10072
+ break;
10073
+ }
10074
+ this._memory.delete(first);
10075
+ }
10076
+ }
10077
+ async _purgeStaleFromIdb() {
10078
+ try {
10079
+ const keys = await this._idb.getAllKeys(RUNTIME_NAV_STORE);
10080
+ for (const key of keys) {
10081
+ const row = await this._idb.get(RUNTIME_NAV_STORE, key);
10082
+ if (row == null || row.sessionId !== this._sessionId) {
10083
+ await this._idb.delete(RUNTIME_NAV_STORE, key);
10084
+ }
10085
+ }
10086
+ }
10087
+ catch {
10088
+ /* ignore IDB errors during purge */
10089
+ }
10090
+ }
10091
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: RuntimeNavStateCacheService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
10092
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: RuntimeNavStateCacheService, providedIn: 'root' }); }
10093
+ }
10094
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: RuntimeNavStateCacheService, decorators: [{
10095
+ type: Injectable,
10096
+ args: [{ providedIn: 'root' }]
10097
+ }], ctorParameters: () => [] });
10098
+
9828
10099
  class CardViewService {
9829
10100
  constructor() {
9830
10101
  this._maxHeaderTitleHeight$ = new BehaviorSubject(0);
@@ -9857,6 +10128,9 @@ class BaseSettingsService {
9857
10128
  saveSetting(key, value) {
9858
10129
  return from(this.idb.set('settings', key, value));
9859
10130
  }
10131
+ removeSetting(key) {
10132
+ return from(this.idb.delete('settings', key));
10133
+ }
9860
10134
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: BaseSettingsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
9861
10135
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: BaseSettingsService, providedIn: 'root' }); }
9862
10136
  }
@@ -9865,40 +10139,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
9865
10139
  args: [{ providedIn: 'root' }]
9866
10140
  }] });
9867
10141
 
9868
- class CalendarSettingsService extends BaseSettingsService {
9869
- constructor() {
9870
- super(...arguments);
9871
- this.CALENDAR_KEY_PREFIX = 'cal_cfg_';
9872
- // نگهداری وضعیت فعلی برای دسترسی سریع در UI
9873
- this.configSubject = new BehaviorSubject(null);
9874
- }
9875
- get config$() {
9876
- return this.configSubject.asObservable();
9877
- }
9878
- /**
9879
- * بارگذاری تنظیمات و آپدیت کردن استریم
9880
- */
9881
- getSetting(reportId) {
9882
- // ۱. اول متد اصلی (پدر) را صدا می‌زنیم تا دیتا از IDB بیاید
9883
- const key = `${this.CALENDAR_KEY_PREFIX}${reportId}`;
9884
- return super.getSetting(key).pipe(tap$1((c) => this.configSubject.next(c)));
9885
- }
9886
- /**
9887
- * ذخیره تنظیمات و اطلاع‌رسانی به تمام Subscribe کننده‌ها
9888
- */
9889
- saveSetting(reportId, newConfig) {
9890
- const key = `${this.CALENDAR_KEY_PREFIX}${reportId}`;
9891
- const updatedConfig = { ...this.configSubject.value, ...newConfig };
9892
- return super.saveSetting(key, updatedConfig).pipe(tap$1(() => this.configSubject.next(updatedConfig)));
9893
- }
9894
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: CalendarSettingsService, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
9895
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: CalendarSettingsService, providedIn: 'root' }); }
9896
- }
9897
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: CalendarSettingsService, decorators: [{
9898
- type: Injectable,
9899
- args: [{ providedIn: 'root' }]
9900
- }] });
9901
-
9902
10142
  class SimpleTemplateEngine {
9903
10143
  constructor() {
9904
10144
  this.cache = new Map();
@@ -10484,6 +10724,9 @@ class ReportBaseComponent extends BaseComponent {
10484
10724
  get moDataList() {
10485
10725
  return this._ulvMainService.moDataListSource.getValue();
10486
10726
  }
10727
+ get isCheckList() {
10728
+ return this._ulvMainService.isMultiSelect;
10729
+ }
10487
10730
  ngOnInit() {
10488
10731
  super.ngOnInit();
10489
10732
  this.rendered = true;
@@ -10499,6 +10742,7 @@ class ReportBaseComponent extends BaseComponent {
10499
10742
  this.conditionalFormats$ = this._ulvMainService.conditionalFormats$;
10500
10743
  this.cartableTemplates$ = this._ulvMainService.cartableTemplates$;
10501
10744
  this.cartableChildsMo$ = this._ulvMainService.cartableChildsMo$;
10745
+ this.isCheckList$ = this._ulvMainService.isMultiSelect$;
10502
10746
  this.title$ = this._ulvMainService.title$.pipe(pluck('text'));
10503
10747
  this.menuItems$ = this._ulvMainService.menuItems$;
10504
10748
  this.pagingSetting$ = this._ulvMainService.pagingSetting$;
@@ -10652,7 +10896,7 @@ class ReportBaseComponent extends BaseComponent {
10652
10896
  this.context.fireEvent('UserSettingChange', this.context, gridSetting);
10653
10897
  }
10654
10898
  _ulvCommandClicked(mo, index) {
10655
- this._removeCheckedAll();
10899
+ !this.isCheckList && this._removeCheckedAll();
10656
10900
  this._select(mo, index);
10657
10901
  }
10658
10902
  _checkedAll() {
@@ -11639,7 +11883,7 @@ class ReportViewBaseComponent extends BaseComponent {
11639
11883
  this.rowIndicator = Number(columns[0].MetaFieldTypeId) === 41;
11640
11884
  }
11641
11885
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: ReportViewBaseComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
11642
- 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 }); }
11886
+ 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", alternateEditObjectColumn: "alternateEditObjectColumn", disableHyperLink: "disableHyperLink", columnsHyperLink: "columnsHyperLink", effectiveReportLayout: "effectiveReportLayout", contentDensity: "contentDensity", rtl: "rtl", showOkCancelButtons: "showOkCancelButtons", title: "title", hasInlineDeleteButton: "hasInlineDeleteButton", hasInlineEditButton: "hasInlineEditButton", contextSetting: "contextSetting", gridFreeColumnSizing: "gridFreeColumnSizing", navigationArrow: "navigationArrow", cartableTemplates: "cartableTemplates", cartableChildsMo: "cartableChildsMo", pagingSetting: "pagingSetting", 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 }); }
11643
11887
  }
11644
11888
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: ReportViewBaseComponent, decorators: [{
11645
11889
  type: Component,
@@ -11771,6 +12015,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
11771
12015
  type: Input
11772
12016
  }], contentHeight: [{
11773
12017
  type: Input
12018
+ }], alternateEditObjectColumn: [{
12019
+ type: Input
12020
+ }], disableHyperLink: [{
12021
+ type: Input
12022
+ }], columnsHyperLink: [{
12023
+ type: Input
12024
+ }], effectiveReportLayout: [{
12025
+ type: Input
11774
12026
  }], contentDensity: [{
11775
12027
  type: Input
11776
12028
  }], rtl: [{
@@ -12922,6 +13174,7 @@ class SplitterComponent extends BaseComponent {
12922
13174
  super(...arguments);
12923
13175
  this.emptyClass = true;
12924
13176
  this.isBig = false;
13177
+ this.spliterResized = new EventEmitter();
12925
13178
  this._renderer = inject(Renderer2);
12926
13179
  this._portalService = inject(PortalService);
12927
13180
  }
@@ -12955,7 +13208,7 @@ class SplitterComponent extends BaseComponent {
12955
13208
  }), switchMap(() => {
12956
13209
  // تشخیص جهت در لحظه شروع درگ
12957
13210
  const isRtl = getComputedStyle(this.el.nativeElement).direction === 'rtl';
12958
- let previousElementSibling = this.el.nativeElement.previousElementSibling;
13211
+ let previousElementSibling = this.elDom || this.el.nativeElement.previousElementSibling;
12959
13212
  while (previousElementSibling &&
12960
13213
  previousElementSibling.tagName.toLocaleLowerCase() === 'bnrc-dynamic-layout') {
12961
13214
  previousElementSibling &&
@@ -12989,9 +13242,11 @@ class SplitterComponent extends BaseComponent {
12989
13242
  newWidth = event.clientX - rect.left;
12990
13243
  }
12991
13244
  if ((!this.minWidth || newWidth >= this.minWidth) && (!this.maxWidth || newWidth <= this.maxWidth)) {
12992
- this._renderer.setStyle(nextSibling, 'overflow', `hidden`);
12993
- this._renderer.setStyle(sibling, 'width', `${newWidth}px`);
13245
+ nextSibling && this._renderer.setStyle(nextSibling, 'overflow', `hidden`);
13246
+ const value = `${newWidth}px`;
13247
+ this._renderer.setStyle(sibling, 'width', value);
12994
13248
  this._renderer.setStyle(sibling, 'flex', 'none');
13249
+ this.spliterResized.emit(value);
12995
13250
  }
12996
13251
  }
12997
13252
  toggleResizingState(isResizing, nextSibling) {
@@ -12999,15 +13254,15 @@ class SplitterComponent extends BaseComponent {
12999
13254
  this._renderer[action](document.body, 'resizing-active');
13000
13255
  this._renderer[action](this.el.nativeElement, 'is-resizing');
13001
13256
  if (!isResizing) {
13002
- this._renderer.removeClass(nextSibling, 'tw-overflow-hidden');
13257
+ nextSibling && this._renderer.removeClass(nextSibling, 'tw-overflow-hidden');
13003
13258
  this._portalService.windowResize();
13004
13259
  }
13005
13260
  else {
13006
- this._renderer.addClass(nextSibling, 'tw-overflow-hidden');
13261
+ nextSibling && this._renderer.addClass(nextSibling, 'tw-overflow-hidden');
13007
13262
  }
13008
13263
  }
13009
13264
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: SplitterComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
13010
- 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">
13265
+ 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">
13011
13266
  <div class="splitter-line"></div>
13012
13267
  <div class="grip-handle">
13013
13268
  <svg viewBox="0 0 24 24" fill="currentColor">
@@ -13051,12 +13306,237 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
13051
13306
  }], elHeight: [{
13052
13307
  type: HostBinding,
13053
13308
  args: ['style.height.px']
13309
+ }], spliterResized: [{
13310
+ type: Output
13054
13311
  }], minWidth: [{
13055
13312
  type: Input
13056
13313
  }], maxWidth: [{
13057
13314
  type: Input
13058
13315
  }], config: [{
13059
13316
  type: Input
13317
+ }], elDom: [{
13318
+ type: Input
13319
+ }] } });
13320
+
13321
+ /**
13322
+ * Fills remaining vertical space for the host element.
13323
+ *
13324
+ * - **viewport** — page-level: uses `window.innerHeight` and offset from the top of the viewport.
13325
+ * - **container** — nested layouts: bounds from the **resolved container** (`[containerDom]` if set,
13326
+ * else nearest ancestor with `fillEmptySpace`, else `document.documentElement`).
13327
+ *
13328
+ * Vertical scroll ownership is **not** decided here; use `ScrollLayoutContextHolder` (`nested` | `isolated` | `root`)
13329
+ * from `barsa-novin-ray-core` on the page shell.
13330
+ *
13331
+ * @deprecated Do not use this directive as the primary way to **size individual reports** (grids, calendars).
13332
+ * Prefer the report layout policy / scroll shell (`resolveReportLayoutPolicy`, `report-grid-wrapper`). Filling
13333
+ * **page or shell containers** remains an appropriate use case.
13334
+ **/
13335
+ class FillEmptySpaceDirective extends BaseDirective {
13336
+ constructor() {
13337
+ super(...arguments);
13338
+ /**
13339
+ * `viewport` — fill against the browser viewport (default).
13340
+ * `container` — fill inside resolved container: optional `[containerDom]`, else nearest parent `[fillEmptySpace]`, else document root.
13341
+ */
13342
+ this.mode = 'viewport';
13343
+ this.heightChanged = new EventEmitter();
13344
+ this._rafId = null;
13345
+ this._viewReady = false;
13346
+ this._onWindowResize = () => this.scheduleMeasure();
13347
+ }
13348
+ ngAfterViewInit() {
13349
+ this._viewReady = true;
13350
+ this.syncFillWatchersAndMeasure();
13351
+ }
13352
+ ngOnChanges(_changes) {
13353
+ if (!this._viewReady) {
13354
+ return;
13355
+ }
13356
+ this.syncFillWatchersAndMeasure();
13357
+ }
13358
+ ngOnDestroy() {
13359
+ this.cancelScheduledMeasure();
13360
+ this.teardownFillLayoutWatchers();
13361
+ super.ngOnDestroy();
13362
+ }
13363
+ Refresh() {
13364
+ this.measureAndApply();
13365
+ }
13366
+ scheduleMeasure() {
13367
+ if (this._rafId !== null) {
13368
+ cancelAnimationFrame(this._rafId);
13369
+ }
13370
+ this._rafId = requestAnimationFrame(() => {
13371
+ this._rafId = null;
13372
+ this.measureAndApply();
13373
+ });
13374
+ }
13375
+ cancelScheduledMeasure() {
13376
+ if (this._rafId !== null) {
13377
+ cancelAnimationFrame(this._rafId);
13378
+ this._rafId = null;
13379
+ }
13380
+ }
13381
+ syncFillWatchersAndMeasure() {
13382
+ this.teardownFillLayoutWatchers();
13383
+ this.cancelScheduledMeasure();
13384
+ if (this.disable) {
13385
+ return;
13386
+ }
13387
+ if (this.height != null) {
13388
+ this.measureAndApply();
13389
+ return;
13390
+ }
13391
+ this.setupFillLayoutWatchers();
13392
+ this.scheduleMeasure();
13393
+ }
13394
+ setupFillLayoutWatchers() {
13395
+ if (typeof ResizeObserver === 'undefined') {
13396
+ window.addEventListener('resize', this._onWindowResize);
13397
+ return;
13398
+ }
13399
+ const roTarget = this.getContainerElement();
13400
+ this._ro = new ResizeObserver(() => this.scheduleMeasure());
13401
+ this._ro.observe(roTarget);
13402
+ window.addEventListener('resize', this._onWindowResize);
13403
+ }
13404
+ teardownFillLayoutWatchers() {
13405
+ this._ro?.disconnect();
13406
+ this._ro = undefined;
13407
+ window.removeEventListener('resize', this._onWindowResize);
13408
+ }
13409
+ measureAndApply() {
13410
+ if (this.disable) {
13411
+ return;
13412
+ }
13413
+ const dom = this._el.nativeElement;
13414
+ if (dom.getClientRects().length === 0) {
13415
+ return;
13416
+ }
13417
+ if (this.height != null) {
13418
+ this.applyFixedHeight(dom);
13419
+ return;
13420
+ }
13421
+ const hostRect = dom.getBoundingClientRect();
13422
+ const containerRect = this.getContainerMetrics();
13423
+ const offsetTop = this.getOffsetTop(hostRect, containerRect);
13424
+ const decrementPx = this.parseCssSize(this.decrement);
13425
+ const available = this.calculateAvailableHeight(containerRect.height, offsetTop, decrementPx);
13426
+ this.applyFillHeight(dom, available);
13427
+ }
13428
+ /**
13429
+ * Element used for ResizeObserver and for `container` mode metrics:
13430
+ * `[containerDom]` → parent `closest('[fillEmptySpace]')` → `document.documentElement`.
13431
+ * Uses `parentElement` before `closest` so the host itself is not selected.
13432
+ */
13433
+ getContainerElement() {
13434
+ if (this.containerDom) {
13435
+ return this.containerDom;
13436
+ }
13437
+ const host = this._el.nativeElement;
13438
+ const parentFill = host.parentElement?.closest('[fillEmptySpace]');
13439
+ if (parentFill) {
13440
+ return parentFill;
13441
+ }
13442
+ return document.documentElement;
13443
+ }
13444
+ getContainerMetrics() {
13445
+ if (this.mode === 'viewport') {
13446
+ // Same spirit as legacy `100svh`: viewport height; explicit container is not used for sizing.
13447
+ return { top: 0, height: window.innerHeight };
13448
+ }
13449
+ const r = this.getContainerElement().getBoundingClientRect();
13450
+ return { top: r.top, height: r.height };
13451
+ }
13452
+ getOffsetTop(hostRect, containerRect) {
13453
+ return this.dontUseTopBound ? 0 : hostRect.top - containerRect.top;
13454
+ }
13455
+ calculateAvailableHeight(containerHeight, offsetTop, decrementPx) {
13456
+ return Math.max(0, containerHeight - offsetTop - decrementPx);
13457
+ }
13458
+ applyFillHeight(dom, px) {
13459
+ const prop = this.getStyleProperty();
13460
+ if (prop === 'min-height' || prop === 'max-height') {
13461
+ this._renderer2.setStyle(dom, 'height', 'auto');
13462
+ }
13463
+ this._renderer2.setStyle(dom, prop, `${px}px`);
13464
+ this.heightChanged.emit();
13465
+ }
13466
+ applyFixedHeight(dom) {
13467
+ if (this.setMinHeight) {
13468
+ this._renderer2.setStyle(dom, 'height', 'auto');
13469
+ }
13470
+ if (this.setMaxHeight) {
13471
+ this._renderer2.setStyle(dom, 'height', 'auto');
13472
+ }
13473
+ const prop = this.setMinHeight ? 'min-height' : this.setMaxHeight ? 'max-height' : 'height';
13474
+ this._renderer2.setStyle(dom, prop, `${this.height}px`);
13475
+ this.heightChanged.emit();
13476
+ }
13477
+ getStyleProperty() {
13478
+ if (this.setMinHeight) {
13479
+ return 'min-height';
13480
+ }
13481
+ if (this.setMaxHeight) {
13482
+ return 'max-height';
13483
+ }
13484
+ return 'height';
13485
+ }
13486
+ parseCssSize(value) {
13487
+ if (value == null || value === '') {
13488
+ return 0;
13489
+ }
13490
+ if (typeof value === 'number' && !Number.isNaN(value)) {
13491
+ return value;
13492
+ }
13493
+ const s = String(value).trim().toLowerCase();
13494
+ if (!s) {
13495
+ return 0;
13496
+ }
13497
+ if (s.endsWith('rem')) {
13498
+ const n = parseFloat(s);
13499
+ if (Number.isNaN(n)) {
13500
+ return 0;
13501
+ }
13502
+ const rootPx = parseFloat(getComputedStyle(document.documentElement).fontSize) || 16;
13503
+ return n * rootPx;
13504
+ }
13505
+ if (s.endsWith('px')) {
13506
+ const n = parseFloat(s);
13507
+ return Number.isNaN(n) ? 0 : n;
13508
+ }
13509
+ const n = parseFloat(s);
13510
+ return Number.isNaN(n) ? 0 : n;
13511
+ }
13512
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: FillEmptySpaceDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
13513
+ 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 }); }
13514
+ }
13515
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: FillEmptySpaceDirective, decorators: [{
13516
+ type: Directive,
13517
+ args: [{
13518
+ selector: '[fillEmptySpace]',
13519
+ exportAs: 'fillEmptySpace',
13520
+ standalone: false
13521
+ }]
13522
+ }], propDecorators: { mode: [{
13523
+ type: Input
13524
+ }], containerDom: [{
13525
+ type: Input
13526
+ }], decrement: [{
13527
+ type: Input
13528
+ }], disable: [{
13529
+ type: Input
13530
+ }], height: [{
13531
+ type: Input
13532
+ }], dontUseTopBound: [{
13533
+ type: Input
13534
+ }], setMinHeight: [{
13535
+ type: Input
13536
+ }], setMaxHeight: [{
13537
+ type: Input
13538
+ }], heightChanged: [{
13539
+ type: Output
13060
13540
  }] } });
13061
13541
 
13062
13542
  class MasterDetailsPageComponent extends PageWithFormHandlerBaseComponent {
@@ -13066,8 +13546,10 @@ class MasterDetailsPageComponent extends PageWithFormHandlerBaseComponent {
13066
13546
  this.sectionClass = true;
13067
13547
  this.ismodal = false;
13068
13548
  this.isinsideview = false;
13549
+ this._scrollLayoutContext = inject(ScrollLayoutContextHolder);
13069
13550
  }
13070
13551
  ngOnInit() {
13552
+ this._scrollLayoutContext.setMode('isolated');
13071
13553
  this.settings = BarsaApi.Common.Util.TryGetValue(this._activatedRoute, 'data._value.pageData.Component.Settings', null);
13072
13554
  const isModal = this.settings?.IsModal;
13073
13555
  if (isModal) {
@@ -13096,42 +13578,56 @@ class MasterDetailsPageComponent extends PageWithFormHandlerBaseComponent {
13096
13578
  ngOnDestroy() {
13097
13579
  super.ngOnDestroy();
13098
13580
  // add ngondestroy because to call routingservice ngondestroy.
13099
- // if i dont add this ngondestroy in routingservice do not call.
13581
+ // if i dont add this ngondestroy in routingservice do not call.
13100
13582
  }
13101
13583
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: MasterDetailsPageComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
13102
- 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: `
13103
- <div class="tw-flex tw-h-full tw-w-full tw-flex-col md:tw-flex-row">
13584
+ 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: `
13585
+ <div
13586
+ class="tw-flex tw-h-full tw-w-full tw-flex-col md:tw-flex-row tw-p-2"
13587
+ fillEmptySpace
13588
+ style="box-sizing: border-box;"
13589
+ >
13104
13590
  <!-- لیست -->
13105
13591
  <div class="tw-w-full md:tw-w-96 master">
13106
13592
  <ng-container #containerRef></ng-container>
13107
13593
  </div>
13108
13594
  <bnrc-splitter></bnrc-splitter>
13109
13595
  <!-- جزئیات -->
13110
- <div class="fd-dynamic-page__content tw-w-full md:tw-flex-1 !tw-overflow-hidden details tw-min-w-0 tw-p-0">
13596
+ <div
13597
+ 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
13598
+ !tw-overflow-hidden details tw-min-w-0 tw-p-0"
13599
+ >
13111
13600
  <router-outlet name="details"></router-outlet>
13112
13601
  </div>
13113
13602
  </div>
13114
13603
  <router-outlet></router-outlet>
13115
13604
  <router-outlet name="dialog"></router-outlet>
13116
- `, isInline: true, styles: [":host{display:block;height:100%}\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 }); }
13605
+ `, 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 }); }
13117
13606
  }
13118
13607
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: MasterDetailsPageComponent, decorators: [{
13119
13608
  type: Component,
13120
13609
  args: [{ selector: 'bnrc-master-details-page', template: `
13121
- <div class="tw-flex tw-h-full tw-w-full tw-flex-col md:tw-flex-row">
13610
+ <div
13611
+ class="tw-flex tw-h-full tw-w-full tw-flex-col md:tw-flex-row tw-p-2"
13612
+ fillEmptySpace
13613
+ style="box-sizing: border-box;"
13614
+ >
13122
13615
  <!-- لیست -->
13123
13616
  <div class="tw-w-full md:tw-w-96 master">
13124
13617
  <ng-container #containerRef></ng-container>
13125
13618
  </div>
13126
13619
  <bnrc-splitter></bnrc-splitter>
13127
13620
  <!-- جزئیات -->
13128
- <div class="fd-dynamic-page__content tw-w-full md:tw-flex-1 !tw-overflow-hidden details tw-min-w-0 tw-p-0">
13621
+ <div
13622
+ 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
13623
+ !tw-overflow-hidden details tw-min-w-0 tw-p-0"
13624
+ >
13129
13625
  <router-outlet name="details"></router-outlet>
13130
13626
  </div>
13131
13627
  </div>
13132
13628
  <router-outlet></router-outlet>
13133
13629
  <router-outlet name="dialog"></router-outlet>
13134
- `, providers: [RoutingService, ContainerService], changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, styles: [":host{display:block;height:100%}\n"] }]
13630
+ `, 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"] }]
13135
13631
  }], propDecorators: { _position: [{
13136
13632
  type: HostBinding,
13137
13633
  args: ['style.position']
@@ -13163,123 +13659,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
13163
13659
  <ng-container #containerBottomRef></ng-container> `, changeDetection: ChangeDetectionStrategy.OnPush, providers: [RoutingService], standalone: false, styles: [":host{min-height:100svh}\n"] }]
13164
13660
  }] });
13165
13661
 
13166
- class FillEmptySpaceDirective extends BaseDirective {
13167
- constructor() {
13168
- super(...arguments);
13169
- this.heightChanged = new EventEmitter();
13170
- this._height = '100svh';
13171
- this.topBound = '';
13172
- this.oldTopBound = '';
13173
- }
13174
- ngAfterViewInit() {
13175
- super.ngAfterViewInit();
13176
- if (this.disable) {
13177
- return;
13178
- }
13179
- this._handleResize();
13180
- }
13181
- ngOnDestroy() {
13182
- super.ngOnDestroy();
13183
- this._ro?.disconnect();
13184
- }
13185
- Refresh() {
13186
- this._setHeightOfFormContent();
13187
- }
13188
- _setHeight() {
13189
- setTimeout(() => {
13190
- this._setHeightOfFormContent();
13191
- if (this.topBound === '0px') {
13192
- setTimeout(() => {
13193
- this._setHeightOfFormContent();
13194
- }, 1000);
13195
- }
13196
- }, 100);
13197
- }
13198
- _handleResize() {
13199
- if (typeof ResizeObserver === 'undefined') {
13200
- return;
13201
- } // چک کردن پشتیبانی مرورگر به جای try-catch
13202
- this._ro = new ResizeObserver((entries) => {
13203
- const entry = entries[0];
13204
- // چک می‌کنیم که المنت مخفی (display: none) نباشد
13205
- if (entry && entry.contentRect.height > 0) {
13206
- requestAnimationFrame(() => {
13207
- this._setHeight();
13208
- });
13209
- }
13210
- });
13211
- if (this._el?.nativeElement) {
13212
- this._ro.observe(this._el.nativeElement);
13213
- }
13214
- }
13215
- _setHeightOfFormContent() {
13216
- const dom = this._el.nativeElement;
13217
- const bound = dom.getBoundingClientRect();
13218
- this.topBound = `${bound.top}px`;
13219
- let decrement = this.decrement;
13220
- if (this.oldTopBound && this.oldTopBound === this.topBound) {
13221
- return;
13222
- }
13223
- if (this.setMinHeight) {
13224
- this._renderer2.setStyle(dom, 'height', `auto`);
13225
- }
13226
- if (this.setMaxHeight) {
13227
- this._renderer2.setStyle(dom, 'height', `auto`);
13228
- }
13229
- if (this.height) {
13230
- let prop = 'height';
13231
- this.setMinHeight && (prop = 'min-height');
13232
- this.setMaxHeight && (prop = 'max-height');
13233
- this._renderer2.setStyle(dom, prop, `${this.height}px`);
13234
- this.heightChanged.emit();
13235
- return;
13236
- }
13237
- if (this.containerDom) {
13238
- this._height = `${this.containerDom.getBoundingClientRect().height}px`;
13239
- }
13240
- if (decrement) {
13241
- decrement = ` - ${decrement}`;
13242
- }
13243
- else {
13244
- decrement = '';
13245
- }
13246
- if (this.dontUseTopBound) {
13247
- this.topBound = '0px';
13248
- }
13249
- this.oldTopBound = this.topBound;
13250
- if (bound) {
13251
- this._renderer2.setStyle(dom, this.setMinHeight ? 'min-height' : 'height', `calc(${this._height} - ${this.topBound}${decrement})`);
13252
- }
13253
- this.heightChanged.emit();
13254
- }
13255
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: FillEmptySpaceDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
13256
- 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 }); }
13257
- }
13258
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: FillEmptySpaceDirective, decorators: [{
13259
- type: Directive,
13260
- args: [{
13261
- selector: '[fillEmptySpace]',
13262
- exportAs: 'fillEmptySpace',
13263
- standalone: false
13264
- }]
13265
- }], propDecorators: { containerDom: [{
13266
- type: Input
13267
- }], decrement: [{
13268
- type: Input
13269
- }], disable: [{
13270
- type: Input
13271
- }], height: [{
13272
- type: Input
13273
- }], dontUseTopBound: [{
13274
- type: Input
13275
- }], setMinHeight: [{
13276
- type: Input
13277
- }], setMaxHeight: [{
13278
- type: Input
13279
- }], heightChanged: [{
13280
- type: Output
13281
- }] } });
13282
-
13283
13662
  class PortalPageSidebarComponent extends PageBaseComponent {
13284
13663
  constructor() {
13285
13664
  super(...arguments);
@@ -13294,7 +13673,7 @@ class PortalPageSidebarComponent extends PageBaseComponent {
13294
13673
  <div class="sidebar" fillEmptySpace><ng-container #containerRef></ng-container></div>
13295
13674
  <div class="mainside"><router-outlet name="mainside"></router-outlet></div>
13296
13675
  </div>
13297
- <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 }); }
13676
+ <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 }); }
13298
13677
  }
13299
13678
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: PortalPageSidebarComponent, decorators: [{
13300
13679
  type: Component,
@@ -13601,7 +13980,7 @@ class BaseViewPropsComponent extends BaseComponent {
13601
13980
  return `${row.$Group ? row.$Group : row.Id}${index}`;
13602
13981
  }
13603
13982
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: BaseViewPropsComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
13604
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.0.6", type: BaseViewPropsComponent, isStandalone: false, selector: "bnrc-base-view-props", inputs: { detailsComponent: "detailsComponent", detailsColumns: "detailsColumns", detailsText: "detailsText", detailsTextFunction: "detailsTextFunction", moDataList: "moDataList", reportId: "reportId", allColumns: "allColumns", hideOpenIcon: "hideOpenIcon", isCheckList: "isCheckList", allChecked: "allChecked", canView: "canView", visibility: "visibility", level: "level", expanded: "expanded", styleIndex: "styleIndex", parentExpanded: "parentExpanded", access: "access", groupby: "groupby", UlvMainCtrlr: "UlvMainCtrlr", conditionalFormats: "conditionalFormats", deviceName: "deviceName", deviceSize: "deviceSize", contextMenuItems: "contextMenuItems", columns: "columns", allowInlineEdit: "allowInlineEdit", secondaryColumns: "secondaryColumns", popin: "popin", typeDefId: "typeDefId", columnsCount: "columnsCount", mobileOrTablet: "mobileOrTablet", containerWidth: "containerWidth", newInlineEditMo: "newInlineEditMo", inlineEditMode: "inlineEditMode", onlyInlineEdit: "onlyInlineEdit", rowHoverable: "rowHoverable", openOnClick: "openOnClick", tlbButtons: "tlbButtons", setting: "setting", parameters: "parameters", formSetting: "formSetting", disableOverflowContextMenu: "disableOverflowContextMenu", rowActivable: "rowActivable", contentDensity: "contentDensity", rtl: "rtl", showOkCancelButtons: "showOkCancelButtons", title: "title", isChecked: "isChecked", navigationArrow: "navigationArrow" }, outputs: { resetWorkflowState: "resetWorkflowState", deselectAll: "deselectAll", escapeKey: "escapeKey", rowCheck: "rowCheck", workflowShareButtons: "workflowShareButtons", rowClick: "rowClick", ulvCommand: "ulvCommand", editFormPanelCancel: "editFormPanelCancel", editFormPanelSave: "editFormPanelSave", selectNextInlineRecord: "selectNextInlineRecord", action: "action", expandClick: "expandClick", editFormPanelValueChange: "editFormPanelValueChange", cartableFormClosed: "cartableFormClosed" }, usesInheritance: true, ngImport: i0, template: ``, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
13983
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.0.6", type: BaseViewPropsComponent, isStandalone: false, selector: "bnrc-base-view-props", inputs: { detailsComponent: "detailsComponent", detailsColumns: "detailsColumns", detailsText: "detailsText", detailsTextFunction: "detailsTextFunction", moDataList: "moDataList", reportId: "reportId", allColumns: "allColumns", hideOpenIcon: "hideOpenIcon", isCheckList: "isCheckList", allChecked: "allChecked", canView: "canView", visibility: "visibility", level: "level", expanded: "expanded", styleIndex: "styleIndex", parentExpanded: "parentExpanded", access: "access", groupby: "groupby", UlvMainCtrlr: "UlvMainCtrlr", conditionalFormats: "conditionalFormats", deviceName: "deviceName", deviceSize: "deviceSize", contextMenuItems: "contextMenuItems", columns: "columns", allowInlineEdit: "allowInlineEdit", secondaryColumns: "secondaryColumns", popin: "popin", typeDefId: "typeDefId", columnsCount: "columnsCount", mobileOrTablet: "mobileOrTablet", containerWidth: "containerWidth", newInlineEditMo: "newInlineEditMo", inlineEditMode: "inlineEditMode", onlyInlineEdit: "onlyInlineEdit", rowHoverable: "rowHoverable", openOnClick: "openOnClick", tlbButtons: "tlbButtons", setting: "setting", parameters: "parameters", formSetting: "formSetting", disableOverflowContextMenu: "disableOverflowContextMenu", rowActivable: "rowActivable", contentDensity: "contentDensity", rtl: "rtl", showOkCancelButtons: "showOkCancelButtons", title: "title", isChecked: "isChecked", navigationArrow: "navigationArrow", alternateEditObjectColumn: "alternateEditObjectColumn", disableHyperLink: "disableHyperLink", columnsHyperLink: "columnsHyperLink" }, outputs: { resetWorkflowState: "resetWorkflowState", deselectAll: "deselectAll", escapeKey: "escapeKey", rowCheck: "rowCheck", workflowShareButtons: "workflowShareButtons", rowClick: "rowClick", ulvCommand: "ulvCommand", editFormPanelCancel: "editFormPanelCancel", editFormPanelSave: "editFormPanelSave", selectNextInlineRecord: "selectNextInlineRecord", action: "action", expandClick: "expandClick", editFormPanelValueChange: "editFormPanelValueChange", cartableFormClosed: "cartableFormClosed" }, usesInheritance: true, ngImport: i0, template: ``, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
13605
13984
  }
13606
13985
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: BaseViewPropsComponent, decorators: [{
13607
13986
  type: Component,
@@ -13707,6 +14086,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
13707
14086
  type: Input
13708
14087
  }], navigationArrow: [{
13709
14088
  type: Input
14089
+ }], alternateEditObjectColumn: [{
14090
+ type: Input
14091
+ }], disableHyperLink: [{
14092
+ type: Input
14093
+ }], columnsHyperLink: [{
14094
+ type: Input
13710
14095
  }], resetWorkflowState: [{
13711
14096
  type: Output
13712
14097
  }], deselectAll: [{
@@ -14218,7 +14603,7 @@ class BaseViewItemPropsComponent extends BaseViewPropsComponent {
14218
14603
  });
14219
14604
  }
14220
14605
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: BaseViewItemPropsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
14221
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.0.6", type: BaseViewItemPropsComponent, isStandalone: false, selector: "bnrc-base-view-item-props", inputs: { checkboxComponent: "checkboxComponent", disableEllapsis: "disableEllapsis", isslider: "isslider", attachmentViewType: "attachmentViewType", dirtyColumns: "dirtyColumns", contextMenuOverflowText: "contextMenuOverflowText", detailsComponent: "detailsComponent", detailsColumns: "detailsColumns", detailsText: "detailsText", mo: "mo", moDataListCount: "moDataListCount", index: "index", last: "last", hideHeader: "hideHeader", isdirty: "isdirty", isChecked: "isChecked", hideDetailsText: "hideDetailsText", showViewButton: "showViewButton", isNewInlineMo: "isNewInlineMo", extraRelation: "extraRelation", hideOpenIcon: "hideOpenIcon", inlineEditWithoutSelection: "inlineEditWithoutSelection", inDialog: "inDialog", isMobile: "isMobile", isMultiSelect: "isMultiSelect", rowIndicator: "rowIndicator", groupSummary: "groupSummary", isLastChildGroup: "isLastChildGroup", showRowNumber: "showRowNumber", rowNumber: "rowNumber", coloringRow: "coloringRow", noSaveInlineEditInServer: "noSaveInlineEditInServer", rowIndicatorColor: "rowIndicatorColor", maxHeightHeader: "maxHeightHeader", UlvMainCtrlr: "UlvMainCtrlr", fieldDict: "fieldDict", actionList: "actionList", serializedRelatedMo: "serializedRelatedMo", cartableTemplate: "cartableTemplate", cartableMo: "cartableMo", cartableWorkflowData: "cartableWorkflowData" }, outputs: { actionListClick: "actionListClick", events: "events" }, viewQueries: [{ propertyName: "_cartableFormRef", first: true, predicate: ["cartableFormRef"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: ``, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
14606
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.0.6", type: BaseViewItemPropsComponent, isStandalone: false, selector: "bnrc-base-view-item-props", inputs: { checkboxComponent: "checkboxComponent", disableEllapsis: "disableEllapsis", isslider: "isslider", attachmentViewType: "attachmentViewType", dirtyColumns: "dirtyColumns", contextMenuOverflowText: "contextMenuOverflowText", detailsComponent: "detailsComponent", detailsColumns: "detailsColumns", detailsText: "detailsText", mo: "mo", moDataListCount: "moDataListCount", index: "index", last: "last", hideHeader: "hideHeader", isdirty: "isdirty", isChecked: "isChecked", hideDetailsText: "hideDetailsText", showViewButton: "showViewButton", isNewInlineMo: "isNewInlineMo", extraRelation: "extraRelation", hideOpenIcon: "hideOpenIcon", inlineEditWithoutSelection: "inlineEditWithoutSelection", inDialog: "inDialog", isMobile: "isMobile", isMultiSelect: "isMultiSelect", rowIndicator: "rowIndicator", groupSummary: "groupSummary", isLastChildGroup: "isLastChildGroup", showRowNumber: "showRowNumber", rowNumber: "rowNumber", coloringRow: "coloringRow", noSaveInlineEditInServer: "noSaveInlineEditInServer", disableHyperLink: "disableHyperLink", columnsHyperLink: "columnsHyperLink", rowIndicatorColor: "rowIndicatorColor", alternateEditObjectColumn: "alternateEditObjectColumn", maxHeightHeader: "maxHeightHeader", UlvMainCtrlr: "UlvMainCtrlr", fieldDict: "fieldDict", actionList: "actionList", serializedRelatedMo: "serializedRelatedMo", cartableTemplate: "cartableTemplate", cartableMo: "cartableMo", cartableWorkflowData: "cartableWorkflowData" }, outputs: { actionListClick: "actionListClick", events: "events" }, viewQueries: [{ propertyName: "_cartableFormRef", first: true, predicate: ["cartableFormRef"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: ``, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
14222
14607
  }
14223
14608
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: BaseViewItemPropsComponent, decorators: [{
14224
14609
  type: Component,
@@ -14299,8 +14684,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
14299
14684
  type: Input
14300
14685
  }], noSaveInlineEditInServer: [{
14301
14686
  type: Input
14687
+ }], disableHyperLink: [{
14688
+ type: Input
14689
+ }], columnsHyperLink: [{
14690
+ type: Input
14302
14691
  }], rowIndicatorColor: [{
14303
14692
  type: Input
14693
+ }], alternateEditObjectColumn: [{
14694
+ type: Input
14304
14695
  }], maxHeightHeader: [{
14305
14696
  type: Input
14306
14697
  }], UlvMainCtrlr: [{
@@ -15583,6 +15974,7 @@ class RenderUlvViewerDirective extends BaseDirective {
15583
15974
  this._injector = inject(Injector);
15584
15975
  this._vcr = inject(ViewContainerRef);
15585
15976
  this._cdr = inject(ChangeDetectorRef);
15977
+ this._renderer = inject(Renderer2);
15586
15978
  }
15587
15979
  ngAfterViewInit() {
15588
15980
  super.ngAfterViewInit();
@@ -15613,6 +16005,7 @@ class RenderUlvViewerDirective extends BaseDirective {
15613
16005
  .getComponent(moduleName, modulePath, componentName, selector, this._injector)
15614
16006
  .pipe(takeUntil(this._onDestroy$), tap((component) => {
15615
16007
  component.instance.id = getUniqueId(4);
16008
+ this._renderer.addClass(component.location.nativeElement, 'ulv-viewer');
15616
16009
  component.instance.context = context;
15617
16010
  component.instance.isReportPage = this.isReportPage;
15618
16011
  component.instance.layoutInfo = this.layoutInfo;
@@ -15964,15 +16357,15 @@ class UlvCommandDirective extends BaseDirective {
15964
16357
  setTimeout(() => {
15965
16358
  // add settimeout because we need select row before execute row
15966
16359
  // executeUlvCommandHandler(button);
15967
- this.$execute.next();
16360
+ this.$execute.next(event);
15968
16361
  });
15969
16362
  return false;
15970
16363
  }
15971
16364
  ngOnInit() {
15972
16365
  super.ngOnInit();
15973
16366
  this.$execute
15974
- .pipe(exhaustMap(() => {
15975
- executeUlvCommandHandler(this.ulvCommandHandler);
16367
+ .pipe(exhaustMap((e) => {
16368
+ executeUlvCommandHandler(this.ulvCommandHandler, e);
15976
16369
  return timer(1000); // ۱ ثانیه بلاک می‌شود
15977
16370
  }))
15978
16371
  .subscribe();
@@ -17496,6 +17889,111 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
17496
17889
  type: Input
17497
17890
  }] } });
17498
17891
 
17892
+ class MoLinkerDirective extends BaseDirective {
17893
+ constructor() {
17894
+ super(...arguments);
17895
+ this.moLinker = input.required();
17896
+ this.alternateEditObjectColumn = input.required();
17897
+ this.disableHyperLink = input(false);
17898
+ this._routingService = inject(RoutingService, { optional: true });
17899
+ this._activatedRoute = inject(ActivatedRoute);
17900
+ this._moVal = inject(MoValuePipe);
17901
+ this._router = inject(Router);
17902
+ // ذخیره درخت روت محلی برای کلیک معمولی در همین صفحه
17903
+ this._localUrlTree = null;
17904
+ }
17905
+ ngOnInit() {
17906
+ super.ngOnInit();
17907
+ if (!this._routingService) {
17908
+ return;
17909
+ }
17910
+ if (!this.disableHyperLink()) {
17911
+ this._renderer2.addClass(this._el.nativeElement, 'mo-linker');
17912
+ // ۱. ساختن روت محلی (وابسته به روت فعلی) برای کلیک‌های معمولی
17913
+ this._localUrlTree = this.buildLocalUrlTree(this._routingService.isFirstPage, this.alternateEditObjectColumn());
17914
+ // ۲. ساختن روت تب جدید (از ریشه اصلی / بدون ActivatedRoute) و ست کردن روی href
17915
+ const newTabUrl = this.buildNewTabUrl();
17916
+ if (newTabUrl) {
17917
+ // فرض بر HashLocationStrategy (دارای #) است؛ اگر پراجکت شما بدون هشتگ است، '#' + را پاک کنید
17918
+ this._renderer2.setAttribute(this._el.nativeElement, 'href', '#' + newTabUrl);
17919
+ }
17920
+ }
17921
+ }
17922
+ // گوش دادن به رویداد کلیک
17923
+ onClick(event) {
17924
+ if (this.disableHyperLink() || !this._routingService) {
17925
+ return;
17926
+ }
17927
+ // تشخیص کلیک برای تب جدید (Ctrl, Cmd, Shift یا کلیک وسط)
17928
+ const isNewTabModifier = event.ctrlKey || event.metaKey || event.shiftKey || event.button === 1;
17929
+ if (isNewTabModifier) {
17930
+ // هیچ کاری نکن! بگذار مرورگر به طور طبیعی آدرس href (یعنی روت ریشه /landingpage) را در تب جدید باز کند
17931
+ return;
17932
+ }
17933
+ // اگر کلیک معمولی بود، جلوی رفتار مرورگر (باز کردن href) را می‌گیریم
17934
+ event.preventDefault();
17935
+ // و روت محلی و داخلی خودمان را اجرا می‌کنیم
17936
+ if (this._localUrlTree) {
17937
+ this._router.navigateByUrl(this._localUrlTree);
17938
+ }
17939
+ }
17940
+ /**
17941
+ * ساخت آدرس برای تب جدید: کاملاً مستقل از ریشه اصلی سایت (بدون relativeTo)
17942
+ */
17943
+ buildNewTabUrl() {
17944
+ const mo = this.moLinker();
17945
+ const x = {
17946
+ MoId: mo.$State === 'New' ? '0' : mo.Id,
17947
+ TypeDefId: mo.$TypeDefId,
17948
+ ReportId: mo.$ReportId,
17949
+ ActionType: 'ShowForm'
17950
+ };
17951
+ // ساخت درخت روت از ریشه اصلی (مطلق)
17952
+ const tree = this._router.createUrlTree(['/landingpage/query'], {
17953
+ // اگر نیاز دارید کوئری‌پارامترهای خاصی هم به تب جدید بفرستید:
17954
+ queryParams: { actionList: JSON.stringify([x]) }
17955
+ });
17956
+ return this._router.serializeUrl(tree);
17957
+ }
17958
+ /**
17959
+ * همان متد قبلی شما که روت را بر اساس ActivatedRoute فعلی می‌سازد
17960
+ */
17961
+ buildLocalUrlTree(isPage, alternateEditObjectColumn) {
17962
+ let alternateMo;
17963
+ if (alternateEditObjectColumn) {
17964
+ alternateMo = this._moVal.transform(alternateEditObjectColumn, this.moLinker(), false);
17965
+ if (!alternateMo) {
17966
+ return null;
17967
+ }
17968
+ }
17969
+ const mo = alternateMo ?? this.moLinker();
17970
+ const navigationParams = this._portalService.buildNavigationParams(null, mo, null, '', this._routingService?.isFirstPage ?? true);
17971
+ const primarySegment = isPage ? 'form' : 'popup';
17972
+ return this._router.createUrlTree([
17973
+ primarySegment,
17974
+ {
17975
+ outlets: {
17976
+ main: ['show', navigationParams]
17977
+ }
17978
+ }
17979
+ ], {
17980
+ relativeTo: this._activatedRoute // وابستگی به روت فعلی فقط برای کلیک معمولی
17981
+ });
17982
+ }
17983
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: MoLinkerDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
17984
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.0.6", type: MoLinkerDirective, isStandalone: false, selector: "[moLinker]", inputs: { moLinker: { classPropertyName: "moLinker", publicName: "moLinker", isSignal: true, isRequired: true, transformFunction: null }, alternateEditObjectColumn: { classPropertyName: "alternateEditObjectColumn", publicName: "alternateEditObjectColumn", isSignal: true, isRequired: true, transformFunction: null }, disableHyperLink: { classPropertyName: "disableHyperLink", publicName: "disableHyperLink", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "onClick($event)" } }, usesInheritance: true, ngImport: i0 }); }
17985
+ }
17986
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: MoLinkerDirective, decorators: [{
17987
+ type: Directive,
17988
+ args: [{
17989
+ selector: '[moLinker]',
17990
+ standalone: false
17991
+ }]
17992
+ }], propDecorators: { onClick: [{
17993
+ type: HostListener,
17994
+ args: ['click', ['$event']]
17995
+ }] } });
17996
+
17499
17997
  class PortalDynamicPageResolver {
17500
17998
  /** Inserted by Angular inject() migration for backwards compatibility */
17501
17999
  constructor() {
@@ -17636,6 +18134,109 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
17636
18134
  args: [{ providedIn: 'root' }]
17637
18135
  }], ctorParameters: () => [] });
17638
18136
 
18137
+ class EntitySettingsStore {
18138
+ constructor() {
18139
+ this.settingsService = inject(BaseSettingsService);
18140
+ this.subjects = new Map();
18141
+ }
18142
+ // ---------------------------------------------------
18143
+ // Subject
18144
+ // ---------------------------------------------------
18145
+ // ---------------------------------------------------
18146
+ // Observable
18147
+ // ---------------------------------------------------
18148
+ select$(entityId) {
18149
+ return this.getSubject(entityId).asObservable();
18150
+ }
18151
+ // ---------------------------------------------------
18152
+ // Snapshot
18153
+ // ---------------------------------------------------
18154
+ getSnapshot(entityId) {
18155
+ return this.getSubject(entityId).value;
18156
+ }
18157
+ // ---------------------------------------------------
18158
+ // Load
18159
+ // ---------------------------------------------------
18160
+ load(entityId) {
18161
+ const key = this.buildKey(entityId);
18162
+ const subject = this.getSubject(entityId);
18163
+ return this.settingsService.getSetting(key).pipe(tap$1((config) => {
18164
+ subject.next(config);
18165
+ }));
18166
+ }
18167
+ // ---------------------------------------------------
18168
+ // Save
18169
+ // ---------------------------------------------------
18170
+ save(entityId, partial) {
18171
+ const key = this.buildKey(entityId);
18172
+ const subject = this.getSubject(entityId);
18173
+ const current = subject.value ?? {};
18174
+ const updated = {
18175
+ ...current,
18176
+ ...partial
18177
+ };
18178
+ return this.settingsService.saveSetting(key, updated).pipe(tap$1(() => {
18179
+ subject.next(updated);
18180
+ }));
18181
+ }
18182
+ // ---------------------------------------------------
18183
+ // Replace
18184
+ // ---------------------------------------------------
18185
+ replace(entityId, value) {
18186
+ const key = this.buildKey(entityId);
18187
+ const subject = this.getSubject(entityId);
18188
+ return this.settingsService.saveSetting(key, value).pipe(tap$1(() => {
18189
+ subject.next(value);
18190
+ }));
18191
+ }
18192
+ // ---------------------------------------------------
18193
+ // Reset
18194
+ // ---------------------------------------------------
18195
+ reset(entityId) {
18196
+ const key = this.buildKey(entityId);
18197
+ const subject = this.getSubject(entityId);
18198
+ subject.next(null);
18199
+ return this.settingsService.removeSetting(key);
18200
+ }
18201
+ // ---------------------------------------------------
18202
+ // Cleanup
18203
+ // ---------------------------------------------------
18204
+ destroy(entityId) {
18205
+ const subject = this.subjects.get(entityId);
18206
+ if (subject) {
18207
+ subject.complete();
18208
+ this.subjects.delete(entityId);
18209
+ }
18210
+ }
18211
+ getSubject(entityId) {
18212
+ if (!this.subjects.has(entityId)) {
18213
+ this.subjects.set(entityId, new BehaviorSubject(null));
18214
+ }
18215
+ return this.subjects.get(entityId);
18216
+ }
18217
+ // ---------------------------------------------------
18218
+ // Utils
18219
+ // ---------------------------------------------------
18220
+ buildKey(entityId) {
18221
+ return `${this.keyPrefix}${entityId}`;
18222
+ }
18223
+ }
18224
+
18225
+ class CalendarSettingsStore extends EntitySettingsStore {
18226
+ constructor() {
18227
+ super(...arguments);
18228
+ this.keyPrefix = 'cal_cfg_';
18229
+ }
18230
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: CalendarSettingsStore, deps: null, target: i0.ɵɵFactoryTarget.Injectable }); }
18231
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: CalendarSettingsStore, providedIn: 'root' }); }
18232
+ }
18233
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: CalendarSettingsStore, decorators: [{
18234
+ type: Injectable,
18235
+ args: [{
18236
+ providedIn: 'root'
18237
+ }]
18238
+ }] });
18239
+
17639
18240
  class FormNewComponent extends BaseComponent {
17640
18241
  constructor() {
17641
18242
  super(...arguments);
@@ -17987,7 +18588,6 @@ class ReportNavigatorComponent extends BaseComponent {
17987
18588
  /** Inserted by Angular inject() migration for backwards compatibility */
17988
18589
  constructor() {
17989
18590
  super();
17990
- this.minheight = '100svh';
17991
18591
  this.isMobile = getDeviceIsDesktop();
17992
18592
  this._activatedRoute = inject(ActivatedRoute);
17993
18593
  this._portalService = inject(PortalService);
@@ -17996,17 +18596,20 @@ class ReportNavigatorComponent extends BaseComponent {
17996
18596
  this._cdr = inject(ChangeDetectorRef);
17997
18597
  this._loadingSource = new BehaviorSubject(false);
17998
18598
  this._routingService = inject(RoutingService, { optional: true, skipSelf: true });
18599
+ this._runtimeNavCache = inject(RuntimeNavStateCacheService);
17999
18600
  this.loading$ = this._loadingSource.asObservable().pipe(takeUntil(this._onDestroy$), debounceTime(200));
18000
18601
  }
18001
18602
  ngOnInit() {
18002
18603
  super.ngOnInit();
18003
18604
  this._activatedRoute.params
18004
- .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
18005
- .renderUlvMainUi(navItem, this.containerRef, this._injector, navItem.isReportPage)
18605
+ .pipe(takeUntil(this._onDestroy$), tap(() => this._setLoading(true)), map((params) => this._extractIds(params)),
18606
+ // tap((c) => (c.isReportPage ? (this.minheight = 'auto') : '100vh')),
18607
+ 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
18608
+ .renderUlvMainUi(resolved, this.containerRef, this._injector, resolved.isReportPage)
18006
18609
  .pipe(catchError((_err) =>
18007
18610
  // this._location.back();
18008
18611
  // return throwError(() => new Error(err));
18009
- of(true)))), tap((ulv) => this._setActiveReport(ulv)), finalize(() => {
18612
+ of(true)))))), tap((ulv) => this._setActiveReport(ulv)), finalize(() => {
18010
18613
  this._setLoading(false);
18011
18614
  }))
18012
18615
  .subscribe(() => {
@@ -18040,18 +18643,28 @@ class ReportNavigatorComponent extends BaseComponent {
18040
18643
  const navIdOrFieldDefId = params.id.split('__')[0];
18041
18644
  const reportId2OrLevelReportId = params.id.split('__').length > 1 ? params.id.split('__')[1] : '';
18042
18645
  const reportIdOrMoId = params.id.split('__').length > 2 ? params.id.split('__')[2] : '';
18646
+ const typeDefFromUrl = lastText.startsWith('in') ? lastText.replace('in', '') : '';
18647
+ const cacheKey = lastText.startsWith('in') && typeDefFromUrl && reportIdOrMoId
18648
+ ? buildRuntimeNavStateCacheKey(reportId2OrLevelReportId, reportIdOrMoId, typeDefFromUrl)
18649
+ : undefined;
18043
18650
  return {
18044
18651
  Id: navIdOrFieldDefId,
18045
18652
  ReportId: reportIdOrMoId,
18046
18653
  ReportId2: reportId2OrLevelReportId,
18047
18654
  isReportPage: lastText === '' || this._masterDetailsPage(lastText),
18655
+ cacheKey,
18048
18656
  OtherData: !lastText.startsWith('in')
18049
18657
  ? undefined
18050
18658
  : {
18051
18659
  FieldId: navIdOrFieldDefId,
18052
18660
  IsInsideViewResult: true,
18053
18661
  LevelReportId: reportId2OrLevelReportId,
18054
- Mo: { Id: reportIdOrMoId, $Caption: '', $TypeDefId: lastText.replace('in', '') }
18662
+ Mo: {
18663
+ Id: reportIdOrMoId,
18664
+ $Caption: '',
18665
+ $TypeDefId: typeDefFromUrl,
18666
+ $LevelReportId: reportId2OrLevelReportId
18667
+ }
18055
18668
  }
18056
18669
  };
18057
18670
  }
@@ -18063,19 +18676,78 @@ class ReportNavigatorComponent extends BaseComponent {
18063
18676
  this._cdr.detectChanges();
18064
18677
  }
18065
18678
  _onSelectionAdapter_SelectionChange() {
18066
- if (this._routingService?.masterDetails && this._ulvMainCtrlr) {
18067
- const fieldId = this._navItemParams.ReportId2;
18068
- const mo = this._ulvMainCtrlr.GetSelectedMetaObject();
18069
- if (!mo) {
18070
- return;
18679
+ const routing = this._routingService;
18680
+ if (!routing?.masterDetails || !this._ulvMainCtrlr) {
18681
+ return;
18682
+ }
18683
+ const fieldId = this._navItemParams.ReportId2;
18684
+ const mo = this._ulvMainCtrlr.GetSelectedMetaObject();
18685
+ if (!mo) {
18686
+ return;
18687
+ }
18688
+ const moId = `${mo.Id}`;
18689
+ const levelReportId = mo.$LevelReportId || '';
18690
+ const typeDefId = `${mo.$TypeDefId}`;
18691
+ const cacheKey = buildRuntimeNavStateCacheKey(levelReportId, moId, typeDefId);
18692
+ const envelope = {
18693
+ version: 1,
18694
+ sessionId: '',
18695
+ createdAt: Date.now(),
18696
+ schema: RUNTIME_NAV_STATE_SCHEMA_V1,
18697
+ serializationMode: 'dto',
18698
+ payload: {
18699
+ OtherData: {
18700
+ FieldId: fieldId,
18701
+ IsInsideViewResult: true,
18702
+ LevelReportId: levelReportId,
18703
+ Mo: mo
18704
+ }
18071
18705
  }
18072
- const moId = `${mo.Id}`;
18073
- const levelReportId = mo.$LevelReportId || '';
18074
- this._routingService.navigate(['details', `${fieldId}__${levelReportId}__${moId}__in${mo.$TypeDefId}`], true, null, null);
18706
+ };
18707
+ void this._runtimeNavCache.save(cacheKey, envelope).finally(() => {
18708
+ routing.navigate(['details', `${fieldId}__${levelReportId}__${moId}__in${mo.$TypeDefId}`], true, null, null);
18709
+ });
18710
+ }
18711
+ /**
18712
+ * URL parse → cache get → merge/hydrate → finalized navItem (before renderUlvMainUi).
18713
+ */
18714
+ async _finalizeNavItemFromCache(nav) {
18715
+ if (!nav.cacheKey || !nav.OtherData) {
18716
+ return nav;
18717
+ }
18718
+ const env = await this._runtimeNavCache.get(nav.cacheKey);
18719
+ return this._applyCachedEnvelope(nav, env);
18720
+ }
18721
+ _applyCachedEnvelope(nav, env) {
18722
+ if (!env?.payload || !nav.OtherData) {
18723
+ return nav;
18724
+ }
18725
+ if (env.schema !== RUNTIME_NAV_STATE_SCHEMA_V1 || env.version !== 1) {
18726
+ return nav;
18727
+ }
18728
+ if (env.expiresAt != null && Date.now() > env.expiresAt) {
18729
+ return nav;
18730
+ }
18731
+ const p = env.payload;
18732
+ if (env.serializationMode === 'dto' || env.serializationMode === 'hydrated') {
18733
+ const mergedOther = p.OtherData != null
18734
+ ? {
18735
+ ...nav.OtherData,
18736
+ ...p.OtherData,
18737
+ Mo: p.OtherData.Mo ?? nav.OtherData.Mo
18738
+ }
18739
+ : nav.OtherData;
18740
+ return {
18741
+ ...nav,
18742
+ OtherData: mergedOther,
18743
+ RuntimeState: p.RuntimeState ?? nav.RuntimeState,
18744
+ Context: p.Context ?? nav.Context
18745
+ };
18075
18746
  }
18747
+ return nav;
18076
18748
  }
18077
18749
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: ReportNavigatorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
18078
- 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 }); }
18750
+ 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 }); }
18079
18751
  }
18080
18752
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: ReportNavigatorComponent, decorators: [{
18081
18753
  type: Component,
@@ -18083,9 +18755,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
18083
18755
  }], ctorParameters: () => [], propDecorators: { containerRef: [{
18084
18756
  type: ViewChild,
18085
18757
  args: ['containerRef', { static: true, read: ViewContainerRef }]
18086
- }], minheight: [{
18087
- type: HostBinding,
18088
- args: ['style.min-height']
18089
18758
  }] } });
18090
18759
 
18091
18760
  class ReportEmptyPageComponent extends PageWithFormHandlerBaseComponent {
@@ -18359,6 +19028,88 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
18359
19028
  }]
18360
19029
  }] });
18361
19030
 
19031
+ /** Default CSS viewport wrapper class for report bodies (table, calendar, �) */
19032
+ const REPORT_GRID_VIEWPORT_CLASS = 'report-grid-wrapper';
19033
+ const DEFAULT_REPORT_LAYOUT_POLICY = Object.freeze({
19034
+ layout: 'inline',
19035
+ scroll: 'inherit'
19036
+ });
19037
+ /** Per-selector defaults (extend in app code if needed). Keys match `UiReportViewBase.UiComponent.Selector`. */
19038
+ const REPORT_TYPE_DEFAULT_POLICIES = Object.freeze({
19039
+ 'bsu-ui-calendar': { layout: 'fill', scroll: 'self' }
19040
+ });
19041
+ function scrollLayoutModeToContextEnvironment(mode) {
19042
+ switch (mode) {
19043
+ case 'nested':
19044
+ return { scrollContainerDepth: 1, shell: 'page' };
19045
+ case 'isolated':
19046
+ return { scrollContainerDepth: 0, shell: 'page', viewportIsolation: true };
19047
+ default:
19048
+ return { scrollContainerDepth: 0, shell: 'page' };
19049
+ }
19050
+ }
19051
+ function contextDefaultsFromEnvironment(env) {
19052
+ if (env.scrollContainerDepth > 0) {
19053
+ return { scroll: 'inherit', layout: 'inline' };
19054
+ }
19055
+ return {};
19056
+ }
19057
+ function mergePolicyLayers(...layers) {
19058
+ let layout;
19059
+ let scroll;
19060
+ for (const layer of layers) {
19061
+ if (!layer) {
19062
+ continue;
19063
+ }
19064
+ if (layer.layout !== undefined) {
19065
+ layout = layer.layout;
19066
+ }
19067
+ if (layer.scroll !== undefined) {
19068
+ scroll = layer.scroll;
19069
+ }
19070
+ }
19071
+ return {
19072
+ layout: layout ?? DEFAULT_REPORT_LAYOUT_POLICY.layout,
19073
+ scroll: scroll ?? DEFAULT_REPORT_LAYOUT_POLICY.scroll
19074
+ };
19075
+ }
19076
+ /**
19077
+ * Final scroll arbitration (pure). Call after merge so registry/explicit `self` wins over nested inherit defaults.
19078
+ */
19079
+ function resolveFinalScroll(merged, env) {
19080
+ if (merged.scroll === 'self') {
19081
+ return 'self';
19082
+ }
19083
+ if (env.scrollContainerDepth > 0) {
19084
+ return 'inherit';
19085
+ }
19086
+ return 'self';
19087
+ }
19088
+ /**
19089
+ * Pure, framework-agnostic policy resolution. Later layers in `extraPartials` override earlier ones.
19090
+ * Order: DEFAULT, contextDefaults(env), registryDefault, ...extraPartials (each partial last-wins on its own keys).
19091
+ */
19092
+ function resolveReportLayoutPolicy(env, registryDefault, ...extraPartials) {
19093
+ const merged = mergePolicyLayers({ layout: DEFAULT_REPORT_LAYOUT_POLICY.layout, scroll: DEFAULT_REPORT_LAYOUT_POLICY.scroll }, contextDefaultsFromEnvironment(env), registryDefault, ...extraPartials);
19094
+ const scroll = resolveFinalScroll(merged, env);
19095
+ return Object.freeze({
19096
+ layout: merged.layout,
19097
+ scroll
19098
+ });
19099
+ }
19100
+ function getReportTypeDefaultPolicy(selector) {
19101
+ if (!selector) {
19102
+ return undefined;
19103
+ }
19104
+ return REPORT_TYPE_DEFAULT_POLICIES[selector];
19105
+ }
19106
+ /** Optional metadata path on view settings (low-code / future designer) */
19107
+ function extractLayoutPolicyFromView(view) {
19108
+ const s = view?.UiComponent?.Settings;
19109
+ const raw = s?.['ReportLayoutPolicy'];
19110
+ return raw;
19111
+ }
19112
+
18362
19113
  class NoInternetComponent extends BaseComponent {
18363
19114
  /** Inserted by Angular inject() migration for backwards compatibility */
18364
19115
  constructor() {
@@ -18822,8 +19573,10 @@ const directives = [
18822
19573
  SimplebarDirective,
18823
19574
  LeafletLongPressDirective,
18824
19575
  ResizeHandlerDirective,
18825
- SafeBottomDirective
19576
+ SafeBottomDirective,
19577
+ MoLinkerDirective
18826
19578
  ];
19579
+ const stores = [CalendarSettingsStore];
18827
19580
  const services = [
18828
19581
  PortalService,
18829
19582
  UploadService,
@@ -18851,8 +19604,7 @@ const services = [
18851
19604
  BarsaStorageService,
18852
19605
  ServiceWorkerCommuncationService,
18853
19606
  ApplicationCtrlrService,
18854
- PushNotificationService,
18855
- CalendarSettingsService
19607
+ PushNotificationService
18856
19608
  ];
18857
19609
  const pipes = [
18858
19610
  NumeralPipe,
@@ -18915,7 +19667,10 @@ const pipes = [
18915
19667
  MapToChatMessagePipe,
18916
19668
  PicturesByGroupIdPipe,
18917
19669
  ScopedCssPipe,
18918
- ReportActionListPipe
19670
+ ReportActionListPipe,
19671
+ GetCssVariableValuePipe,
19672
+ FindColumnsPipe,
19673
+ ExistsColumnsPipe
18919
19674
  ];
18920
19675
  const functionL1 = async function () {
18921
19676
  if (BarsaApi.LoginFormData.Culture === 'fa-IR') {
@@ -19012,7 +19767,8 @@ class BarsaNovinRayCoreModule extends BaseModule {
19012
19767
  useClass: SimpleTemplateEngine
19013
19768
  },
19014
19769
  ...pipes,
19015
- ...services
19770
+ ...services,
19771
+ ...stores
19016
19772
  ]
19017
19773
  };
19018
19774
  }
@@ -19105,7 +19861,10 @@ class BarsaNovinRayCoreModule extends BaseModule {
19105
19861
  MapToChatMessagePipe,
19106
19862
  PicturesByGroupIdPipe,
19107
19863
  ScopedCssPipe,
19108
- ReportActionListPipe, PlaceHolderDirective,
19864
+ ReportActionListPipe,
19865
+ GetCssVariableValuePipe,
19866
+ FindColumnsPipe,
19867
+ ExistsColumnsPipe, PlaceHolderDirective,
19109
19868
  NumbersOnlyInputDirective,
19110
19869
  RenderUlvViewerDirective,
19111
19870
  RenderUlvPaginDirective,
@@ -19156,7 +19915,8 @@ class BarsaNovinRayCoreModule extends BaseModule {
19156
19915
  SimplebarDirective,
19157
19916
  LeafletLongPressDirective,
19158
19917
  ResizeHandlerDirective,
19159
- SafeBottomDirective], imports: [CommonModule,
19918
+ SafeBottomDirective,
19919
+ MoLinkerDirective], imports: [CommonModule,
19160
19920
  BarsaNovinRayCoreRoutingModule,
19161
19921
  BarsaSapUiFormPageModule,
19162
19922
  ResizableModule,
@@ -19249,7 +20009,10 @@ class BarsaNovinRayCoreModule extends BaseModule {
19249
20009
  MapToChatMessagePipe,
19250
20010
  PicturesByGroupIdPipe,
19251
20011
  ScopedCssPipe,
19252
- ReportActionListPipe, PlaceHolderDirective,
20012
+ ReportActionListPipe,
20013
+ GetCssVariableValuePipe,
20014
+ FindColumnsPipe,
20015
+ ExistsColumnsPipe, PlaceHolderDirective,
19253
20016
  NumbersOnlyInputDirective,
19254
20017
  RenderUlvViewerDirective,
19255
20018
  RenderUlvPaginDirective,
@@ -19300,7 +20063,8 @@ class BarsaNovinRayCoreModule extends BaseModule {
19300
20063
  SimplebarDirective,
19301
20064
  LeafletLongPressDirective,
19302
20065
  ResizeHandlerDirective,
19303
- SafeBottomDirective] }); }
20066
+ SafeBottomDirective,
20067
+ MoLinkerDirective] }); }
19304
20068
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: BarsaNovinRayCoreModule, providers: [provideHttpClient(withInterceptorsFromDi())], imports: [CommonModule,
19305
20069
  BarsaNovinRayCoreRoutingModule,
19306
20070
  BarsaSapUiFormPageModule,
@@ -19330,5 +20094,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
19330
20094
  * Generated bundle index. Do not edit.
19331
20095
  */
19332
20096
 
19333
- 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, BaseSettingsService 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, PortalService as bA, UiService as bB, UlvMainService as bC, UploadService as bD, NetworkStatusService as bE, AudioRecordingService as bF, VideoRecordingService as bG, LocalStorageService as bH, IndexedDbService as bI, BarsaStorageService as bJ, PromptUpdateService as bK, NotificationService as bL, ServiceWorkerNotificationService as bM, ColumnService as bN, ServiceWorkerCommuncationService as bO, SaveScrollPositionService as bP, RoutingService as bQ, GroupByService as bR, LayoutMainContentService as bS, TabpageService as bT, InMemoryStorageService as bU, ShellbarHeightService as bV, ApplicationCtrlrService as bW, PushCheckService as bX, IdbService as bY, PushNotificationService as bZ, CardViewService 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, ApiService as bp, BreadcrumbService as bq, CustomInjector as br, DialogParams as bs, BarsaDialogService as bt, FormPanelService as bu, FormService as bv, ContainerService as bw, HorizontalLayoutService as bx, LayoutService as by, LogService as bz, BaseDynamicComponent as c, MetaobjectRelationModel as c$, CalendarSettingsService as c0, SimpleTemplateEngine as c1, TEMPLATE_ENGINE as c2, PortalDynamicPageResolver as c3, PortalFormPageResolver as c4, PortalPageResolver as c5, PortalReportPageResolver as c6, TileGroupBreadcrumResolver as c7, LoginSettingsResolver as c8, ReportBreadcrumbResolver as c9, NumberControlInfoModel as cA, FilePictureInfoModel as cB, FileControlInfoModel as cC, CommandControlInfoModel as cD, IconControlInfoModel as cE, PictureFileControlInfoModel as cF, GaugeControlInfoModel as cG, RelationListControlInfoModel as cH, HistoryControlInfoModel as cI, RabetehAkseTakiListiControlInfoModel as cJ, RelatedReportControlInfoModel as cK, CodeEditorControlInfoModel as cL, EnumControlInfoModel as cM, RowDataOption as cN, DateTimeControlInfoModel as cO, BoolControlInfoModel as cP, CalculateControlInfoModel as cQ, SubformControlInfoModel as cR, LinearListControlInfoModel as cS, ListRelationModel as cT, SingleRelationControlInfoModel as cU, MetaobjectDataModel as cV, MoForReportModelBase as cW, MoForReportModel as cX, ReportBaseInfo as cY, FormToolbarButton as cZ, ReportExtraInfo as c_, DateService as ca, DateHijriService as cb, DateMiladiService as cc, DateShamsiService as cd, FormNewComponent as ce, ReportContainerComponent as cf, FormComponent as cg, FieldUiComponent as ch, BarsaSapUiFormPageModule as ci, ReportNavigatorComponent as cj, BaseController as ck, FieldBaseController as cl, ViewBase as cm, ModalRootComponent as cn, ButtonLoadingComponent as co, UnlimitSessionComponent as cp, SplitterComponent as cq, APP_VERSION as cr, DIALOG_SERVICE as cs, FORM_DIALOG_COMPONENT as ct, NOTIFICATAION_POPUP_SERVER as cu, TOAST_SERVICE as cv, NOTIFICATION_WEBWORKER_FACTORY as cw, GeneralControlInfoModel as cx, StringControlInfoModel as cy, RichStringControlInfoModel as cz, DynamicFormComponent as d, genrateInlineMoId as d$, FieldInfoTypeEnum as d0, BaseReportModel as d1, DefaultCommandsAccessValue as d2, CustomCommand as d3, ReportModel as d4, ReportListModel as d5, ReportFormModel as d6, ReportCalendarModel as d7, ReportTreeModel as d8, ReportViewColumn as d9, LinearListHelper as dA, PageWithFormHandlerBaseComponent as dB, FormPageBaseComponent as dC, FormPageComponent as dD, BaseColumnPropsComponent as dE, TilePropsComponent as dF, FormFieldReportPageComponent as dG, ColumnRendererBase as dH, ColumnRendererViewBase as dI, BaseUlvSettingComponent as dJ, TableHeaderWidthMode as dK, setTableThWidth as dL, calculateColumnContent as dM, calculateColumnWidth as dN, setColumnWidthByMaxMoContentWidth as dO, calculateMoDataListContentWidthByColumnName as dP, calculateFreeColumnSize as dQ, calculateColumnWidthFitToContainer as dR, calcContextMenuWidth as dS, RotateImage as dT, isInLocalMode as dU, getLabelWidth as dV, getColumnValueOfMoDataList as dW, throwIfAlreadyLoaded as dX, measureText2 as dY, measureText as dZ, measureTextBy as d_, DefaultGridSetting as da, GridSetting as db, ColSetting as dc, SortSetting as dd, ReportField as de, DateRanges as df, SortDirection as dg, SelectionMode as dh, UlvHeightSizeType as di, FieldBaseComponent as dj, FieldViewBase as dk, FormBaseComponent as dl, FormToolbarBaseComponent as dm, SystemBaseComponent as dn, ReportBaseComponent as dp, ReportItemBaseComponent as dq, ApplicationBaseComponent as dr, LayoutItemBaseComponent as ds, LayoutPanelBaseComponent as dt, PageBaseComponent as du, NumberBaseComponent as dv, FilesValidationHelper as dw, BarsaApi as dx, ReportViewBaseComponent as dy, FormPropsBaseComponent as dz, DynamicItemComponent as e, easeInOutCubic as e$, enumValueToStringSize as e0, isVersionBiggerThan as e1, compareVersions as e2, scrollToElement as e3, executeUlvCommandHandler as e4, getUniqueId as e5, getDateService as e6, getAllItemsPerChildren as e7, setOneDepthLevel as e8, isFirefox as e9, FillAllLayoutControls as eA, FindToolbarItem as eB, FindLayoutSettingFromLayout94 as eC, GetAllHorizontalFromLayout94 as eD, getGridSettings as eE, getResetGridSettings as eF, GetDefaultMoObjectInfo as eG, getLayout94ObjectInfo as eH, getFormSettings as eI, createFormPanelMetaConditions as eJ, getNewMoGridEditor as eK, createGridEditorFormPanel as eL, getLayoutControl as eM, getControlList as eN, shallowEqual as eO, toNumber as eP, InputNumber as eQ, AffixRespondEvents as eR, isTargetWindow as eS, getTargetRect as eT, getFieldValue as eU, availablePrefixes as eV, requestAnimationFramePolyfill as eW, ExecuteDynamicCommand as eX, ExecuteWorkflowChoiceDef as eY, getRequestAnimationFrame as eZ, cancelRequestAnimationFrame as e_, getImagePath as ea, checkPermission as eb, fixUnclosedParentheses as ec, isFunction as ed, DeviceWidth as ee, getHeaderValue as ef, elementInViewport2 as eg, PreventDefaulEvent as eh, stopPropagation as ei, getParentHeight as ej, getComponentDefined as ek, isSafari as el, isFF as em, getDeviceIsPhone as en, getDeviceIsDesktop as eo, getDeviceIsTablet as ep, getDeviceIsMobile as eq, getControlSizeMode as er, formatBytes as es, getValidExtension as et, getIcon as eu, isImage as ev, GetAllColumnsSorted as ew, GetVisibleValue as ex, GroupBy as ey, FindGroup as ez, formRoutes as f, WordMimeType as f0, ImageMimeType as f1, PdfMimeType as f2, AllFilesMimeType as f3, VideoMimeType as f4, AudioMimeType as f5, MimeTypes as f6, GetContentType as f7, GetViewableExtensions as f8, ChangeLayoutInfoCustomUi as f9, ResizableComponent as fA, ResizableDirective as fB, ResizableModule as fC, PushBannerComponent as fD, BarsaNovinRayCoreModule as fE, mobile_regex as fa, number_only as fb, forbiddenValidator as fc, GetImgTags as fd, ImagetoPrint as fe, PrintImage as ff, SaveImageToFile as fg, validateAllFormFields as fh, getFocusableTagNames as fi, addCssVariableToRoot as fj, flattenTree as fk, IsDarkMode as fl, nullOrUndefinedString as fm, fromEntries as fn, bodyClick as fo, removeDynamicStyle as fp, addDynamicVariableTo as fq, AddDynamicFormStyles as fr, RemoveDynamicFormStyles as fs, ContainerComponent as ft, IntersectionStatus as fu, fromIntersectionObserver as fv, CustomRouteReuseStrategy as fw, AuthGuard as fx, RedirectHomeGuard as fy, RootPageComponent 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 };
19334
- //# sourceMappingURL=barsa-novin-ray-core-barsa-novin-ray-core-BOKaq7hB.mjs.map
20097
+ 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, MoInfoUlvPagingPipe 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, 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_, 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, MoLinkerDirective 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, ApplicationCtrlrService 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, ContainerService as bA, HorizontalLayoutService as bB, LayoutService as bC, LogService as bD, PortalService as bE, UiService as bF, UlvMainService as bG, UploadService as bH, NetworkStatusService as bI, AudioRecordingService as bJ, VideoRecordingService as bK, LocalStorageService as bL, IndexedDbService as bM, BarsaStorageService as bN, PromptUpdateService as bO, NotificationService as bP, ServiceWorkerNotificationService as bQ, ColumnService as bR, ServiceWorkerCommuncationService as bS, SaveScrollPositionService as bT, RoutingService as bU, GroupByService as bV, LayoutMainContentService as bW, TabpageService as bX, InMemoryStorageService as bY, ScrollLayoutContextHolder as bZ, ShellbarHeightService 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, GetCssVariableValuePipe as bq, FindColumnsPipe as br, ExistsColumnsPipe as bs, ApiService as bt, BreadcrumbService as bu, CustomInjector as bv, DialogParams as bw, BarsaDialogService as bx, FormPanelService as by, FormService as bz, BaseDynamicComponent as c, LinearListControlInfoModel as c$, PushCheckService as c0, IdbService as c1, RUNTIME_NAV_STATE_SCHEMA_V1 as c2, buildRuntimeNavStateCacheKey as c3, RuntimeNavStateCacheService as c4, PushNotificationService as c5, CardViewService as c6, BaseSettingsService as c7, SimpleTemplateEngine as c8, TEMPLATE_ENGINE as c9, APP_VERSION as cA, DIALOG_SERVICE as cB, FORM_DIALOG_COMPONENT as cC, NOTIFICATAION_POPUP_SERVER as cD, TOAST_SERVICE as cE, NOTIFICATION_WEBWORKER_FACTORY as cF, GeneralControlInfoModel as cG, StringControlInfoModel as cH, RichStringControlInfoModel as cI, NumberControlInfoModel as cJ, FilePictureInfoModel as cK, FileControlInfoModel as cL, CommandControlInfoModel as cM, IconControlInfoModel as cN, PictureFileControlInfoModel as cO, GaugeControlInfoModel as cP, RelationListControlInfoModel as cQ, HistoryControlInfoModel as cR, RabetehAkseTakiListiControlInfoModel as cS, RelatedReportControlInfoModel as cT, CodeEditorControlInfoModel as cU, EnumControlInfoModel as cV, RowDataOption as cW, DateTimeControlInfoModel as cX, BoolControlInfoModel as cY, CalculateControlInfoModel as cZ, SubformControlInfoModel as c_, PortalDynamicPageResolver as ca, PortalFormPageResolver as cb, PortalPageResolver as cc, PortalReportPageResolver as cd, TileGroupBreadcrumResolver as ce, LoginSettingsResolver as cf, ReportBreadcrumbResolver as cg, DateService as ch, DateHijriService as ci, DateMiladiService as cj, DateShamsiService as ck, EntitySettingsStore as cl, CalendarSettingsStore as cm, FormNewComponent as cn, ReportContainerComponent as co, FormComponent as cp, FieldUiComponent as cq, BarsaSapUiFormPageModule as cr, ReportNavigatorComponent as cs, BaseController as ct, FieldBaseController as cu, ViewBase as cv, ModalRootComponent as cw, ButtonLoadingComponent as cx, UnlimitSessionComponent as cy, SplitterComponent as cz, DynamicFormComponent as d, calcContextMenuWidth as d$, ListRelationModel as d0, SingleRelationControlInfoModel as d1, MetaobjectDataModel as d2, MoForReportModelBase as d3, MoForReportModel as d4, ReportBaseInfo as d5, FormToolbarButton as d6, ReportExtraInfo as d7, MetaobjectRelationModel as d8, FieldInfoTypeEnum as d9, ApplicationBaseComponent as dA, LayoutItemBaseComponent as dB, LayoutPanelBaseComponent as dC, PageBaseComponent as dD, NumberBaseComponent as dE, FilesValidationHelper as dF, BarsaApi as dG, ReportViewBaseComponent as dH, FormPropsBaseComponent as dI, LinearListHelper as dJ, PageWithFormHandlerBaseComponent as dK, FormPageBaseComponent as dL, FormPageComponent as dM, BaseColumnPropsComponent as dN, TilePropsComponent as dO, FormFieldReportPageComponent as dP, ColumnRendererBase as dQ, ColumnRendererViewBase as dR, BaseUlvSettingComponent as dS, TableHeaderWidthMode as dT, setTableThWidth as dU, calculateColumnContent as dV, calculateColumnWidth as dW, setColumnWidthByMaxMoContentWidth as dX, calculateMoDataListContentWidthByColumnName as dY, calculateFreeColumnSize as dZ, calculateColumnWidthFitToContainer as d_, BaseReportModel as da, DefaultCommandsAccessValue as db, CustomCommand as dc, ReportModel as dd, ReportListModel as de, ReportFormModel as df, ReportCalendarModel as dg, ReportTreeModel as dh, ReportViewColumn as di, DefaultGridSetting as dj, GridSetting as dk, ColSetting as dl, SortSetting as dm, ReportField as dn, DateRanges as dp, SortDirection as dq, SelectionMode as dr, UlvHeightSizeType as ds, FieldBaseComponent as dt, FieldViewBase as du, FormBaseComponent as dv, FormToolbarBaseComponent as dw, SystemBaseComponent as dx, ReportBaseComponent as dy, ReportItemBaseComponent as dz, DynamicItemComponent as e, isTargetWindow as e$, RotateImage as e0, isInLocalMode as e1, getLabelWidth as e2, getColumnValueOfMoDataList as e3, throwIfAlreadyLoaded as e4, measureText2 as e5, measureText as e6, measureTextBy as e7, genrateInlineMoId as e8, enumValueToStringSize as e9, getControlSizeMode as eA, formatBytes as eB, getValidExtension as eC, getIcon as eD, isImage as eE, GetAllColumnsSorted as eF, GetVisibleValue as eG, GroupBy as eH, FindGroup as eI, FillAllLayoutControls as eJ, FindToolbarItem as eK, FindLayoutSettingFromLayout94 as eL, GetAllHorizontalFromLayout94 as eM, getGridSettings as eN, getResetGridSettings as eO, GetDefaultMoObjectInfo as eP, getLayout94ObjectInfo as eQ, getFormSettings as eR, createFormPanelMetaConditions as eS, getNewMoGridEditor as eT, createGridEditorFormPanel as eU, getLayoutControl as eV, getControlList as eW, shallowEqual as eX, toNumber as eY, InputNumber as eZ, AffixRespondEvents as e_, isVersionBiggerThan as ea, compareVersions as eb, scrollToElement as ec, executeUlvCommandHandler as ed, getUniqueId as ee, getDateService as ef, getAllItemsPerChildren as eg, setOneDepthLevel as eh, isFirefox as ei, getImagePath as ej, checkPermission as ek, fixUnclosedParentheses as el, isFunction as em, DeviceWidth as en, getHeaderValue as eo, elementInViewport2 as ep, PreventDefaulEvent as eq, stopPropagation as er, getParentHeight as es, getComponentDefined as et, isSafari as eu, isFF as ev, getDeviceIsPhone as ew, getDeviceIsDesktop as ex, getDeviceIsTablet as ey, getDeviceIsMobile as ez, formRoutes as f, getTargetRect as f0, getFieldValue as f1, availablePrefixes as f2, requestAnimationFramePolyfill as f3, ExecuteDynamicCommand as f4, ExecuteWorkflowChoiceDef as f5, getRequestAnimationFrame as f6, cancelRequestAnimationFrame as f7, easeInOutCubic as f8, WordMimeType as f9, AddDynamicFormStyles as fA, RemoveDynamicFormStyles as fB, ContainerComponent as fC, IntersectionStatus as fD, fromIntersectionObserver as fE, CustomRouteReuseStrategy as fF, AuthGuard as fG, RedirectHomeGuard as fH, RootPageComponent as fI, ResizableComponent as fJ, ResizableDirective as fK, ResizableModule as fL, PushBannerComponent as fM, REPORT_GRID_VIEWPORT_CLASS as fN, DEFAULT_REPORT_LAYOUT_POLICY as fO, REPORT_TYPE_DEFAULT_POLICIES as fP, scrollLayoutModeToContextEnvironment as fQ, contextDefaultsFromEnvironment as fR, resolveFinalScroll as fS, resolveReportLayoutPolicy as fT, getReportTypeDefaultPolicy as fU, extractLayoutPolicyFromView as fV, BarsaNovinRayCoreModule as fW, ImageMimeType as fa, PdfMimeType as fb, AllFilesMimeType as fc, VideoMimeType as fd, AudioMimeType as fe, MimeTypes as ff, GetContentType as fg, GetViewableExtensions as fh, ChangeLayoutInfoCustomUi as fi, mobile_regex as fj, number_only as fk, forbiddenValidator as fl, GetImgTags as fm, ImagetoPrint as fn, PrintImage as fo, SaveImageToFile as fp, validateAllFormFields as fq, getFocusableTagNames as fr, addCssVariableToRoot as fs, flattenTree as ft, IsDarkMode as fu, nullOrUndefinedString as fv, fromEntries as fw, bodyClick as fx, removeDynamicStyle as fy, addDynamicVariableTo 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 };
20098
+ //# sourceMappingURL=barsa-novin-ray-core-barsa-novin-ray-core-BhKR992Z.mjs.map