@flusys/ng-core 9.1.0 → 9.1.2

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,187 +1,212 @@
1
- import * as i0 from '@angular/core';
2
- import { signal, computed, Service, inject, Component, InjectionToken } from '@angular/core';
3
- import { ConfirmDialog, ProgressbarComponent, ToastComponent } from '@flusys/ng-ui';
4
- import { finalize } from 'rxjs/operators';
5
- import { HttpClient } from '@angular/common/http';
6
-
7
- class ApiLoaderService {
8
- loaders = signal({}, /* @ts-ignore */
9
- ...(ngDevMode ? [{ debugName: "loaders" }] : /* istanbul ignore next */ []));
10
- DEFAULT_TAG = 'default';
11
- // Global loading state
12
- show = computed(() => {
13
- const loaders = this.loaders();
14
- return Object.values(loaders).some((count) => count > 0);
15
- }, /* @ts-ignore */
16
- ...(ngDevMode ? [{ debugName: "show" }] : /* istanbul ignore next */ []));
17
- // Get specific loader as a signal
18
- getLoader(name) {
19
- return computed(() => (this.loaders()[name] ?? 0) > 0);
20
- }
21
- increase(name = this.DEFAULT_TAG) {
22
- this.loaders.update((loaders) => ({
23
- ...loaders,
24
- [name]: (loaders[name] ?? 0) + 1,
25
- }));
26
- }
27
- decrease(name = this.DEFAULT_TAG) {
28
- this.loaders.update((loaders) => {
29
- const current = loaders[name] ?? 0;
30
- return { ...loaders, [name]: Math.max(0, current - 1) };
31
- });
32
- }
33
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: ApiLoaderService, deps: [], target: i0.ɵɵFactoryTarget.Service });
34
- static ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.1.5", ngImport: i0, type: ApiLoaderService });
35
- }
36
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: ApiLoaderService, decorators: [{
37
- type: Service
38
- }] });
39
-
40
- class LibAppConfigComponent {
41
- apiLoaderService = inject(ApiLoaderService);
42
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: LibAppConfigComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
43
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: LibAppConfigComponent, isStandalone: true, selector: "lib-app-config", ngImport: i0, template: `
1
+ import * as i0 from "@angular/core";
2
+ import { Component, InjectionToken, Service, computed, inject, signal } from "@angular/core";
3
+ import { ConfirmDialog, ProgressbarComponent, ToastComponent } from "@flusys/ng-ui";
4
+ import { finalize } from "rxjs/operators";
5
+ import { HttpClient } from "@angular/common/http";
6
+ var ApiLoaderService = class ApiLoaderService {
7
+ loaders = signal({}, ...ngDevMode ? [{ debugName: "loaders" }] : /* istanbul ignore next */ []);
8
+ DEFAULT_TAG = "default";
9
+ show = computed(() => {
10
+ const loaders = this.loaders();
11
+ return Object.values(loaders).some((count) => count > 0);
12
+ }, ...ngDevMode ? [{ debugName: "show" }] : /* istanbul ignore next */ []);
13
+ getLoader(name) {
14
+ return computed(() => (this.loaders()[name] ?? 0) > 0);
15
+ }
16
+ increase(name = this.DEFAULT_TAG) {
17
+ this.loaders.update((loaders) => ({
18
+ ...loaders,
19
+ [name]: (loaders[name] ?? 0) + 1
20
+ }));
21
+ }
22
+ decrease(name = this.DEFAULT_TAG) {
23
+ this.loaders.update((loaders) => {
24
+ const current = loaders[name] ?? 0;
25
+ return {
26
+ ...loaders,
27
+ [name]: Math.max(0, current - 1)
28
+ };
29
+ });
30
+ }
31
+ static ɵfac = i0.ɵɵngDeclareFactory({
32
+ minVersion: "12.0.0",
33
+ version: "22.2.1",
34
+ ngImport: i0,
35
+ type: ApiLoaderService,
36
+ deps: [],
37
+ target: i0.ɵɵFactoryTarget.Service
38
+ });
39
+ static ɵprov = i0.ɵɵngDeclareService({
40
+ minVersion: "22.0.0",
41
+ version: "22.2.1",
42
+ ngImport: i0,
43
+ type: ApiLoaderService
44
+ });
45
+ };
46
+ i0.ɵɵngDeclareClassMetadata({
47
+ minVersion: "12.0.0",
48
+ version: "22.2.1",
49
+ ngImport: i0,
50
+ type: ApiLoaderService,
51
+ decorators: [{ type: Service }]
52
+ });
53
+ var LibAppConfigComponent = class LibAppConfigComponent {
54
+ apiLoaderService = inject(ApiLoaderService);
55
+ static ɵfac = i0.ɵɵngDeclareFactory({
56
+ minVersion: "12.0.0",
57
+ version: "22.2.1",
58
+ ngImport: i0,
59
+ type: LibAppConfigComponent,
60
+ deps: [],
61
+ target: i0.ɵɵFactoryTarget.Component
62
+ });
63
+ static ɵcmp = i0.ɵɵngDeclareComponent({
64
+ minVersion: "17.0.0",
65
+ version: "22.2.1",
66
+ type: LibAppConfigComponent,
67
+ isStandalone: true,
68
+ selector: "lib-app-config",
69
+ ngImport: i0,
70
+ template: `
44
71
  @if (apiLoaderService.show()) {
45
72
  <f-progressbar mode="indeterminate" />
46
73
  }
47
74
  <f-toast />
48
75
  <f-confirmdialog />
49
- `, isInline: true, styles: ["f-progressbar{position:fixed}\n"], dependencies: [{ kind: "component", type: ConfirmDialog, selector: "f-confirmdialog", inputs: ["key", "icon", "acceptLabel", "rejectLabel", "acceptIcon", "rejectIcon", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "blockScroll", "defaultFocus", "styleClass", "style"] }, { kind: "component", type: ProgressbarComponent, selector: "f-progressbar", inputs: ["value", "mode", "showValue", "unit", "severity", "color", "styleClass"] }, { kind: "component", type: ToastComponent, selector: "f-toast", inputs: ["key", "position"], outputs: ["onClose"] }] });
50
- }
51
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: LibAppConfigComponent, decorators: [{
52
- type: Component,
53
- args: [{ selector: 'lib-app-config', imports: [ConfirmDialog, ProgressbarComponent, ToastComponent], template: `
76
+ `,
77
+ isInline: true,
78
+ styles: ["f-progressbar{position:fixed}\n"],
79
+ dependencies: [
80
+ {
81
+ kind: "component",
82
+ type: ConfirmDialog,
83
+ selector: "f-confirmdialog",
84
+ inputs: [
85
+ "key",
86
+ "icon",
87
+ "acceptLabel",
88
+ "rejectLabel",
89
+ "acceptIcon",
90
+ "rejectIcon",
91
+ "acceptButtonStyleClass",
92
+ "rejectButtonStyleClass",
93
+ "closeOnEscape",
94
+ "blockScroll",
95
+ "defaultFocus",
96
+ "styleClass",
97
+ "style"
98
+ ]
99
+ },
100
+ {
101
+ kind: "component",
102
+ type: ProgressbarComponent,
103
+ selector: "f-progressbar",
104
+ inputs: [
105
+ "value",
106
+ "mode",
107
+ "showValue",
108
+ "unit",
109
+ "severity",
110
+ "color",
111
+ "styleClass"
112
+ ]
113
+ },
114
+ {
115
+ kind: "component",
116
+ type: ToastComponent,
117
+ selector: "f-toast",
118
+ inputs: ["key", "position"],
119
+ outputs: ["onClose"]
120
+ }
121
+ ]
122
+ });
123
+ };
124
+ i0.ɵɵngDeclareClassMetadata({
125
+ minVersion: "12.0.0",
126
+ version: "22.2.1",
127
+ ngImport: i0,
128
+ type: LibAppConfigComponent,
129
+ decorators: [{
130
+ type: Component,
131
+ args: [{
132
+ selector: "lib-app-config",
133
+ imports: [
134
+ ConfirmDialog,
135
+ ProgressbarComponent,
136
+ ToastComponent
137
+ ],
138
+ template: `
54
139
  @if (apiLoaderService.show()) {
55
140
  <f-progressbar mode="indeterminate" />
56
141
  }
57
142
  <f-toast />
58
143
  <f-confirmdialog />
59
- `, styles: ["f-progressbar{position:fixed}\n"] }]
60
- }] });
61
-
62
- /**
63
- * Interceptor that tracks loading state for HTTP requests.
64
- * Uses 'x-loader-tag' header to group related requests.
65
- *
66
- * @example
67
- * ```typescript
68
- * http.get('/api/users', {
69
- * headers: new HttpHeaders({ 'x-loader-tag': 'users-list' })
70
- * });
71
- * // In template: apiLoaderService.getLoader('users-list')
72
- * ```
73
- */
144
+ `,
145
+ styles: ["f-progressbar{position:fixed}\n"]
146
+ }]
147
+ }]
148
+ });
74
149
  function apiLoaderInterceptor(req, next) {
75
- const loaderService = inject(ApiLoaderService);
76
- const loaderTag = req.headers.get('x-loader-tag') ?? loaderService.DEFAULT_TAG;
77
- loaderService.increase(loaderTag);
78
- const cleanReq = req.clone({
79
- headers: req.headers.delete('x-loader-tag'),
80
- });
81
- return next(cleanReq).pipe(finalize(() => loaderService.decrease(loaderTag)));
150
+ const loaderService = inject(ApiLoaderService);
151
+ const loaderTag = req.headers.get("x-loader-tag") ?? loaderService.DEFAULT_TAG;
152
+ loaderService.increase(loaderTag);
153
+ return next(req.clone({ headers: req.headers.delete("x-loader-tag") })).pipe(finalize(() => loaderService.decrease(loaderTag)));
82
154
  }
