barsa-novin-ray-core 2.3.100 → 2.3.101
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.
- package/fesm2022/barsa-novin-ray-core.mjs +241 -215
- package/fesm2022/barsa-novin-ray-core.mjs.map +1 -1
- package/index.d.ts +62 -35
- package/package.json +1 -1
|
@@ -7836,12 +7836,11 @@ class ServiceWorkerNotificationService {
|
|
|
7836
7836
|
this.hasRegistration = false;
|
|
7837
7837
|
this._swPush = inject(SwPush);
|
|
7838
7838
|
this._portalService = inject(PortalService);
|
|
7839
|
-
this._notificationPermissionAllowed = false;
|
|
7840
7839
|
this.init();
|
|
7841
7840
|
}
|
|
7842
7841
|
// بررسی وضعیت فعلی
|
|
7843
7842
|
get isEnabled() {
|
|
7844
|
-
return this._swPush.isEnabled && this.hasRegistration
|
|
7843
|
+
return this._swPush.isEnabled && this.hasRegistration;
|
|
7845
7844
|
}
|
|
7846
7845
|
async closeNotifications(tags) {
|
|
7847
7846
|
const sw = await this.getSw();
|
|
@@ -7897,7 +7896,6 @@ class ServiceWorkerNotificationService {
|
|
|
7897
7896
|
}
|
|
7898
7897
|
async init() {
|
|
7899
7898
|
console.log(`SwPush enabled: ${this._swPush.isEnabled}`);
|
|
7900
|
-
this.handlePermission();
|
|
7901
7899
|
// مدیریت کلیک روی نوتیفیکیشنها
|
|
7902
7900
|
this._swPush.notificationClicks.subscribe((e) => {
|
|
7903
7901
|
if (!e.notification.tag) {
|
|
@@ -7912,44 +7910,6 @@ class ServiceWorkerNotificationService {
|
|
|
7912
7910
|
// بررسی مجوز و ثبت سرویسورکر
|
|
7913
7911
|
await this.registerServiceWorker();
|
|
7914
7912
|
}
|
|
7915
|
-
handlePermission() {
|
|
7916
|
-
if (!navigator?.permissions?.query) {
|
|
7917
|
-
return;
|
|
7918
|
-
}
|
|
7919
|
-
return navigator.permissions
|
|
7920
|
-
.query({ name: 'notifications' })
|
|
7921
|
-
.then(this.permissionQuery.bind(this))
|
|
7922
|
-
.catch(this.permissionError.bind(this));
|
|
7923
|
-
}
|
|
7924
|
-
permissionQuery(result) {
|
|
7925
|
-
let newPrompt;
|
|
7926
|
-
if (result.state === 'granted') {
|
|
7927
|
-
console.log('notificaiton granted');
|
|
7928
|
-
// notifications allowed, go wild
|
|
7929
|
-
}
|
|
7930
|
-
else if (result.state === 'prompt') {
|
|
7931
|
-
// we can ask the user
|
|
7932
|
-
console.log('notificaiton prompt');
|
|
7933
|
-
newPrompt = Notification.requestPermission();
|
|
7934
|
-
}
|
|
7935
|
-
else if (result.state === 'denied') {
|
|
7936
|
-
// notifications were disabled
|
|
7937
|
-
console.log('notificaiton denied');
|
|
7938
|
-
this._notificationPermissionAllowed = false;
|
|
7939
|
-
}
|
|
7940
|
-
result.onchange = () => console.log({ updatedPermission: result });
|
|
7941
|
-
return newPrompt || result;
|
|
7942
|
-
}
|
|
7943
|
-
permissionError(error) {
|
|
7944
|
-
this._notificationPermissionAllowed = false;
|
|
7945
|
-
console.error(error);
|
|
7946
|
-
}
|
|
7947
|
-
async requestPermission() {
|
|
7948
|
-
if (Notification.permission === 'default') {
|
|
7949
|
-
await Notification.requestPermission();
|
|
7950
|
-
}
|
|
7951
|
-
this._notificationPermissionAllowed = Notification.permission === 'granted';
|
|
7952
|
-
}
|
|
7953
7913
|
async registerServiceWorker() {
|
|
7954
7914
|
if (!('serviceWorker' in navigator)) {
|
|
7955
7915
|
return;
|
|
@@ -8268,157 +8228,210 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
|
|
|
8268
8228
|
args: [{ providedIn: 'root' }]
|
|
8269
8229
|
}] });
|
|
8270
8230
|
|
|
8271
|
-
|
|
8272
|
-
|
|
8273
|
-
|
|
8274
|
-
|
|
8275
|
-
|
|
8276
|
-
|
|
8277
|
-
|
|
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);
|
|
8231
|
+
// src/app/services/idb.service.ts
|
|
8232
|
+
class IdbService {
|
|
8233
|
+
constructor() {
|
|
8234
|
+
this.dbPromise = openDB('my-app-db', 1, {
|
|
8235
|
+
upgrade(db) {
|
|
8236
|
+
if (!db.objectStoreNames.contains('subscription')) {
|
|
8237
|
+
db.createObjectStore('subscription');
|
|
8326
8238
|
}
|
|
8327
|
-
|
|
8328
|
-
|
|
8239
|
+
if (!db.objectStoreNames.contains('settings')) {
|
|
8240
|
+
db.createObjectStore('settings');
|
|
8329
8241
|
}
|
|
8330
8242
|
}
|
|
8331
|
-
|
|
8332
|
-
|
|
8333
|
-
|
|
8334
|
-
|
|
8335
|
-
|
|
8243
|
+
});
|
|
8244
|
+
}
|
|
8245
|
+
async get(store, key) {
|
|
8246
|
+
const db = await this.dbPromise;
|
|
8247
|
+
const v = await db.get(store, key);
|
|
8248
|
+
return (v === undefined ? null : v);
|
|
8249
|
+
}
|
|
8250
|
+
async set(store, key, value) {
|
|
8251
|
+
const db = await this.dbPromise;
|
|
8252
|
+
await db.put(store, value, key);
|
|
8253
|
+
}
|
|
8254
|
+
async delete(store, key) {
|
|
8255
|
+
const db = await this.dbPromise;
|
|
8256
|
+
await db.delete(store, key);
|
|
8257
|
+
}
|
|
8258
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: IdbService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
8259
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: IdbService, providedIn: 'root' }); }
|
|
8260
|
+
}
|
|
8261
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: IdbService, decorators: [{
|
|
8262
|
+
type: Injectable,
|
|
8263
|
+
args: [{ providedIn: 'root' }]
|
|
8264
|
+
}], ctorParameters: () => [] });
|
|
8265
|
+
|
|
8266
|
+
class PushNotificationService {
|
|
8267
|
+
constructor() {
|
|
8268
|
+
this.swPush = inject(SwPush);
|
|
8269
|
+
this.http = inject(HttpClient);
|
|
8270
|
+
this.idb = inject(IdbService);
|
|
8271
|
+
this.local = inject(LocalStorageService);
|
|
8272
|
+
// یک سیگنال واحد
|
|
8273
|
+
this._push = signal({
|
|
8274
|
+
bannerVisible: false,
|
|
8275
|
+
isSubscribed: false,
|
|
8276
|
+
permission: Notification.permission,
|
|
8277
|
+
errorMessage: null
|
|
8278
|
+
});
|
|
8279
|
+
this.registerServiceWorkerMessageListener = () => {
|
|
8280
|
+
// avoid adding multiple listeners (idempotent)
|
|
8281
|
+
const onMessage = (event) => {
|
|
8282
|
+
const data = event.data;
|
|
8283
|
+
if (!data) {
|
|
8284
|
+
return;
|
|
8285
|
+
}
|
|
8286
|
+
if (data.event === 'subscriptionChanged' && data.subscription) {
|
|
8287
|
+
// run async handler but don't await here
|
|
8288
|
+
(async () => {
|
|
8289
|
+
await this.handleNewSubscription(data.subscription);
|
|
8290
|
+
})().catch(console.error);
|
|
8291
|
+
}
|
|
8292
|
+
};
|
|
8293
|
+
// addEventListener is idempotent-ish but let's guard by setting property
|
|
8294
|
+
// we attach once on navigator.serviceWorker (not to window)
|
|
8295
|
+
navigator.serviceWorker?.addEventListener('message', onMessage);
|
|
8296
|
+
};
|
|
8297
|
+
}
|
|
8298
|
+
get push() {
|
|
8299
|
+
return this._push.asReadonly();
|
|
8300
|
+
}
|
|
8301
|
+
hideBanner() {
|
|
8302
|
+
this.update({ bannerVisible: false });
|
|
8303
|
+
}
|
|
8304
|
+
async setup() {
|
|
8305
|
+
// Load subscription status
|
|
8306
|
+
await this.initPushBanner();
|
|
8307
|
+
// Listen for subscription updates
|
|
8308
|
+
this.swPush.subscription.subscribe((sub) => {
|
|
8309
|
+
this.update({
|
|
8310
|
+
isSubscribed: !!sub,
|
|
8311
|
+
permission: Notification.permission
|
|
8312
|
+
});
|
|
8313
|
+
if (sub) {
|
|
8314
|
+
const json = sub.toJSON?.() ?? sub;
|
|
8315
|
+
this.handleNewSubscription(json);
|
|
8336
8316
|
}
|
|
8337
|
-
|
|
8338
|
-
|
|
8317
|
+
});
|
|
8318
|
+
// Listen for SW messages
|
|
8319
|
+
navigator.serviceWorker.addEventListener('message', (event) => {
|
|
8320
|
+
if (event.data?.event === 'subscriptionChanged') {
|
|
8321
|
+
this.handleNewSubscription(event.data.subscription);
|
|
8339
8322
|
}
|
|
8340
|
-
}
|
|
8341
|
-
}
|
|
8342
|
-
|
|
8343
|
-
|
|
8344
|
-
|
|
8345
|
-
|
|
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 () => {
|
|
8323
|
+
});
|
|
8324
|
+
}
|
|
8325
|
+
async subscribe() {
|
|
8326
|
+
this.update({
|
|
8327
|
+
bannerVisible: false
|
|
8328
|
+
});
|
|
8373
8329
|
try {
|
|
8374
|
-
const publicKey = await lastValueFrom(http.get('/api/pushnotification/publickey', { responseType: 'text' }));
|
|
8375
|
-
|
|
8376
|
-
const
|
|
8377
|
-
|
|
8378
|
-
await
|
|
8379
|
-
|
|
8380
|
-
|
|
8381
|
-
|
|
8382
|
-
|
|
8383
|
-
|
|
8330
|
+
const publicKey = await lastValueFrom(this.http.get('/api/pushnotification/publickey', { responseType: 'text' }));
|
|
8331
|
+
await this.idb.set('settings', 'vapid-public-key', publicKey);
|
|
8332
|
+
const sub = await this.swPush.requestSubscription({ serverPublicKey: publicKey });
|
|
8333
|
+
await lastValueFrom(this.http.post('/api/pushnotification/add', sub, this.httpOptions()));
|
|
8334
|
+
await this.idb.set('subscription', 'push-subscription', sub.toJSON());
|
|
8335
|
+
this.update({
|
|
8336
|
+
isSubscribed: true,
|
|
8337
|
+
permission: Notification.permission,
|
|
8338
|
+
bannerVisible: false,
|
|
8339
|
+
errorMessage: null
|
|
8340
|
+
});
|
|
8384
8341
|
return sub;
|
|
8385
8342
|
}
|
|
8386
8343
|
catch (err) {
|
|
8387
|
-
|
|
8388
|
-
errorMessage.set(err?.message || 'خطا در فعالسازی Push');
|
|
8344
|
+
this.update({ errorMessage: err.message ?? 'خطا در فعالسازی اعلان', bannerVisible: true });
|
|
8389
8345
|
throw err;
|
|
8390
8346
|
}
|
|
8391
|
-
}
|
|
8392
|
-
|
|
8347
|
+
}
|
|
8348
|
+
async unsubscribe() {
|
|
8393
8349
|
try {
|
|
8394
|
-
const sub = await lastValueFrom(swPush.subscription);
|
|
8350
|
+
const sub = await lastValueFrom(this.swPush.subscription);
|
|
8395
8351
|
if (!sub) {
|
|
8396
8352
|
return;
|
|
8397
8353
|
}
|
|
8398
|
-
|
|
8399
|
-
await
|
|
8354
|
+
const json = sub.toJSON();
|
|
8355
|
+
await lastValueFrom(this.http.post('/api/pushnotification/delete', json, this.httpOptions()));
|
|
8400
8356
|
await sub.unsubscribe();
|
|
8401
|
-
await deleteSubscription();
|
|
8402
|
-
|
|
8403
|
-
errorMessage.set(null);
|
|
8357
|
+
await this.deleteSubscription();
|
|
8358
|
+
this.update({ isSubscribed: false, errorMessage: null });
|
|
8404
8359
|
}
|
|
8405
8360
|
catch (err) {
|
|
8406
|
-
|
|
8407
|
-
errorMessage.set(err?.message || 'خطا در لغو اشتراک');
|
|
8361
|
+
this.update({ errorMessage: err.message ?? 'خطا در لغو اشتراک' });
|
|
8408
8362
|
}
|
|
8409
|
-
}
|
|
8410
|
-
|
|
8411
|
-
|
|
8412
|
-
|
|
8413
|
-
|
|
8414
|
-
|
|
8415
|
-
|
|
8416
|
-
|
|
8417
|
-
|
|
8418
|
-
|
|
8419
|
-
|
|
8420
|
-
|
|
8363
|
+
}
|
|
8364
|
+
async handleNewSubscription(subData) {
|
|
8365
|
+
const saved = await this.idb.get('subscription', 'push-subscription');
|
|
8366
|
+
if (!saved || saved.endpoint !== subData.endpoint) {
|
|
8367
|
+
if (saved) {
|
|
8368
|
+
await lastValueFrom(this.http.post('/api/pushnotification/delete', saved, this.httpOptions()));
|
|
8369
|
+
}
|
|
8370
|
+
await lastValueFrom(this.http.post('/api/pushnotification/add', subData, this.httpOptions()));
|
|
8371
|
+
await this.idb.set('subscription', 'push-subscription', subData);
|
|
8372
|
+
}
|
|
8373
|
+
this.update({
|
|
8374
|
+
isSubscribed: true,
|
|
8375
|
+
permission: Notification.permission,
|
|
8376
|
+
errorMessage: null
|
|
8377
|
+
});
|
|
8378
|
+
}
|
|
8379
|
+
update(values) {
|
|
8380
|
+
this._push.update((prev) => ({ ...prev, ...values }));
|
|
8381
|
+
}
|
|
8382
|
+
async loadSubscription() {
|
|
8383
|
+
return await this.idb.get('subscription', 'push-subscription');
|
|
8384
|
+
}
|
|
8385
|
+
async loadPublicKey() {
|
|
8386
|
+
return await this.idb.get('settings', 'vapid-public-key');
|
|
8387
|
+
}
|
|
8388
|
+
async initPushBanner() {
|
|
8389
|
+
let saved = await this.loadSubscription();
|
|
8390
|
+
const perm = Notification.permission;
|
|
8391
|
+
this.update({
|
|
8392
|
+
permission: perm
|
|
8393
|
+
});
|
|
8394
|
+
if (saved) {
|
|
8395
|
+
// اگر پرمیشن اکنون revoked یا default شد، subscription قبلی را حذف کن
|
|
8396
|
+
if (perm === 'default' || perm === 'denied') {
|
|
8397
|
+
console.log('Permission reset detected, removing old subscription');
|
|
8398
|
+
await this.deleteSubscription();
|
|
8399
|
+
saved = null;
|
|
8400
|
+
}
|
|
8401
|
+
}
|
|
8402
|
+
if (saved) {
|
|
8403
|
+
this.update({
|
|
8404
|
+
isSubscribed: true,
|
|
8405
|
+
bannerVisible: false
|
|
8406
|
+
});
|
|
8407
|
+
}
|
|
8408
|
+
else {
|
|
8409
|
+
this.update({
|
|
8410
|
+
isSubscribed: false,
|
|
8411
|
+
bannerVisible: perm !== 'denied' && 'PushManager' in window
|
|
8412
|
+
});
|
|
8413
|
+
}
|
|
8414
|
+
this.registerServiceWorkerMessageListener();
|
|
8415
|
+
const publicKey = await this.loadPublicKey();
|
|
8416
|
+
if (publicKey) {
|
|
8417
|
+
const reg = await navigator.serviceWorker.ready;
|
|
8418
|
+
reg.active?.postMessage({ event: 'setVapidKey', publicKey });
|
|
8419
|
+
}
|
|
8420
|
+
}
|
|
8421
|
+
async deleteSubscription() {
|
|
8422
|
+
await this.idb.delete('subscription', 'push-subscription');
|
|
8423
|
+
}
|
|
8424
|
+
httpOptions() {
|
|
8425
|
+
const token2 = this.local.getItem(BarsaApi.LoginAction.token2StorageKey) ?? '';
|
|
8426
|
+
return { headers: new HttpHeaders({ 'Content-Type': 'application/json', sth: token2 }) };
|
|
8427
|
+
}
|
|
8428
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: PushNotificationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
8429
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: PushNotificationService, providedIn: 'root' }); }
|
|
8421
8430
|
}
|
|
8431
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: PushNotificationService, decorators: [{
|
|
8432
|
+
type: Injectable,
|
|
8433
|
+
args: [{ providedIn: 'root' }]
|
|
8434
|
+
}] });
|
|
8422
8435
|
|
|
8423
8436
|
class ServiceWorkerCommuncationService {
|
|
8424
8437
|
constructor() {
|
|
@@ -8426,7 +8439,7 @@ class ServiceWorkerCommuncationService {
|
|
|
8426
8439
|
this._localStorage = inject(LocalStorageService);
|
|
8427
8440
|
this._portalService = inject(PortalService);
|
|
8428
8441
|
this._pushCheckService = inject(PushCheckService);
|
|
8429
|
-
this.
|
|
8442
|
+
this._pushNotificatioService = inject(PushNotificationService);
|
|
8430
8443
|
}
|
|
8431
8444
|
get token2() {
|
|
8432
8445
|
return this._localStorage.getItem(BarsaApi.LoginAction.token2StorageKey) ?? '';
|
|
@@ -8442,7 +8455,7 @@ class ServiceWorkerCommuncationService {
|
|
|
8442
8455
|
this._serviceWorker = reg.active;
|
|
8443
8456
|
navigator.serviceWorker.addEventListener('message', (event) => {
|
|
8444
8457
|
if (event.data?.event === 'subscriptionChanged') {
|
|
8445
|
-
this.
|
|
8458
|
+
this._pushNotificatioService.handleNewSubscription(event.data.subscription);
|
|
8446
8459
|
}
|
|
8447
8460
|
});
|
|
8448
8461
|
}
|
|
@@ -8453,34 +8466,18 @@ class ServiceWorkerCommuncationService {
|
|
|
8453
8466
|
});
|
|
8454
8467
|
// automatic effect: update operationName based on subscription
|
|
8455
8468
|
effect(() => {
|
|
8456
|
-
const sub = this.
|
|
8469
|
+
const sub = this._pushNotificatioService.push().isSubscribed;
|
|
8457
8470
|
// اینجا میتونی متغیر operationName یا UI رو اتوماتیک آپدیت کنی
|
|
8458
8471
|
console.log('Push subscription changed:', sub);
|
|
8459
8472
|
});
|
|
8460
8473
|
// automatic effect: show toast on errors
|
|
8461
8474
|
effect(() => {
|
|
8462
|
-
const err = this.
|
|
8475
|
+
const err = this._pushNotificatioService.push().errorMessage;
|
|
8463
8476
|
if (err) {
|
|
8464
8477
|
this.toast(err);
|
|
8465
8478
|
}
|
|
8466
8479
|
});
|
|
8467
8480
|
}
|
|
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
|
-
}
|
|
8484
8481
|
_subscribe() {
|
|
8485
8482
|
this._portalService.userLoggedIn$.pipe().subscribe((isLoggedIn) => this._isLoggedIn(isLoggedIn));
|
|
8486
8483
|
this._portalService.documentVisibilitychange$
|
|
@@ -8497,7 +8494,7 @@ class ServiceWorkerCommuncationService {
|
|
|
8497
8494
|
this._postServiceWorker({ event: 'isLoggedInChange', options: { isLoggedIn } });
|
|
8498
8495
|
if (isLoggedIn) {
|
|
8499
8496
|
this._setDefaultOptions();
|
|
8500
|
-
this.
|
|
8497
|
+
this._pushNotificatioService.setup();
|
|
8501
8498
|
}
|
|
8502
8499
|
}
|
|
8503
8500
|
_visibilitychange(documentIsHidden) {
|
|
@@ -8513,7 +8510,7 @@ class ServiceWorkerCommuncationService {
|
|
|
8513
8510
|
}
|
|
8514
8511
|
// لغو push (هر زمان امکانپذیر است)
|
|
8515
8512
|
_handlePushUnSubscription(doReturn) {
|
|
8516
|
-
this.
|
|
8513
|
+
this._pushNotificatioService.unsubscribe().finally(() => doReturn && doReturn());
|
|
8517
8514
|
}
|
|
8518
8515
|
toast(msg) {
|
|
8519
8516
|
if (!this._toastService) {
|
|
@@ -13213,49 +13210,77 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
|
|
|
13213
13210
|
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"] }]
|
|
13214
13211
|
}] });
|
|
13215
13212
|
|
|
13216
|
-
class PushBannerComponent {
|
|
13213
|
+
class PushBannerComponent extends BaseComponent {
|
|
13217
13214
|
constructor() {
|
|
13218
|
-
|
|
13215
|
+
super();
|
|
13216
|
+
this._pushService = inject(PushNotificationService);
|
|
13217
|
+
this.push = this._pushService.push;
|
|
13218
|
+
}
|
|
13219
|
+
get bannerPositionClass() {
|
|
13220
|
+
const userAgent = navigator.userAgent;
|
|
13221
|
+
const isMobile = /Android|iPhone|iPad|iPod/i.test(userAgent);
|
|
13222
|
+
if (!isMobile) {
|
|
13223
|
+
// دسکتاپ: بالا، راست/چپ
|
|
13224
|
+
return 'position-desktop';
|
|
13225
|
+
}
|
|
13226
|
+
const isAndroid = /Android/i.test(userAgent);
|
|
13227
|
+
const isIOS = /iPhone|iPad|iPod/i.test(userAgent);
|
|
13228
|
+
if (isAndroid) {
|
|
13229
|
+
// موبایل اندروید: بالا
|
|
13230
|
+
return 'position-android-top';
|
|
13231
|
+
}
|
|
13232
|
+
if (isIOS) {
|
|
13233
|
+
// موبایل iOS: پایین (برای جلوگیری از تداخل با نوار آدرس Safari/Chrome)
|
|
13234
|
+
return 'position-ios-bottom';
|
|
13235
|
+
}
|
|
13236
|
+
// پیشفرض برای هر موبایل دیگر
|
|
13237
|
+
return 'position-ios-bottom';
|
|
13238
|
+
}
|
|
13239
|
+
onHideBanner() {
|
|
13240
|
+
this._pushService.hideBanner();
|
|
13241
|
+
}
|
|
13242
|
+
onEnable() {
|
|
13243
|
+
this._pushService.subscribe();
|
|
13219
13244
|
}
|
|
13220
13245
|
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">
|
|
13246
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.6", type: PushBannerComponent, isStandalone: false, selector: "bnrc-push-banner", usesInheritance: true, ngImport: i0, template: `
|
|
13247
|
+
@if(push().bannerVisible){
|
|
13248
|
+
<div class="push-banner" [ngClass]="bannerPositionClass">
|
|
13224
13249
|
<div class="text">
|
|
13225
13250
|
<b>فعالسازی اعلانها</b>
|
|
13226
13251
|
<p>برای دریافت پیامها و رویدادهای مهم، اعلانها را فعال کنید.</p>
|
|
13227
13252
|
</div>
|
|
13228
13253
|
<div class="actions">
|
|
13229
|
-
<button class="btn enable" (click)="
|
|
13230
|
-
<button class="btn later" (click)="
|
|
13254
|
+
<button class="btn enable" (click)="onEnable()">فعالسازی</button>
|
|
13255
|
+
<button class="btn later" (click)="onHideBanner()">بعداً</button>
|
|
13231
13256
|
</div>
|
|
13232
|
-
@if(push.errorMessage
|
|
13233
|
-
<p class="error">{{ push.errorMessage
|
|
13257
|
+
@if(push().errorMessage){
|
|
13258
|
+
<p class="error">{{ push().errorMessage }}</p>
|
|
13234
13259
|
}
|
|
13235
13260
|
</div>
|
|
13236
13261
|
}
|
|
13237
|
-
`, isInline: true, styles: [".push-banner{position:fixed;
|
|
13262
|
+
`, isInline: true, styles: [".push-banner{position:fixed;left:0;right:0;font-family:var(--sapFontFamily);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}.position-ios-bottom{bottom:0;top:auto;border-radius:12px 12px 0 0}.position-android-top{top:0;bottom:auto;border-radius:0 0 12px 12px}.position-desktop{inset:20px 20px auto auto;width:320px;max-width:90%;border-radius:8px}\n"], dependencies: [{ kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
13238
13263
|
}
|
|
13239
13264
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImport: i0, type: PushBannerComponent, decorators: [{
|
|
13240
13265
|
type: Component,
|
|
13241
|
-
args: [{ selector: 'bnrc-push-banner', standalone: false, template: `
|
|
13242
|
-
@if(push.bannerVisible
|
|
13243
|
-
<div class="push-banner">
|
|
13266
|
+
args: [{ selector: 'bnrc-push-banner', standalone: false, changeDetection: ChangeDetectionStrategy.OnPush, template: `
|
|
13267
|
+
@if(push().bannerVisible){
|
|
13268
|
+
<div class="push-banner" [ngClass]="bannerPositionClass">
|
|
13244
13269
|
<div class="text">
|
|
13245
13270
|
<b>فعالسازی اعلانها</b>
|
|
13246
13271
|
<p>برای دریافت پیامها و رویدادهای مهم، اعلانها را فعال کنید.</p>
|
|
13247
13272
|
</div>
|
|
13248
13273
|
<div class="actions">
|
|
13249
|
-
<button class="btn enable" (click)="
|
|
13250
|
-
<button class="btn later" (click)="
|
|
13274
|
+
<button class="btn enable" (click)="onEnable()">فعالسازی</button>
|
|
13275
|
+
<button class="btn later" (click)="onHideBanner()">بعداً</button>
|
|
13251
13276
|
</div>
|
|
13252
|
-
@if(push.errorMessage
|
|
13253
|
-
<p class="error">{{ push.errorMessage
|
|
13277
|
+
@if(push().errorMessage){
|
|
13278
|
+
<p class="error">{{ push().errorMessage }}</p>
|
|
13254
13279
|
}
|
|
13255
13280
|
</div>
|
|
13256
13281
|
}
|
|
13257
|
-
`, styles: [".push-banner{position:fixed;
|
|
13258
|
-
}] });
|
|
13282
|
+
`, styles: [".push-banner{position:fixed;left:0;right:0;font-family:var(--sapFontFamily);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}.position-ios-bottom{bottom:0;top:auto;border-radius:12px 12px 0 0}.position-android-top{top:0;bottom:auto;border-radius:0 0 12px 12px}.position-desktop{inset:20px 20px auto auto;width:320px;max-width:90%;border-radius:8px}\n"] }]
|
|
13283
|
+
}], ctorParameters: () => [] });
|
|
13259
13284
|
|
|
13260
13285
|
class LoadExternalFilesDirective {
|
|
13261
13286
|
constructor() {
|
|
@@ -17118,7 +17143,8 @@ const services = [
|
|
|
17118
17143
|
BbbTranslatePipe,
|
|
17119
17144
|
BarsaStorageService,
|
|
17120
17145
|
ServiceWorkerCommuncationService,
|
|
17121
|
-
ApplicationCtrlrService
|
|
17146
|
+
ApplicationCtrlrService,
|
|
17147
|
+
PushNotificationService
|
|
17122
17148
|
];
|
|
17123
17149
|
const pipes = [
|
|
17124
17150
|
NumeralPipe,
|
|
@@ -17571,5 +17597,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.6", ngImpor
|
|
|
17571
17597
|
* Generated bundle index. Do not edit.
|
|
17572
17598
|
*/
|
|
17573
17599
|
|
|
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,
|
|
17600
|
+
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, IdbService, 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, PushNotificationService, 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, validateAllFormFields };
|
|
17575
17601
|
//# sourceMappingURL=barsa-novin-ray-core.mjs.map
|