@praxisui/metadata-editor 0.0.1

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 ADDED
@@ -0,0 +1,237 @@
1
+ import { ValidatorFn, FormBuilder, FormGroup, AbstractControl } from '@angular/forms';
2
+ import { FieldControlType, FieldDefinition, FieldMetadata, IconPickerService } from '@praxisui/core';
3
+ import * as i0 from '@angular/core';
4
+ import { Type, OnChanges, SimpleChanges, OnInit, EventEmitter } from '@angular/core';
5
+ import { MatDialog } from '@angular/material/dialog';
6
+ import { BehaviorSubject } from 'rxjs';
7
+
8
+ /** Descreve uma propriedade editável do FieldDefinition alvo. */
9
+ interface EditorProperty {
10
+ name: string;
11
+ label: string;
12
+ editorType: 'text' | 'number' | 'textarea' | 'select' | 'checkbox' | string;
13
+ defaultValue?: any;
14
+ placeholder?: string;
15
+ hint?: string;
16
+ required?: boolean;
17
+ options?: Array<{
18
+ value: any;
19
+ text: string;
20
+ }> | {
21
+ type: 'static' | 'http' | 'fn';
22
+ config?: any;
23
+ };
24
+ validators?: ValidatorFn[];
25
+ visibleWhen?: (formValue: any) => boolean;
26
+ group?: string;
27
+ row?: string;
28
+ inline?: boolean;
29
+ order?: number;
30
+ [key: string]: any;
31
+ }
32
+ type ConfigMap = Record<FieldControlType, EditorProperty[]>;
33
+
34
+ declare class ConfigRegistryService {
35
+ private readonly map;
36
+ register(controlType: FieldControlType, props: EditorProperty[]): void;
37
+ getProperties(controlType: FieldControlType): EditorProperty[];
38
+ list(): Array<{
39
+ controlType: FieldControlType;
40
+ count: number;
41
+ }>;
42
+ static ɵfac: i0.ɵɵFactoryDeclaration<ConfigRegistryService, never>;
43
+ static ɵprov: i0.ɵɵInjectableDeclaration<ConfigRegistryService>;
44
+ }
45
+
46
+ declare class ContextValidatorRegistryService {
47
+ private readonly map;
48
+ register(controlType: FieldControlType, validator: ValidatorFn): void;
49
+ get(controlType: FieldControlType): ValidatorFn[];
50
+ static ɵfac: i0.ɵɵFactoryDeclaration<ContextValidatorRegistryService, never>;
51
+ static ɵprov: i0.ɵɵInjectableDeclaration<ContextValidatorRegistryService>;
52
+ }
53
+
54
+ declare class SchemaNormalizerService {
55
+ /** Normaliza propriedades e aplica defaultValue resolvendo do seed por dot-path. */
56
+ normalize(properties: EditorProperty[], seed?: Partial<FieldDefinition>): EditorProperty[];
57
+ /** Lê valor por dot-path */
58
+ private getByPath;
59
+ static ɵfac: i0.ɵɵFactoryDeclaration<SchemaNormalizerService, never>;
60
+ static ɵprov: i0.ɵɵInjectableDeclaration<SchemaNormalizerService>;
61
+ }
62
+
63
+ declare class DynamicFormFactoryService {
64
+ private fb;
65
+ private ctxValidators;
66
+ constructor(fb: FormBuilder, ctxValidators: ContextValidatorRegistryService);
67
+ createEditorForm(controlType: FieldControlType, props: EditorProperty[], seed?: Partial<FieldDefinition>): FormGroup;
68
+ getControlByPath(form: FormGroup, path: string): AbstractControl | null;
69
+ setValueByPath(form: FormGroup, path: string, value: any): void;
70
+ extractPatch(form: FormGroup): Partial<FieldDefinition>;
71
+ mergeIntoFieldDefinition(base: FieldDefinition, patch: Partial<FieldDefinition>): FieldDefinition;
72
+ private assignControlByPath;
73
+ private deepMerge;
74
+ static ɵfac: i0.ɵɵFactoryDeclaration<DynamicFormFactoryService, never>;
75
+ static ɵprov: i0.ɵɵInjectableDeclaration<DynamicFormFactoryService>;
76
+ }
77
+
78
+ declare class EditorComponentRegistryService {
79
+ private readonly registry;
80
+ private readonly cache;
81
+ register(editorType: string, loader: () => Promise<Type<any>>): void;
82
+ get(editorType: string): Promise<Type<any> | null>;
83
+ isRegistered(editorType: string): boolean;
84
+ static ɵfac: i0.ɵɵFactoryDeclaration<EditorComponentRegistryService, never>;
85
+ static ɵprov: i0.ɵɵInjectableDeclaration<EditorComponentRegistryService>;
86
+ }
87
+
88
+ declare class DynamicEditorRendererComponent implements OnChanges {
89
+ private dialog;
90
+ private iconPicker;
91
+ properties: EditorProperty[];
92
+ form: FormGroup;
93
+ fields: FieldMetadata[];
94
+ groupFields: Record<string, FieldMetadata[]>;
95
+ groupOrder: string[];
96
+ groupRows: Record<string, FieldMetadata[][]>;
97
+ ready: boolean;
98
+ ngOnChanges(changes: SimpleChanges): void;
99
+ private toFieldMetadata;
100
+ private groupWeight;
101
+ isInitiallyExpanded(_group: string): boolean;
102
+ rowClass(row: FieldMetadata[]): string;
103
+ private mapEditorType;
104
+ groupIcon(group: string): string;
105
+ constructor(dialog: MatDialog, iconPicker: IconPickerService);
106
+ isIconField(path: string): boolean;
107
+ openRegexHelp(): void;
108
+ openIconPicker(path: string): Promise<void>;
109
+ static ɵfac: i0.ɵɵFactoryDeclaration<DynamicEditorRendererComponent, never>;
110
+ static ɵcmp: i0.ɵɵComponentDeclaration<DynamicEditorRendererComponent, "praxis-dynamic-editor-renderer", never, { "properties": { "alias": "properties"; "required": false; }; "form": { "alias": "form"; "required": false; }; }, {}, never, never, true, never>;
111
+ }
112
+
113
+ declare class FieldMetadataEditorComponent implements OnInit {
114
+ private registry;
115
+ private normalizer;
116
+ private factory;
117
+ private ctxValidators;
118
+ controlType: FieldControlType;
119
+ seed?: Partial<FieldDefinition>;
120
+ applied: EventEmitter<Partial<FieldDefinition>>;
121
+ cancel: EventEmitter<void>;
122
+ form: FormGroup;
123
+ normalizedProps: any[];
124
+ private initialSnapshot;
125
+ private baselineReady;
126
+ typeOptions: Array<{
127
+ value: FieldControlType;
128
+ label: string;
129
+ }>;
130
+ isDirty$: BehaviorSubject<boolean>;
131
+ isValid$: BehaviorSubject<boolean>;
132
+ isBusy$: BehaviorSubject<boolean>;
133
+ constructor(registry: ConfigRegistryService, normalizer: SchemaNormalizerService, factory: DynamicFormFactoryService, ctxValidators: ContextValidatorRegistryService);
134
+ ngOnInit(): void;
135
+ private rebuildEditorForType;
136
+ apply(): void;
137
+ onSave(): Partial<FieldDefinition> | undefined;
138
+ getSettingsValue(): Partial<FieldDefinition>;
139
+ /**
140
+ * Constrói um patch delta a partir do valor atual do form, removendo
141
+ * chaves não alteradas e valores nulos/strings vazias (exceto boolean/zero).
142
+ */
143
+ private buildDeltaPatch;
144
+ reset(): void;
145
+ onControlTypeChange(next: FieldControlType): void;
146
+ onControlTypeChangeEvent(event: Event): void;
147
+ static ɵfac: i0.ɵɵFactoryDeclaration<FieldMetadataEditorComponent, never>;
148
+ static ɵcmp: i0.ɵɵComponentDeclaration<FieldMetadataEditorComponent, "praxis-field-metadata-editor", never, { "controlType": { "alias": "controlType"; "required": false; }; "seed": { "alias": "seed"; "required": false; }; }, { "applied": "applied"; "cancel": "cancel"; }, never, never, true, never>;
149
+ }
150
+
151
+ interface CascadeRuleViewModel {
152
+ targetField: string;
153
+ dependencyFields: string[];
154
+ enableDependencyCascade: boolean;
155
+ resetOnDependentChange: boolean;
156
+ dependencyFilterMap?: Record<string, any> | null;
157
+ dependencyValuePath?: string | Record<string, string> | null;
158
+ dependencyMergeStrategy?: 'merge' | 'replace';
159
+ dependencyDebounceMs?: number | null;
160
+ dependencyLoadOnChange?: 'respectLoadOn' | 'immediate' | 'manual';
161
+ }
162
+ declare class CascadeRulesService {
163
+ getFieldLabelMap(fields: Array<FieldDefinition | FieldMetadata>): Map<string, string>;
164
+ hydrateRule(field: FieldDefinition | FieldMetadata): CascadeRuleViewModel | null;
165
+ dehydratePatch(rule: CascadeRuleViewModel): Partial<FieldDefinition>;
166
+ /** Suggest a basic mapping dep->dep and a default valuePath */
167
+ suggest(rule: CascadeRuleViewModel, inferredValueKey?: string): CascadeRuleViewModel;
168
+ static ɵfac: i0.ɵɵFactoryDeclaration<CascadeRulesService, never>;
169
+ static ɵprov: i0.ɵɵInjectableDeclaration<CascadeRulesService>;
170
+ }
171
+
172
+ declare class CascadeManagerTabComponent implements OnChanges {
173
+ private readonly svc;
174
+ fields: Array<FieldDefinition | FieldMetadata>;
175
+ connections?: Array<{
176
+ toFieldName: string;
177
+ toInputPath: string;
178
+ }>;
179
+ apply: EventEmitter<Record<string, Partial<FieldDefinition>>>;
180
+ cancel: EventEmitter<void>;
181
+ searchTerm: string;
182
+ private searchTimer;
183
+ private searchValue;
184
+ private readonly rules;
185
+ private readonly selectedFieldSig;
186
+ readonly editing: i0.WritableSignal<boolean>;
187
+ editDepCsv: string;
188
+ editEnable: boolean;
189
+ editReset: boolean;
190
+ editMerge: 'merge' | 'replace';
191
+ editLoadOn: 'respectLoadOn' | 'immediate' | 'manual';
192
+ editDebounce: number | null;
193
+ editValuePath: string;
194
+ editFilterMapJson: string;
195
+ importMode: boolean;
196
+ importJson: string;
197
+ editMapRows: Array<{
198
+ dep: string;
199
+ key: string;
200
+ valuePath?: string;
201
+ }>;
202
+ constructor(svc: CascadeRulesService);
203
+ ngOnInit(): void;
204
+ ngOnChanges(changes: SimpleChanges): void;
205
+ filteredFields(): Array<FieldDefinition | FieldMetadata>;
206
+ labelFor(name: string): string;
207
+ selectedField(): string | null;
208
+ selectField(name: string): void;
209
+ hasRule(name: string): boolean;
210
+ ruleFor(name: string): CascadeRuleViewModel | null;
211
+ isCascadeEnabled(name: string): boolean;
212
+ loadOnChange(name: string): 'respectLoadOn' | 'immediate' | 'manual';
213
+ hasConflict(name: string): boolean;
214
+ startEdit(name: string): void;
215
+ edit(name: string): void;
216
+ cancelEdit(): void;
217
+ saveEdit(name: string): void;
218
+ remove(name: string): void;
219
+ quickSet(name: string, action: 'disable' | 'manual'): void;
220
+ private emitPatch;
221
+ onSearchChange(val: string): void;
222
+ onFieldKeydown(event: KeyboardEvent, name: string): void;
223
+ hasField(name: string): boolean;
224
+ toggleImport(): void;
225
+ exportRules(): void;
226
+ applyImport(): void;
227
+ startTemplate(name: string, tpl: 'rota-destino' | 'rota-destino-propriedade'): void;
228
+ buildMapRowsFromDeps(): void;
229
+ buildValuePathOverrides(deps: string[]): string | Record<string, string>;
230
+ buildPreview(): string;
231
+ copyPreview(): void;
232
+ static ɵfac: i0.ɵɵFactoryDeclaration<CascadeManagerTabComponent, never>;
233
+ static ɵcmp: i0.ɵɵComponentDeclaration<CascadeManagerTabComponent, "praxis-cascade-manager-tab", never, { "fields": { "alias": "fields"; "required": false; }; "connections": { "alias": "connections"; "required": false; }; }, { "apply": "apply"; "cancel": "cancel"; }, never, never, true, never>;
234
+ }
235
+
236
+ export { CascadeManagerTabComponent, CascadeRulesService, ConfigRegistryService, ContextValidatorRegistryService, DynamicEditorRendererComponent, DynamicFormFactoryService, EditorComponentRegistryService, FieldMetadataEditorComponent, SchemaNormalizerService };
237
+ export type { CascadeRuleViewModel, ConfigMap, EditorProperty };
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "@praxisui/metadata-editor",
3
+ "version": "0.0.1",
4
+ "peerDependencies": {
5
+ "@angular/common": "^20.0.0",
6
+ "@angular/core": "^20.0.0"
7
+ },
8
+ "dependencies": {
9
+ "tslib": "^2.3.0"
10
+ },
11
+ "license": "Apache-2.0",
12
+ "publishConfig": {
13
+ "access": "public"
14
+ },
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "https://github.com/codexrodrigues/praxis"
18
+ },
19
+ "homepage": "https://github.com/codexrodrigues/praxis#readme",
20
+ "bugs": {
21
+ "url": "https://github.com/codexrodrigues/praxis/issues"
22
+ },
23
+ "sideEffects": false,
24
+ "module": "fesm2022/praxisui-metadata-editor.mjs",
25
+ "typings": "index.d.ts",
26
+ "exports": {
27
+ "./package.json": {
28
+ "default": "./package.json"
29
+ },
30
+ ".": {
31
+ "types": "./index.d.ts",
32
+ "default": "./fesm2022/praxisui-metadata-editor.mjs"
33
+ }
34
+ }
35
+ }