ngx-dev-toolbar 2.0.0 → 2.0.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.
package/index.d.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  export * from './components/icons/icon.component';
2
2
  export * from './components/icons/icon.models';
3
+ export * from './components/list/list.component';
4
+ export * from './components/list-item/list-item.component';
3
5
  export * from './components/toolbar-tool/toolbar-tool.component';
4
6
  export * from './components/toolbar-tool/toolbar-tool.models';
5
7
  export * from './dev-toolbar.component';
@@ -14,4 +14,26 @@ export interface DevToolsService<OptionType> {
14
14
  * @returns Observable of forced values array
15
15
  */
16
16
  getForcedValues(): Observable<OptionType[]>;
17
+ /**
18
+ * Gets ALL option values with overrides already applied.
19
+ * Returns the complete set of options where overridden values replace base values.
20
+ * Each option includes an `isForced` property indicating if it was overridden.
21
+ *
22
+ * This method simplifies integration by eliminating the need to manually merge
23
+ * base values with overrides using combineLatest.
24
+ *
25
+ * @returns Observable of all values with overrides applied
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * // Simple integration - no manual merging needed
30
+ * this.devToolbarService.getValues().pipe(
31
+ * map(values => values.find(v => v.id === targetId)),
32
+ * map(value => value?.isEnabled ?? defaultValue)
33
+ * ).subscribe(finalValue => {
34
+ * // Use the final value
35
+ * });
36
+ * ```
37
+ */
38
+ getValues(): Observable<OptionType[]>;
17
39
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-dev-toolbar",
3
- "version": "2.0.0",
3
+ "version": "2.0.2",
4
4
  "keywords": [
5
5
  "devtools",
6
6
  "development-toolbar",
@@ -39,7 +39,7 @@ export declare class DevToolbarAppFeaturesToolComponent {
39
39
  onFilterChange(value: string | undefined): void;
40
40
  /**
41
41
  * Handle feature value change from 3-state dropdown.
42
- * - 'not-forced' (empty string): Remove forced override
42
+ * - 'not-forced': Remove forced override
43
43
  * - 'on': Force feature to enabled
44
44
  * - 'off': Force feature to disabled
45
45
  */
@@ -42,6 +42,11 @@ export interface DevToolbarAppFeature {
42
42
  * - false: State reflects the natural application configuration
43
43
  */
44
44
  isForced: boolean;
45
+ /**
46
+ * Original value before forcing (only present when isForced is true)
47
+ * Used to display what the feature's state was before being overridden
48
+ */
49
+ originalValue?: boolean;
45
50
  }
46
51
  /**
47
52
  * Filter options for displaying features in the toolbar UI.
@@ -97,6 +97,30 @@ export declare class DevToolbarAppFeaturesService implements DevToolsService<Dev
97
97
  * ```
98
98
  */
99
99
  getForcedValues(): Observable<DevToolbarAppFeature[]>;
100
+ /**
101
+ * Gets ALL app feature values with overrides already applied.
102
+ * Returns the complete set of features where overridden values replace base values.
103
+ * Each feature includes an `isForced` property indicating if it was overridden.
104
+ *
105
+ * This method simplifies integration by eliminating the need to manually merge
106
+ * base features with overrides using combineLatest.
107
+ *
108
+ * @returns Observable of all features with overrides applied
109
+ *
110
+ * @example
111
+ * ```typescript
112
+ * // Check if a feature is enabled with overrides applied
113
+ * this.appFeaturesService.getValues().pipe(
114
+ * map(features => features.find(f => f.id === 'premium-analytics')),
115
+ * map(feature => feature?.isEnabled ?? false)
116
+ * ).subscribe(isEnabled => {
117
+ * if (isEnabled) {
118
+ * // Enable premium analytics
119
+ * }
120
+ * });
121
+ * ```
122
+ */
123
+ getValues(): Observable<DevToolbarAppFeature[]>;
100
124
  /**
101
125
  * Apply a preset feature configuration (for preset tool integration).
102
126
  *
@@ -5,5 +5,6 @@ export interface DevToolbarFlag {
5
5
  link?: string;
6
6
  isEnabled: boolean;
7
7
  isForced: boolean;
8
+ originalValue?: boolean;
8
9
  }
9
10
  export type FeatureFlagFilter = 'all' | 'forced' | 'enabled' | 'disabled';
@@ -14,6 +14,30 @@ export declare class DevToolbarFeatureFlagService implements DevToolsService<Dev
14
14
  * @returns Observable of forced flags array
15
15
  */
16
16
  getForcedValues(): Observable<DevToolbarFlag[]>;
17
+ /**
18
+ * Gets ALL flag values with overrides already applied.
19
+ * Returns the complete set of flags where overridden values replace base values.
20
+ * Each flag includes an `isForced` property indicating if it was overridden.
21
+ *
22
+ * This method simplifies integration by eliminating the need to manually merge
23
+ * base flags with overrides using combineLatest.
24
+ *
25
+ * @returns Observable of all flags with overrides applied
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * // Get a specific flag value with overrides applied
30
+ * this.featureFlagsService.getValues().pipe(
31
+ * map(flags => flags.find(f => f.id === 'newFeature')),
32
+ * map(flag => flag?.isEnabled ?? false)
33
+ * ).subscribe(isEnabled => {
34
+ * if (isEnabled) {
35
+ * // Enable feature
36
+ * }
37
+ * });
38
+ * ```
39
+ */
40
+ getValues(): Observable<DevToolbarFlag[]>;
17
41
  static ɵfac: i0.ɵɵFactoryDeclaration<DevToolbarFeatureFlagService, never>;
18
42
  static ɵprov: i0.ɵɵInjectableDeclaration<DevToolbarFeatureFlagService>;
19
43
  }
@@ -29,7 +29,6 @@ export declare class DevToolbarHomeToolComponent {
29
29
  readonly url: "https://discord.com/invite/angular";
30
30
  readonly label: "Community";
31
31
  }];
32
- onToggleTheme(): void;
33
32
  onExportSettings(): void;
34
33
  onImportSettings(): void;
35
34
  onResetSettings(): void;
@@ -14,6 +14,13 @@ export declare class DevToolbarLanguageService implements DevToolsService<Langua
14
14
  * @returns Observable of forced languages array
15
15
  */
16
16
  getForcedValues(): Observable<Language[]>;
17
+ /**
18
+ * Gets the forced language value.
19
+ * For the language tool, this returns the same as getForcedValues() since
20
+ * only one language can be selected at a time.
21
+ * @returns Observable of forced language array (single item or empty)
22
+ */
23
+ getValues(): Observable<Language[]>;
17
24
  static ɵfac: i0.ɵɵFactoryDeclaration<DevToolbarLanguageService, never>;
18
25
  static ɵprov: i0.ɵɵInjectableDeclaration<DevToolbarLanguageService>;
19
26
  }