83
-
84
- const APP_CONFIG = new InjectionToken('APP_CONFIG');
155
+ const APP_CONFIG = new InjectionToken("APP_CONFIG");
85
156
  function isServiceEnabled(config, serviceName) {
86
- const service = config.services[serviceName];
87
- return service?.enabled ?? false;
157
+ return config.services[serviceName]?.enabled ?? false;
88
158
  }
89
159
  function getServiceUrl(config, serviceName) {
90
- if (isServiceEnabled(config, serviceName)) {
91
- const service = config.services[serviceName];
92
- return service?.baseUrl ?? config.apiBaseUrl;
93
- }
94
- return config.apiBaseUrl;
160
+ if (isServiceEnabled(config, serviceName)) return config.services[serviceName]?.baseUrl ?? config.apiBaseUrl;
161
+ return config.apiBaseUrl;
95
162
  }
96
163
  function isCompanyFeatureEnabled(config) {
97
- return config.enableCompanyFeature ?? false;
164
+ return config.enableCompanyFeature ?? false;
98
165
  }
99
166
  function getNotificationSocketUrl(config) {
100
- const service = config.services.notification;
101
- if (!service?.enabled)
102
- return null;
103
- return service.socketUrl ?? service.baseUrl;
167
+ const service = config.services.notification;
168
+ if (!service?.enabled) return null;
169
+ return service.socketUrl ?? service.baseUrl;
104
170
  }
105
171
  function getPermissionMode(config) {
106
- return config.permissionMode ?? 'full';
172
+ return config.permissionMode ?? "full";
107
173
  }
108
174
  function getDefaultStorageConfigId(config) {
109
- return config.services.storage?.defaultStorageConfigId;
175
+ return config.services.storage?.defaultStorageConfigId;
110
176
  }
111
177
  function isSignUpEnabled(config) {
112
- return config.enableSignUp ?? true;
178
+ return config.enableSignUp ?? true;
113
179
  }
114
180
  function getDefaultCompanySlug(config) {
115
- return config.registrationDefaults?.companySlug;
181
+ return config.registrationDefaults?.companySlug;
116
182
  }
117
183
  function getDefaultBranchSlug(config) {
118
- return config.registrationDefaults?.branchSlug;
184
+ return config.registrationDefaults?.branchSlug;
119
185
  }
120
- const DEFAULT_APP_NAME = 'FLUSYS';
186
+ const DEFAULT_APP_NAME = "FLUSYS";
121
187
  const DEFAULT_AUTHOR = {
122
- name: 'Flusys',
123
- url: 'https://flusys.vercel.app',
188
+ name: "Flusys",
189
+ url: "https://flusys.vercel.app"
124
190
  };
125
-
126
- /** Registry for fallback messages when localization is not active */
127
- const FALLBACK_MESSAGES_REGISTRY = new InjectionToken('FALLBACK_MESSAGES_REGISTRY');
128
- // ✅ Provide it once at root as a single shared object
191
+ const FALLBACK_MESSAGES_REGISTRY = new InjectionToken("FALLBACK_MESSAGES_REGISTRY");
129
192
  const provideFallbackMessagesRegistry = (initialFallbackMessages) => ({
130
- provide: FALLBACK_MESSAGES_REGISTRY,
131
- useValue: initialFallbackMessages || {}, // Single object instance shared across all injections
193
+ provide: FALLBACK_MESSAGES_REGISTRY,
194
+ useValue: initialFallbackMessages || {}
132
195
  });
