@qoretechnologies/reqraft 0.10.2 → 0.10.5
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/.claude/CLAUDE.md +5 -0
- package/design/COMPACT_ENGINE_REDESIGN.md +156 -0
- package/design/FORM_ENGINE_COMPACT_UX_PLAN.md +353 -0
- package/dist/components/form/engine/CompactRow.d.ts.map +1 -1
- package/dist/components/form/engine/CompactRow.js +158 -101
- package/dist/components/form/engine/CompactRow.js.map +1 -1
- package/dist/components/form/engine/CompactToolbar.d.ts.map +1 -1
- package/dist/components/form/engine/CompactToolbar.js +122 -105
- package/dist/components/form/engine/CompactToolbar.js.map +1 -1
- package/dist/components/form/engine/FormEngine.d.ts +9 -1
- package/dist/components/form/engine/FormEngine.d.ts.map +1 -1
- package/dist/components/form/engine/FormEngine.js +272 -82
- package/dist/components/form/engine/FormEngine.js.map +1 -1
- package/dist/components/form/engine/compactRowStyles.d.ts +6 -3
- package/dist/components/form/engine/compactRowStyles.d.ts.map +1 -1
- package/dist/components/form/engine/compactRowStyles.js +76 -49
- package/dist/components/form/engine/compactRowStyles.js.map +1 -1
- package/dist/components/form/engine/compactToolbarContext.d.ts +1 -0
- package/dist/components/form/engine/compactToolbarContext.d.ts.map +1 -1
- package/dist/components/form/engine/compactToolbarContext.js.map +1 -1
- package/dist/components/form/engine/readFirst.d.ts +19 -0
- package/dist/components/form/engine/readFirst.d.ts.map +1 -1
- package/dist/components/form/engine/readFirst.js +22 -1
- package/dist/components/form/engine/readFirst.js.map +1 -1
- package/dist/components/form/engine/variants/VariantCalmTable.d.ts +6 -0
- package/dist/components/form/engine/variants/VariantCalmTable.d.ts.map +1 -0
- package/dist/components/form/engine/variants/VariantCalmTable.js +94 -0
- package/dist/components/form/engine/variants/VariantCalmTable.js.map +1 -0
- package/dist/components/form/engine/variants/VariantCards.d.ts +6 -0
- package/dist/components/form/engine/variants/VariantCards.d.ts.map +1 -0
- package/dist/components/form/engine/variants/VariantCards.js +80 -0
- package/dist/components/form/engine/variants/VariantCards.js.map +1 -0
- package/dist/components/form/engine/variants/VariantFocus.d.ts +7 -0
- package/dist/components/form/engine/variants/VariantFocus.d.ts.map +1 -0
- package/dist/components/form/engine/variants/VariantFocus.js +138 -0
- package/dist/components/form/engine/variants/VariantFocus.js.map +1 -0
- package/dist/components/form/engine/variants/VariantMinimal.d.ts +6 -0
- package/dist/components/form/engine/variants/VariantMinimal.d.ts.map +1 -0
- package/dist/components/form/engine/variants/VariantMinimal.js +73 -0
- package/dist/components/form/engine/variants/VariantMinimal.js.map +1 -0
- package/dist/components/form/engine/variants/focusDemo.d.ts +13 -0
- package/dist/components/form/engine/variants/focusDemo.d.ts.map +1 -0
- package/dist/components/form/engine/variants/focusDemo.js +139 -0
- package/dist/components/form/engine/variants/focusDemo.js.map +1 -0
- package/dist/components/form/engine/variants/variantModel.d.ts +70 -0
- package/dist/components/form/engine/variants/variantModel.d.ts.map +1 -0
- package/dist/components/form/engine/variants/variantModel.js +133 -0
- package/dist/components/form/engine/variants/variantModel.js.map +1 -0
- package/dist/components/form/engine/variants/variantParts.d.ts +79 -0
- package/dist/components/form/engine/variants/variantParts.d.ts.map +1 -0
- package/dist/components/form/engine/variants/variantParts.js +191 -0
- package/dist/components/form/engine/variants/variantParts.js.map +1 -0
- package/dist/components/form/fields/auto/AutoFormField.d.ts +3 -0
- package/dist/components/form/fields/auto/AutoFormField.d.ts.map +1 -1
- package/dist/components/form/fields/auto/AutoFormField.js +5 -2
- package/dist/components/form/fields/auto/AutoFormField.js.map +1 -1
- package/package.json +1 -1
- package/src/components/form/engine/CompactRow.tsx +273 -258
- package/src/components/form/engine/CompactToolbar.tsx +112 -85
- package/src/components/form/engine/FormEngine.stories.tsx +239 -115
- package/src/components/form/engine/FormEngine.tsx +332 -83
- package/src/components/form/engine/compactRowStyles.ts +221 -144
- package/src/components/form/engine/compactToolbarContext.ts +1 -0
- package/src/components/form/engine/readFirst.ts +35 -0
- package/src/components/form/engine/variants/FormEngineVariants.stories.tsx +119 -0
- package/src/components/form/engine/variants/VariantCalmTable.tsx +242 -0
- package/src/components/form/engine/variants/VariantCards.tsx +212 -0
- package/src/components/form/engine/variants/VariantFocus.tsx +382 -0
- package/src/components/form/engine/variants/VariantMinimal.tsx +170 -0
- package/src/components/form/engine/variants/focusDemo.ts +145 -0
- package/src/components/form/engine/variants/variantModel.ts +216 -0
- package/src/components/form/engine/variants/variantParts.tsx +313 -0
- package/src/components/form/fields/auto/AutoFormField.stories.tsx +9 -2
- package/src/components/form/fields/auto/AutoFormField.tsx +8 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.focusDemoGroupLabels = exports.focusDemoInvalid = exports.focusDemoValue = exports.getFocusDemoOptions = void 0;
|
|
4
|
+
var getFocusDemoOptions = function () {
|
|
5
|
+
return ({
|
|
6
|
+
// --- Connection -------------------------------------------------------
|
|
7
|
+
url: {
|
|
8
|
+
type: 'string',
|
|
9
|
+
ui_type: 'string',
|
|
10
|
+
display_name: 'Connection URL',
|
|
11
|
+
short_desc: 'The full datasource URL (driver://user@host:port/db).',
|
|
12
|
+
desc: 'Accepts any Qore datasource URL. Templates like `$config:db-url` are supported.',
|
|
13
|
+
group: 'connection',
|
|
14
|
+
required: true,
|
|
15
|
+
supports_templates: true,
|
|
16
|
+
},
|
|
17
|
+
port: {
|
|
18
|
+
type: 'int',
|
|
19
|
+
ui_type: 'number',
|
|
20
|
+
display_name: 'Port',
|
|
21
|
+
short_desc: 'TCP port of the database server.',
|
|
22
|
+
group: 'connection',
|
|
23
|
+
default_value: { type: 'int', value: 5432 },
|
|
24
|
+
},
|
|
25
|
+
database: {
|
|
26
|
+
type: 'string',
|
|
27
|
+
ui_type: 'string',
|
|
28
|
+
display_name: 'Database name',
|
|
29
|
+
short_desc: 'Name of the schema/database to connect to.',
|
|
30
|
+
group: 'connection',
|
|
31
|
+
required: true,
|
|
32
|
+
},
|
|
33
|
+
// --- Authentication (one-of required group) ---------------------------
|
|
34
|
+
token: {
|
|
35
|
+
type: 'string',
|
|
36
|
+
ui_type: 'string',
|
|
37
|
+
display_name: 'API token',
|
|
38
|
+
short_desc: 'Bearer token — use this OR a username/password.',
|
|
39
|
+
group: 'authentication',
|
|
40
|
+
required_groups: ['auth'],
|
|
41
|
+
supports_templates: true,
|
|
42
|
+
},
|
|
43
|
+
username: {
|
|
44
|
+
type: 'string',
|
|
45
|
+
ui_type: 'string',
|
|
46
|
+
display_name: 'Username',
|
|
47
|
+
short_desc: 'Database user — paired with a password.',
|
|
48
|
+
group: 'authentication',
|
|
49
|
+
required_groups: ['auth'],
|
|
50
|
+
},
|
|
51
|
+
password: {
|
|
52
|
+
type: 'string',
|
|
53
|
+
ui_type: 'string',
|
|
54
|
+
display_name: 'Password',
|
|
55
|
+
short_desc: 'Database password.',
|
|
56
|
+
group: 'authentication',
|
|
57
|
+
required_groups: ['auth'],
|
|
58
|
+
supports_templates: true,
|
|
59
|
+
},
|
|
60
|
+
// --- Advanced ---------------------------------------------------------
|
|
61
|
+
options: {
|
|
62
|
+
type: 'hash',
|
|
63
|
+
ui_type: 'hash',
|
|
64
|
+
display_name: 'Driver options',
|
|
65
|
+
short_desc: 'Extra key/value options passed to the driver.',
|
|
66
|
+
group: 'advanced',
|
|
67
|
+
},
|
|
68
|
+
poolSize: {
|
|
69
|
+
type: 'int',
|
|
70
|
+
ui_type: 'number',
|
|
71
|
+
display_name: 'Pool size',
|
|
72
|
+
short_desc: 'Max simultaneous connections.',
|
|
73
|
+
group: 'advanced',
|
|
74
|
+
default_value: { type: 'int', value: 10 },
|
|
75
|
+
},
|
|
76
|
+
timeout: {
|
|
77
|
+
type: 'int',
|
|
78
|
+
ui_type: 'number',
|
|
79
|
+
display_name: 'Timeout (s)',
|
|
80
|
+
short_desc: 'Connection timeout in seconds.',
|
|
81
|
+
group: 'advanced',
|
|
82
|
+
},
|
|
83
|
+
logLevel: {
|
|
84
|
+
type: 'string',
|
|
85
|
+
ui_type: 'string',
|
|
86
|
+
display_name: 'Log level',
|
|
87
|
+
short_desc: 'Verbosity of the connection log.',
|
|
88
|
+
group: 'advanced',
|
|
89
|
+
allowed_values: [
|
|
90
|
+
{ value: 'error', display_name: 'Error' },
|
|
91
|
+
{ value: 'info', display_name: 'Info' },
|
|
92
|
+
{ value: 'debug', display_name: 'Debug' },
|
|
93
|
+
],
|
|
94
|
+
},
|
|
95
|
+
// --- Optional (non-preselected — render in the Optional group) ---------
|
|
96
|
+
sslCert: {
|
|
97
|
+
type: 'file',
|
|
98
|
+
ui_type: 'file',
|
|
99
|
+
display_name: 'SSL certificate',
|
|
100
|
+
short_desc: 'Client certificate for mutual TLS.',
|
|
101
|
+
},
|
|
102
|
+
tags: {
|
|
103
|
+
type: 'list',
|
|
104
|
+
ui_type: 'list',
|
|
105
|
+
display_name: 'Tags',
|
|
106
|
+
short_desc: 'Free-form labels for this connection.',
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
};
|
|
110
|
+
exports.getFocusDemoOptions = getFocusDemoOptions;
|
|
111
|
+
exports.focusDemoValue = {
|
|
112
|
+
url: { type: 'string', value: 'pgsql://hq.qoretechnologies.com:5432/omq' },
|
|
113
|
+
// database: intentionally unset → required to-do
|
|
114
|
+
// auth group: intentionally none set → one-of unsatisfied → attention
|
|
115
|
+
options: {
|
|
116
|
+
type: 'hash',
|
|
117
|
+
value: {
|
|
118
|
+
sslmode: { type: 'string', value: 'require' },
|
|
119
|
+
application_name: { type: 'string', value: 'qorus-ide' },
|
|
120
|
+
connect_timeout: { type: 'int', value: 8 },
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
logLevel: { type: 'string', value: 'info' },
|
|
124
|
+
// timeout: invalid (entered 0)
|
|
125
|
+
timeout: { type: 'int', value: 0 },
|
|
126
|
+
};
|
|
127
|
+
// Demo-only invalid reasons (in the engine these come from the validity pass).
|
|
128
|
+
exports.focusDemoInvalid = {
|
|
129
|
+
timeout: 'Must be greater than 0',
|
|
130
|
+
};
|
|
131
|
+
// Display labels for the named groups.
|
|
132
|
+
exports.focusDemoGroupLabels = {
|
|
133
|
+
connection: 'Connection',
|
|
134
|
+
authentication: 'Authentication',
|
|
135
|
+
advanced: 'Advanced',
|
|
136
|
+
optional: 'Optional',
|
|
137
|
+
general: 'General',
|
|
138
|
+
};
|
|
139
|
+
//# sourceMappingURL=focusDemo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"focusDemo.js","sourceRoot":"","sources":["../../../../../src/components/form/engine/variants/focusDemo.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared row model for the FormEngine compact VARIANTS playground.
|
|
3
|
+
*
|
|
4
|
+
* This is a prototyping harness: every variant renders the SAME normalized rows
|
|
5
|
+
* (derived from a real options schema + values via the real `readFirst`
|
|
6
|
+
* formatters) and differs only in layout / chrome / UX. That keeps the
|
|
7
|
+
* comparison about presentation, not data. Editing is intentionally stubbed
|
|
8
|
+
* (expand shows a placeholder) — the point is to compare the read-first view
|
|
9
|
+
* that currently feels crowded, then graft the winner onto the real engine.
|
|
10
|
+
*/
|
|
11
|
+
import { IQorusFormField, IQorusFormSchema } from '@qoretechnologies/ts-toolkit';
|
|
12
|
+
export type TVariantStatus = 'set' | 'unset' | 'todo' | 'invalid';
|
|
13
|
+
export type TVariantValueKind = 'text' | 'number' | 'bool' | 'color' | 'file' | 'template' | 'richtext' | 'hash' | 'empty';
|
|
14
|
+
export interface IVariantValue {
|
|
15
|
+
kind: TVariantValueKind;
|
|
16
|
+
/** Human-readable summary (already formatted by readFirst). */
|
|
17
|
+
display: string;
|
|
18
|
+
/** color: css color; file: size label; hash: field count; template: label */
|
|
19
|
+
extra?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface IVariantRow {
|
|
22
|
+
name: string;
|
|
23
|
+
label: string;
|
|
24
|
+
shortDesc?: string;
|
|
25
|
+
longDesc?: string;
|
|
26
|
+
required: boolean;
|
|
27
|
+
readOnly: boolean;
|
|
28
|
+
status: TVariantStatus;
|
|
29
|
+
/** Short reason for todo/invalid, e.g. "Text value is empty". */
|
|
30
|
+
reason?: string;
|
|
31
|
+
value: IVariantValue;
|
|
32
|
+
typeLabel: string;
|
|
33
|
+
/** required_groups this field belongs to (one-of constraints). */
|
|
34
|
+
requiredGroups: string[];
|
|
35
|
+
/** True when this field is a member of an unsatisfied one-of group. */
|
|
36
|
+
inUnmetGroup: boolean;
|
|
37
|
+
/** Raw schema + value object — passed to AutoFormField for REAL editing. */
|
|
38
|
+
schema: any;
|
|
39
|
+
field: any;
|
|
40
|
+
}
|
|
41
|
+
export interface IVariantGroup {
|
|
42
|
+
name: string;
|
|
43
|
+
label: string;
|
|
44
|
+
rows: IVariantRow[];
|
|
45
|
+
}
|
|
46
|
+
/** One-of required group: members + whether any is filled. */
|
|
47
|
+
export interface IRequiredGroupInfo {
|
|
48
|
+
key: string;
|
|
49
|
+
members: string[];
|
|
50
|
+
memberLabels: string[];
|
|
51
|
+
satisfied: boolean;
|
|
52
|
+
}
|
|
53
|
+
export interface IVariantConfig {
|
|
54
|
+
groupLabels?: Record<string, string>;
|
|
55
|
+
/** name → reason; in the engine this comes from the validity pass. */
|
|
56
|
+
invalidReasons?: Record<string, string>;
|
|
57
|
+
}
|
|
58
|
+
export declare function buildVariantGroups(options: IQorusFormSchema, values: Record<string, IQorusFormField>, config?: IVariantConfig): {
|
|
59
|
+
groups: IVariantGroup[];
|
|
60
|
+
requiredGroups: Record<string, IRequiredGroupInfo>;
|
|
61
|
+
};
|
|
62
|
+
export declare function summarize(groups: IVariantGroup[]): {
|
|
63
|
+
total: number;
|
|
64
|
+
set: number;
|
|
65
|
+
todo: number;
|
|
66
|
+
invalid: number;
|
|
67
|
+
attention: number;
|
|
68
|
+
pct: number;
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=variantModel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variantModel.d.ts","sourceRoot":"","sources":["../../../../../src/components/form/engine/variants/variantModel.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAajF,MAAM,MAAM,cAAc,GACtB,KAAK,GACL,OAAO,GACP,MAAM,GACN,SAAS,CAAC;AAEd,MAAM,MAAM,iBAAiB,GACzB,MAAM,GACN,QAAQ,GACR,MAAM,GACN,OAAO,GACP,MAAM,GACN,UAAU,GACV,UAAU,GACV,MAAM,GACN,OAAO,CAAC;AAEZ,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,iBAAiB,CAAC;IACxB,+DAA+D;IAC/D,OAAO,EAAE,MAAM,CAAC;IAChB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,cAAc,CAAC;IACvB,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,aAAa,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,uEAAuE;IACvE,YAAY,EAAE,OAAO,CAAC;IACtB,4EAA4E;IAC5E,MAAM,EAAE,GAAG,CAAC;IACZ,KAAK,EAAE,GAAG,CAAC;CACZ;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,WAAW,EAAE,CAAC;CACrB;AAED,8DAA8D;AAC9D,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,sEAAsE;IACtE,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACzC;AA4CD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,gBAAgB,EACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EACvC,MAAM,GAAE,cAAmB,GAC1B;IAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IAAC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAA;CAAE,CAqEjF;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE;;;;;;;EAShD"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.summarize = exports.buildVariantGroups = void 0;
|
|
4
|
+
var readFirst_1 = require("../readFirst");
|
|
5
|
+
var templates_1 = require("../../../../helpers/templates");
|
|
6
|
+
// Default (basic-fixture) invalid set — overridable via config.
|
|
7
|
+
var DEFAULT_INVALID = {
|
|
8
|
+
optionWithInvalidValue: 'Text value is empty',
|
|
9
|
+
schemaOption: 'Hash arguments are invalid',
|
|
10
|
+
};
|
|
11
|
+
function buildValue(field, schema) {
|
|
12
|
+
if (!field || (0, readFirst_1.isOptionValueEmpty)(field.value))
|
|
13
|
+
return { kind: 'empty', display: '' };
|
|
14
|
+
var valueType = (0, readFirst_1.getValueType)(field, schema);
|
|
15
|
+
var formatted = (0, readFirst_1.formatOptionValue)(field, schema);
|
|
16
|
+
if (valueType === 'rgbcolor') {
|
|
17
|
+
return { kind: 'color', display: formatted, extra: (0, readFirst_1.colorToCss)(field.value) };
|
|
18
|
+
}
|
|
19
|
+
if (valueType === 'file') {
|
|
20
|
+
var size = (0, readFirst_1.getFileSize)(field.value);
|
|
21
|
+
return {
|
|
22
|
+
kind: 'file',
|
|
23
|
+
display: formatted,
|
|
24
|
+
extra: size !== undefined ? (0, readFirst_1.formatBytes)(size) : undefined,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
if (valueType === 'bool' || valueType === 'boolean') {
|
|
28
|
+
return { kind: 'bool', display: formatted };
|
|
29
|
+
}
|
|
30
|
+
if (valueType === 'hash' || valueType === 'free-hash') {
|
|
31
|
+
return { kind: 'hash', display: formatted };
|
|
32
|
+
}
|
|
33
|
+
if (typeof field.value === 'string' && (0, templates_1.isValueTemplate)(field.value)) {
|
|
34
|
+
// The real chip resolves the template's display name from the templates
|
|
35
|
+
// list; the prototype shows a friendly label of the key.
|
|
36
|
+
var label = field.value.replace(/^\$[a-z]+:/i, '').replace(/[-_]/g, ' ') || field.value;
|
|
37
|
+
return { kind: 'template', display: label.replace(/\b\w/g, function (c) { return c.toUpperCase(); }), extra: 'local' };
|
|
38
|
+
}
|
|
39
|
+
if (valueType === 'richtext' && Array.isArray(field.value)) {
|
|
40
|
+
return { kind: 'richtext', display: formatted };
|
|
41
|
+
}
|
|
42
|
+
return { kind: 'text', display: formatted };
|
|
43
|
+
}
|
|
44
|
+
function buildVariantGroups(options, values, config) {
|
|
45
|
+
var _a;
|
|
46
|
+
if (config === void 0) { config = {}; }
|
|
47
|
+
var invalidReasons = (_a = config.invalidReasons) !== null && _a !== void 0 ? _a : DEFAULT_INVALID;
|
|
48
|
+
var groupMap = new Map();
|
|
49
|
+
// Pass 1: collect one-of required-group membership + satisfaction.
|
|
50
|
+
var reqGroups = {};
|
|
51
|
+
Object.entries(options).forEach(function (_a) {
|
|
52
|
+
var name = _a[0], schema = _a[1];
|
|
53
|
+
((schema === null || schema === void 0 ? void 0 : schema.required_groups) || []).forEach(function (key) {
|
|
54
|
+
var _a;
|
|
55
|
+
if (!reqGroups[key])
|
|
56
|
+
reqGroups[key] = { key: key, members: [], memberLabels: [], satisfied: false };
|
|
57
|
+
reqGroups[key].members.push(name);
|
|
58
|
+
reqGroups[key].memberLabels.push((schema === null || schema === void 0 ? void 0 : schema.display_name) || name);
|
|
59
|
+
if (!(0, readFirst_1.isOptionValueEmpty)((_a = values[name]) === null || _a === void 0 ? void 0 : _a.value))
|
|
60
|
+
reqGroups[key].satisfied = true;
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
Object.entries(options).forEach(function (_a) {
|
|
64
|
+
var _b, _c;
|
|
65
|
+
var name = _a[0], schema = _a[1];
|
|
66
|
+
var field = values[name];
|
|
67
|
+
var empty = (0, readFirst_1.isOptionValueEmpty)(field === null || field === void 0 ? void 0 : field.value);
|
|
68
|
+
var ownGroups = (schema === null || schema === void 0 ? void 0 : schema.required_groups) || [];
|
|
69
|
+
// Member of a one-of group that nobody has satisfied yet.
|
|
70
|
+
var inUnmetGroup = ownGroups.some(function (k) { return reqGroups[k] && !reqGroups[k].satisfied; });
|
|
71
|
+
var required = !!(schema === null || schema === void 0 ? void 0 : schema.required);
|
|
72
|
+
var status;
|
|
73
|
+
var reason;
|
|
74
|
+
if (invalidReasons[name]) {
|
|
75
|
+
status = 'invalid';
|
|
76
|
+
reason = invalidReasons[name];
|
|
77
|
+
}
|
|
78
|
+
else if (empty && required) {
|
|
79
|
+
status = 'todo';
|
|
80
|
+
reason = 'Needs a value';
|
|
81
|
+
}
|
|
82
|
+
else if (empty && inUnmetGroup) {
|
|
83
|
+
status = 'todo';
|
|
84
|
+
reason = "One of ".concat(reqGroups[ownGroups[0]].memberLabels.join(' / '));
|
|
85
|
+
}
|
|
86
|
+
else if (empty) {
|
|
87
|
+
status = 'unset';
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
status = 'set';
|
|
91
|
+
}
|
|
92
|
+
var groupName = (0, readFirst_1.getOptionGroup)(schema);
|
|
93
|
+
var groupLabel = (_c = (_b = config.groupLabels) === null || _b === void 0 ? void 0 : _b[groupName]) !== null && _c !== void 0 ? _c : (0, readFirst_1.getOptionGroupLabel)(groupName, undefined);
|
|
94
|
+
if (!groupMap.has(groupName)) {
|
|
95
|
+
groupMap.set(groupName, { name: groupName, label: groupLabel, rows: [] });
|
|
96
|
+
}
|
|
97
|
+
groupMap.get(groupName).rows.push({
|
|
98
|
+
name: name,
|
|
99
|
+
label: (schema === null || schema === void 0 ? void 0 : schema.display_name) || name,
|
|
100
|
+
shortDesc: schema === null || schema === void 0 ? void 0 : schema.short_desc,
|
|
101
|
+
longDesc: schema === null || schema === void 0 ? void 0 : schema.desc,
|
|
102
|
+
required: required || ownGroups.length > 0,
|
|
103
|
+
readOnly: !!(schema === null || schema === void 0 ? void 0 : schema.readonly),
|
|
104
|
+
status: status,
|
|
105
|
+
reason: reason,
|
|
106
|
+
value: buildValue(field, schema),
|
|
107
|
+
typeLabel: "".concat((schema === null || schema === void 0 ? void 0 : schema.ui_type) || (schema === null || schema === void 0 ? void 0 : schema.type) || 'auto'),
|
|
108
|
+
requiredGroups: ownGroups,
|
|
109
|
+
inUnmetGroup: inUnmetGroup,
|
|
110
|
+
schema: schema,
|
|
111
|
+
field: field,
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
// Stable group order: 'general' first, then the rest, 'optional' last.
|
|
115
|
+
var groups = Array.from(groupMap.values()).sort(function (a, b) {
|
|
116
|
+
var rank = function (g) { return (g === 'general' ? 0 : g === 'optional' ? 2 : 1); };
|
|
117
|
+
return rank(a.name) - rank(b.name);
|
|
118
|
+
});
|
|
119
|
+
return { groups: groups, requiredGroups: reqGroups };
|
|
120
|
+
}
|
|
121
|
+
exports.buildVariantGroups = buildVariantGroups;
|
|
122
|
+
function summarize(groups) {
|
|
123
|
+
var rows = groups.flatMap(function (g) { return g.rows; });
|
|
124
|
+
var total = rows.length;
|
|
125
|
+
var set = rows.filter(function (r) { return r.status === 'set'; }).length;
|
|
126
|
+
var todo = rows.filter(function (r) { return r.status === 'todo'; }).length;
|
|
127
|
+
var invalid = rows.filter(function (r) { return r.status === 'invalid'; }).length;
|
|
128
|
+
var attention = todo + invalid;
|
|
129
|
+
var pct = total ? Math.round((set / total) * 100) : 0;
|
|
130
|
+
return { total: total, set: set, todo: todo, invalid: invalid, attention: attention, pct: pct };
|
|
131
|
+
}
|
|
132
|
+
exports.summarize = summarize;
|
|
133
|
+
//# sourceMappingURL=variantModel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variantModel.js","sourceRoot":"","sources":["../../../../../src/components/form/engine/variants/variantModel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { IVariantGroup, IVariantRow, IVariantValue, TVariantStatus } from './variantModel';
|
|
3
|
+
export declare function useVariantColors(): {
|
|
4
|
+
main: string;
|
|
5
|
+
text: string;
|
|
6
|
+
muted: string;
|
|
7
|
+
faint: string;
|
|
8
|
+
line: string;
|
|
9
|
+
hover: string;
|
|
10
|
+
surface: string;
|
|
11
|
+
danger: string;
|
|
12
|
+
warning: string;
|
|
13
|
+
success: string;
|
|
14
|
+
info: string;
|
|
15
|
+
custom1: string;
|
|
16
|
+
};
|
|
17
|
+
export declare const STATUS_COLOR: (status: TVariantStatus, c: ReturnType<typeof useVariantColors>) => string;
|
|
18
|
+
/** A single status mark — one dot, color = severity. Replaces stripe+box+icon. */
|
|
19
|
+
export declare const StatusDot: ({ status, size, }: {
|
|
20
|
+
status: TVariantStatus;
|
|
21
|
+
size?: number;
|
|
22
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
/** The value summary. `tone='calm'` desaturates template/richtext chips. */
|
|
24
|
+
export declare const ValueView: ({ value, tone, }: {
|
|
25
|
+
value: IVariantValue;
|
|
26
|
+
tone?: 'calm' | 'vivid';
|
|
27
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
28
|
+
/** A reusable description disclosure used by every variant (tap-friendly).
|
|
29
|
+
* Unifies short_desc (inline) + long desc into ONE control. */
|
|
30
|
+
export declare const useDisclosure: () => {
|
|
31
|
+
isOpen: (id: string) => boolean;
|
|
32
|
+
toggle: (id: string) => void;
|
|
33
|
+
};
|
|
34
|
+
export type TVariantFilter = 'all' | 'attention';
|
|
35
|
+
export declare function useVariantForm(options: any, values: any, config?: any): {
|
|
36
|
+
groups: IVariantGroup[];
|
|
37
|
+
visibleGroups: IVariantGroup[];
|
|
38
|
+
requiredGroups: Record<string, import("./variantModel").IRequiredGroupInfo>;
|
|
39
|
+
summary: {
|
|
40
|
+
total: number;
|
|
41
|
+
set: number;
|
|
42
|
+
todo: number;
|
|
43
|
+
invalid: number;
|
|
44
|
+
attention: number;
|
|
45
|
+
pct: number;
|
|
46
|
+
};
|
|
47
|
+
filter: TVariantFilter;
|
|
48
|
+
setFilter: React.Dispatch<React.SetStateAction<TVariantFilter>>;
|
|
49
|
+
toggleAttention: () => void;
|
|
50
|
+
query: string;
|
|
51
|
+
setQuery: React.Dispatch<React.SetStateAction<string>>;
|
|
52
|
+
showDescriptions: boolean;
|
|
53
|
+
toggleDescriptions: () => void;
|
|
54
|
+
editing: string;
|
|
55
|
+
startEdit: (name: string) => void;
|
|
56
|
+
stopEdit: () => void;
|
|
57
|
+
};
|
|
58
|
+
export type TVariantForm = ReturnType<typeof useVariantForm>;
|
|
59
|
+
/** Compact toolbar: just a prominent filter field. The "needs attention" control
|
|
60
|
+
* lives in each variant's header (the count line is the link); all optional
|
|
61
|
+
* fields render inline in the Optional group, so there's no "add field" step. */
|
|
62
|
+
export declare const VariantToolbar: ({ form }: {
|
|
63
|
+
form: TVariantForm;
|
|
64
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
65
|
+
/** Complex value preview — the SAME nested tree + "Show more" fade the compact
|
|
66
|
+
* engine uses, so hash/list fields show their contents immediately. */
|
|
67
|
+
export declare const ComplexPreview: ({ value, onOpen }: {
|
|
68
|
+
value: unknown;
|
|
69
|
+
onOpen?: () => void;
|
|
70
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
71
|
+
/** Inline editor: mounts the REAL field editor (AutoFormField) for the row's
|
|
72
|
+
* schema + value, so clicking a field edits it for real (string, number, bool,
|
|
73
|
+
* colour, file, richtext, list, date, …). Local state only — the prototype
|
|
74
|
+
* doesn't persist; in the engine this flows through handleValueChange. */
|
|
75
|
+
export declare const InlineEdit: ({ row, onDone }: {
|
|
76
|
+
row: IVariantRow;
|
|
77
|
+
onDone: () => void;
|
|
78
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
79
|
+
//# sourceMappingURL=variantParts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"variantParts.d.ts","sourceRoot":"","sources":["../../../../../src/components/form/engine/variants/variantParts.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAGL,aAAa,EACb,WAAW,EACX,aAAa,EACb,cAAc,EACf,MAAM,gBAAgB,CAAC;AAExB,wBAAgB,gBAAgB;;;;;;;;;;;;;EAiB/B;AAED,eAAO,MAAM,YAAY,WACf,cAAc,KACnB,WAAW,uBAAuB,CAAC,WAK7B,CAAC;AAEZ,kFAAkF;AAClF,eAAO,MAAM,SAAS,sBAGnB;IACD,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,4CAgBA,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,SAAS,qBAGnB;IACD,KAAK,EAAE,aAAa,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACzB,4CAkFA,CAAC;AAEF;gEACgE;AAChE,eAAO,MAAM,aAAa;iBAGT,MAAM;iBACN,MAAM;CAEtB,CAAC;AAMF,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,WAAW,CAAC;AAEjD,wBAAgB,cAAc,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,GAAG;;;;;;;;;;;;;;;;;;;;sBAwChD,MAAM;;EAG3B;AAED,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAE7D;;kFAEkF;AAClF,eAAO,MAAM,cAAc,aAAc;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,4CAgC9D,CAAC;AAEF;wEACwE;AACxE,eAAO,MAAM,cAAc,sBAAuB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;CAAE,4CAWxF,CAAC;AAEF;;;2EAG2E;AAC3E,eAAO,MAAM,UAAU,oBAAqB;IAAE,GAAG,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,MAAM,IAAI,CAAA;CAAE,4CAuBnF,CAAC"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
13
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
14
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.InlineEdit = exports.ComplexPreview = exports.VariantToolbar = exports.useVariantForm = exports.useDisclosure = exports.ValueView = exports.StatusDot = exports.STATUS_COLOR = exports.useVariantColors = void 0;
|
|
18
|
+
var jsx_runtime_1 = require("react/jsx-runtime");
|
|
19
|
+
/**
|
|
20
|
+
* Shared rendering parts for the FormEngine compact VARIANTS playground.
|
|
21
|
+
* Value rendering is shared so every variant shows identical data; the `tone`
|
|
22
|
+
* prop lets a variant choose a calm (desaturated) or vivid chip treatment.
|
|
23
|
+
*/
|
|
24
|
+
var reqore_1 = require("@qoretechnologies/reqore");
|
|
25
|
+
var useTheme_1 = require("@qoretechnologies/reqore/dist/hooks/useTheme");
|
|
26
|
+
var react_1 = __importDefault(require("react"));
|
|
27
|
+
var AutoFormField_1 = require("../../fields/auto/AutoFormField");
|
|
28
|
+
var StructuredDataView_1 = require("../_structuredData/StructuredDataView");
|
|
29
|
+
var variantModel_1 = require("./variantModel");
|
|
30
|
+
function useVariantColors() {
|
|
31
|
+
var _a, _b, _c, _d, _e, _f;
|
|
32
|
+
var theme = (0, useTheme_1.useReqoreTheme)();
|
|
33
|
+
var intents = (theme.intents || {});
|
|
34
|
+
return {
|
|
35
|
+
main: theme.main,
|
|
36
|
+
text: ((_a = theme.text) === null || _a === void 0 ? void 0 : _a.color) || '#e8e8e8',
|
|
37
|
+
muted: "".concat(((_b = theme.text) === null || _b === void 0 ? void 0 : _b.color) || '#e8e8e8', "99"),
|
|
38
|
+
faint: "".concat(((_c = theme.text) === null || _c === void 0 ? void 0 : _c.color) || '#e8e8e8', "55"),
|
|
39
|
+
line: "".concat(((_d = theme.text) === null || _d === void 0 ? void 0 : _d.color) || '#ffffff', "14"),
|
|
40
|
+
hover: "".concat(((_e = theme.text) === null || _e === void 0 ? void 0 : _e.color) || '#ffffff', "0c"),
|
|
41
|
+
surface: "".concat(((_f = theme.text) === null || _f === void 0 ? void 0 : _f.color) || '#ffffff', "08"),
|
|
42
|
+
danger: intents.danger || '#a82a2a',
|
|
43
|
+
warning: intents.warning || '#d17c29',
|
|
44
|
+
success: intents.success || '#4a7110',
|
|
45
|
+
info: intents.info || '#3b7bbf',
|
|
46
|
+
custom1: intents.custom1 || '#762f7e',
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
exports.useVariantColors = useVariantColors;
|
|
50
|
+
var STATUS_COLOR = function (status, c) {
|
|
51
|
+
return status === 'invalid' ? c.danger
|
|
52
|
+
: status === 'todo' ? c.warning
|
|
53
|
+
: status === 'set' ? c.success
|
|
54
|
+
: c.faint;
|
|
55
|
+
};
|
|
56
|
+
exports.STATUS_COLOR = STATUS_COLOR;
|
|
57
|
+
/** A single status mark — one dot, color = severity. Replaces stripe+box+icon. */
|
|
58
|
+
var StatusDot = function (_a) {
|
|
59
|
+
var status = _a.status, _b = _a.size, size = _b === void 0 ? 7 : _b;
|
|
60
|
+
var c = useVariantColors();
|
|
61
|
+
if (status === 'unset')
|
|
62
|
+
return null;
|
|
63
|
+
return ((0, jsx_runtime_1.jsx)("span", { "aria-hidden": true, style: {
|
|
64
|
+
width: size,
|
|
65
|
+
height: size,
|
|
66
|
+
borderRadius: '50%',
|
|
67
|
+
flex: '0 0 auto',
|
|
68
|
+
background: (0, exports.STATUS_COLOR)(status, c),
|
|
69
|
+
boxShadow: status !== 'set' ? "0 0 0 3px ".concat((0, exports.STATUS_COLOR)(status, c), "22") : undefined,
|
|
70
|
+
} }));
|
|
71
|
+
};
|
|
72
|
+
exports.StatusDot = StatusDot;
|
|
73
|
+
/** The value summary. `tone='calm'` desaturates template/richtext chips. */
|
|
74
|
+
var ValueView = function (_a) {
|
|
75
|
+
var value = _a.value, _b = _a.tone, tone = _b === void 0 ? 'calm' : _b;
|
|
76
|
+
var c = useVariantColors();
|
|
77
|
+
var ellipsis = {
|
|
78
|
+
overflow: 'hidden',
|
|
79
|
+
textOverflow: 'ellipsis',
|
|
80
|
+
whiteSpace: 'nowrap',
|
|
81
|
+
minWidth: 0,
|
|
82
|
+
};
|
|
83
|
+
switch (value.kind) {
|
|
84
|
+
case 'empty':
|
|
85
|
+
// A quiet dash reads as "no value" without shouting "Not set" on every row.
|
|
86
|
+
return (0, jsx_runtime_1.jsx)("span", { style: { color: c.faint }, children: "\u2014" });
|
|
87
|
+
case 'color':
|
|
88
|
+
return ((0, jsx_runtime_1.jsxs)("span", { style: { display: 'inline-flex', alignItems: 'center', gap: 7, minWidth: 0 }, children: [(0, jsx_runtime_1.jsx)("span", { "aria-hidden": true, style: {
|
|
89
|
+
width: 12,
|
|
90
|
+
height: 12,
|
|
91
|
+
borderRadius: 3,
|
|
92
|
+
flex: '0 0 auto',
|
|
93
|
+
background: value.extra,
|
|
94
|
+
border: "1px solid ".concat(c.line),
|
|
95
|
+
} }), (0, jsx_runtime_1.jsx)("span", { style: ellipsis, children: value.display })] }));
|
|
96
|
+
case 'file':
|
|
97
|
+
return ((0, jsx_runtime_1.jsxs)("span", { style: { display: 'inline-flex', alignItems: 'center', gap: 6, minWidth: 0 }, children: [(0, jsx_runtime_1.jsx)(reqore_1.ReqoreIcon, { icon: 'FileLine', size: '13px', style: { color: c.muted, flexShrink: 0 } }), (0, jsx_runtime_1.jsx)("span", { style: ellipsis, children: value.display }), value.extra ?
|
|
98
|
+
(0, jsx_runtime_1.jsx)("span", { style: { color: c.faint, fontSize: 11, flexShrink: 0 }, children: value.extra })
|
|
99
|
+
: null] }));
|
|
100
|
+
case 'bool':
|
|
101
|
+
return (0, jsx_runtime_1.jsx)("span", { children: value.display });
|
|
102
|
+
case 'hash':
|
|
103
|
+
return ((0, jsx_runtime_1.jsxs)("span", { style: { display: 'inline-flex', alignItems: 'center', gap: 6, color: c.muted }, children: [(0, jsx_runtime_1.jsx)(reqore_1.ReqoreIcon, { icon: 'BracesLine', size: '12px', style: { color: c.faint } }), (0, jsx_runtime_1.jsx)("span", { children: value.display })] }));
|
|
104
|
+
case 'template':
|
|
105
|
+
return tone === 'vivid' ?
|
|
106
|
+
(0, jsx_runtime_1.jsx)(reqore_1.ReqoreTag, { size: 'small', intent: 'info', icon: 'ExchangeDollarLine', label: value.display })
|
|
107
|
+
: (0, jsx_runtime_1.jsxs)("span", { style: __assign({ display: 'inline-flex', alignItems: 'center', gap: 5, padding: '1px 7px', borderRadius: 4, background: c.surface, border: "1px solid ".concat(c.line), color: c.text, fontSize: 12, maxWidth: '100%' }, ellipsis), children: [(0, jsx_runtime_1.jsx)(reqore_1.ReqoreIcon, { icon: 'ExchangeDollarLine', size: '11px', style: { color: c.custom1, flexShrink: 0 } }), (0, jsx_runtime_1.jsx)("span", { style: ellipsis, children: value.display })] });
|
|
108
|
+
case 'richtext':
|
|
109
|
+
return (0, jsx_runtime_1.jsx)("span", { style: ellipsis, children: value.display });
|
|
110
|
+
default:
|
|
111
|
+
return (0, jsx_runtime_1.jsx)("span", { style: ellipsis, children: value.display });
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
exports.ValueView = ValueView;
|
|
115
|
+
/** A reusable description disclosure used by every variant (tap-friendly).
|
|
116
|
+
* Unifies short_desc (inline) + long desc into ONE control. */
|
|
117
|
+
var useDisclosure = function () {
|
|
118
|
+
var _a = react_1.default.useState({}), open = _a[0], setOpen = _a[1];
|
|
119
|
+
return {
|
|
120
|
+
isOpen: function (id) { return !!open[id]; },
|
|
121
|
+
toggle: function (id) { return setOpen(function (p) {
|
|
122
|
+
var _a;
|
|
123
|
+
return (__assign(__assign({}, p), (_a = {}, _a[id] = !p[id], _a)));
|
|
124
|
+
}); },
|
|
125
|
+
};
|
|
126
|
+
};
|
|
127
|
+
exports.useDisclosure = useDisclosure;
|
|
128
|
+
function useVariantForm(options, values, config) {
|
|
129
|
+
var _a = react_1.default.useState('all'), filter = _a[0], setFilter = _a[1];
|
|
130
|
+
var _b = react_1.default.useState(''), query = _b[0], setQuery = _b[1];
|
|
131
|
+
var _c = react_1.default.useState(false), showDescriptions = _c[0], setShowDescriptions = _c[1];
|
|
132
|
+
var _d = react_1.default.useState(null), editing = _d[0], setEditing = _d[1];
|
|
133
|
+
var _e = react_1.default.useMemo(function () { return (0, variantModel_1.buildVariantGroups)(options, values, config); }, [options, values, config]), groups = _e.groups, requiredGroups = _e.requiredGroups;
|
|
134
|
+
var summary = react_1.default.useMemo(function () { return (0, variantModel_1.summarize)(groups); }, [groups]);
|
|
135
|
+
// Filtered view: text query (label match) + 'attention' (todo/invalid only).
|
|
136
|
+
var visibleGroups = react_1.default.useMemo(function () {
|
|
137
|
+
var q = query.trim().toLowerCase();
|
|
138
|
+
return groups
|
|
139
|
+
.map(function (g) { return (__assign(__assign({}, g), { rows: g.rows.filter(function (r) {
|
|
140
|
+
return (filter === 'all' || r.status === 'todo' || r.status === 'invalid') &&
|
|
141
|
+
(!q || r.label.toLowerCase().includes(q) || r.name.toLowerCase().includes(q));
|
|
142
|
+
}) })); })
|
|
143
|
+
.filter(function (g) { return g.rows.length; });
|
|
144
|
+
}, [groups, filter, query]);
|
|
145
|
+
return {
|
|
146
|
+
groups: groups,
|
|
147
|
+
visibleGroups: visibleGroups,
|
|
148
|
+
requiredGroups: requiredGroups,
|
|
149
|
+
summary: summary,
|
|
150
|
+
filter: filter,
|
|
151
|
+
setFilter: setFilter,
|
|
152
|
+
toggleAttention: function () { return setFilter(function (f) { return (f === 'attention' ? 'all' : 'attention'); }); },
|
|
153
|
+
query: query,
|
|
154
|
+
setQuery: setQuery,
|
|
155
|
+
showDescriptions: showDescriptions,
|
|
156
|
+
toggleDescriptions: function () { return setShowDescriptions(function (v) { return !v; }); },
|
|
157
|
+
editing: editing,
|
|
158
|
+
startEdit: function (name) { return setEditing(function (cur) { return (cur === name ? null : name); }); },
|
|
159
|
+
stopEdit: function () { return setEditing(null); },
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
exports.useVariantForm = useVariantForm;
|
|
163
|
+
/** Compact toolbar: just a prominent filter field. The "needs attention" control
|
|
164
|
+
* lives in each variant's header (the count line is the link); all optional
|
|
165
|
+
* fields render inline in the Optional group, so there's no "add field" step. */
|
|
166
|
+
var VariantToolbar = function (_a) {
|
|
167
|
+
var form = _a.form;
|
|
168
|
+
var c = useVariantColors();
|
|
169
|
+
var summary = form.summary, query = form.query, setQuery = form.setQuery, showDescriptions = form.showDescriptions, toggleDescriptions = form.toggleDescriptions;
|
|
170
|
+
return ((0, jsx_runtime_1.jsxs)(reqore_1.ReqoreControlGroup, { verticalAlign: 'center', fluid: true, children: [(0, jsx_runtime_1.jsx)(reqore_1.ReqoreInput, { placeholder: 'Filter fields\u2026', icon: 'Search2Line', iconColor: 'muted', pill: true, fluid: true, value: query, onChange: function (e) { return setQuery(e.currentTarget.value); }, onClearClick: function () { return setQuery(''); } }), (0, jsx_runtime_1.jsx)(reqore_1.ReqoreButton, { fixed: true, flat: true, minimal: true, intent: showDescriptions ? 'info' : undefined, active: showDescriptions, icon: showDescriptions ? 'InformationFill' : 'InformationLine', tooltip: showDescriptions ? 'Hide field descriptions' : 'Show field descriptions', onClick: toggleDescriptions }), (0, jsx_runtime_1.jsxs)("span", { style: { color: c.faint, fontSize: 12, paddingLeft: 4, whiteSpace: 'nowrap' }, children: [summary.set, "/", summary.total, " set"] })] }));
|
|
171
|
+
};
|
|
172
|
+
exports.VariantToolbar = VariantToolbar;
|
|
173
|
+
/** Complex value preview — the SAME nested tree + "Show more" fade the compact
|
|
174
|
+
* engine uses, so hash/list fields show their contents immediately. */
|
|
175
|
+
var ComplexPreview = function (_a) {
|
|
176
|
+
var value = _a.value, onOpen = _a.onOpen;
|
|
177
|
+
return ((0, jsx_runtime_1.jsx)(reqore_1.ReqoreCollapsibleContent, { maxCollapsedHeight: 120, children: (0, jsx_runtime_1.jsx)("div", { onClick: function (e) { return e.stopPropagation(); }, children: (0, jsx_runtime_1.jsx)(StructuredDataView_1.StructuredDataView, { value: value, collapsibleRoot: false, defaultExpandDepth: 2, onItemClick: onOpen }) }) }));
|
|
178
|
+
};
|
|
179
|
+
exports.ComplexPreview = ComplexPreview;
|
|
180
|
+
/** Inline editor: mounts the REAL field editor (AutoFormField) for the row's
|
|
181
|
+
* schema + value, so clicking a field edits it for real (string, number, bool,
|
|
182
|
+
* colour, file, richtext, list, date, …). Local state only — the prototype
|
|
183
|
+
* doesn't persist; in the engine this flows through handleValueChange. */
|
|
184
|
+
var InlineEdit = function (_a) {
|
|
185
|
+
var _b, _c;
|
|
186
|
+
var row = _a.row, onDone = _a.onDone;
|
|
187
|
+
var _d = react_1.default.useState((_b = row.field) === null || _b === void 0 ? void 0 : _b.value), value = _d[0], setValue = _d[1];
|
|
188
|
+
return ((0, jsx_runtime_1.jsxs)("div", { style: { gridColumn: '1 / -1', display: 'flex', flexFlow: 'column', gap: 8, padding: '10px 0 12px' }, onClick: function (e) { return e.stopPropagation(); }, children: [(0, jsx_runtime_1.jsx)(AutoFormField_1.AutoFormField, __assign({}, (row.schema || {}), { name: row.name, value: value, default_value: (_c = row.schema) === null || _c === void 0 ? void 0 : _c.default_value, onChange: function (_n, v) { return setValue(v); }, fluid: true, size: 'small' })), (0, jsx_runtime_1.jsx)("div", { style: { display: 'flex', justifyContent: 'flex-end' }, children: (0, jsx_runtime_1.jsx)(reqore_1.ReqoreButton, { size: 'small', intent: 'success', icon: 'CheckLine', fixed: true, onClick: onDone, children: "Done" }) })] }));
|
|
189
|
+
};
|
|
190
|
+
exports.InlineEdit = InlineEdit;
|
|
191
|
+
//# sourceMappingURL=variantParts.js.map
|