@praxisui/settings-panel 1.0.0-beta.5 → 1.0.0-beta.52

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/index.d.ts CHANGED
@@ -1,17 +1,20 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Type, Injector, ComponentRef, ChangeDetectorRef, InjectionToken, OnInit, ViewContainerRef } from '@angular/core';
2
+ import { Type, Injector, ComponentRef, ChangeDetectorRef, InjectionToken, OnInit, AfterViewInit, ViewContainerRef } from '@angular/core';
3
3
  import { OverlayRef, Overlay } from '@angular/cdk/overlay';
4
4
  import * as rxjs from 'rxjs';
5
5
  import { Observable, BehaviorSubject } from 'rxjs';
6
6
  import { MatDialog } from '@angular/material/dialog';
7
- import { GlobalConfig, FormConfig, FormValueChangeEvent } from '@praxisui/core';
7
+ import { GlobalConfig, FormConfig, FormValueChangeEvent, AiCapabilityCategory, AiValueKind, AiCapability, AiCapabilityCatalog } from '@praxisui/core';
8
8
  import { MatSnackBar } from '@angular/material/snack-bar';
9
+ import { AiProviderCatalogItem } from '@praxisui/ai';
9
10
 
10
11
  interface SettingsPanelConfig {
11
12
  id: string;
12
13
  title: string;
13
14
  /** Optional Material icon name to display in header before the title */
14
15
  titleIcon?: string;
16
+ /** Optional initial expanded state */
17
+ expanded?: boolean;
15
18
  content: {
16
19
  component: Type<any>;
17
20
  inputs?: Record<string, any>;
@@ -152,9 +155,12 @@ declare class SettingsPanelComponent {
152
155
  isDirty: boolean;
153
156
  isValid: boolean;
154
157
  isBusy: boolean;
158
+ private lastSavedAt;
155
159
  get canApply(): boolean;
156
160
  get canSave(): boolean;
157
161
  get disabledReason(): string;
162
+ get statusTone(): 'busy' | 'dirty' | 'saved' | 'idle';
163
+ get statusMessage(): string;
158
164
  private readonly destroyRef;
159
165
  private contentHost;
160
166
  constructor(cdr: ChangeDetectorRef, dialog: MatDialog);
@@ -162,6 +168,8 @@ declare class SettingsPanelComponent {
162
168
  onReset(): void;
163
169
  onApply(): void;
164
170
  onSave(): void;
171
+ private emitSave;
172
+ private formatClock;
165
173
  toggleExpand(): void;
166
174
  onCancel(): void;
167
175
  handleKeydown(event: KeyboardEvent): void;
@@ -181,7 +189,11 @@ declare class GlobalConfigAdminService {
181
189
  /** Returns the effective merged configuration (providers + storage). */
182
190
  getEffectiveConfig(): GlobalConfig;
183
191
  /** Persist a partial update and notify listeners. */
184
- save(partial: Partial<GlobalConfig>): void;
192
+ save(partial: Partial<GlobalConfig>): Promise<void>;
193
+ /** True when a tenant/global config exists in storage (overrides env defaults). */
194
+ hasStoredConfig(): Promise<boolean>;
195
+ /** Clear stored config for the active tenant and refresh the cache. */
196
+ clearStoredConfig(): Promise<void>;
185
197
  static ɵfac: i0.ɵɵFactoryDeclaration<GlobalConfigAdminService, never>;
186
198
  static ɵprov: i0.ɵɵInjectableDeclaration<GlobalConfigAdminService>;
187
199
  }
@@ -218,7 +230,7 @@ interface GlobalConfigEditorFieldSpec {
218
230
  */
219
231
  declare function buildGlobalConfigFormConfig(): FormConfig;
220
232
 
221
- declare class GlobalConfigEditorComponent implements OnInit {
233
+ declare class GlobalConfigEditorComponent implements OnInit, AfterViewInit {
222
234
  private admin;
223
235
  private snack;
224
236
  formConfig: FormConfig;
@@ -232,20 +244,96 @@ declare class GlobalConfigEditorComponent implements OnInit {
232
244
  readonly isBusy$: BehaviorSubject<boolean>;
233
245
  hostCrud: ViewContainerRef;
234
246
  hostFields: ViewContainerRef;
247
+ hostCache: ViewContainerRef;
235
248
  hostTable: ViewContainerRef;
236
249
  hostDialog: ViewContainerRef;
250
+ hostAiCredentials: ViewContainerRef;
251
+ hostAiModel: ViewContainerRef;
252
+ hostAiEmbedding: ViewContainerRef;
237
253
  private readonly destroyRef;
238
254
  private readonly iconPicker;
255
+ private readonly aiApi;
256
+ private readonly cdr;
257
+ private readonly logger;
258
+ private readonly logContext;
259
+ private readonly providedDynamicFormCtor;
260
+ private dynamicFormCtor;
261
+ private loggedMissingDynamicForm;
239
262
  private dialogFormInst;
263
+ private aiModelFormRef;
264
+ private aiEmbeddingFormRef;
265
+ private pendingModelOptions;
266
+ private readonly embeddingModelOptions;
267
+ private componentRefs;
240
268
  readonly dialogVariantKeys: readonly ["danger", "info", "success", "question", "error"];
269
+ isTestingAi: boolean;
270
+ isRefetchingModels: boolean;
271
+ isClearingGlobalConfig: boolean;
272
+ aiTestResult: {
273
+ success: boolean;
274
+ message: string;
275
+ } | null;
276
+ private availableModels;
277
+ providers: AiProviderCatalogItem[];
278
+ selectedProvider: AiProviderCatalogItem | null;
279
+ apiKeyLast4: string | null;
280
+ hasStoredApiKey: boolean;
281
+ hasStoredGlobalConfig: boolean;
282
+ configSourceLabel: string;
283
+ private apiKeyChanged$;
284
+ hasApiKey: boolean;
285
+ selectedModelDetails: string;
286
+ get hasCurrentApiKey(): boolean;
287
+ get apiKeyStatusLabel(): string;
241
288
  constructor(admin: GlobalConfigAdminService, snack: MatSnackBar);
242
- ngOnInit(): void;
289
+ ngOnInit(): Promise<void>;
290
+ ngAfterViewInit(): void;
243
291
  onValueChange(sectionId: string, ev: FormValueChangeEvent): void;
244
- private hasBootstrappedAll;
292
+ private buildSectionConfig;
293
+ private bootstrapDynamicForms;
294
+ private ensureAiModelForm;
295
+ private loadProviderCatalog;
296
+ private buildFallbackProviders;
297
+ private applyProviderOptions;
298
+ private applyEmbeddingProviderOptions;
299
+ private setProviderFieldOptions;
300
+ private setEmbeddingProviderFieldOptions;
301
+ private resolveDefaultProvider;
302
+ private setFieldDefaultValue;
303
+ private updateSelectedProvider;
304
+ private updateApiKeyState;
305
+ get embeddingUseSameAsLlm(): boolean;
306
+ get embeddingDimensionMismatch(): boolean;
307
+ get canUseLlmForEmbeddings(): boolean;
308
+ private canAutoRefreshModels;
309
+ private ensureDefaultModelSelection;
310
+ private clearModelSelection;
311
+ private findProvider;
312
+ private setModelFieldOptions;
313
+ private applyConfigSnapshot;
314
+ private patchFormsWithValues;
315
+ private refreshAiStateAfterConfig;
316
+ private refreshStoredConfigState;
317
+ clearStoredConfig(): Promise<void>;
318
+ private syncEmbeddingDefaults;
319
+ private ensureEmbeddingModelDefaults;
320
+ private ensureEmbeddingDimensionsDefaults;
321
+ useLlmForEmbeddings(): void;
322
+ private createAiModelForm;
323
+ private setEmbeddingValue;
324
+ private recreateAiModelForm;
325
+ private updateModelDetails;
245
326
  reset(): void;
246
327
  getSettingsValue(): any;
247
- onSave(): any;
328
+ onSave(): Promise<any>;
329
+ refreshModels(force?: boolean, silent?: boolean): Promise<void>;
330
+ private applyModelOptions;
331
+ testAiConnection(): Promise<void>;
332
+ private buildLogOptions;
248
333
  private safeName;
334
+ private buildChangedValues;
335
+ private shouldIncludeField;
336
+ private resolveSaveErrorMessage;
249
337
  getVariantIcon(key: string): string | undefined;
250
338
  pickVariantIcon(key: string): Promise<void>;
251
339
  clearVariantIcon(key: string): void;
@@ -259,6 +347,14 @@ declare class GlobalConfigEditorComponent implements OnInit {
259
347
  static ɵcmp: i0.ɵɵComponentDeclaration<GlobalConfigEditorComponent, "praxis-global-config-editor", never, {}, {}, never, never, true, never>;
260
348
  }
261
349
 
350
+ /**
351
+ * Optional token used by GlobalConfigEditorComponent to render forms.
352
+ * Provide the PraxisDynamicForm component (or a compatible dynamic form)
353
+ * to avoid creating a hard dependency from @praxisui/settings-panel to
354
+ * @praxisui/dynamic-form.
355
+ */
356
+ declare const GLOBAL_CONFIG_DYNAMIC_FORM_COMPONENT: InjectionToken<Type<any> | null>;
357
+
262
358
  type OpenGlobalConfigOptions = {
263
359
  id?: string;
264
360
  title?: string;
@@ -271,5 +367,24 @@ type OpenGlobalConfigOptions = {
271
367
  */
272
368
  declare function openGlobalConfigEditor(settings: SettingsPanelService, opts?: OpenGlobalConfigOptions): void;
273
369
 
274
- export { GlobalConfigAdminService, GlobalConfigEditorComponent, SETTINGS_PANEL_DATA, SETTINGS_PANEL_REF, SettingsPanelComponent, SettingsPanelRef, SettingsPanelService, buildGlobalConfigFormConfig, openGlobalConfigEditor };
275
- export type { GlobalConfigEditorFieldSpec, GlobalConfigEditorGroup, GlobalConfigEditorOption, GlobalConfigEditorState, OpenGlobalConfigOptions, SettingsPanelAction, SettingsPanelCloseReason, SettingsPanelConfig, SettingsValueProvider };
370
+ /**
371
+ * Capabilities catalog for SettingsPanelConfig.
372
+ */
373
+
374
+ declare module '@praxisui/core' {
375
+ interface AiCapabilityCategoryMap {
376
+ content: true;
377
+ }
378
+ }
379
+ type CapabilityCategory = AiCapabilityCategory;
380
+ type ValueKind = AiValueKind;
381
+ interface Capability extends AiCapability {
382
+ category: CapabilityCategory;
383
+ }
384
+ interface CapabilityCatalog extends AiCapabilityCatalog {
385
+ capabilities: Capability[];
386
+ }
387
+ declare const SETTINGS_PANEL_AI_CAPABILITIES: CapabilityCatalog;
388
+
389
+ export { GLOBAL_CONFIG_DYNAMIC_FORM_COMPONENT, GlobalConfigAdminService, GlobalConfigEditorComponent, SETTINGS_PANEL_AI_CAPABILITIES, SETTINGS_PANEL_DATA, SETTINGS_PANEL_REF, SettingsPanelComponent, SettingsPanelRef, SettingsPanelService, buildGlobalConfigFormConfig, openGlobalConfigEditor };
390
+ export type { Capability, CapabilityCatalog, CapabilityCategory, GlobalConfigEditorFieldSpec, GlobalConfigEditorGroup, GlobalConfigEditorOption, GlobalConfigEditorState, OpenGlobalConfigOptions, SettingsPanelAction, SettingsPanelCloseReason, SettingsPanelConfig, SettingsValueProvider, ValueKind };
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@praxisui/settings-panel",
3
- "version": "1.0.0-beta.5",
3
+ "version": "1.0.0-beta.52",
4
4
  "description": "Settings panel for Praxis UI libraries: open editors for configuration at runtime and persist settings.",
5
5
  "peerDependencies": {
6
6
  "@angular/common": "^20.0.0",
7
7
  "@angular/core": "^20.0.0",
8
8
  "@angular/cdk": "^20.0.0",
9
9
  "@angular/material": "^20.0.0",
10
- "@praxisui/dynamic-fields": "^1.0.0-beta.5"
10
+ "@praxisui/dynamic-fields": "^1.0.0-beta.52"
11
11
  },
12
12
  "dependencies": {
13
13
  "tslib": "^2.3.0"
@@ -18,11 +18,11 @@
18
18
  },
19
19
  "repository": {
20
20
  "type": "git",
21
- "url": "https://github.com/codexrodrigues/praxis"
21
+ "url": "https://github.com/codexrodrigues/praxis-ui-angular"
22
22
  },
23
- "homepage": "https://github.com/codexrodrigues/praxis#readme",
23
+ "homepage": "https://github.com/codexrodrigues/praxis-ui-angular#readme",
24
24
  "bugs": {
25
- "url": "https://github.com/codexrodrigues/praxis/issues"
25
+ "url": "https://github.com/codexrodrigues/praxis-ui-angular/issues"
26
26
  },
27
27
  "keywords": [
28
28
  "angular",