133
- const LOCALIZATION_STATE_SERVICE = new InjectionToken('LOCALIZATION_STATE_SERVICE');
134
- const LOCALIZATION_API_SERVICE = new InjectionToken('LOCALIZATION_API_SERVICE');
135
-
136
- /**
137
- * Base API Service
138
- * Provides service-specific base URL resolution
139
- *
140
- * Note: This project uses POST-only RPC - all endpoints use POST, not REST verbs.
141
- *
142
- * Usage:
143
- * ```typescript
144
- * @Service()
145
- * export class MyService extends BaseApiService {
146
- * constructor() {
147
- * super('my-service'); // Service name from config
148
- * }
149
- *
150
- * getData() {
151
- * return this.http.post(`${this.baseUrl}/data/get`, {});
152
- * }
153
- * }
154
- * ```
155
- */
156
- class BaseApiService {
157
- http = inject(HttpClient);
158
- appConfig = inject(APP_CONFIG);
159
- baseUrl;
160
- /**
161
- * @param serviceName - Service name from config (e.g., 'auth', 'iam', 'storage')
162
- */
163
- constructor(serviceName) {
164
- this.baseUrl = getServiceUrl(this.appConfig, serviceName);
165
- }
166
- /**
167
- * Get full URL for an endpoint
168
- * @param endpoint - API endpoint (e.g., '/users/get-all')
169
- * @returns Full URL (e.g., 'http://localhost:2002/users/get-all')
170
- */
171
- getUrl(endpoint) {
172
- // Remove leading slash if present to avoid double slashes
173
- const cleanEndpoint = endpoint.startsWith('/')
174
- ? endpoint.substring(1)
175
- : endpoint;
176
- return `${this.baseUrl}/${cleanEndpoint}`;
177
- }
178
- }
179
-
180
- // Components
181
-
182
- /**
183
- * Generated bundle index. Do not edit.
184
- */
185
-
196
+ const LOCALIZATION_STATE_SERVICE = new InjectionToken("LOCALIZATION_STATE_SERVICE");
197
+ const LOCALIZATION_API_SERVICE = new InjectionToken("LOCALIZATION_API_SERVICE");
198
+ var BaseApiService = class {
199
+ http = inject(HttpClient);
200
+ appConfig = inject(APP_CONFIG);
201
+ baseUrl;
202
+ constructor(serviceName) {
203
+ this.baseUrl = getServiceUrl(this.appConfig, serviceName);
204
+ }
205
+ getUrl(endpoint) {
206
+ const cleanEndpoint = endpoint.startsWith("/") ? endpoint.substring(1) : endpoint;
207
+ return `${this.baseUrl}/${cleanEndpoint}`;
208
+ }
209
+ };
186
210
  export { APP_CONFIG, ApiLoaderService, BaseApiService, DEFAULT_APP_NAME, DEFAULT_AUTHOR, FALLBACK_MESSAGES_REGISTRY, LOCALIZATION_API_SERVICE, LOCALIZATION_STATE_SERVICE, LibAppConfigComponent, apiLoaderInterceptor, getDefaultBranchSlug, getDefaultCompanySlug, getDefaultStorageConfigId, getNotificationSocketUrl, getPermissionMode, getServiceUrl, isCompanyFeatureEnabled, isServiceEnabled, isSignUpEnabled, provideFallbackMessagesRegistry };
