barsa-novin-ray-core 2.3.98 → 2.3.100

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, EventEmitter, ChangeDetectorRef, Renderer2, HostBinding, Output, HostListener, ViewContainerRef, ViewChild, signal, 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, combineLatest, withLatestFrom as withLatestFrom$1, fromEvent, forkJoin, takeUntil as takeUntil$1, filter as filter$1, throwError, merge, interval, concatMap as concatMap$1, catchError as catchError$1, finalize as finalize$1, take, debounceTime as debounceTime$1, skip, Observable, tap as tap$1, timer, mergeWith, Subscription } from 'rxjs';
2
+ import { Injectable, inject, ElementRef, Input, ChangeDetectionStrategy, Component, Pipe, ComponentFactoryResolver, Injector, ApplicationRef, Compiler, DOCUMENT, NgModuleFactory, InjectionToken, NgZone, signal, effect, EventEmitter, ChangeDetectorRef, Renderer2, HostBinding, Output, HostListener, ViewContainerRef, 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, combineLatest, withLatestFrom as withLatestFrom$1, fromEvent, forkJoin, takeUntil as takeUntil$1, filter as filter$1, throwError, merge, interval, lastValueFrom, take, debounceTime as debounceTime$1, skip, Observable, tap as tap$1, catchError as catchError$1, timer, mergeWith, Subscription } from 'rxjs';
4
4
  import * as i1 from '@angular/router';
5
5
  import { Router, NavigationEnd, ActivatedRoute, RouterEvent, NavigationStart, RouterModule } from '@angular/router';
6
6
  import { DomSanitizer, Title } from '@angular/platform-browser';
@@ -17,6 +17,7 @@ import * as i1$1 from '@angular/common';
17
17
  import { Location, TitleCasePipe, CommonModule } from '@angular/common';
18
18
  import RecordRTC from 'recordrtc';
19
19
  import { SwUpdate, SwPush } from '@angular/service-worker';
20
+ import { openDB } from 'idb';
20
21
  import Splide from '@splidejs/splide';
21
22
 
22
23
  class BarsaApi {
@@ -2397,6 +2398,32 @@ function fromEntries(entries) {
2397
2398
  }
2398
2399
  return result;
2399
2400
  }
2401
+ function AddDynamicFormStyles(id, cssStyles) {
2402
+ if (!cssStyles) {
2403
+ return null;
2404
+ }
2405
+ cssStyles = cssStyles.replace(/:root/gi, `#${id}`);
2406
+ cssStyles = cssStyles.replace(/:html/gi, `:root`);
2407
+ const head = document.head || document.getElementsByTagName('head')[0];
2408
+ const style = document.createElement('style');
2409
+ head.appendChild(style);
2410
+ style.type = 'text/css';
2411
+ if (style.styleSheet) {
2412
+ // This is required for IE8 and below.
2413
+ style.styleSheet.cssText = cssStyles;
2414
+ }
2415
+ else {
2416
+ style.appendChild(document.createTextNode(cssStyles));
2417
+ }
2418
+ return style;
2419
+ }
2420
+ function RemoveDynamicFormStyles(style) {
2421
+ if (!style) {
2422
+ return;
2423
+ }
2424
+ const head = document.head || document.getElementsByTagName('head')[0];
2425
+ head.removeChild(style);
2426
+ }
2400
2427
 
2401
2428
  class MoReportValuePipe {
2402
2429
  transform(name, mo, Columns, caption) {
@@ -5810,7 +5837,11 @@ class PortalService {
5810
5837
  path: (cpage.IsDefaultRoute === 'True' && path === '') || (path !== '' && typeof path !== 'undefined')
5811
5838
  ? path
5812
5839
  : cpage.Route.replace('/', ''),
5813
- canActivate: cpage.HasAuthorize === 'True' ? [AuthGuard] : cpage.IsLoginRoute === 'True' ? [RedirectHomeGuard] : [],
5840
+ canActivate: cpage.HasAuthorize === 'True'
5841
+ ? [AuthGuard]
5842
+ : cpage.IsLoginRoute === 'True'
5843
+ ? [RedirectHomeGuard]
5844
+ : [],
5814
5845
  resolve: { pageData: PortalPageResolver },
5815
5846
  component: pageComponent,
5816
5847
  outlet: cpage.Outlet ? cpage.Outlet : undefined,
@@ -5819,7 +5850,7 @@ class PortalService {
5819
5850
  ...cpage
5820
5851
  }
5821
5852
  },
5822
- children: [formRoutes()]
5853
+ children: cpage.ComponentName !== 'PortalPage' ? [formRoutes()] : []
5823
5854
  };
5824
5855
  children.push(newRoute);
5825
5856
  // Recursively process each MetaObjectModel inside MoDataList
@@ -8177,53 +8208,284 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
8177
8208
  type: Injectable
8178
8209
  }], ctorParameters: () => [] });
8179
8210
 