@@ -13,6 +13,8 @@ export interface DevToolbarPermission {
13
13
  isGranted: boolean;
14
14
  /** Whether the permission's value has been overridden through the toolbar */
15
15
  isForced: boolean;
16
+ /** Original value before forcing (only present when isForced is true) */
17
+ originalValue?: boolean;
16
18
  }
17
19
  /**
18
20
  * Internal state representing forced permission overrides.
@@ -62,6 +62,30 @@ export declare class DevToolbarPermissionsService implements DevToolsService<Dev
62
62
  * ```
63
63
  */
64
64
  getForcedValues(): Observable<DevToolbarPermission[]>;
65
+ /**
66
+ * Gets ALL permission values with overrides already applied.
67
+ * Returns the complete set of permissions where overridden values replace base values.
68
+ * Each permission includes an `isForced` property indicating if it was overridden.
69
+ *
70
+ * This method simplifies integration by eliminating the need to manually merge
71
+ * base permissions with overrides using combineLatest.
72
+ *
73
+ * @returns Observable of all permissions with overrides applied
74
+ *
75
+ * @example
76
+ * ```typescript
77
+ * // Simple permission check with overrides applied
78
+ * this.permissionsService.getValues().pipe(
79
+ * map(permissions => permissions.find(p => p.id === 'can-edit')),
80
+ * map(permission => permission?.isGranted ?? false)
81
+ * ).subscribe(canEdit => {
82
+ * if (canEdit) {
83
+ * // Enable edit functionality
84
+ * }
85
+ * });
86
+ * ```
87
+ */
88
+ getValues(): Observable<DevToolbarPermission[]>;
65
89
  /**
66
90
  * Apply a preset permission state. Useful for automated testing scenarios.
67
91
  *
@@ -1,5 +1,5 @@
1
1
  import { Observable } from 'rxjs';
2
- import { DevToolbarPreset } from './presets.models';
2
+ import { DevToolbarPreset, PresetCategoryOptions } from './presets.models';
3
3
  import * as i0 from "@angular/core";
4
4
  /**
5
5
  * Internal service for managing presets state.
@@ -19,7 +19,7 @@ export declare class DevToolbarInternalPresetsService {
19
19
  /**
20
20
  * Capture current toolbar state as a new preset
21
21
  */