187
- //# sourceMappingURL=flusys-ng-core.mjs.map
211
+
212
+ //# sourceMappingURL=flusys-ng-core.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"flusys-ng-core.mjs","sources":["../../../projects/ng-core/services/api-loader.service.ts","../../../projects/ng-core/components/lib-app-config/lib-app-config.component.ts","../../../projects/ng-core/interceptors/api-loader.interceptor.ts","../../../projects/ng-core/interfaces/app-config.interface.ts","../../../projects/ng-core/interfaces/translate-adapter.interface.ts","../../../projects/ng-core/services/base-api.service.ts","../../../projects/ng-core/public-api.ts","../../../projects/ng-core/flusys-ng-core.ts"],"sourcesContent":["import { computed, Signal, signal, Service } from '@angular/core';\n\n@Service()\nexport class ApiLoaderService {\n private readonly loaders = signal<Record<string, number>>({});\n readonly DEFAULT_TAG = 'default';\n\n // Global loading state\n readonly show: Signal<boolean> = computed(() => {\n const loaders = this.loaders();\n return Object.values(loaders).some((count) => count > 0);\n });\n\n // Get specific loader as a signal\n getLoader(name: string): Signal<boolean> {\n return computed(() => (this.loaders()[name] ?? 0) > 0);\n }\n\n increase(name: string = this.DEFAULT_TAG): void {\n this.loaders.update((loaders) => ({\n ...loaders,\n [name]: (loaders[name] ?? 0) + 1,\n }));\n }\n\n decrease(name: string = this.DEFAULT_TAG): void {\n this.loaders.update((loaders) => {\n const current = loaders[name] ?? 0;\n return { ...loaders, [name]: Math.max(0, current - 1) };\n });\n }\n}\n","import { Component, inject } from '@angular/core';\nimport { ConfirmDialog, ProgressbarComponent, ToastComponent } from '@flusys/ng-ui';\nimport { ApiLoaderService } from '../../services/api-loader.service';\n\n@Component({\n selector: 'lib-app-config',\n imports: [ConfirmDialog, ProgressbarComponent, ToastComponent],\n template: `\n @if (apiLoaderService.show()) {\n <f-progressbar mode=\"indeterminate\" />\n }\n <f-toast />\n <f-confirmdialog />\n `,\n styles: [\n `\n f-progressbar {\n position: fixed;\n }\n `,\n ],\n})\nexport class LibAppConfigComponent {\n readonly apiLoaderService = inject(ApiLoaderService);\n}\n","import { HttpEvent, HttpHandlerFn, HttpRequest } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { finalize } from 'rxjs/operators';\nimport { ApiLoaderService } from '../services/api-loader.service';\n\n/**\n * Interceptor that tracks loading state for HTTP requests.\n * Uses 'x-loader-tag' header to group related requests.\n *\n * @example\n * ```typescript\n * http.get('/api/users', {\n * headers: new HttpHeaders({ 'x-loader-tag': 'users-list' })\n * });\n * // In template: apiLoaderService.getLoader('users-list')\n * ```\n */\nexport function apiLoaderInterceptor(\n req: HttpRequest<unknown>,\n next: HttpHandlerFn,\n): Observable<HttpEvent<unknown>> {\n const loaderService = inject(ApiLoaderService);\n const loaderTag =\n req.headers.get('x-loader-tag') ?? loaderService.DEFAULT_TAG;\n\n loaderService.increase(loaderTag);\n\n const cleanReq = req.clone({\n headers: req.headers.delete('x-loader-tag'),\n });\n\n return next(cleanReq).pipe(finalize(() => loaderService.decrease(loaderTag)));\n}\n","import { InjectionToken } from '@angular/core';\n\nexport type PermissionMode = 'rbac' | 'direct' | 'full';\n\nexport type ServiceName =\n | 'auth'\n | 'administration'\n | 'iam'\n | 'storage'\n | 'formBuilder'\n | 'email'\n | 'eventManager'\n | 'notification'\n | 'localization'\n | 'taskManager'\n | 'aiAssistant'\n | 'entityBuilder';\n\nexport interface IServiceConfig {\n baseUrl: string;\n enabled: boolean;\n}\n\nexport interface IStorageServiceConfig extends IServiceConfig {\n /** Default storage config ID (falls back to company/branch default if not set) */\n defaultStorageConfigId?: string;\n}\n\nexport interface INotificationServiceConfig extends IServiceConfig {\n /** WebSocket URL (defaults to baseUrl if not set) */\n socketUrl?: string;\n}\n\nexport interface IAuthorConfig {\n name: string;\n url: string;\n}\n\nexport interface IRegistrationDefaults {\n companySlug?: string;\n branchSlug?: string;\n}\n\n/** Layout skin — shared services and components, different shell markup and styling. */\nexport type LayoutTheme = 'classic' | 'modern';\n\nexport interface LayoutConfig {\n preset?: string;\n primary?: string;\n surface?: string | null;\n darkTheme?: boolean;\n menuMode?: 'static' | 'overlay' | 'topbar';\n /** @default 'classic' */\n layoutTheme?: LayoutTheme;\n isMemorable?: boolean;\n}\n\nexport interface IAppConfig {\n appName: string;\n appLogo: string;\n author?: IAuthorConfig;\n apiBaseUrl: string;\n enableCompanyFeature: boolean;\n /** @default true */\n enableSignUp?: boolean;\n registrationDefaults?: IRegistrationDefaults;\n layoutConfig?: LayoutConfig;\n services: {\n auth: IServiceConfig;\n administration: IServiceConfig;\n iam: IServiceConfig;\n storage: IStorageServiceConfig;\n formBuilder: IServiceConfig;\n email: IServiceConfig;\n eventManager: IServiceConfig;\n notification?: INotificationServiceConfig;\n localization?: IServiceConfig;\n taskManager?: IServiceConfig;\n aiAssistant?: IServiceConfig;\n entityBuilder?: IServiceConfig;\n };\n multiTenant: {\n enabled: boolean;\n tenantHeader: string;\n tenantId?: string;\n };\n /** 'rbac' | 'direct' | 'full' (default: 'full') */\n permissionMode?: PermissionMode;\n}\n\nexport const APP_CONFIG = new InjectionToken<IAppConfig>('APP_CONFIG');\n\nexport function isServiceEnabled(\n config: IAppConfig,\n serviceName: ServiceName,\n): boolean {\n const service = config.services[serviceName as keyof typeof config.services];\n return service?.enabled ?? false;\n}\n\nexport function getServiceUrl(\n config: IAppConfig,\n serviceName: ServiceName,\n): string {\n if (isServiceEnabled(config, serviceName)) {\n const service =\n config.services[serviceName as keyof typeof config.services];\n return service?.baseUrl ?? config.apiBaseUrl;\n }\n return config.apiBaseUrl;\n}\n\nexport function isCompanyFeatureEnabled(config: IAppConfig): boolean {\n return config.enableCompanyFeature ?? false;\n}\n\nexport function getNotificationSocketUrl(config: IAppConfig): string | null {\n const service = config.services.notification;\n if (!service?.enabled) return null;\n return service.socketUrl ?? service.baseUrl;\n}\n\nexport function getPermissionMode(config: IAppConfig): PermissionMode {\n return config.permissionMode ?? 'full';\n}\n\nexport function getDefaultStorageConfigId(\n config: IAppConfig,\n): string | undefined {\n return config.services.storage?.defaultStorageConfigId;\n}\n\nexport function isSignUpEnabled(config: IAppConfig): boolean {\n return config.enableSignUp ?? true;\n}\n\nexport function getDefaultCompanySlug(config: IAppConfig): string | undefined {\n return config.registrationDefaults?.companySlug;\n}\n\nexport function getDefaultBranchSlug(config: IAppConfig): string | undefined {\n return config.registrationDefaults?.branchSlug;\n}\n\nexport const DEFAULT_APP_NAME = 'FLUSYS';\nexport const DEFAULT_AUTHOR: IAuthorConfig = {\n name: 'Flusys',\n url: 'https://flusys.vercel.app',\n};\n","import { InjectionToken, Signal } from '@angular/core';\nimport { Observable } from 'rxjs';\n\nexport interface ITranslateAdapter {\n /** Current language code signal - read this to create reactive dependency */\n translate(key: string, params?: Record<string, unknown>): string;\n}\n\n/** Registry for fallback messages when localization is not active */\nexport const FALLBACK_MESSAGES_REGISTRY = new InjectionToken<\n Record<string, string>\n>('FALLBACK_MESSAGES_REGISTRY');\n// ✅ Provide it once at root as a single shared object\nexport const provideFallbackMessagesRegistry = (\n initialFallbackMessages?: Record<string, string>,\n) => ({\n provide: FALLBACK_MESSAGES_REGISTRY,\n useValue: initialFallbackMessages || {}, // Single object instance shared across all injections\n});\n\n// Injection Token for localization services used in the resolver\nexport interface ILocalizationStateServicesAdapter {\n updateFallbackMessages(messages: Record<string, string>): void;\n currentLanguageCode: Signal<string>;\n isModuleLoaded(module: string): boolean;\n mergeTranslations(translations: Record<string, string>): void;\n markModuleLoaded(module: string): void;\n currentLanguage: Signal<string>;\n translations: Signal<Record<string, string>>;\n fallbackMessages: Signal<Record<string, string>>;\n}\nexport interface ILocalizationApiServicesAdapter {\n getTranslationsByLanguage(\n languageCode: string,\n modules: string[],\n ): Observable<unknown>;\n}\nexport const LOCALIZATION_STATE_SERVICE =\n new InjectionToken<ILocalizationStateServicesAdapter>(\n 'LOCALIZATION_STATE_SERVICE',\n );\nexport const LOCALIZATION_API_SERVICE =\n new InjectionToken<ILocalizationApiServicesAdapter>(\n 'LOCALIZATION_API_SERVICE',\n );\n","import { HttpClient } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport {\n APP_CONFIG,\n getServiceUrl,\n ServiceName,\n} from '../interfaces/app-config.interface';\n\n/**\n * Base API Service\n * Provides service-specific base URL resolution\n *\n * Note: This project uses POST-only RPC - all endpoints use POST, not REST verbs.\n *\n * Usage:\n * ```typescript\n * @Service()\n * export class MyService extends BaseApiService {\n * constructor() {\n * super('my-service'); // Service name from config\n * }\n *\n * getData() {\n * return this.http.post(`${this.baseUrl}/data/get`, {});\n * }\n * }\n * ```\n */\nexport abstract class BaseApiService {\n protected readonly http = inject(HttpClient);\n protected readonly appConfig = inject(APP_CONFIG);\n protected readonly baseUrl: string;\n\n /**\n * @param serviceName - Service name from config (e.g., 'auth', 'iam', 'storage')\n */\n constructor(serviceName: ServiceName) {\n this.baseUrl = getServiceUrl(this.appConfig, serviceName);\n }\n\n /**\n * Get full URL for an endpoint\n * @param endpoint - API endpoint (e.g., '/users/get-all')\n * @returns Full URL (e.g., 'http://localhost:2002/users/get-all')\n */\n protected getUrl(endpoint: string): string {\n // Remove leading slash if present to avoid double slashes\n const cleanEndpoint = endpoint.startsWith('/')\n ? endpoint.substring(1)\n : endpoint;\n return `${this.baseUrl}/${cleanEndpoint}`;\n }\n}\n","// Components\nexport * from './components/public-api';\n\n// Interceptors\nexport * from './interceptors/public-api';\n\n// Interfaces\nexport * from './interfaces/public-api';\n\n// Services\nexport * from './services/public-api';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"flusys-ng-core.mjs","names":[],"sources":["../../../projects/ng-core/services/api-loader.service.ts","../../../projects/ng-core/components/lib-app-config/lib-app-config.component.ts","../../../projects/ng-core/interceptors/api-loader.interceptor.ts","../../../projects/ng-core/interfaces/app-config.interface.ts","../../../projects/ng-core/interfaces/translate-adapter.interface.ts","../../../projects/ng-core/services/base-api.service.ts"],"sourcesContent":["import { computed, Signal, signal, Service } from '@angular/core';\n\n@Service()\nexport class ApiLoaderService {\n private readonly loaders = signal<Record<string, number>>({});\n readonly DEFAULT_TAG = 'default';\n\n // Global loading state\n readonly show: Signal<boolean> = computed(() => {\n const loaders = this.loaders();\n return Object.values(loaders).some((count) => count > 0);\n });\n\n // Get specific loader as a signal\n getLoader(name: string): Signal<boolean> {\n return computed(() => (this.loaders()[name] ?? 0) > 0);\n }\n\n increase(name: string = this.DEFAULT_TAG): void {\n this.loaders.update((loaders) => ({\n ...loaders,\n [name]: (loaders[name] ?? 0) + 1,\n }));\n }\n\n decrease(name: string = this.DEFAULT_TAG): void {\n this.loaders.update((loaders) => {\n const current = loaders[name] ?? 0;\n return { ...loaders, [name]: Math.max(0, current - 1) };\n });\n }\n}\n","import { Component, inject } from '@angular/core';\nimport { ConfirmDialog, ProgressbarComponent, ToastComponent } from '@flusys/ng-ui';\nimport { ApiLoaderService } from '../../services/api-loader.service';\n\n@Component({\n selector: 'lib-app-config',\n imports: [ConfirmDialog, ProgressbarComponent, ToastComponent],\n template: `\n @if (apiLoaderService.show()) {\n <f-progressbar mode=\"indeterminate\" />\n }\n <f-toast />\n <f-confirmdialog />\n `,\n styles: [\n `\n f-progressbar {\n position: fixed;\n }\n `,\n ],\n})\nexport class LibAppConfigComponent {\n readonly apiLoaderService = inject(ApiLoaderService);\n}\n","import { HttpEvent, HttpHandlerFn, HttpRequest } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { finalize } from 'rxjs/operators';\nimport { ApiLoaderService } from '../services/api-loader.service';\n\n/**\n * Interceptor that tracks loading state for HTTP requests.\n * Uses 'x-loader-tag' header to group related requests.\n *\n * @example\n * ```typescript\n * http.get('/api/users', {\n * headers: new HttpHeaders({ 'x-loader-tag': 'users-list' })\n * });\n * // In template: apiLoaderService.getLoader('users-list')\n * ```\n */\nexport function apiLoaderInterceptor(\n req: HttpRequest<unknown>,\n next: HttpHandlerFn,\n): Observable<HttpEvent<unknown>> {\n const loaderService = inject(ApiLoaderService);\n const loaderTag =\n req.headers.get('x-loader-tag') ?? loaderService.DEFAULT_TAG;\n\n loaderService.increase(loaderTag);\n\n const cleanReq = req.clone({\n headers: req.headers.delete('x-loader-tag'),\n });\n\n return next(cleanReq).pipe(finalize(() => loaderService.decrease(loaderTag)));\n}\n","import { InjectionToken } from '@angular/core';\n\nexport type PermissionMode = 'rbac' | 'direct' | 'full';\n\nexport type ServiceName =\n | 'auth'\n | 'administration'\n | 'iam'\n | 'storage'\n | 'formBuilder'\n | 'email'\n | 'eventManager'\n | 'notification'\n | 'localization'\n | 'taskManager'\n | 'aiAssistant'\n | 'entityBuilder';\n\nexport interface IServiceConfig {\n baseUrl: string;\n enabled: boolean;\n}\n\nexport interface IStorageServiceConfig extends IServiceConfig {\n /** Default storage config ID (falls back to company/branch default if not set) */\n defaultStorageConfigId?: string;\n}\n\nexport interface INotificationServiceConfig extends IServiceConfig {\n /** WebSocket URL (defaults to baseUrl if not set) */\n socketUrl?: string;\n}\n\nexport interface IAuthorConfig {\n name: string;\n url: string;\n}\n\nexport interface IRegistrationDefaults {\n companySlug?: string;\n branchSlug?: string;\n}\n\n/** Layout skin — shared services and components, different shell markup and styling. */\nexport type LayoutTheme = 'classic' | 'modern';\n\nexport interface LayoutConfig {\n preset?: string;\n primary?: string;\n surface?: string | null;\n darkTheme?: boolean;\n menuMode?: 'static' | 'overlay' | 'topbar';\n /** @default 'classic' */\n layoutTheme?: LayoutTheme;\n isMemorable?: boolean;\n}\n\nexport interface IAppConfig {\n appName: string;\n appLogo: string;\n author?: IAuthorConfig;\n apiBaseUrl: string;\n enableCompanyFeature: boolean;\n /** @default true */\n enableSignUp?: boolean;\n registrationDefaults?: IRegistrationDefaults;\n layoutConfig?: LayoutConfig;\n services: {\n auth: IServiceConfig;\n administration: IServiceConfig;\n iam: IServiceConfig;\n storage: IStorageServiceConfig;\n formBuilder: IServiceConfig;\n email: IServiceConfig;\n eventManager: IServiceConfig;\n notification?: INotificationServiceConfig;\n localization?: IServiceConfig;\n taskManager?: IServiceConfig;\n aiAssistant?: IServiceConfig;\n entityBuilder?: IServiceConfig;\n };\n multiTenant: {\n enabled: boolean;\n tenantHeader: string;\n tenantId?: string;\n };\n /** 'rbac' | 'direct' | 'full' (default: 'full') */\n permissionMode?: PermissionMode;\n}\n\nexport const APP_CONFIG = new InjectionToken<IAppConfig>('APP_CONFIG');\n\nexport function isServiceEnabled(\n config: IAppConfig,\n serviceName: ServiceName,\n): boolean {\n const service = config.services[serviceName as keyof typeof config.services];\n return service?.enabled ?? false;\n}\n\nexport function getServiceUrl(\n config: IAppConfig,\n serviceName: ServiceName,\n): string {\n if (isServiceEnabled(config, serviceName)) {\n const service =\n config.services[serviceName as keyof typeof config.services];\n return service?.baseUrl ?? config.apiBaseUrl;\n }\n return config.apiBaseUrl;\n}\n\nexport function isCompanyFeatureEnabled(config: IAppConfig): boolean {\n return config.enableCompanyFeature ?? false;\n}\n\nexport function getNotificationSocketUrl(config: IAppConfig): string | null {\n const service = config.services.notification;\n if (!service?.enabled) return null;\n return service.socketUrl ?? service.baseUrl;\n}\n\nexport function getPermissionMode(config: IAppConfig): PermissionMode {\n return config.permissionMode ?? 'full';\n}\n\nexport function getDefaultStorageConfigId(\n config: IAppConfig,\n): string | undefined {\n return config.services.storage?.defaultStorageConfigId;\n}\n\nexport function isSignUpEnabled(config: IAppConfig): boolean {\n return config.enableSignUp ?? true;\n}\n\nexport function getDefaultCompanySlug(config: IAppConfig): string | undefined {\n return config.registrationDefaults?.companySlug;\n}\n\nexport function getDefaultBranchSlug(config: IAppConfig): string | undefined {\n return config.registrationDefaults?.branchSlug;\n}\n\nexport const DEFAULT_APP_NAME = 'FLUSYS';\nexport const DEFAULT_AUTHOR: IAuthorConfig = {\n name: 'Flusys',\n url: 'https://flusys.vercel.app',\n};\n","import { InjectionToken, Signal } from '@angular/core';\nimport { Observable } from 'rxjs';\n\nexport interface ITranslateAdapter {\n /** Current language code signal - read this to create reactive dependency */\n translate(key: string, params?: Record<string, unknown>): string;\n}\n\n/** Registry for fallback messages when localization is not active */\nexport const FALLBACK_MESSAGES_REGISTRY = new InjectionToken<\n Record<string, string>\n>('FALLBACK_MESSAGES_REGISTRY');\n// ✅ Provide it once at root as a single shared object\nexport const provideFallbackMessagesRegistry = (\n initialFallbackMessages?: Record<string, string>,\n) => ({\n provide: FALLBACK_MESSAGES_REGISTRY,\n useValue: initialFallbackMessages || {}, // Single object instance shared across all injections\n});\n\n// Injection Token for localization services used in the resolver\nexport interface ILocalizationStateServicesAdapter {\n updateFallbackMessages(messages: Record<string, string>): void;\n currentLanguageCode: Signal<string>;\n isModuleLoaded(module: string): boolean;\n mergeTranslations(translations: Record<string, string>): void;\n markModuleLoaded(module: string): void;\n currentLanguage: Signal<string>;\n translations: Signal<Record<string, string>>;\n fallbackMessages: Signal<Record<string, string>>;\n}\nexport interface ILocalizationApiServicesAdapter {\n getTranslationsByLanguage(\n languageCode: string,\n modules: string[],\n ): Observable<unknown>;\n}\nexport const LOCALIZATION_STATE_SERVICE =\n new InjectionToken<ILocalizationStateServicesAdapter>(\n 'LOCALIZATION_STATE_SERVICE',\n );\nexport const LOCALIZATION_API_SERVICE =\n new InjectionToken<ILocalizationApiServicesAdapter>(\n 'LOCALIZATION_API_SERVICE',\n );\n","import { HttpClient } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport {\n APP_CONFIG,\n getServiceUrl,\n ServiceName,\n} from '../interfaces/app-config.interface';\n\n/**\n * Base API Service\n * Provides service-specific base URL resolution\n *\n * Note: This project uses POST-only RPC - all endpoints use POST, not REST verbs.\n *\n * Usage:\n * ```typescript\n * @Service()\n * export class MyService extends BaseApiService {\n * constructor() {\n * super('my-service'); // Service name from config\n * }\n *\n * getData() {\n * return this.http.post(`${this.baseUrl}/data/get`, {});\n * }\n * }\n * ```\n */\nexport abstract class BaseApiService {\n protected readonly http = inject(HttpClient);\n protected readonly appConfig = inject(APP_CONFIG);\n protected readonly baseUrl: string;\n\n /**\n * @param serviceName - Service name from config (e.g., 'auth', 'iam', 'storage')\n */\n constructor(serviceName: ServiceName) {\n this.baseUrl = getServiceUrl(this.appConfig, serviceName);\n }\n\n /**\n * Get full URL for an endpoint\n * @param endpoint - API endpoint (e.g., '/users/get-all')\n * @returns Full URL (e.g., 'http://localhost:2002/users/get-all')\n */\n protected getUrl(endpoint: string): string {\n // Remove leading slash if present to avoid double slashes\n const cleanEndpoint = endpoint.startsWith('/')\n ? endpoint.substring(1)\n : endpoint;\n return `${this.baseUrl}/${cleanEndpoint}`;\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@flusys/ng-core",
3
- "version": "9.1.0",
3
+ "version": "9.1.2",
4
4
  "description": "Core utilities and services for FLUSYS Angular packages",