8211
+ class PushCheckService {
8212
+ async checkPushReady() {
8213
+ if (!this.baseSupport()) {
8214
+ return 'مرورگر شما Push API را پشتیبانی نمی‌کند';
8215
+ }
8216
+ const iosCheck = this.iosSupport();
8217
+ if (iosCheck !== true) {
8218
+ return iosCheck;
8219
+ }
8220
+ if (Notification.permission === 'denied') {
8221
+ return 'شما قبلاً اجازه نوتیفیکیشن را رد کرده‌اید. از تنظیمات مرورگر آن را فعال کنید';
8222
+ }
8223
+ const regs = await navigator.serviceWorker.getRegistrations();
8224
+ if (!regs.length) {
8225
+ return 'Service Worker ثبت نشده است';
8226
+ }
8227
+ return true;
8228
+ }
8229
+ getIosVersion() {
8230
+ const ua = navigator.userAgent;
8231
+ if (/iP(hone|od|ad)/.test(ua)) {
8232
+ const v = ua.match(/OS (\d+)_/);
8233
+ return v ? parseInt(v[1], 10) : null;
8234
+ }
8235
+ return null;
8236
+ }
8237
+ isIosStandalone() {
8238
+ return 'standalone' in navigator && navigator.standalone === true;
8239
+ }
8240
+ isSafari() {
8241
+ const ua = navigator.userAgent.toLowerCase();
8242
+ return ua.includes('safari') && !ua.includes('chrome');
8243
+ }
8244
+ baseSupport() {
8245
+ return 'Notification' in window && 'serviceWorker' in navigator && 'PushManager' in window;
8246
+ }
8247
+ iosSupport() {
8248
+ const v = this.getIosVersion();
8249
+ if (v && v < 16) {
8250
+ return 'نسخه iOS کمتر از 16 است (Push پشتیبانی نمی‌شود)';
8251
+ }
8252
+ if (v && v < 16.4) {
8253
+ return 'iOS باید حداقل نسخه 16.4 باشد تا Push فعال شود';
8254
+ }
8255
+ if (v && !this.isSafari()) {
8256
+ return 'Push فقط در Safari iOS پشتیبانی می‌شود';
8257
+ }
8258
+ if (v && !this.isIosStandalone()) {
8259
+ return 'برای فعال شدن Push، برنامه را با Add to Home Screen نصب کنید';
8260
+ }
8261
+ return true;
8262
+ }
8263
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: PushCheckService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
8264
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: PushCheckService, providedIn: 'root' }); }
8265
+ }
8266
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: PushCheckService, decorators: [{
8267
+ type: Injectable,
8268
+ args: [{ providedIn: 'root' }]
8269
+ }] });
8270
+
8271
+ /* eslint-disable */
8272
+ //
8273
+ function usePushNotification() {
8274
+ const swPush = inject(SwPush);
8275
+ const http = inject(HttpClient);
8276
+ const _localStorage = inject(LocalStorageService);
8277
+ // Signals
8278
+ const bannerVisible = signal(false);
8279
+ const isSubscribed = signal(false);
8280
+ const permission = signal(Notification.permission);
8281
+ const errorMessage = signal(null);
8282
+ // IndexedDB setup
8283
+ const dbPromise = openDB('push-db', 1, {
8284
+ upgrade(db) {
8285
+ db.createObjectStore('subscription');
8286
+ }
8287
+ });
8288
+ // ذخیره subscription در DB
8289
+ const saveSubscription = async (sub) => {
8290
+ const db = await dbPromise;
8291
+ await db.put('subscription', sub.toJSON(), 'push-subscription');
8292
+ };
8293
+ async function initPushBanner() {
8294
+ const saved = await loadSubscription();
8295
+ if (saved) {
8296
+ isSubscribed.set(true);
8297
+ bannerVisible.set(false); // قبلاً subscribe شده
8298
+ }
8299
+ else {
8300
+ isSubscribed.set(false);
8301
+ bannerVisible.set(true); // هنوز subscribe نشده، بنر نمایش داده شود
8302
+ }
8303
+ }
8304
+ // خواندن subscription از DB
8305
+ const loadSubscription = async () => {
8306
+ const db = await dbPromise;
8307
+ const data = await db.get('subscription', 'push-subscription');
8308
+ if (!data) {
8309
+ return null;
8310
+ }
8311
+ // داده را به سرور می‌فرستیم یا UI نشان می‌دهیم
8312
+ return data;
8313
+ };
8314
+ // حذف subscription از DB
8315
+ const deleteSubscription = async () => {
8316
+ const db = await dbPromise;
8317
+ await db.delete('subscription', 'push-subscription');
8318
+ };
8319
+ const handleNewSubscription = async (subData) => {
8320
+ const saved = await loadSubscription();
8321
+ if (!saved || saved.endpoint !== subData.endpoint) {
8322
+ // حذف قبلی
8323
+ if (saved) {
8324
+ try {
8325
+ await addSubscriptionToServer(saved);
8326
+ }
8327
+ catch (e) {
8328
+ console.error('Delete old subscription failed', e);
8329
+ }
8330
+ }
8331
+ // ثبت جدید
8332
+ try {
8333
+ await deleteSubscriptionFromServer(subData);
8334
+ await saveSubscription(subData);
8335
+ isSubscribed.set(true);
8336
+ }
8337
+ catch (e) {
8338
+ console.error('Add new subscription failed', e);
8339
+ }
8340
+ }
8341
+ };
8342
+ const hideBanner = () => bannerVisible.set(false);
8343
+ // بررسی وضعیت فعلی subscription از SwPush و DB
8344
+ swPush.subscription.subscribe(async (sub) => {
8345
+ isSubscribed.set(!!sub);
8346
+ permission.set(Notification.permission);
8347
+ if (sub) {
8348
+ await handleNewSubscription(sub.toJSON());
8349
+ }
8350
+ });
8351
+ const addSubscriptionToServer = async (sub) => {
8352
+ const token2 = _localStorage.getItem(BarsaApi.LoginAction.token2StorageKey) ?? '';
8353
+ const options = {
8354
+ headers: new HttpHeaders({
8355
+ 'Content-Type': 'application/json',
8356
+ sth: token2
8357
+ })
8358
+ };
8359
+ await lastValueFrom(http.post('/api/pushnotification/add', sub, options));
8360
+ };
8361
+ const deleteSubscriptionFromServer = async (sub) => {
8362
+ const token2 = _localStorage.getItem(BarsaApi.LoginAction.token2StorageKey) ?? '';
8363
+ const options = {
8364
+ headers: new HttpHeaders({
8365
+ 'Content-Type': 'application/json',
8366
+ sth: token2
8367
+ })
8368
+ };
8369
+ await lastValueFrom(http.post('/api/pushnotification/delete', sub, options));
8370
+ };
8371
+ // subscribe فقط داخل gesture
8372
+ const subscribe = async () => {
8373
+ try {
8374
+ const publicKey = await lastValueFrom(http.get('/api/pushnotification/publickey', { responseType: 'text' }));
8375
+ const sub = await swPush.requestSubscription({ serverPublicKey: publicKey });
8376
+ const registration = await navigator.serviceWorker.ready;
8377
+ registration.active?.postMessage({ event: 'setVapidKey', publicKey });
8378
+ await addSubscriptionToServer(sub);
8379
+ await saveSubscription(sub);
8380
+ isSubscribed.set(true);
8381
+ permission.set(Notification.permission);
8382
+ bannerVisible.set(false);
8383
+ errorMessage.set(null);
8384
+ return sub;
8385
+ }
8386
+ catch (err) {
8387
+ console.error('Push subscribe error:', err);
8388
+ errorMessage.set(err?.message || 'خطا در فعال‌سازی Push');
8389
+ throw err;
8390
+ }
8391
+ };
8392
+ const unsubscribe = async () => {
8393
+ try {
8394
+ const sub = await lastValueFrom(swPush.subscription);
8395
+ if (!sub) {
8396
+ return;
8397
+ }
8398
+ swPush.unsubscribe();
8399
+ await deleteSubscriptionFromServer(sub);
8400
+ await sub.unsubscribe();
8401
+ await deleteSubscription();
8402
+ isSubscribed.set(false);
8403
+ errorMessage.set(null);
8404
+ }
8405
+ catch (err) {
8406
+ console.error('Push unsubscribe error:', err);
8407
+ errorMessage.set(err?.message || 'خطا در لغو اشتراک');
8408
+ }
8409
+ };
8410
+ return {
8411
+ bannerVisible,
8412
+ isSubscribed,
8413
+ permission,
8414
+ errorMessage,
8415
+ initPushBanner,
8416
+ subscribe,
8417
+ unsubscribe,
8418
+ handleNewSubscription,
8419
+ hideBanner
8420
+ };
8421
+ }
8422
+
8180
8423
  class ServiceWorkerCommuncationService {
8181
8424
  constructor() {
8425
+ this._toastService = inject(TOAST_SERVICE, { optional: true });
8182
8426
  this._localStorage = inject(LocalStorageService);
8183
- this._logService = inject(LogService);
8184
8427
  this._portalService = inject(PortalService);
8185
- this._swPush = inject(SwPush);
8186
- this._httpClient = inject(HttpClient);
8428
+ this._pushCheckService = inject(PushCheckService);
8429
+ this._usePushNotification = usePushNotification();
8187
8430
  }
8188
8431
  get token2() {
8189
8432
  return this._localStorage.getItem(BarsaApi.LoginAction.token2StorageKey) ?? '';
8190
8433
  }
8191
- get httpOptions() {
8192
- return {
8193
- headers: new HttpHeaders({
8194
- 'Content-Type': 'application/json',
8195
- sth: this.token2
8196
- })
8197
- };
8198
- }
8199
8434
  init() {
8200
- BarsaApi.Ul.ApplicationCtrlr.on({
8201
- UserLoggedout: (_, doReturn) => {
8202
- this._handlePushUnSubscription(doReturn);
8203
- }
8204
- });
8435
+ this._subscribe();
8436
+ // register SW
8205
8437
  if (!navigator.serviceWorker) {
8206
8438
  return;
8207
8439
  }
8208
- navigator.serviceWorker.ready.then((registration) => {
8209
- if (registration.active) {
8210
- this._serviceWorker = registration.active;
8211
- this._subscribe();
8440
+ navigator.serviceWorker.ready.then((reg) => {
8441
+ if (reg.active) {
8442
+ this._serviceWorker = reg.active;
8443
+ navigator.serviceWorker.addEventListener('message', (event) => {
8444
+ if (event.data?.event === 'subscriptionChanged') {
8445
+ this._usePushNotification.handleNewSubscription(event.data.subscription);
8446
+ }
8447
+ });
8212
8448
  }
8213
8449
  });
8214
- }
8215
- _handlePushSubscirption() {
8216
- this._swPush.subscription.subscribe((subscription) => {
8217
- this._subscription = subscription;
8218
- this.operationName = this._subscription === null ? 'Subscribe' : 'Unsubscribe';
8450
+ // user logout
8451
+ BarsaApi.Ul.ApplicationCtrlr.on({
8452
+ UserLoggedout: (_, doReturn) => this._handlePushUnSubscription(doReturn)
8453
+ });
8454
+ // automatic effect: update operationName based on subscription
8455
+ effect(() => {
8456
+ const sub = this._usePushNotification.isSubscribed();
8457
+ // اینجا می‌تونی متغیر operationName یا UI رو اتوماتیک آپدیت کنی
8458
+ console.log('Push subscription changed:', sub);
8459
+ });
8460
+ // automatic effect: show toast on errors
8461
+ effect(() => {
8462
+ const err = this._usePushNotification.errorMessage();
8463
+ if (err) {
8464
+ this.toast(err);
8465
+ }
8219
8466
  });
8220
8467
  }
8468
+ // فعال‌سازی push توسط gesture (مثلاً از UI)
8469
+ async subscribePush() {
8470
+ try {
8471
+ const check = await this._pushCheckService.checkPushReady();
8472
+ if (check !== true) {
8473
+ this.toast(check);
8474
+ return;
8475
+ }
8476
+ await this._usePushNotification.subscribe();
8477
+ this.toast('نوتیفیکیشن فعال شد');
8478
+ }
8479
+ catch (err) {
8480
+ console.error(err);
8481
+ this.toast('خطا در فعال‌سازی Push');
8482
+ }
8483
+ }
8221
8484
  _subscribe() {
8222
8485
  this._portalService.userLoggedIn$.pipe().subscribe((isLoggedIn) => this._isLoggedIn(isLoggedIn));
8223
8486
  this._portalService.documentVisibilitychange$
8224
8487
  .pipe()
8225
8488
  .subscribe((visibilitychange) => this._visibilitychange(visibilitychange));
8226
- this._handlePushSubscirption();
8227
8489
  }
8228
8490
  _setDefaultOptions() {
8229
8491
  const token2 = this.token2;
@@ -8235,7 +8497,7 @@ class ServiceWorkerCommuncationService {
8235
8497
  this._postServiceWorker({ event: 'isLoggedInChange', options: { isLoggedIn } });
8236
8498
  if (isLoggedIn) {
8237
8499
  this._setDefaultOptions();
8238
- this._initPushSubscription();
8500
+ this._usePushNotification.initPushBanner();
8239
8501
  }
8240
8502
  }
8241
8503
  _visibilitychange(documentIsHidden) {
@@ -8244,41 +8506,20 @@ class ServiceWorkerCommuncationService {
8244
8506
  _postServiceWorker(message) {
8245
8507
  // console.log(`post message to sw ${JSON.stringify(message, null, 2)}`);
8246
8508
  if (!this._serviceWorker) {
8247
- this._logService.warn(`service worker is undefined.`);
8509
+ console.warn(`service worker is undefined.`);
8248
8510
  return;
8249
8511
  }
8250
8512
  this._serviceWorker.postMessage(message);
8251
8513
  }
8252
- _testSend(subscription) {
8253
- setTimeout(() => {
8254
- this._httpClient.post('/api/pushnotification/send', subscription, this.httpOptions).subscribe();
8255
- }, 5000);
8256
- }
8257
- _initPushSubscription() {
8258
- this._httpClient
8259
- .get('/api/pushnotification/publickey', { responseType: 'text' })
8260
- .pipe(concatMap$1((publicKey) => from(this._swPush.requestSubscription({
8261
- serverPublicKey: publicKey
8262
- }))), concatMap$1((subscription) => this._httpClient.post('/api/pushnotification/add', subscription, this.httpOptions)), catchError$1((err) => {
8263
- this._logService.error(err);
8264
- return throwError(() => err);
8265
- }))
8266
- .subscribe();
8267
- }
8514
+ // لغو push (هر زمان امکان‌پذیر است)
8268
8515
  _handlePushUnSubscription(doReturn) {
8269
- if (!this._subscription) {
8270
- return doReturn && doReturn();
8271
- }
8272
- this._httpClient
8273
- .post('/api/pushnotification/delete', this._subscription, this.httpOptions)
8274
- .pipe(concatMap$1(() => from(this._swPush.unsubscribe())), catchError$1((err) => {
8275
- this._logService.error(err);
8276
- doReturn && doReturn();
8277
- return throwError(() => new Error(err));
8278
- }), finalize$1(() => {
8279
- doReturn && doReturn();
8280
- }))
8281
- .subscribe();
8516
+ this._usePushNotification.unsubscribe().finally(() => doReturn && doReturn());
8517
+ }
8518
+ toast(msg) {
8519
+ if (!this._toastService) {
8520
+ return console.log(msg);
8521
+ }
8522
+ this._toastService.open(msg, { duration: 5000 });
8282
8523
  }
8283
8524
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: ServiceWorkerCommuncationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
8284
8525
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: ServiceWorkerCommuncationService }); }
@@ -8466,6 +8707,7 @@ class FieldBaseComponent extends BaseComponent {
8466
8707
  this.formmatedValue = new EventEmitter();
8467
8708
  this.isMobile = getDeviceIsMobile();
8468
8709
  this.isTablet = getDeviceIsTablet();
8710
+ this._rlt = true;
8469
8711
  this.mobileConfig = {
8470
8712
  title: 'انتخاب',
8471
8713
  approveButtonText: 'تایید',
@@ -8492,6 +8734,7 @@ class FieldBaseComponent extends BaseComponent {
8492
8734
  this._valueChangedSource = new Subject();
8493
8735
  this._disableChangedSource = new BehaviorSubject(false);
8494
8736
  this._readonlyChangedSource = new BehaviorSubject(false);
8737
+ this._portalService.rtl$.pipe(takeUntil(this._onDestroy$)).subscribe((c) => (this._rlt = c));
8495
8738
  this.refresh$ = this._refreshSource.asObservable().pipe(takeUntil(this._onDestroy$));
8496
8739
  this.value$ = this._valueChangedSource.asObservable().pipe(takeUntil(this._onDestroy$));
8497
8740
  this.deviceSize$ = this._portalService.deviceSize$;
@@ -8618,7 +8861,7 @@ class FieldBaseComponent extends BaseComponent {
8618
8861
  }
8619
8862
  }
8620
8863
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: FieldBaseComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
8621
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.0.6", type: FieldBaseComponent, isStandalone: false, selector: "bnrc-field-base", inputs: { context: "context", focusControl: "focusControl", layoutInfo: "layoutInfo", value: "value", width: "width", height: "height", formHeight: "formHeight", inlineEdit: "inlineEdit", cellEdit: "cellEdit", formContainer: "formContainer", id: "id", parametes: "parametes" }, outputs: { valueChange: "valueChange", formmatedValue: "formmatedValue" }, host: { properties: { "class.isMobile": "this.isMobile", "class.isTablet": "this.isTablet" } }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
8864
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.0.6", type: FieldBaseComponent, isStandalone: false, selector: "bnrc-field-base", inputs: { context: "context", focusControl: "focusControl", layoutInfo: "layoutInfo", value: "value", width: "width", height: "height", formHeight: "formHeight", inlineEdit: "inlineEdit", cellEdit: "cellEdit", formContainer: "formContainer", id: "id", parametes: "parametes" }, outputs: { valueChange: "valueChange", formmatedValue: "formmatedValue" }, host: { properties: { "class.isMobile": "this.isMobile", "class.isTablet": "this.isTablet", "class.rtl": "this._rlt" } }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
8622
8865
  }
8623
8866
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: FieldBaseComponent, decorators: [{
8624
8867
  type: Component,
@@ -8662,6 +8905,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
8662
8905
  }], isTablet: [{
8663
8906
  type: HostBinding,
8664
8907
  args: ['class.isTablet']
8908
+ }], _rlt: [{
8909
+ type: HostBinding,
8910
+ args: ['class.rtl']
8665
8911
  }] } });
8666
8912
 
8667
8913
  class FormBaseComponent extends BaseComponent {
@@ -9235,7 +9481,6 @@ class LayoutItemBaseComponent extends BaseComponent {
9235
9481
  super();
9236
9482
  this.formPanelService = inject(FormPanelService);
9237
9483
  this._cdr = inject(ChangeDetectorRef);
9238
- this.id = getUniqueId(4);
9239
9484
  this.formPanelService.isSearchPanel$.subscribe((isSearchPanel) => {
9240
9485
  this.isSearchPanel = isSearchPanel;
9241
9486
  });
@@ -9246,6 +9491,10 @@ class LayoutItemBaseComponent extends BaseComponent {
9246
9491
  this.searchPanelIsObject = searchPanelIsObject;
9247
9492
  });
9248
9493
  }
9494
+ ngOnInit() {
9495
+ super.ngOnInit();
9496
+ this.id = this.config.id;
9497
+ }
9249
9498
  ngOnChanges(changes) {
9250
9499
  super.ngOnChanges(changes);
9251
9500
  const { maxLabelWidth } = changes;
@@ -9254,7 +9503,7 @@ class LayoutItemBaseComponent extends BaseComponent {
9254
9503
  }
9255
9504
  }
9256
9505
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: LayoutItemBaseComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
9257
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.0.6", type: LayoutItemBaseComponent, isStandalone: false, selector: "bnrc-layout-item-base", inputs: { config: "config", isPanel: "isPanel", maxLabelWidth: "maxLabelWidth", rtl: "rtl" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
9506
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.0.6", type: LayoutItemBaseComponent, isStandalone: false, selector: "bnrc-layout-item-base", inputs: { config: "config", isPanel: "isPanel", maxLabelWidth: "maxLabelWidth", rtl: "rtl" }, host: { properties: { "attr.id": "this.id" } }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
9258
9507
  }
9259
9508
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: LayoutItemBaseComponent, decorators: [{
9260
9509
  type: Component,
@@ -9264,7 +9513,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
9264
9513
  changeDetection: ChangeDetectionStrategy.OnPush,
9265
9514
  standalone: false
9266
9515
  }]
9267
- }], ctorParameters: () => [], propDecorators: { config: [{
9516
+ }], ctorParameters: () => [], propDecorators: { id: [{
9517
+ type: HostBinding,
9518
+ args: ['attr.id']
9519
+ }], config: [{
9268
9520
  type: Input
9269
9521
  }], isPanel: [{
9270
9522
  type: Input
@@ -9278,21 +9530,40 @@ class LayoutPanelBaseComponent extends LayoutItemBaseComponent {
9278
9530
  constructor() {
9279
9531
  super();
9280
9532
  this.layoutControlCount = 0;
9281
- this.portalService = inject(PortalService);
9282
- this.layoutService = inject(LayoutService, { self: true });
9283
- const layoutService = this.layoutService;
9533
+ this.visible = true;
9534
+ this._renderer2 = inject(Renderer2);
9535
+ this._portalService = inject(PortalService);
9536
+ this._layoutService = inject(LayoutService, { self: true });
9537
+ const layoutService = this._layoutService;
9284
9538
  this.id = getUniqueId(4);
9285
9539
  layoutService.id = 'panel' + this.id;
9286
9540
  this.formPanelService.isSearchPanel$.subscribe((isSearchPanel) => {
9287
9541
  this.isSearchPanel = isSearchPanel;
9288
9542
  });
9543
+ this.formPanelService.groupLayout$
9544
+ .pipe(takeUntil$1(this._onDestroy$), filter$1((c) => c.ControlId === this.config.ControlId))
9545
+ .subscribe((_groupItem) => {
9546
+ this._setBRule();
9547
+ });
9289
9548
  }
9290
9549
  ngOnInit() {
9291
9550
  super.ngOnInit();
9551
+ this._setBRule();
9292
9552
  this.formPanelService.formContainerDom = this.parentDom;
9293
- this.maxLabelWidth$ = this.layoutService.maxWidth$;
9553
+ this.maxLabelWidth$ = this._layoutService.maxWidth$;
9294
9554
  this._calcWidth(this.config);
9295
9555
  }
9556
+ _setBRule() {
9557
+ this.visible = this.config.Visible === false ? false : true;
9558
+ this.readonly = this.config.Readonly === false ? false : true;
9559
+ this.enable = this.config.Enable === false ? false : true;
9560
+ if (this.enable) {
9561
+ this._renderer2.removeClass(this._el.nativeElement, 'control-disabled');
9562
+ }
9563
+ else {
9564
+ this._renderer2.addClass(this._el.nativeElement, 'control-disabled');
9565
+ }
9566
+ }
9296
9567
  _calcWidth(config) {
9297
9568
  config.items.forEach((item) => {
9298
9569
  switch (item.xtype) {
@@ -9309,7 +9580,7 @@ class LayoutPanelBaseComponent extends LayoutItemBaseComponent {
9309
9580
  _setLabelWidth(item) {
9310
9581
  const controlWidth = getLabelWidth(item);
9311
9582
  if (controlWidth) {
9312
- this.layoutService.setMaxWidth(controlWidth);
9583
+ this._layoutService.setMaxWidth(controlWidth);
9313
9584
  }
9314
9585
  }
9315
9586
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: LayoutPanelBaseComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
@@ -9345,8 +9616,8 @@ class ContainerComponent extends BaseComponent {
9345
9616
  this._cdr = inject(ChangeDetectorRef);
9346
9617
  this._renderer2 = inject(Renderer2);
9347
9618
  this._dialogService = inject(DIALOG_SERVICE, { optional: true });
9348
- this._containerServiceParent = inject(ContainerService, { self: true, optional: true });
9349
- this._containerService = inject(ContainerService);
9619
+ this._containerServiceParent = inject(ContainerService, { self: false, optional: true });
9620
+ this._containerService = inject(ContainerService, { self: true, optional: true });
9350
9621
  this._formDialogComponent = inject(FORM_DIALOG_COMPONENT, { optional: true });
9351
9622
  this.oldContainerContainer = this._barsaDialogService.containerComponent;
9352
9623
  this._barsaDialogService.containerComponent = this;
@@ -9388,7 +9659,7 @@ class ContainerComponent extends BaseComponent {
9388
9659
  }
9389
9660
  }
9390
9661
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: ContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
9391
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.0.6", type: ContainerComponent, isStandalone: false, selector: "bnrc-container", viewQueries: [{ propertyName: "containerRef", first: true, predicate: ["containerRef"], descendants: true, read: ViewContainerRef, static: true }], usesInheritance: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
9662
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.0.6", type: ContainerComponent, isStandalone: false, selector: "bnrc-container", viewQueries: [{ propertyName: "containerRef", first: true, predicate: ["containerRef"], descendants: true, read: ViewContainerRef, static: true }, { propertyName: "containerBottomRef", first: true, predicate: ["containerBottomRef"], descendants: true, read: ViewContainerRef, static: true }], usesInheritance: true, ngImport: i0, template: '', isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
9392
9663
  }
9393
9664
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: ContainerComponent, decorators: [{
9394
9665
  type: Component,
@@ -9401,6 +9672,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
9401
9672
  }], ctorParameters: () => [], propDecorators: { containerRef: [{
9402
9673
  type: ViewChild,
9403
9674
  args: ['containerRef', { static: true, read: ViewContainerRef }]
9675
+ }], containerBottomRef: [{
9676
+ type: ViewChild,
9677
+ args: ['containerBottomRef', { static: true, read: ViewContainerRef }]
9404
9678
  }] } });
9405
9679
 
9406
9680
  class PageBaseComponent extends ContainerComponent {
@@ -9412,7 +9686,7 @@ class PageBaseComponent extends ContainerComponent {
9412
9686
  }
9413
9687
  ngAfterViewInit() {
9414
9688
  super.ngAfterViewInit();
9415
- this._containerService.state === 'attach' && this.addModulesToDom();
9689
+ this._containerService?.state === 'attach' && this.addModulesToDom();
9416
9690
  this._containerService?.addModules.pipe(takeUntil(this._onDestroy$)).subscribe(() => this.addModulesToDom());
9417
9691
  }
9418
9692
  addModulesToDom() {
@@ -9468,8 +9742,12 @@ class PageBaseComponent extends ContainerComponent {
9468
9742
  .pipe(takeUntil(this._onDestroy$), concatMap((module) => this.getComponentFactory(module.Component).pipe(tap((controlUi) => {
9469
9743
  controlUi.instance.settings = module.Component.Settings;
9470
9744
  controlUi.instance.activatedRoute = this._activatedRoute;
9471
- if (this.containerRef) {
9472
- this.containerRef.insert(controlUi.hostView);
9745
+ let containerRef = this.containerRef;
9746
+ if (module.ContainerRef && this[module.ContainerRef]) {
9747
+ containerRef = this[module.ContainerRef];
9748
+ } // توسط ماژول مشخص شده کامپوننت در کدام کانتینر پیج قرار گیرد
9749
+ if (containerRef) {
9750
+ containerRef.insert(controlUi.hostView);
9473
9751
  }
9474
9752
  else {
9475
9753
  this._vcr.insert(controlUi.hostView);
@@ -9529,11 +9807,14 @@ class NumberBaseComponent extends FieldBaseComponent {
9529
9807
  const isValid = new RegExp('^[0-9,.,-]*$').test(e.currentTarget.value + e.key);
9530
9808
  if (!isValid || e.key === '.') {
9531
9809
  if (e.key === '.' && this.inputElement && this.decimalPrecision > 0) {
9532
- const cursorPosition = this.inputElement.value.indexOf('.');
9533
- this._setCursorPosition(cursorPosition + 1);
9810
+ const indexOfDot = this.inputElement.value.indexOf('.');
9811
+ if (indexOfDot > -1) {
9812
+ this._setCursorPosition(indexOfDot + 1);
9813
+ e.preventDefault();
9814
+ e.stopPropagation();
9815
+ return;
9816
+ }
9534
9817
  }
9535
- e.preventDefault();
9536
- e.stopPropagation();
9537
9818
  }
9538
9819
  else if (isValid && this.inputElement) {
9539
9820
  // در صورتی که عدد قبل از منفی قرار گیرد
@@ -9559,7 +9840,7 @@ class NumberBaseComponent extends FieldBaseComponent {
9559
9840
  }
9560
9841
  _updateBySetting() {
9561
9842
  if (this.inputElement) {
9562
- const formated = this._getFormated(this.value).toString();
9843
+ const formated = this._getFormated(this.value?.toString()).toString();
9563
9844
  this.inputElement.value = formated;
9564
9845
  }
9565
9846
  this.hasMask =
@@ -9591,7 +9872,17 @@ class NumberBaseComponent extends FieldBaseComponent {
9591
9872
  return false;
9592
9873
  }
9593
9874
  _getFormated(val) {
9594
- return this._numeralPipe.transform(val, this.decimalPrecision, this.Setting.ShowThousandSeperator).toString();
9875
+ let decimalPersicion = 0;
9876
+ const indexOfDot = val.indexOf('.');
9877
+ if (indexOfDot > 0 && this.decimalPrecision) {
9878
+ decimalPersicion = val.length - indexOfDot - 1;
9879
+ decimalPersicion = decimalPersicion > this.decimalPrecision ? this.decimalPrecision : decimalPersicion;
9880
+ }
9881
+ let newVal = this._numeralPipe.transform(val, decimalPersicion, this.Setting.ShowThousandSeperator).toString();
9882
+ if (this.decimalPrecision && decimalPersicion === 0 && val.endsWith('.')) {
9883
+ newVal += '.';
9884
+ }
9885
+ return newVal;
9595
9886
  }
9596
9887
  _setCursorPosition(cursorPosition) {
9597
9888
  if (this.inputElement) {
@@ -9611,9 +9902,19 @@ class NumberBaseComponent extends FieldBaseComponent {
9611
9902
  if (value === +elValue) {
9612
9903
  return;
9613
9904
  }
9614
- const formated = this._getFormated(value);
9905
+ const formated = this._getFormated(value.toString());
9615
9906
  e.target.value = formated;
9616
9907
  }
9908
+ _setTargetToFormatedValue(target, formated, isMinus) {
9909
+ if (!target) {
9910
+ return 0;
9911
+ }
9912
+ const oldVal = target.value;
9913
+ if (target.value !== formated) {
9914
+ target.value = this._getMinusValue(isMinus, formated);
9915
+ }
9916
+ return formated.length > oldVal.length ? formated.length - oldVal.length : oldVal.length - target.value.length;
9917
+ }
9617
9918
  reFormatValue(text, e) {
9618
9919
  let newVal;
9619
9920
  if (typeof text === 'number') {
@@ -9632,7 +9933,7 @@ class NumberBaseComponent extends FieldBaseComponent {
9632
9933
  let indexofDot = text.indexOf('.');
9633
9934
  const selectionStart = this.inputElement?.selectionStart;
9634
9935
  const decimalPersicion = this.decimalPrecision;
9635
- if (decimalPersicion) {
9936
+ if (decimalPersicion && indexofDot > 0) {
9636
9937
  const t = text.length - (indexofDot + 1);
9637
9938
  if (t > decimalPersicion) {
9638
9939
  const diff = t - decimalPersicion;
@@ -9665,12 +9966,10 @@ class NumberBaseComponent extends FieldBaseComponent {
9665
9966
  diff = indexOfDotFormated - indexofDot;
9666
9967
  cursorPosition += diff;
9667
9968
  }
9668
- if (this.inputElement && this.inputElement.value !== formated) {
9669
- this.inputElement.value = this._getMinusValue(isMinus, formated);
9670
- }
9671
- if (e.target.value !== formated) {
9672
- e.target.value = this._getMinusValue(isMinus, formated);
9673
- }
9969
+ const diff1 = this._setTargetToFormatedValue(this.inputElement, formated, isMinus);
9970
+ const diff2 = this._setTargetToFormatedValue(e.traget, formated, isMinus);
9971
+ cursorPosition && (cursorPosition += diff1);
9972
+ cursorPosition && (cursorPosition += diff2);
9674
9973
  this._setCursorPosition(cursorPosition);
9675
9974
  }
9676
9975
  else {
@@ -11508,20 +11807,20 @@ class PortalPageComponent extends PageWithFormHandlerBaseComponent {
11508
11807
  super(...arguments);
11509
11808
  this._routingService = inject(RoutingService);
11510
11809
  }
11810
+ ngOnInit() {
11811
+ super.ngOnInit();
11812
+ this.addModulesToDom();
11813
+ }
11511
11814
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: PortalPageComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
11512
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.0.6", type: PortalPageComponent, isStandalone: false, selector: "bnrc-portal-page", providers: [RoutingService, ContainerService], usesInheritance: true, ngImport: i0, template: `<ng-container #containerRef></ng-container> <router-outlet></router-outlet
11513
- ><router-outlet name="dialog"></router-outlet>`, isInline: true, dependencies: [{ kind: "directive", type: i1.RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
11815
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.0.6", type: PortalPageComponent, isStandalone: false, selector: "bnrc-portal-page", providers: [RoutingService], usesInheritance: true, ngImport: i0, template: `<ng-container #containerRef></ng-container> <router-outlet></router-outlet
11816
+ ><router-outlet name="dialog"></router-outlet>
11817
+ <ng-container #containerBottomRef></ng-container> `, isInline: true, styles: [":host{min-height:100svh}\n"], dependencies: [{ kind: "directive", type: i1.RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
11514
11818
  }
11515
11819
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: PortalPageComponent, decorators: [{
11516
11820
  type: Component,
11517
- args: [{
11518
- selector: 'bnrc-portal-page',
11519
- template: `<ng-container #containerRef></ng-container> <router-outlet></router-outlet
11520
- ><router-outlet name="dialog"></router-outlet>`,
11521
- changeDetection: ChangeDetectionStrategy.OnPush,
11522
- providers: [RoutingService, ContainerService],
11523
- standalone: false
11524
- }]
11821
+ args: [{ selector: 'bnrc-portal-page', template: `<ng-container #containerRef></ng-container> <router-outlet></router-outlet
11822
+ ><router-outlet name="dialog"></router-outlet>
11823
+ <ng-container #containerBottomRef></ng-container> `, changeDetection: ChangeDetectionStrategy.OnPush, providers: [RoutingService], standalone: false, styles: [":host{min-height:100svh}\n"] }]
11525
11824
  }] });
11526
11825
 
11527
11826
  class FillEmptySpaceDirective extends BaseDirective {
@@ -12466,6 +12765,12 @@ class BaseViewItemPropsComponent extends BaseViewPropsComponent {
12466
12765
  _setSavingState(err) {
12467
12766
  if (err) {
12468
12767
  this.hasError = true;
12768
+ this._handleBruleShowMessageAction({
12769
+ MessageExpression: err.Text,
12770
+ MessageType: 2,
12771
+ MessageExpressionHtml: err.Text,
12772
+ EscapeCharacters: true
12773
+ });
12469
12774
  return;
12470
12775
  }
12471
12776
  this.hasError = false;
@@ -12908,6 +13213,50 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
12908
13213
  args: [{ selector: 'bnrc-unlimit-session', changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "", styles: [":host{background:#191919 -webkit-linear-gradient(top,#000 0%,#191919 100%) no-repeat;background:#191919 linear-gradient(to bottom,#000,#191919) no-repeat;text-align:center}:host h1,:host h2{font-weight:400}:host h1{margin:0 auto;padding:.15em;font-size:10em;text-shadow:0 2px 2px #000}:host h2{margin-bottom:2em}\n"] }]
12909
13214
  }] });
12910
13215
 
13216
+ class PushBannerComponent {
13217
+ constructor() {
13218
+ this.push = usePushNotification();
13219
+ }
13220
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: PushBannerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
13221
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.6", type: PushBannerComponent, isStandalone: false, selector: "bnrc-push-banner", ngImport: i0, template: `
13222
+ @if(push.bannerVisible()){
13223
+ <div class="push-banner">
13224
+ <div class="text">
13225
+ <b>فعال‌سازی اعلان‌ها</b>
13226
+ <p>برای دریافت پیام‌ها و رویدادهای مهم، اعلان‌ها را فعال کنید.</p>
13227
+ </div>
13228
+ <div class="actions">
13229
+ <button class="btn enable" (click)="push.subscribe()">فعال‌سازی</button>
13230
+ <button class="btn later" (click)="push.hideBanner()">بعداً</button>
13231
+ </div>
13232
+ @if(push.errorMessage()){
13233
+ <p class="error">{{ push.errorMessage() }}</p>
13234
+ }
13235
+ </div>
13236
+ }
13237
+ `, isInline: true, styles: [".push-banner{position:fixed;bottom:0;left:0;right:0;background:#fff;border-radius:12px 12px 0 0;box-shadow:0 -4px 16px #00000026;padding:16px;display:flex;flex-direction:column;gap:8px;z-index:9999}.actions{display:flex;gap:8px}.btn.enable{background:#25d366;color:#fff;border-radius:8px;padding:8px 12px;border:none}.btn.later{background:transparent;color:#666;border:none;padding:8px 12px}.error{color:red;font-size:13px}\n"] }); }
13238
+ }
13239
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: PushBannerComponent, decorators: [{
13240
+ type: Component,
13241
+ args: [{ selector: 'bnrc-push-banner', standalone: false, template: `
13242
+ @if(push.bannerVisible()){
13243
+ <div class="push-banner">
13244
+ <div class="text">
13245
+ <b>فعال‌سازی اعلان‌ها</b>
13246
+ <p>برای دریافت پیام‌ها و رویدادهای مهم، اعلان‌ها را فعال کنید.</p>
13247
+ </div>
13248
+ <div class="actions">
13249
+ <button class="btn enable" (click)="push.subscribe()">فعال‌سازی</button>
13250
+ <button class="btn later" (click)="push.hideBanner()">بعداً</button>
13251
+ </div>
13252
+ @if(push.errorMessage()){
13253
+ <p class="error">{{ push.errorMessage() }}</p>
13254
+ }
13255
+ </div>
13256
+ }
13257
+ `, styles: [".push-banner{position:fixed;bottom:0;left:0;right:0;background:#fff;border-radius:12px 12px 0 0;box-shadow:0 -4px 16px #00000026;padding:16px;display:flex;flex-direction:column;gap:8px;z-index:9999}.actions{display:flex;gap:8px}.btn.enable{background:#25d366;color:#fff;border-radius:8px;padding:8px 12px;border:none}.btn.later{background:transparent;color:#666;border:none;padding:8px 12px}.error{color:red;font-size:13px}\n"] }]
13258
+ }] });
13259
+
12911
13260
  class LoadExternalFilesDirective {
12912
13261
  constructor() {
12913
13262
  this._renderer2 = inject(Renderer2);
@@ -13094,7 +13443,8 @@ class RootPortalComponent extends PageBaseComponent {
13094
13443
  @if(pageData?.UnlimitSession==='True'){
13095
13444
  <bnrc-unlimit-session></bnrc-unlimit-session>
13096
13445
  }
13097
- `, isInline: true, dependencies: [{ kind: "directive", type: i1.RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: UnlimitSessionComponent, selector: "bnrc-unlimit-session" }, { kind: "directive", type: LoadExternalFilesDirective, selector: "[loadExternalFiles]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
13446
+ <bnrc-push-banner></bnrc-push-banner>
13447
+ `, isInline: true, dependencies: [{ kind: "directive", type: i1.RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: UnlimitSessionComponent, selector: "bnrc-unlimit-session" }, { kind: "component", type: PushBannerComponent, selector: "bnrc-push-banner" }, { kind: "directive", type: LoadExternalFilesDirective, selector: "[loadExternalFiles]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
13098
13448
  }
13099
13449
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: RootPortalComponent, decorators: [{
13100
13450
  type: Component,
@@ -13166,6 +13516,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
13166
13516
  @if(pageData?.UnlimitSession==='True'){
13167
13517
  <bnrc-unlimit-session></bnrc-unlimit-session>
13168
13518
  }
13519
+ <bnrc-push-banner></bnrc-push-banner>
13169
13520
  `,
13170
13521
  changeDetection: ChangeDetectionStrategy.OnPush,
13171
13522
  providers: [ContainerService],
@@ -14510,45 +14861,19 @@ class DynamicStyleDirective extends BaseDirective {
14510
14861
  }
14511
14862
  ngOnInit() {
14512
14863
  super.ngOnInit();
14513
- this._addDynamicFormStyles(this.cssStyle);
14864
+ this._style = AddDynamicFormStyles(this.id, this.cssStyle);
14514
14865
  }
14515
14866
  ngOnChanges(changes) {
14516
14867
  super.ngOnChanges(changes);
14517
14868
  const { cssStyle } = changes;
14518
14869
  if (cssStyle && !cssStyle.firstChange) {
14519
- this._removeDynamicFormStyles();
14520
- this._addDynamicFormStyles(cssStyle.currentValue);
14870
+ RemoveDynamicFormStyles(this._style);
14871
+ this._style = AddDynamicFormStyles(this.id, cssStyle.currentValue);
14521
14872
  }
14522
14873
  }
14523
14874
  ngOnDestroy() {
14524
14875
  super.ngOnDestroy();
14525
- this._removeDynamicFormStyles();
14526
- }
14527
- _addDynamicFormStyles(cssStyles) {
14528
- if (!cssStyles) {
14529
- return;
14530
- }
14531
- cssStyles = cssStyles.replace(/:root/gi, `#${this.id}`);
14532
- cssStyles = cssStyles.replace(/:html/gi, `:root`);
14533
- const head = document.head || document.getElementsByTagName('head')[0];
14534
- const style = document.createElement('style');
14535
- head.appendChild(style);
14536
- style.type = 'text/css';
14537
- if (style.styleSheet) {
14538
- // This is required for IE8 and below.
14539
- style.styleSheet.cssText = cssStyles;
14540
- }
14541
- else {
14542
- style.appendChild(document.createTextNode(cssStyles));
14543
- }
14544
- this._style = style;
14545
- }
14546
- _removeDynamicFormStyles() {
14547
- if (!this._style) {
14548
- return;
14549
- }
14550
- const head = document.head || document.getElementsByTagName('head')[0];
14551
- head.removeChild(this._style);
14876
+ RemoveDynamicFormStyles(this._style);
14552
14877
  }
14553
14878
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: DynamicStyleDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
14554
14879
  static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.0.6", type: DynamicStyleDirective, isStandalone: false, selector: "[cssStyle]", inputs: { cssStyle: "cssStyle" }, host: { properties: { "attr.id": "this.id" } }, usesInheritance: true, usesOnChanges: true, ngImport: i0 }); }
@@ -15583,6 +15908,43 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
15583
15908
  type: Input
15584
15909
  }] } });
15585
15910
 
15911
+ class SafeBottomDirective extends BaseDirective {
15912
+ constructor() {
15913
+ super(...arguments);
15914
+ this.isMobile = getDeviceIsMobile();
15915
+ }
15916
+ ngOnInit() {
15917
+ super.ngOnInit();
15918
+ if (!this.isMobile) {
15919
+ return;
15920
+ }
15921
+ let cls = this.disableBottom ? '' : 'safe-bottom-area-env';
15922
+ this.applyTop && (cls += 'safe-top-area-env');
15923
+ let clsNonStandlalone = this.disableBottom ? '' : 'safe-bottom-padding';
15924
+ this.applyTop && (clsNonStandlalone += 'safe-top-padding');
15925
+ const isStandAlone = !document.body.classList.contains('noStandalone');
15926
+ if (isStandAlone) {
15927
+ this._renderer2.addClass(this._el.nativeElement, cls);
15928
+ }
15929
+ else {
15930
+ this._renderer2.addClass(this._el.nativeElement, clsNonStandlalone);
15931
+ }
15932
+ }
15933
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: SafeBottomDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
15934
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.0.6", type: SafeBottomDirective, isStandalone: false, selector: "[safe-area]", inputs: { applyTop: "applyTop", disableBottom: "disableBottom" }, usesInheritance: true, ngImport: i0 }); }
15935
+ }
15936
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: SafeBottomDirective, decorators: [{
15937
+ type: Directive,
15938
+ args: [{
15939
+ selector: '[safe-area]',
15940
+ standalone: false
15941
+ }]
15942
+ }], propDecorators: { applyTop: [{
15943
+ type: Input
15944
+ }], disableBottom: [{
15945
+ type: Input
15946
+ }] } });
15947
+
15586
15948
  class PortalDynamicPageResolver {
15587
15949
  /** Inserted by Angular inject() migration for backwards compatibility */
15588
15950
  constructor() {
@@ -15726,7 +16088,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
15726
16088
  class FormNewComponent extends BaseComponent {
15727
16089
  constructor() {
15728
16090
  super(...arguments);
15729
- this._location = inject(Location);
16091
+ this._router = inject(Router);
16092
+ this._activatedRoute = inject(ActivatedRoute);
15730
16093
  }
15731
16094
  ngOnInit() {
15732
16095
  super.ngOnInit();
@@ -15736,7 +16099,10 @@ class FormNewComponent extends BaseComponent {
15736
16099
  this.params = { moId, typeDefId, viewId };
15737
16100
  }
15738
16101
  onFormClose() {
15739
- this._location.back();
16102
+ this._router.navigate(['../'], {
16103
+ relativeTo: this._activatedRoute,
16104
+ replaceUrl: true
16105
+ });
15740
16106
  }
15741
16107
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: FormNewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
15742
16108
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.0.6", type: FormNewComponent, isStandalone: false, selector: "bnrc-form-new", inputs: { settings: "settings" }, usesInheritance: true, ngImport: i0, template: '<bnrc-form [params]="params" (formClose)="onFormClose()"></bnrc-form>', isInline: true, dependencies: [{ kind: "component", type: FormComponent, selector: "bnrc-form", inputs: ["params", "customFormPanelUi", "formPanelCtrl", "UlvMainCtrlr", "formPanelCtrlId", "saveOnChange", "inlineEditInReport"], outputs: ["titleChanged", "moChanged", "formClose", "uiComponent", "formRendered", "bruleAction", "beforeTransition", "afterTransition"] }, { kind: "directive", type: FormCloseDirective, selector: "[formClose]", inputs: ["isMobile"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
@@ -16669,7 +17035,8 @@ const components = [
16669
17035
  FormFieldReportPageComponent,
16670
17036
  ButtonLoadingComponent,
16671
17037
  UnlimitSessionComponent,
16672
- DynamicTileGroupComponent
17038
+ DynamicTileGroupComponent,
17039
+ PushBannerComponent
16673
17040
  ];
16674
17041
  const directives = [
16675
17042
  PlaceHolderDirective,
@@ -16722,7 +17089,8 @@ const directives = [
16722
17089
  TooltipDirective,
16723
17090
  SimplebarDirective,
16724
17091
  LeafletLongPressDirective,
16725
- ResizeHandlerDirective
17092
+ ResizeHandlerDirective,
17093
+ SafeBottomDirective
16726
17094
  ];
16727
17095
  const services = [
16728
17096
  PortalService,
@@ -16927,7 +17295,8 @@ class BarsaNovinRayCoreModule extends BaseModule {
16927
17295
  FormFieldReportPageComponent,
16928
17296
  ButtonLoadingComponent,
16929
17297
  UnlimitSessionComponent,
16930
- DynamicTileGroupComponent, NumeralPipe,
17298
+ DynamicTileGroupComponent,
17299
+ PushBannerComponent, NumeralPipe,
16931
17300
  CanUploadFilePipe,
16932
17301
  RemoveNewlinePipe,
16933
17302
  ConvertToStylePipe,
@@ -17034,7 +17403,8 @@ class BarsaNovinRayCoreModule extends BaseModule {
17034
17403
  TooltipDirective,
17035
17404
  SimplebarDirective,
17036
17405
  LeafletLongPressDirective,
17037
- ResizeHandlerDirective], imports: [CommonModule,
17406
+ ResizeHandlerDirective,
17407
+ SafeBottomDirective], imports: [CommonModule,
17038
17408
  BarsaNovinRayCoreRoutingModule,
17039
17409
  BarsaSapUiFormPageModule,
17040
17410
  ResizableModule,
@@ -17062,7 +17432,8 @@ class BarsaNovinRayCoreModule extends BaseModule {
17062
17432
  FormFieldReportPageComponent,
17063
17433
  ButtonLoadingComponent,
17064
17434
  UnlimitSessionComponent,
17065
- DynamicTileGroupComponent, NumeralPipe,
17435
+ DynamicTileGroupComponent,
17436
+ PushBannerComponent, NumeralPipe,
17066
17437
  CanUploadFilePipe,
17067
17438
  RemoveNewlinePipe,
17068
17439
  ConvertToStylePipe,
@@ -17169,7 +17540,8 @@ class BarsaNovinRayCoreModule extends BaseModule {
17169
17540
  TooltipDirective,
17170
17541
  SimplebarDirective,
17171
17542
  LeafletLongPressDirective,
17172
- ResizeHandlerDirective] }); }
17543
+ ResizeHandlerDirective,
17544
+ SafeBottomDirective] }); }
17173
17545
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: BarsaNovinRayCoreModule, providers: [provideHttpClient(withInterceptorsFromDi())], imports: [CommonModule,
17174
17546
  BarsaNovinRayCoreRoutingModule,
17175
17547
  BarsaSapUiFormPageModule,
@@ -17199,5 +17571,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
17199
17571
  * Generated bundle index. Do not edit.
17200
17572
  */
17201
17573
 
17202
- export { APP_VERSION, AbsoluteDivBodyDirective, AffixRespondEvents, AllFilesMimeType, AnchorScrollDirective, ApiService, ApplicationBaseComponent, ApplicationCtrlrService, AttrRtlDirective, AudioMimeType, AudioRecordingService, AuthGuard, BarsaApi, BarsaDialogService, BarsaIconDictPipe, BarsaNovinRayCoreModule, BarsaReadonlyDirective, BarsaSapUiFormPageModule, BarsaStorageService, BaseColumnPropsComponent, BaseComponent, BaseController, BaseDirective, BaseDynamicComponent, BaseFormToolbaritemPropsComponent, BaseItemContentPropsComponent, BaseModule, BaseReportModel, BaseUlvSettingComponent, BaseViewContentPropsComponent, BaseViewItemPropsComponent, BaseViewPropsComponent, BbbTranslatePipe, BodyClickDirective, BoolControlInfoModel, BreadcrumbService, ButtonLoadingComponent, CalculateControlInfoModel, CanUploadFilePipe, CardMediaSizePipe, ChangeLayoutInfoCustomUi, ChunkArrayPipe, CodeEditorControlInfoModel, ColSetting, ColumnCustomComponentPipe, ColumnCustomUiPipe, ColumnIconPipe, ColumnResizerDirective, ColumnService, ColumnValueDirective, ColumnValueOfParametersPipe, ColumnValuePipe, ComboRowImagePipe, CommandControlInfoModel, ContainerComponent, ContainerService, ContextMenuPipe, ControlUiPipe, ConvertToStylePipe, CopyDirective, CountDownDirective, CustomCommand, CustomInjector, CustomRouteReuseStategy, DIALOG_SERVICE, DateHijriService, DateMiladiService, DateRanges, DateService, DateShamsiService, DateTimeControlInfoModel, DeviceWidth, DialogParams, DynamicCommandDirective, DynamicComponentService, DynamicDarkColorPipe, DynamicFormComponent, DynamicFormToolbaritemComponent, DynamicItemComponent, DynamicLayoutComponent, DynamicRootVariableDirective, DynamicStyleDirective, DynamicTileGroupComponent, EllapsisTextDirective, EllipsifyDirective, EmptyPageComponent, EmptyPageWithRouterAndRouterOutletComponent, EnumControlInfoModel, ExecuteDynamicCommand, ExecuteWorkflowChoiceDef, FORM_DIALOG_COMPONENT, FieldBaseComponent, FieldDirective, FieldInfoTypeEnum, FieldUiComponent, FileControlInfoModel, FileInfoCountPipe, FilePictureInfoModel, FilesValidationHelper, FillAllLayoutControls, FillEmptySpaceDirective, FilterColumnsByDetailsPipe, FilterInlineActionListPipe, FilterPipe, FilterStringPipe, FilterTabPipe, FilterToolbarControlPipe, FilterWorkflowInMobilePipe, FindColumnByDbNamePipe, FindGroup, FindLayoutSettingFromLayout94, FindPreviewColumnPipe, FindToolbarItem, FioriIconPipe, FormBaseComponent, FormCloseDirective, FormComponent, FormFieldReportPageComponent, FormNewComponent, FormPageBaseComponent, FormPageComponent, FormPanelService, FormPropsBaseComponent, FormService, FormToolbarBaseComponent, GaugeControlInfoModel, GeneralControlInfoModel, GetAllColumnsSorted, GetAllHorizontalFromLayout94, GetDefaultMoObjectInfo, GetImgTags, GetVisibleValue, GridSetting, GroupBy, GroupByPipe, GroupByService, HeaderFacetValuePipe, HideAcceptCancelButtonsPipe, HideColumnsInmobilePipe, HistoryControlInfoModel, HorizontalLayoutService, HorizontalResponsiveDirective, IconControlInfoModel, ImageLazyDirective, ImageMimeType, ImagetoPrint, InMemoryStorageService, IndexedDbService, InputNumber, IntersectionObserverDirective, IntersectionStatus, IsDarkMode, IsExpandedNodePipe, IsImagePipe, ItemsRendererDirective, LabelStarTrimPipe, LabelmandatoryDirective, LayoutItemBaseComponent, LayoutMainContentService, LayoutPanelBaseComponent, LayoutService, LeafletLongPressDirective, LinearListControlInfoModel, LinearListHelper, ListCountPipe, ListRelationModel, LoadExternalFilesDirective, LocalStorageService, LogService, LoginSettingsResolver, MapToChatMessagePipe, MasterDetailsPageComponent, MeasureFormTitleWidthDirective, MergeFieldsToColumnsPipe, MetaobjectDataModel, MetaobjectRelationModel, MoForReportModel, MoForReportModelBase, MoInfoUlvMoListPipe, MoInfoUlvPagingPipe, MoReportValueConcatPipe, MoReportValuePipe, MoValuePipe, MobileDirective, ModalRootComponent, MultipleGroupByPipe, NOTIFICATAION_POPUP_SERVER, NOTIFICATION_WEBWORKER_FACTORY, NetworkStatusService, NotFoundComponent, NotificationService, NowraptextDirective, NumberBaseComponent, NumberControlInfoModel, NumbersOnlyInputDirective, NumeralPipe, OverflowTextDirective, PageBaseComponent, PageWithFormHandlerBaseComponent, PdfMimeType, PictureFieldSourcePipe, PictureFileControlInfoModel, PlaceHolderDirective, PortalDynamicPageResolver, PortalFormPageResolver, PortalPageComponent, PortalPageResolver, PortalPageSidebarComponent, PortalReportPageResolver, PortalService, PreventDefaulEvent, PreventDefaultDirective, PrintFilesDirective, PrintImage, PromptUpdateService, RabetehAkseTakiListiControlInfoModel, RedirectHomeGuard, RedirectReportNavigatorCommandComponent, RelatedReportControlInfoModel, RelationListControlInfoModel, RemoveNewlinePipe, RenderUlvDirective, RenderUlvPaginDirective, RenderUlvViewerDirective, ReplacePipe, ReportBaseComponent, ReportBaseInfo, ReportCalendarModel, ReportContainerComponent, ReportExtraInfo, ReportField, ReportFormModel, ReportItemBaseComponent, ReportListModel, ReportModel, ReportTreeModel, ReportViewBaseComponent, ReportViewColumn, ResizableComponent, ResizableDirective, ResizableModule, ResizeHandlerDirective, ResizeObserverDirective, ReversePipe, RichStringControlInfoModel, RootPageComponent, RootPortalComponent, RouteFormChangeDirective, RoutingService, RowDataOption, RowNumberPipe, SanitizeTextPipe, SaveImageDirective, SaveImageToFile, SaveScrollPositionService, ScrollPersistDirective, ScrollToSelectedDirective, SelectionMode, SeperatorFixPipe, ServiceWorkerCommuncationService, ServiceWorkerNotificationService, ShellbarHeightService, ShortcutHandlerDirective, ShortcutRegisterDirective, SimplebarDirective, SingleRelationControlInfoModel, SortDirection, SortPipe, SortSetting, SplideSliderDirective, SplitPipe, StopPropagationDirective, StringControlInfoModel, StringToNumberPipe, SubformControlInfoModel, SystemBaseComponent, TOAST_SERVICE, TableHeaderWidthMode, TableResizerDirective, TabpageService, ThImageOrIconePipe, TileGroupBreadcrumResolver, TilePropsComponent, TlbButtonsPipe, ToolbarSettingsPipe, TooltipDirective, TotalSummaryPipe, UiService, UlvCommandDirective, UlvMainService, UnlimitSessionComponent, UntilInViewDirective, UploadService, VideoMimeType, VideoRecordingService, ViewBase, VisibleValuePipe, WebOtpDirective, WordMimeType, WorfkflowwChoiceCommandDirective, addCssVariableToRoot, availablePrefixes, calcContextMenuWidth, calculateColumnContent, calculateColumnWidth, calculateColumnWidthFitToContainer, calculateFreeColumnSize, calculateMoDataListContentWidthByColumnName, cancelRequestAnimationFrame, createFormPanelMetaConditions, createGridEditorFormPanel, easeInOutCubic, elementInViewport2, enumValueToStringSize, executeUlvCommandHandler, flattenTree, forbiddenValidator, formRoutes, formatBytes, fromEntries, fromIntersectionObserver, genrateInlineMoId, getAllItemsPerChildren, getColumnValueOfMoDataList, getComponentDefined, getControlList, getControlSizeMode, getDateService, getDeviceIsDesktop, getDeviceIsMobile, getDeviceIsPhone, getDeviceIsTablet, getFieldValue, getFocusableTagNames, getFormSettings, getGridSettings, getHeaderValue, getIcon, getImagePath, getLabelWidth, getLayout94ObjectInfo, getLayoutControl, getNewMoGridEditor, getParentHeight, getRequestAnimationFrame, getResetGridSettings, getTargetRect, getUniqueId, getValidExtension, isFF, isFirefox, isFunction, isImage, isInLocalMode, isSafari, isTargetWindow, measureText, measureText2, measureTextBy, mobile_regex, nullOrUndefinedString, number_only, requestAnimationFramePolyfill, setColumnWidthByMaxMoContentWidth, setOneDepthLevel, setTableThWidth, shallowEqual, stopPropagation, throwIfAlreadyLoaded, toNumber, validateAllFormFields };
17574
+ export { APP_VERSION, AbsoluteDivBodyDirective, AddDynamicFormStyles, AffixRespondEvents, AllFilesMimeType, AnchorScrollDirective, ApiService, ApplicationBaseComponent, ApplicationCtrlrService, AttrRtlDirective, AudioMimeType, AudioRecordingService, AuthGuard, BarsaApi, BarsaDialogService, BarsaIconDictPipe, BarsaNovinRayCoreModule, BarsaReadonlyDirective, BarsaSapUiFormPageModule, BarsaStorageService, BaseColumnPropsComponent, BaseComponent, BaseController, BaseDirective, BaseDynamicComponent, BaseFormToolbaritemPropsComponent, BaseItemContentPropsComponent, BaseModule, BaseReportModel, BaseUlvSettingComponent, BaseViewContentPropsComponent, BaseViewItemPropsComponent, BaseViewPropsComponent, BbbTranslatePipe, BodyClickDirective, BoolControlInfoModel, BreadcrumbService, ButtonLoadingComponent, CalculateControlInfoModel, CanUploadFilePipe, CardMediaSizePipe, ChangeLayoutInfoCustomUi, ChunkArrayPipe, CodeEditorControlInfoModel, ColSetting, ColumnCustomComponentPipe, ColumnCustomUiPipe, ColumnIconPipe, ColumnResizerDirective, ColumnService, ColumnValueDirective, ColumnValueOfParametersPipe, ColumnValuePipe, ComboRowImagePipe, CommandControlInfoModel, ContainerComponent, ContainerService, ContextMenuPipe, ControlUiPipe, ConvertToStylePipe, CopyDirective, CountDownDirective, CustomCommand, CustomInjector, CustomRouteReuseStategy, DIALOG_SERVICE, DateHijriService, DateMiladiService, DateRanges, DateService, DateShamsiService, DateTimeControlInfoModel, DeviceWidth, DialogParams, DynamicCommandDirective, DynamicComponentService, DynamicDarkColorPipe, DynamicFormComponent, DynamicFormToolbaritemComponent, DynamicItemComponent, DynamicLayoutComponent, DynamicRootVariableDirective, DynamicStyleDirective, DynamicTileGroupComponent, EllapsisTextDirective, EllipsifyDirective, EmptyPageComponent, EmptyPageWithRouterAndRouterOutletComponent, EnumControlInfoModel, ExecuteDynamicCommand, ExecuteWorkflowChoiceDef, FORM_DIALOG_COMPONENT, FieldBaseComponent, FieldDirective, FieldInfoTypeEnum, FieldUiComponent, FileControlInfoModel, FileInfoCountPipe, FilePictureInfoModel, FilesValidationHelper, FillAllLayoutControls, FillEmptySpaceDirective, FilterColumnsByDetailsPipe, FilterInlineActionListPipe, FilterPipe, FilterStringPipe, FilterTabPipe, FilterToolbarControlPipe, FilterWorkflowInMobilePipe, FindColumnByDbNamePipe, FindGroup, FindLayoutSettingFromLayout94, FindPreviewColumnPipe, FindToolbarItem, FioriIconPipe, FormBaseComponent, FormCloseDirective, FormComponent, FormFieldReportPageComponent, FormNewComponent, FormPageBaseComponent, FormPageComponent, FormPanelService, FormPropsBaseComponent, FormService, FormToolbarBaseComponent, GaugeControlInfoModel, GeneralControlInfoModel, GetAllColumnsSorted, GetAllHorizontalFromLayout94, GetDefaultMoObjectInfo, GetImgTags, GetVisibleValue, GridSetting, GroupBy, GroupByPipe, GroupByService, HeaderFacetValuePipe, HideAcceptCancelButtonsPipe, HideColumnsInmobilePipe, HistoryControlInfoModel, HorizontalLayoutService, HorizontalResponsiveDirective, IconControlInfoModel, ImageLazyDirective, ImageMimeType, ImagetoPrint, InMemoryStorageService, IndexedDbService, InputNumber, IntersectionObserverDirective, IntersectionStatus, IsDarkMode, IsExpandedNodePipe, IsImagePipe, ItemsRendererDirective, LabelStarTrimPipe, LabelmandatoryDirective, LayoutItemBaseComponent, LayoutMainContentService, LayoutPanelBaseComponent, LayoutService, LeafletLongPressDirective, LinearListControlInfoModel, LinearListHelper, ListCountPipe, ListRelationModel, LoadExternalFilesDirective, LocalStorageService, LogService, LoginSettingsResolver, MapToChatMessagePipe, MasterDetailsPageComponent, MeasureFormTitleWidthDirective, MergeFieldsToColumnsPipe, MetaobjectDataModel, MetaobjectRelationModel, MoForReportModel, MoForReportModelBase, MoInfoUlvMoListPipe, MoInfoUlvPagingPipe, MoReportValueConcatPipe, MoReportValuePipe, MoValuePipe, MobileDirective, ModalRootComponent, MultipleGroupByPipe, NOTIFICATAION_POPUP_SERVER, NOTIFICATION_WEBWORKER_FACTORY, NetworkStatusService, NotFoundComponent, NotificationService, NowraptextDirective, NumberBaseComponent, NumberControlInfoModel, NumbersOnlyInputDirective, NumeralPipe, OverflowTextDirective, PageBaseComponent, PageWithFormHandlerBaseComponent, PdfMimeType, PictureFieldSourcePipe, PictureFileControlInfoModel, PlaceHolderDirective, PortalDynamicPageResolver, PortalFormPageResolver, PortalPageComponent, PortalPageResolver, PortalPageSidebarComponent, PortalReportPageResolver, PortalService, PreventDefaulEvent, PreventDefaultDirective, PrintFilesDirective, PrintImage, PromptUpdateService, PushBannerComponent, PushCheckService, RabetehAkseTakiListiControlInfoModel, RedirectHomeGuard, RedirectReportNavigatorCommandComponent, RelatedReportControlInfoModel, RelationListControlInfoModel, RemoveDynamicFormStyles, RemoveNewlinePipe, RenderUlvDirective, RenderUlvPaginDirective, RenderUlvViewerDirective, ReplacePipe, ReportBaseComponent, ReportBaseInfo, ReportCalendarModel, ReportContainerComponent, ReportExtraInfo, ReportField, ReportFormModel, ReportItemBaseComponent, ReportListModel, ReportModel, ReportTreeModel, ReportViewBaseComponent, ReportViewColumn, ResizableComponent, ResizableDirective, ResizableModule, ResizeHandlerDirective, ResizeObserverDirective, ReversePipe, RichStringControlInfoModel, RootPageComponent, RootPortalComponent, RouteFormChangeDirective, RoutingService, RowDataOption, RowNumberPipe, SafeBottomDirective, SanitizeTextPipe, SaveImageDirective, SaveImageToFile, SaveScrollPositionService, ScrollPersistDirective, ScrollToSelectedDirective, SelectionMode, SeperatorFixPipe, ServiceWorkerCommuncationService, ServiceWorkerNotificationService, ShellbarHeightService, ShortcutHandlerDirective, ShortcutRegisterDirective, SimplebarDirective, SingleRelationControlInfoModel, SortDirection, SortPipe, SortSetting, SplideSliderDirective, SplitPipe, StopPropagationDirective, StringControlInfoModel, StringToNumberPipe, SubformControlInfoModel, SystemBaseComponent, TOAST_SERVICE, TableHeaderWidthMode, TableResizerDirective, TabpageService, ThImageOrIconePipe, TileGroupBreadcrumResolver, TilePropsComponent, TlbButtonsPipe, ToolbarSettingsPipe, TooltipDirective, TotalSummaryPipe, UiService, UlvCommandDirective, UlvMainService, UnlimitSessionComponent, UntilInViewDirective, UploadService, VideoMimeType, VideoRecordingService, ViewBase, VisibleValuePipe, WebOtpDirective, WordMimeType, WorfkflowwChoiceCommandDirective, addCssVariableToRoot, availablePrefixes, calcContextMenuWidth, calculateColumnContent, calculateColumnWidth, calculateColumnWidthFitToContainer, calculateFreeColumnSize, calculateMoDataListContentWidthByColumnName, cancelRequestAnimationFrame, createFormPanelMetaConditions, createGridEditorFormPanel, easeInOutCubic, elementInViewport2, enumValueToStringSize, executeUlvCommandHandler, flattenTree, forbiddenValidator, formRoutes, formatBytes, fromEntries, fromIntersectionObserver, genrateInlineMoId, getAllItemsPerChildren, getColumnValueOfMoDataList, getComponentDefined, getControlList, getControlSizeMode, getDateService, getDeviceIsDesktop, getDeviceIsMobile, getDeviceIsPhone, getDeviceIsTablet, getFieldValue, getFocusableTagNames, getFormSettings, getGridSettings, getHeaderValue, getIcon, getImagePath, getLabelWidth, getLayout94ObjectInfo, getLayoutControl, getNewMoGridEditor, getParentHeight, getRequestAnimationFrame, getResetGridSettings, getTargetRect, getUniqueId, getValidExtension, isFF, isFirefox, isFunction, isImage, isInLocalMode, isSafari, isTargetWindow, measureText, measureText2, measureTextBy, mobile_regex, nullOrUndefinedString, number_only, requestAnimationFramePolyfill, setColumnWidthByMaxMoContentWidth, setOneDepthLevel, setTableThWidth, shallowEqual, stopPropagation, throwIfAlreadyLoaded, toNumber, usePushNotification, validateAllFormFields };
17203
17575
  //# sourceMappingURL=barsa-novin-ray-core.mjs.map