22
- saveCurrentAsPreset(name: string, description?: string): DevToolbarPreset;
22
+ saveCurrentAsPreset(name: string, description?: string, categoryOptions?: PresetCategoryOptions): DevToolbarPreset;
23
23
  /**
24
24
  * Apply a preset to all tools (THIS IS THE KEY METHOD)
25
25
  */
@@ -1,4 +1,5 @@
1
1
  import { DevToolbarWindowOptions } from '../../components/toolbar-tool/toolbar-tool.models';
2
+ import { DevToolbarStateService } from '../../dev-toolbar-state.service';
2
3
  import * as i0 from "@angular/core";
3
4
  export declare class DevToolbarPresetsToolComponent {
4
5
  private readonly presetsService;
@@ -6,14 +7,29 @@ export declare class DevToolbarPresetsToolComponent {
6
7
  private readonly permissionsService;
7
8
  private readonly appFeaturesService;
8
9
  private readonly languageService;
10
+ protected readonly state: DevToolbarStateService;
9
11
  protected readonly viewMode: import("@angular/core").WritableSignal<"list" | "create">;
10
12
  protected readonly searchQuery: import("@angular/core").WritableSignal<string>;
11
13
  protected readonly presetName: import("@angular/core").WritableSignal<string>;
12
14
  protected readonly presetDescription: import("@angular/core").WritableSignal<string>;
15
+ protected readonly includeFeatureFlags: import("@angular/core").WritableSignal<boolean>;
16
+ protected readonly includePermissions: import("@angular/core").WritableSignal<boolean>;
17
+ protected readonly includeAppFeatures: import("@angular/core").WritableSignal<boolean>;
18
+ protected readonly includeLanguage: import("@angular/core").WritableSignal<boolean>;
19
+ protected readonly selectedFlagIds: import("@angular/core").WritableSignal<Set<string>>;
20
+ protected readonly selectedPermissionIds: import("@angular/core").WritableSignal<Set<string>>;
21
+ protected readonly selectedFeatureIds: import("@angular/core").WritableSignal<Set<string>>;
13
22
  protected readonly presets: import("@angular/core").Signal<import("ngx-dev-toolbar").DevToolbarPreset[]>;
14
23
  protected readonly filteredPresets: import("@angular/core").Signal<import("ngx-dev-toolbar").DevToolbarPreset[]>;
15
24
  protected readonly hasNoPresets: import("@angular/core").Signal<boolean>;
16
25
  protected readonly hasNoFilteredPresets: import("@angular/core").Signal<boolean>;
26
+ protected readonly isFeatureFlagsEnabled: import("@angular/core").Signal<boolean>;
27
+ protected readonly isPermissionsEnabled: import("@angular/core").Signal<boolean>;
28
+ protected readonly isAppFeaturesEnabled: import("@angular/core").Signal<boolean>;
29
+ protected readonly isLanguageEnabled: import("@angular/core").Signal<boolean>;
30
+ protected readonly forcedFlags: import("@angular/core").Signal<import("ngx-dev-toolbar").DevToolbarFlag[]>;
31
+ protected readonly forcedPermissions: import("@angular/core").Signal<import("ngx-dev-toolbar").DevToolbarPermission[]>;
32
+ protected readonly forcedAppFeatures: import("@angular/core").Signal<import("ngx-dev-toolbar").DevToolbarAppFeature[]>;
17
33
  protected readonly options: DevToolbarWindowOptions;
18
34
  onSearchChange(query: string): void;
19
35
  onSwitchToCreateMode(): void;
@@ -28,6 +44,14 @@ export declare class DevToolbarPresetsToolComponent {
28
44
  protected getCurrentAppFeaturesCount(): number;
29
45
  protected getCurrentLanguage(): string;
30
46
  protected formatDate(isoString: string): string;
47
+ /**
48
+ * Toggle selection of an individual item
49
+ */
50
+ protected toggleItemSelection(signal: typeof this.selectedFlagIds, itemId: string): void;
51
+ /**
52
+ * Check if an item is selected
53
+ */
54
+ protected isItemSelected(selectedSet: Set<string>, itemId: string): boolean;
31
55
  static ɵfac: i0.ɵɵFactoryDeclaration<DevToolbarPresetsToolComponent, never>;
32
56
  static ɵcmp: i0.ɵɵComponentDeclaration<DevToolbarPresetsToolComponent, "ndt-presets-tool", never, {}, {}, never, never, true, never>;
33
57
  }
@@ -22,3 +22,12 @@ export interface DevToolbarPresetConfig {
22
22
  };
23
23
  }
24
24
  export type PresetFilter = 'all' | 'recent' | 'favorites';
25
+ export interface PresetCategoryOptions {
26
+ includeFeatureFlags?: boolean;
27
+ includePermissions?: boolean;
28
+ includeAppFeatures?: boolean;
29
+ includeLanguage?: boolean;
30
+ selectedFlagIds?: string[];
31
+ selectedPermissionIds?: string[];
32
+ selectedFeatureIds?: string[];
33
+ }
@@ -1,6 +1,14 @@
1
1
  import { Observable } from 'rxjs';
2
- import { DevToolbarPreset } from './presets.models';
2
+ import { DevToolbarPreset, DevToolbarPresetConfig } from './presets.models';
3
3
  import * as i0 from "@angular/core";
4
+ /**
5
+ * Partial preset for initialization (without generated fields)
6
+ */
7
+ export interface InitialPreset {
8
+ name: string;
9
+ description?: string;
10
+ config: DevToolbarPresetConfig;
11
+ }
4
12
  /**
5
13
  * Public service for managing dev toolbar presets.
6
14
  * Allows developers to programmatically save, load, and manage presets.
@@ -46,6 +54,68 @@ export declare class DevToolbarPresetsService {
46
54
  * @throws Error if JSON is invalid
47
55
  */
48
56
  importPreset(json: string): DevToolbarPreset;
57
+ /**
58
+ * Initialize presets with predefined configurations.
59
+ * Useful for setting up default presets that all developers can use.
60
+ *
61
+ * @param presets - Array of preset configurations to initialize
62
+ * @returns Array of created presets
63
+ *
64
+ * @example
65
+ * ```typescript
66
+ * const presetsService = inject(DevToolbarPresetsService);
67
+ *
68
+ * presetsService.initializePresets([
69
+ * {
70
+ * name: 'Admin User',
71
+ * description: 'Full access admin configuration',
72
+ * config: {
73
+ * featureFlags: {
74
+ * enabled: ['admin-panel', 'advanced-features'],
75
+ * disabled: []
76
+ * },
77
+ * permissions: {
78
+ * granted: ['admin', 'write', 'delete'],
79
+ * denied: []
80
+ * },
81
+ * appFeatures: {
82
+ * enabled: ['analytics', 'reporting'],
83
+ * disabled: []
84
+ * },
85
+ * language: 'en'
86
+ * }
87
+ * },
88
+ * {
89
+ * name: 'Read-Only User',
90
+ * description: 'Limited access for viewing only',
91
+ * config: {
92
+ * featureFlags: {
93
+ * enabled: [],
94
+ * disabled: ['admin-panel', 'advanced-features']
95
+ * },
96
+ * permissions: {
97
+ * granted: ['read'],
98
+ * denied: ['write', 'delete']
99
+ * },
100
+ * appFeatures: {
101
+ * enabled: [],
102
+ * disabled: ['analytics', 'reporting']
103
+ * },
104
+ * language: null
105
+ * }
106
+ * }
107
+ * ]);
108
+ * ```
109
+ */
110
+ initializePresets(presets: InitialPreset[]): DevToolbarPreset[];
111
+ /**
112
+ * Clear all existing presets and set new initial presets.
113
+ * Use this to replace all presets with a fresh set of configurations.
114
+ *
115
+ * @param presets - Array of preset configurations to set as initial
116
+ * @returns Array of created presets
117
+ */
118
+ setInitialPresets(presets: InitialPreset[]): DevToolbarPreset[];
49
119
  static ɵfac: i0.ɵɵFactoryDeclaration<DevToolbarPresetsService, never>;
50
120
  static ɵprov: i0.ɵɵInjectableDeclaration<DevToolbarPresetsService>;
51
121
  }