5
5
  "license": "MIT",
6
6
  "peerDependencies": {
7
7
  "@angular/common": ">=22.0.0",
8
8
  "@angular/core": ">=22.0.0",
9
- "@flusys/ng-ui": ">=9.1.0",
9
+ "@flusys/ng-ui": ">=9.1.2",
10
10
  "rxjs": "^7.8.0"
11
11
  },
12
12
  "sideEffects": false,
@@ -1,26 +1,22 @@
1
- import * as i0 from '@angular/core';
2
- import { Signal, InjectionToken } from '@angular/core';
3
- import { HttpRequest, HttpHandlerFn, HttpEvent, HttpClient } from '@angular/common/http';
4
- import { Observable } from 'rxjs';
5
- import * as _flusys_ng_core from '@flusys/ng-core';
6
-
7
- declare class ApiLoaderService {
8
- private readonly loaders;
9
- readonly DEFAULT_TAG = "default";
10
- readonly show: Signal<boolean>;
11
- getLoader(name: string): Signal<boolean>;
12
- increase(name?: string): void;
13
- decrease(name?: string): void;
14
- static ɵfac: i0.ɵɵFactoryDeclaration<ApiLoaderService, never>;
15
- static ɵprov: i0.ɵɵInjectableDeclaration<ApiLoaderService>;
1
+ import * as i0 from "@angular/core";
2
+ import { InjectionToken, Signal } from "@angular/core";
3
+ import { HttpClient, HttpEvent, HttpHandlerFn, HttpRequest } from "@angular/common/http";
4
+ import { Observable } from "rxjs";
5
+ export declare class ApiLoaderService {
6
+ private readonly loaders;
7
+ readonly DEFAULT_TAG = "default";
8
+ readonly show: Signal<boolean>;
9
+ getLoader(name: string): Signal<boolean>;
10
+ increase(name?: string): void;
11
+ decrease(name?: string): void;
12
+ static ɵfac: i0.ɵɵFactoryDeclaration<ApiLoaderService, never>;
13
+ static ɵprov: i0.ɵɵInjectableDeclaration<any>;
16
14
  }
17
-
18
- declare class LibAppConfigComponent {
19
- readonly apiLoaderService: ApiLoaderService;
20
- static ɵfac: i0.ɵɵFactoryDeclaration<LibAppConfigComponent, never>;
21
- static ɵcmp: i0.ɵɵComponentDeclaration<LibAppConfigComponent, "lib-app-config", never, {}, {}, never, never, true, never>;
15
+ export declare class LibAppConfigComponent {
16
+ readonly apiLoaderService: ApiLoaderService;
17
+ static ɵfac: i0.ɵɵFactoryDeclaration<LibAppConfigComponent, never>;
18
+ static ɵcmp: i0.ɵɵComponentDeclaration<LibAppConfigComponent, "lib-app-config", never, {}, {}, never, never, true, never>;
22
19
  }
23
-
24
20
  /**
25
21
  * Interceptor that tracks loading state for HTTP requests.
26
22
  * Uses 'x-loader-tag' header to group related requests.
@@ -33,113 +29,110 @@ declare class LibAppConfigComponent {
33
29
  * // In template: apiLoaderService.getLoader('users-list')
34
30
  * ```
35
31
  */
36
- declare function apiLoaderInterceptor(req: HttpRequest<unknown>, next: HttpHandlerFn): Observable<HttpEvent<unknown>>;
37
-
38
- type PermissionMode = 'rbac' | 'direct' | 'full';
39
- type ServiceName = 'auth' | 'administration' | 'iam' | 'storage' | 'formBuilder' | 'email' | 'eventManager' | 'notification' | 'localization' | 'taskManager' | 'aiAssistant' | 'entityBuilder';
40
- interface IServiceConfig {
41
- baseUrl: string;
42
- enabled: boolean;
32
+ export declare function apiLoaderInterceptor(req: HttpRequest<unknown>, next: HttpHandlerFn): Observable<HttpEvent<unknown>>;
33
+ export type PermissionMode = 'rbac' | 'direct' | 'full';
34
+ export type ServiceName = 'auth' | 'administration' | 'iam' | 'storage' | 'formBuilder' | 'email' | 'eventManager' | 'notification' | 'localization' | 'taskManager' | 'aiAssistant' | 'entityBuilder';
35
+ export interface IServiceConfig {
36
+ baseUrl: string;
37
+ enabled: boolean;
43
38
  }
44
- interface IStorageServiceConfig extends IServiceConfig {
45
- /** Default storage config ID (falls back to company/branch default if not set) */
46
- defaultStorageConfigId?: string;
39
+ export interface IStorageServiceConfig extends IServiceConfig {
40
+ /** Default storage config ID (falls back to company/branch default if not set) */
41
+ defaultStorageConfigId?: string;
47
42
  }
48
- interface INotificationServiceConfig extends IServiceConfig {
49
- /** WebSocket URL (defaults to baseUrl if not set) */
50
- socketUrl?: string;
43
+ export interface INotificationServiceConfig extends IServiceConfig {
44
+ /** WebSocket URL (defaults to baseUrl if not set) */
45
+ socketUrl?: string;
51
46
  }
52
- interface IAuthorConfig {
53
- name: string;
54
- url: string;
47
+ export interface IAuthorConfig {
48
+ name: string;
49
+ url: string;
55
50
  }
56
- interface IRegistrationDefaults {
57
- companySlug?: string;
58
- branchSlug?: string;
51
+ export interface IRegistrationDefaults {
52
+ companySlug?: string;
53
+ branchSlug?: string;
59
54
  }
60
55
  /** Layout skin — shared services and components, different shell markup and styling. */
61
- type LayoutTheme = 'classic' | 'modern';
62
- interface LayoutConfig {
63
- preset?: string;
64
- primary?: string;
65
- surface?: string | null;
66
- darkTheme?: boolean;
67
- menuMode?: 'static' | 'overlay' | 'topbar';
68
- /** @default 'classic' */
69
- layoutTheme?: LayoutTheme;
70
- isMemorable?: boolean;
56
+ export type LayoutTheme = 'classic' | 'modern';
57
+ export interface LayoutConfig {
58
+ preset?: string;
59
+ primary?: string;
60
+ surface?: string | null;
61
+ darkTheme?: boolean;
62
+ menuMode?: 'static' | 'overlay' | 'topbar';
63
+ /** @default 'classic' */
64
+ layoutTheme?: LayoutTheme;
65
+ isMemorable?: boolean;
71
66
  }
72
- interface IAppConfig {
73
- appName: string;
74
- appLogo: string;
75
- author?: IAuthorConfig;
76
- apiBaseUrl: string;
77
- enableCompanyFeature: boolean;
78
- /** @default true */
79
- enableSignUp?: boolean;
80
- registrationDefaults?: IRegistrationDefaults;
81
- layoutConfig?: LayoutConfig;
82
- services: {
83
- auth: IServiceConfig;
84
- administration: IServiceConfig;
85
- iam: IServiceConfig;
86
- storage: IStorageServiceConfig;
87
- formBuilder: IServiceConfig;
88
- email: IServiceConfig;
89
- eventManager: IServiceConfig;
90
- notification?: INotificationServiceConfig;
91
- localization?: IServiceConfig;
92
- taskManager?: IServiceConfig;
93
- aiAssistant?: IServiceConfig;
94
- entityBuilder?: IServiceConfig;
95
- };
96
- multiTenant: {
97
- enabled: boolean;
98
- tenantHeader: string;
99
- tenantId?: string;
100
- };
101
- /** 'rbac' | 'direct' | 'full' (default: 'full') */
102
- permissionMode?: PermissionMode;
67
+ export interface IAppConfig {
68
+ appName: string;
69
+ appLogo: string;
70
+ author?: IAuthorConfig;
71
+ apiBaseUrl: string;
72
+ enableCompanyFeature: boolean;
73
+ /** @default true */
74
+ enableSignUp?: boolean;
75
+ registrationDefaults?: IRegistrationDefaults;
76
+ layoutConfig?: LayoutConfig;
77
+ services: {
78
+ auth: IServiceConfig;
79
+ administration: IServiceConfig;
80
+ iam: IServiceConfig;
81
+ storage: IStorageServiceConfig;
82
+ formBuilder: IServiceConfig;
83
+ email: IServiceConfig;
84
+ eventManager: IServiceConfig;
85
+ notification?: INotificationServiceConfig;
86
+ localization?: IServiceConfig;
87
+ taskManager?: IServiceConfig;
88
+ aiAssistant?: IServiceConfig;
89
+ entityBuilder?: IServiceConfig;
90
+ };
91
+ multiTenant: {
92
+ enabled: boolean;
93
+ tenantHeader: string;
94
+ tenantId?: string;
95
+ };
96
+ /** 'rbac' | 'direct' | 'full' (default: 'full') */
97
+ permissionMode?: PermissionMode;
103
98
  }
104
- declare const APP_CONFIG: InjectionToken<IAppConfig>;
105
- declare function isServiceEnabled(config: IAppConfig, serviceName: ServiceName): boolean;
106
- declare function getServiceUrl(config: IAppConfig, serviceName: ServiceName): string;
107
- declare function isCompanyFeatureEnabled(config: IAppConfig): boolean;
108
- declare function getNotificationSocketUrl(config: IAppConfig): string | null;
109
- declare function getPermissionMode(config: IAppConfig): PermissionMode;
110
- declare function getDefaultStorageConfigId(config: IAppConfig): string | undefined;
111
- declare function isSignUpEnabled(config: IAppConfig): boolean;
112
- declare function getDefaultCompanySlug(config: IAppConfig): string | undefined;
113
- declare function getDefaultBranchSlug(config: IAppConfig): string | undefined;
114
- declare const DEFAULT_APP_NAME = "FLUSYS";
115
- declare const DEFAULT_AUTHOR: IAuthorConfig;
116
-
117
- interface ITranslateAdapter {
118
- /** Current language code signal - read this to create reactive dependency */
119
- translate(key: string, params?: Record<string, unknown>): string;
99
+ export declare const APP_CONFIG: InjectionToken<IAppConfig>;
100
+ export declare function isServiceEnabled(config: IAppConfig, serviceName: ServiceName): boolean;
101
+ export declare function getServiceUrl(config: IAppConfig, serviceName: ServiceName): string;
102
+ export declare function isCompanyFeatureEnabled(config: IAppConfig): boolean;
103
+ export declare function getNotificationSocketUrl(config: IAppConfig): string | null;
104
+ export declare function getPermissionMode(config: IAppConfig): PermissionMode;
105
+ export declare function getDefaultStorageConfigId(config: IAppConfig): string | undefined;
106
+ export declare function isSignUpEnabled(config: IAppConfig): boolean;
107
+ export declare function getDefaultCompanySlug(config: IAppConfig): string | undefined;
108
+ export declare function getDefaultBranchSlug(config: IAppConfig): string | undefined;
109
+ export declare const DEFAULT_APP_NAME = "FLUSYS";
110
+ export declare const DEFAULT_AUTHOR: IAuthorConfig;
111
+ export interface ITranslateAdapter {
112
+ /** Current language code signal - read this to create reactive dependency */
113
+ translate(key: string, params?: Record<string, unknown>): string;
120
114
  }
121
115
  /** Registry for fallback messages when localization is not active */
122
- declare const FALLBACK_MESSAGES_REGISTRY: InjectionToken<Record<string, string>>;
123
- declare const provideFallbackMessagesRegistry: (initialFallbackMessages?: Record<string, string>) => {
124
- provide: InjectionToken<Record<string, string>>;
125
- useValue: Record<string, string>;
116
+ export declare const FALLBACK_MESSAGES_REGISTRY: InjectionToken<Record<string, string>>;
117
+ export declare const provideFallbackMessagesRegistry: (initialFallbackMessages?: Record<string, string>) => {
118
+ provide: InjectionToken<Record<string, string>>;
119
+ useValue: Record<string, string>;
126
120
  };
127
- interface ILocalizationStateServicesAdapter {
128
- updateFallbackMessages(messages: Record<string, string>): void;
129
- currentLanguageCode: Signal<string>;
130
- isModuleLoaded(module: string): boolean;
131
- mergeTranslations(translations: Record<string, string>): void;
132
- markModuleLoaded(module: string): void;
133
- currentLanguage: Signal<string>;
134
- translations: Signal<Record<string, string>>;
135
- fallbackMessages: Signal<Record<string, string>>;
121
+ export interface ILocalizationStateServicesAdapter {
122
+ updateFallbackMessages(messages: Record<string, string>): void;
123
+ currentLanguageCode: Signal<string>;
124
+ isModuleLoaded(module: string): boolean;
125
+ mergeTranslations(translations: Record<string, string>): void;
126
+ markModuleLoaded(module: string): void;
127
+ currentLanguage: Signal<string>;
128
+ translations: Signal<Record<string, string>>;
129
+ fallbackMessages: Signal<Record<string, string>>;
136
130
  }
137
- interface ILocalizationApiServicesAdapter {
138
- getTranslationsByLanguage(languageCode: string, modules: string[]): Observable<unknown>;
131
+ export interface ILocalizationApiServicesAdapter {
132
+ getTranslationsByLanguage(languageCode: string, modules: string[]): Observable<unknown>;
139
133
  }
140
- declare const LOCALIZATION_STATE_SERVICE: InjectionToken<ILocalizationStateServicesAdapter>;
141
- declare const LOCALIZATION_API_SERVICE: InjectionToken<ILocalizationApiServicesAdapter>;
142
-
134
+ export declare const LOCALIZATION_STATE_SERVICE: InjectionToken<ILocalizationStateServicesAdapter>;
135
+ export declare const LOCALIZATION_API_SERVICE: InjectionToken<ILocalizationApiServicesAdapter>;
143
136
  /**
144
137
  * Base API Service
145
138
  * Provides service-specific base URL resolution
@@ -160,21 +153,18 @@ declare const LOCALIZATION_API_SERVICE: InjectionToken<ILocalizationApiServicesA
160
153
  * }
161
154
  * ```
162
155
  */
163
- declare abstract class BaseApiService {
164
- protected readonly http: HttpClient;
165
- protected readonly appConfig: _flusys_ng_core.IAppConfig;
166
- protected readonly baseUrl: string;
167
- /**
168
- * @param serviceName - Service name from config (e.g., 'auth', 'iam', 'storage')
169
- */
170
- constructor(serviceName: ServiceName);
171
- /**
172
- * Get full URL for an endpoint
173
- * @param endpoint - API endpoint (e.g., '/users/get-all')
174
- * @returns Full URL (e.g., 'http://localhost:2002/users/get-all')
175
- */
176
- protected getUrl(endpoint: string): string;
177
- }
178
-
179
- export { APP_CONFIG, ApiLoaderService, BaseApiService, DEFAULT_APP_NAME, DEFAULT_AUTHOR, FALLBACK_MESSAGES_REGISTRY, LOCALIZATION_API_SERVICE, LOCALIZATION_STATE_SERVICE, LibAppConfigComponent, apiLoaderInterceptor, getDefaultBranchSlug, getDefaultCompanySlug, getDefaultStorageConfigId, getNotificationSocketUrl, getPermissionMode, getServiceUrl, isCompanyFeatureEnabled, isServiceEnabled, isSignUpEnabled, provideFallbackMessagesRegistry };
180
- export type { IAppConfig, IAuthorConfig, ILocalizationApiServicesAdapter, ILocalizationStateServicesAdapter, INotificationServiceConfig, IRegistrationDefaults, IServiceConfig, IStorageServiceConfig, ITranslateAdapter, LayoutConfig, LayoutTheme, PermissionMode, ServiceName };
156
+ export declare abstract class BaseApiService {
157
+ protected readonly http: HttpClient;
158
+ protected readonly appConfig: import("@flusys/ng-core").IAppConfig;
159
+ protected readonly baseUrl: string;
160
+ /**
161
+ * @param serviceName - Service name from config (e.g., 'auth', 'iam', 'storage')
162
+ */
163
+ constructor(serviceName: ServiceName);
164
+ /**
165
+ * Get full URL for an endpoint
166
+ * @param endpoint - API endpoint (e.g., '/users/get-all')
167
+ * @returns Full URL (e.g., 'http://localhost:2002/users/get-all')
168
+ */
169
+ protected getUrl(endpoint: string): string;
170
+ }