@stonecrop/stonecrop 0.10.11 → 0.10.13
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/dist/composables/stonecrop.js +26 -110
- package/dist/field-triggers.js +5 -6
- package/dist/index.js +9 -6
- package/dist/plugins/index.js +4 -1
- package/dist/registry.js +62 -61
- package/dist/schema-validator.js +1 -13
- package/dist/src/composables/stonecrop.d.ts +2 -74
- package/dist/src/composables/stonecrop.d.ts.map +1 -1
- package/dist/src/doctype.d.ts +1 -27
- package/dist/src/doctype.d.ts.map +1 -1
- package/dist/src/field-triggers.d.ts.map +1 -1
- package/dist/src/index.d.ts +6 -9
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/plugins/index.d.ts.map +1 -1
- package/dist/src/registry.d.ts +13 -10
- package/dist/src/registry.d.ts.map +1 -1
- package/dist/src/schema-validator.d.ts +1 -62
- package/dist/src/schema-validator.d.ts.map +1 -1
- package/dist/src/stonecrop.d.ts +38 -17
- package/dist/src/stonecrop.d.ts.map +1 -1
- package/dist/src/stores/operation-log.d.ts +1 -1
- package/dist/src/types/composable.d.ts +230 -0
- package/dist/src/types/composable.d.ts.map +1 -0
- package/dist/src/types/doctype.d.ts +57 -0
- package/dist/src/types/doctype.d.ts.map +1 -0
- package/dist/src/types/index.d.ts +6 -67
- package/dist/src/types/index.d.ts.map +1 -1
- package/dist/src/types/plugin.d.ts +37 -0
- package/dist/src/types/plugin.d.ts.map +1 -0
- package/dist/src/types/schema-validator.d.ts +64 -0
- package/dist/src/types/schema-validator.d.ts.map +1 -0
- package/dist/src/types/stonecrop.d.ts +17 -0
- package/dist/src/types/stonecrop.d.ts.map +1 -0
- package/dist/stonecrop.css +1 -0
- package/dist/stonecrop.d.ts +206 -14
- package/dist/stonecrop.js +1751 -1631
- package/dist/stonecrop.js.map +1 -1
- package/dist/types/composable.js +0 -0
- package/dist/types/doctype.js +0 -0
- package/dist/types/index.js +7 -2
- package/dist/types/plugin.js +0 -0
- package/dist/types/schema-validator.js +13 -0
- package/dist/types/stonecrop.js +0 -0
- package/package.json +4 -4
- package/src/composables/stonecrop.ts +34 -218
- package/src/doctype.ts +2 -29
- package/src/field-triggers.ts +5 -6
- package/src/index.ts +12 -19
- package/src/plugins/index.ts +4 -1
- package/src/registry.ts +61 -66
- package/src/schema-validator.ts +3 -66
- package/src/stonecrop.ts +148 -17
- package/src/types/composable.ts +245 -0
- package/src/types/doctype.ts +60 -0
- package/src/types/index.ts +7 -74
- package/src/types/plugin.ts +38 -0
- package/src/types/schema-validator.ts +67 -0
- package/src/types/stonecrop.ts +17 -0
|
@@ -1,70 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import { List, Map } from 'immutable';
|
|
4
|
-
import type { Component } from 'vue';
|
|
5
|
-
import type { Router } from 'vue-router';
|
|
6
|
-
import type { AnyStateNodeConfig, UnknownMachineConfig } from 'xstate';
|
|
7
|
-
import type Doctype from '../doctype';
|
|
8
|
-
import Registry from '../registry';
|
|
9
|
-
import { Stonecrop } from '../stonecrop';
|
|
10
|
-
import type { RouteContext } from './registry';
|
|
11
|
-
/**
|
|
12
|
-
* Immutable Doctype type for Stonecrop instances
|
|
13
|
-
* @public
|
|
14
|
-
*/
|
|
15
|
-
export type ImmutableDoctype = {
|
|
16
|
-
readonly schema?: List<SchemaTypes>;
|
|
17
|
-
readonly workflow?: UnknownMachineConfig | AnyStateNodeConfig | WorkflowMeta;
|
|
18
|
-
readonly actions?: Map<string, string[]>;
|
|
19
|
-
};
|
|
20
|
-
/**
|
|
21
|
-
* Mutable Doctype type for Stonecrop instances
|
|
22
|
-
* @public
|
|
23
|
-
*/
|
|
24
|
-
export type MutableDoctype = {
|
|
25
|
-
doctype?: string;
|
|
26
|
-
schema?: SchemaTypes[];
|
|
27
|
-
workflow?: UnknownMachineConfig | AnyStateNodeConfig | WorkflowMeta;
|
|
28
|
-
actions?: Record<string, string[]>;
|
|
29
|
-
};
|
|
30
|
-
/**
|
|
31
|
-
* Schema type for Stonecrop instances
|
|
32
|
-
* @public
|
|
33
|
-
*/
|
|
34
|
-
export type Schema = {
|
|
35
|
-
doctype: string;
|
|
36
|
-
schema: List<SchemaTypes>;
|
|
37
|
-
};
|
|
38
|
-
/**
|
|
39
|
-
* Install options for Stonecrop Vue plugin
|
|
40
|
-
* @public
|
|
41
|
-
*/
|
|
42
|
-
export type InstallOptions = {
|
|
43
|
-
router?: Router;
|
|
44
|
-
components?: Record<string, Component>;
|
|
45
|
-
getMeta?: (routeContext: RouteContext) => Doctype | Promise<Doctype>;
|
|
46
|
-
/**
|
|
47
|
-
* Data client for fetching doctype metadata and records.
|
|
48
|
-
* Use \@stonecrop/graphql-client's StonecropClient for GraphQL backends,
|
|
49
|
-
* or implement DataClient for custom data sources.
|
|
50
|
-
*
|
|
51
|
-
* Can be set later via `useStonecropRegistry().setClient()` for deferred configuration.
|
|
52
|
-
*
|
|
53
|
-
* @example
|
|
54
|
-
* ```ts
|
|
55
|
-
* import { StonecropClient } from '@stonecrop/graphql-client'
|
|
56
|
-
*
|
|
57
|
-
* const client = new StonecropClient({ endpoint: '/graphql' })
|
|
58
|
-
* app.use(StonecropPlugin, { client })
|
|
59
|
-
* ```
|
|
60
|
-
*/
|
|
61
|
-
client?: DataClient;
|
|
62
|
-
/** Automatically run initialization callback after app mounting (default: false) */
|
|
63
|
-
autoInitializeRouter?: boolean;
|
|
64
|
-
/** Callback function called after plugin is ready and mounted */
|
|
65
|
-
onRouterInitialized?: (registry: Registry, stonecrop: Stonecrop) => void | Promise<void>;
|
|
66
|
-
};
|
|
1
|
+
export * from './composable';
|
|
2
|
+
export * from './doctype';
|
|
67
3
|
export * from './field-triggers';
|
|
68
|
-
export * from './registry';
|
|
69
4
|
export * from './operation-log';
|
|
5
|
+
export * from './plugin';
|
|
6
|
+
export * from './registry';
|
|
7
|
+
export * from './schema-validator';
|
|
8
|
+
export * from './stonecrop';
|
|
70
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AACA,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,cAAc,kBAAkB,CAAA;AAChC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,UAAU,CAAA;AACxB,cAAc,YAAY,CAAA;AAC1B,cAAc,oBAAoB,CAAA;AAClC,cAAc,aAAa,CAAA"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { DataClient } from '@stonecrop/schema';
|
|
2
|
+
import type { Component } from 'vue';
|
|
3
|
+
import type { Router } from 'vue-router';
|
|
4
|
+
import type Doctype from '../doctype';
|
|
5
|
+
import type Registry from '../registry';
|
|
6
|
+
import type { Stonecrop } from '../stonecrop';
|
|
7
|
+
import type { RouteContext } from './registry';
|
|
8
|
+
/**
|
|
9
|
+
* Install options for Stonecrop Vue plugin
|
|
10
|
+
* @public
|
|
11
|
+
*/
|
|
12
|
+
export type InstallOptions = {
|
|
13
|
+
router?: Router;
|
|
14
|
+
components?: Record<string, Component>;
|
|
15
|
+
getMeta?: (routeContext: RouteContext) => Doctype | Promise<Doctype>;
|
|
16
|
+
/**
|
|
17
|
+
* Data client for fetching doctype metadata and records.
|
|
18
|
+
* Use \@stonecrop/graphql-client's StonecropClient for GraphQL backends,
|
|
19
|
+
* or implement DataClient for custom data sources.
|
|
20
|
+
*
|
|
21
|
+
* Can be set later via `useStonecropRegistry().setClient()` for deferred configuration.
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```ts
|
|
25
|
+
* import { StonecropClient } from '@stonecrop/graphql-client'
|
|
26
|
+
*
|
|
27
|
+
* const client = new StonecropClient({ endpoint: '/graphql' })
|
|
28
|
+
* app.use(StonecropPlugin, { client })
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
client?: DataClient;
|
|
32
|
+
/** Automatically run initialization callback after app mounting (default: false) */
|
|
33
|
+
autoInitializeRouter?: boolean;
|
|
34
|
+
/** Callback function called after plugin is ready and mounted */
|
|
35
|
+
onRouterInitialized?: (registry: Registry, stonecrop: Stonecrop) => void | Promise<void>;
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/types/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AACnD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,KAAK,CAAA;AACpC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAExC,OAAO,KAAK,OAAO,MAAM,YAAY,CAAA;AACrC,OAAO,KAAK,QAAQ,MAAM,aAAa,CAAA;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAE9C;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IACtC,OAAO,CAAC,EAAE,CAAC,YAAY,EAAE,YAAY,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IACpE;;;;;;;;;;;;;;OAcG;IACH,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,oFAAoF;IACpF,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,iEAAiE;IACjE,mBAAmB,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACxF,CAAA"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type Registry from '../registry';
|
|
2
|
+
/**
|
|
3
|
+
* Validation severity levels
|
|
4
|
+
* @public
|
|
5
|
+
*/
|
|
6
|
+
export declare enum ValidationSeverity {
|
|
7
|
+
/** Blocking error that prevents save */
|
|
8
|
+
ERROR = "error",
|
|
9
|
+
/** Advisory warning that allows save */
|
|
10
|
+
WARNING = "warning",
|
|
11
|
+
/** Informational message */
|
|
12
|
+
INFO = "info"
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Validation issue
|
|
16
|
+
* @public
|
|
17
|
+
*/
|
|
18
|
+
export interface ValidationIssue {
|
|
19
|
+
/** Severity level */
|
|
20
|
+
severity: ValidationSeverity;
|
|
21
|
+
/** Validation rule that failed */
|
|
22
|
+
rule: string;
|
|
23
|
+
/** Human-readable message */
|
|
24
|
+
message: string;
|
|
25
|
+
/** Doctype name */
|
|
26
|
+
doctype?: string;
|
|
27
|
+
/** Field name if applicable */
|
|
28
|
+
fieldname?: string;
|
|
29
|
+
/** Additional context */
|
|
30
|
+
context?: Record<string, unknown>;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Validation result
|
|
34
|
+
* @public
|
|
35
|
+
*/
|
|
36
|
+
export interface ValidationResult {
|
|
37
|
+
/** Whether validation passed (no blocking errors) */
|
|
38
|
+
valid: boolean;
|
|
39
|
+
/** List of validation issues */
|
|
40
|
+
issues: ValidationIssue[];
|
|
41
|
+
/** Count of errors */
|
|
42
|
+
errorCount: number;
|
|
43
|
+
/** Count of warnings */
|
|
44
|
+
warningCount: number;
|
|
45
|
+
/** Count of info messages */
|
|
46
|
+
infoCount: number;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Schema validator options
|
|
50
|
+
* @public
|
|
51
|
+
*/
|
|
52
|
+
export interface ValidatorOptions {
|
|
53
|
+
/** Registry instance for doctype lookups */
|
|
54
|
+
registry?: Registry;
|
|
55
|
+
/** Whether to validate Link field targets */
|
|
56
|
+
validateLinkTargets?: boolean;
|
|
57
|
+
/** Whether to validate workflow reachability */
|
|
58
|
+
validateWorkflows?: boolean;
|
|
59
|
+
/** Whether to validate action registration */
|
|
60
|
+
validateActions?: boolean;
|
|
61
|
+
/** Whether to validate required schema properties */
|
|
62
|
+
validateRequiredProperties?: boolean;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=schema-validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-validator.d.ts","sourceRoot":"","sources":["../../../src/types/schema-validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,aAAa,CAAA;AAEvC;;;GAGG;AACH,oBAAY,kBAAkB;IAC7B,wCAAwC;IACxC,KAAK,UAAU;IACf,wCAAwC;IACxC,OAAO,YAAY;IACnB,4BAA4B;IAC5B,IAAI,SAAS;CACb;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC/B,qBAAqB;IACrB,QAAQ,EAAE,kBAAkB,CAAA;IAC5B,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAA;IACZ,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,mBAAmB;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,+BAA+B;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,yBAAyB;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACjC;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAChC,qDAAqD;IACrD,KAAK,EAAE,OAAO,CAAA;IACd,gCAAgC;IAChC,MAAM,EAAE,eAAe,EAAE,CAAA;IACzB,sBAAsB;IACtB,UAAU,EAAE,MAAM,CAAA;IAClB,wBAAwB;IACxB,YAAY,EAAE,MAAM,CAAA;IACpB,6BAA6B;IAC7B,SAAS,EAAE,MAAM,CAAA;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAChC,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,6CAA6C;IAC7C,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,gDAAgD;IAChD,iBAAiB,CAAC,EAAE,OAAO,CAAA;IAC3B,8CAA8C;IAC9C,eAAe,CAAC,EAAE,OAAO,CAAA;IACzB,qDAAqD;IACrD,0BAA0B,CAAC,EAAE,OAAO,CAAA;CACpC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { DataClient } from '@stonecrop/schema';
|
|
2
|
+
/**
|
|
3
|
+
* Options for constructing a Stonecrop instance directly.
|
|
4
|
+
* When using the Vue plugin, pass these via `InstallOptions` instead.
|
|
5
|
+
* @public
|
|
6
|
+
*/
|
|
7
|
+
export interface StonecropOptions {
|
|
8
|
+
/**
|
|
9
|
+
* Data client for fetching doctype metadata and records.
|
|
10
|
+
* Use \@stonecrop/graphql-client's StonecropClient for GraphQL backends,
|
|
11
|
+
* or implement DataClient for custom data sources.
|
|
12
|
+
*
|
|
13
|
+
* Can be set later via `setClient()` for deferred configuration.
|
|
14
|
+
*/
|
|
15
|
+
client?: DataClient;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=stonecrop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stonecrop.d.ts","sourceRoot":"","sources":["../../../src/types/stonecrop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAEnD;;;;GAIG;AACH,MAAM,WAAW,gBAAgB;IAChC;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,UAAU,CAAA;CACnB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@import"https://fonts.googleapis.com/css2?family=Arimo:ital,wght@0,400..700;1,400..700&display=swap";.atable-cell{border-radius:0;box-sizing:border-box;outline:none;box-shadow:none;color:var(--sc-cell-text-color);padding-left:.5ch!important;padding-right:.5ch;padding-top:var(--sc-atable-row-padding);padding-bottom:var(--sc-atable-row-padding);border-spacing:0px;border-collapse:collapse;overflow:hidden;text-overflow:ellipsis;order:1;white-space:nowrap;max-width:40ch;border-top:1px solid var(--sc-row-border-color);margin:0 0 0 1px}.atable-cell a{color:var(--sc-cell-text-color);text-decoration:none}.atable-cell:focus,.atable-cell:focus-within{background-color:var(--sc-focus-cell-background);outline-width:var(--sc-atable-cell-border-width);outline-style:solid;outline-offset:calc(var(--sc-atable-cell-border-width) * -1);outline-color:var(--sc-focus-cell-outline);box-shadow:none;overflow:hidden;text-wrap:nowrap;box-sizing:border-box}.cell-modified{font-weight:700;font-style:italic}.cell-modified-highlight{background-color:var(--sc-cell-changed-color)}.row-index{color:var(--sc-header-text-color);font-weight:700;text-align:center;-webkit-user-select:none;user-select:none;width:2ch;display:flex;align-items:center;justify-content:center}.expandable-row{border-top:1px solid var(--sc-row-border-color);height:var(--sc-atable-row-height)}.expandable-row>td:first-child{border-left:4px solid var(--sc-row-border-color)}.expanded-row{border-left:2px solid var(--sc-row-border-color)}.expandable-row:last-child{border-bottom:1px solid var(--sc-row-border-color)}.expanded-row-content{border-top:1px solid var(--sc-row-border-color);padding:1.5rem}.expandable-row.changed-row-gradient[data-v-a42297c7]:has(td.cell-modified){--cell-color-start: color-mix(in srgb, var(--sc-cell-changed-color), #fff 20%);--cell-color-end: color-mix(in srgb, var(--sc-cell-changed-color), #fff 60%);background:linear-gradient(90deg,var(--cell-color-start),var(--cell-color-end))}.aganttcell[data-v-8917a8a3]{background-color:#f9f9f9;width:100%;padding:0;height:100%}.gantt-container[data-v-8917a8a3]{position:relative;height:100%;background-color:#f0f0f0;border-radius:4px;overflow:visible}.gantt-bar[data-v-8917a8a3]{position:absolute;border-radius:4px;display:flex;align-items:center;justify-content:space-between;cursor:grab;box-sizing:border-box;border:1px solid rgba(0,0,0,.5);transition:left .1s ease-out,width .1s ease-out;height:80%;top:50%;z-index:2;transform:translateY(-50%)}.gantt-bar[data-v-8917a8a3]:active{cursor:grabbing}.gantt-bar.is-dragging[data-v-8917a8a3]{z-index:10}.gantt-label[data-v-8917a8a3]{flex:1;text-align:center;font-size:12px;color:#aaa;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding:0 8px;-webkit-user-select:none;user-select:none}.resize-handle[data-v-8917a8a3]{position:relative;width:12px;height:100%;cursor:ew-resize;display:flex;align-items:center;justify-content:center;z-index:0;background:#00000040}.left-resize-handle[data-v-8917a8a3]{border-right:1px solid rgba(0,0,0,.5)}.right-resize-handle[data-v-8917a8a3]{border-left:1px solid rgba(0,0,0,.5)}.handle-grip[data-v-8917a8a3]{width:4px;height:12px;border-radius:2px;background:#000c}.resize-handle[data-v-8917a8a3]:hover{background-color:#ffffff80}.vertical-indicator[data-v-8917a8a3]{position:absolute;width:2px;opacity:0;pointer-events:none;transition:opacity .2s ease;top:-100vh;height:100vh;z-index:5;background-color:var(--v6d722296)}.left-indicator[data-v-8917a8a3]{left:50%;transform:translate(-50%)}.right-indicator[data-v-8917a8a3]{right:50%;transform:translate(50%)}.resize-handle.is-dragging .vertical-indicator[data-v-8917a8a3]{opacity:.7}.gantt-container[data-v-8917a8a3]:after{content:"";position:absolute;inset:0;background-size:calc(100% / var(--v260b36f8)) 100%;background-image:linear-gradient(to right,rgba(0,0,0,.1) 1px,transparent 1px);pointer-events:none;z-index:1}.connection-handle[data-v-8917a8a3]{position:absolute;top:50%;transform:translateY(-50%);width:16px;height:16px;opacity:0;transition:opacity .2s ease;cursor:crosshair;z-index:15;display:flex;align-items:center;justify-content:center}.connection-handle.visible[data-v-8917a8a3]{opacity:1}.left-connection-handle[data-v-8917a8a3]{left:-16px}.right-connection-handle[data-v-8917a8a3]{right:-16px}.connection-dot[data-v-8917a8a3]{width:8px;height:8px;border-radius:50%;background-color:#2196f3;border:2px solid white;box-shadow:0 1px 3px #0000004d}.connection-handle:hover .connection-dot[data-v-8917a8a3]{background-color:#1976d2;transform:scale(1.2)}.connection-handle.is-dragging[data-v-8917a8a3]{opacity:1!important}.connection-handle.is-dragging .connection-dot[data-v-8917a8a3]{background-color:#1976d2;transform:scale(1.3);box-shadow:0 2px 8px #2196f366}.atable-row-actions{width:2rem;min-width:2rem;padding:0 .25rem;vertical-align:middle;white-space:nowrap;border-top:1px solid var(--sc-row-border-color);background:#fff;-webkit-user-select:none;user-select:none;position:relative}.atable-row-actions.dropdown-active{z-index:500}.row-actions-icons{display:flex;gap:.25rem;align-items:center;justify-content:center}.row-action-btn{display:inline-flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;padding:.125rem;border:none;background:transparent;cursor:pointer;border-radius:.25rem;transition:background-color .15s ease}.row-action-btn:hover{background-color:var(--sc-gray-10, #e5e5e5)}.row-action-btn:focus{outline:2px solid var(--sc-focus-cell-outline, #3b82f6);outline-offset:1px}.row-action-btn .action-icon{display:flex;align-items:center;justify-content:center;width:1rem;height:1rem}.row-action-btn .action-icon :deep(svg){width:100%;height:100%}.row-actions-dropdown{position:relative;display:inline-block}.row-actions-dropdown:has(button:focus){outline:2px solid var(--sc-focus-cell-outline);outline-offset:-2px}.row-actions-toggle{display:inline-flex;align-items:center;justify-content:center;width:1.5rem;height:1.5rem;padding:0;border:none;background:transparent;cursor:pointer;border-radius:.25rem;font-size:1rem;font-weight:700;transition:background-color .15s ease}.row-actions-toggle:hover{background-color:var(--sc-gray-10, #e5e5e5)}.dropdown-icon{line-height:1}.row-actions-menu{position:fixed;z-index:9999;min-width:10rem;padding:.25rem 0;background:#fff;border:1px solid var(--sc-row-border-color);border-left:4px solid var(--sc-row-border-color);border-radius:0}.row-actions-menu.menu-flipped{box-shadow:0 -4px 6px -1px #0000001a,0 -2px 4px -2px #0000001a}.row-action-menu-item{display:flex;align-items:center;gap:.5rem;width:100%;padding:.5rem .75rem;border:none;background:transparent;cursor:pointer;text-align:left;font-size:.875rem;transition:background-color .15s ease}.row-action-menu-item:hover{background-color:var(--sc-gray-10, #f5f5f5)}.row-action-menu-item:focus{outline:none;background-color:var(--sc-gray-10, #f5f5f5)}.row-action-menu-item .action-icon{display:flex;align-items:center;justify-content:center;width:1rem;height:1rem;flex-shrink:0}.row-action-menu-item .action-icon :deep(svg){width:100%;height:100%}.row-action-menu-item .action-label{flex:1}.atable-row{background-color:#fff}.atable-row:last-child>td{border-bottom:1px solid var(--sc-row-border-color)}.atable-row>td:first-child{border-left:4px solid var(--sc-row-border-color)}.atable-row>td:last-child{border-right:1px solid var(--sc-row-border-color)}.list-index{color:var(--sc-header-text-color);font-weight:700;padding-left:var(--sc-atable-row-padding);padding-right:.5em;text-align:left;-webkit-user-select:none;user-select:none;border-top:1px solid var(--sc-row-border-color);text-overflow:ellipsis;overflow:hidden;box-sizing:border-box;padding-top:var(--sc-atable-row-padding);padding-bottom:var(--sc-atable-row-padding)}.tree-index{color:var(--sc-header-text-color);font-weight:700;text-align:center;-webkit-user-select:none;user-select:none;width:2ch;box-sizing:border-box;padding-top:var(--sc-atable-row-padding);padding-bottom:var(--sc-atable-row-padding)}.atable-row:has(td.cell-modified)>td.sticky-column,.atable-row:has(td.cell-modified)>th.sticky-column,.atable-row:has(td.cell-modified)>td.sticky-index,.atable-row:has(td.cell-modified)>th.sticky-index{background:var(--sc-cell-changed-color)}.atable-row.changed-row-gradient[data-v-2e038a9c]:has(td.cell-modified){--cell-color-start: color-mix(in srgb, var(--sc-cell-changed-color), #fff 20%);--cell-color-end: color-mix(in srgb, var(--sc-cell-changed-color), #fff 60%);background:linear-gradient(90deg,var(--cell-color-start),var(--cell-color-end))}.gantt-connection-overlay[data-v-71911260]{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:1}.connection-path[data-v-71911260]{transition:stroke-width .2s ease;pointer-events:auto;cursor:pointer;stroke-dasharray:5px;stroke:var(--sc-cell-text-color)}#arrowhead-marker polygon[data-v-71911260]{fill:var(--sc-cell-text-color)}.animated-path[data-v-71911260]{animation:animated-dash-71911260 infinite 1.5s linear}.connection-path[data-v-71911260]:hover{stroke-width:3px}.connection-hitbox[data-v-71911260]{pointer-events:auto;cursor:pointer}@keyframes animated-dash-71911260{0%{stroke-dashoffset:0px}to{stroke-dashoffset:-10px}}.column-filter[data-v-8487462d]{display:flex;align-items:center;gap:.25rem;width:100%}.filter-input[data-v-8487462d],.filter-select[data-v-8487462d]{background-color:var(--sc-form-background)!important;padding:.15rem .2rem;border:1px solid var(--sc-form-border);border-radius:3px;font-size:.875rem;color:var(--sc-text-color);width:100%;box-sizing:border-box}.filter-input[data-v-8487462d]:focus,.filter-select[data-v-8487462d]:focus{outline:none;border-color:var(--sc-input-active-border-color)}.checkbox-filter[data-v-8487462d]{display:flex;align-items:center;gap:.25rem;font-size:.875rem;color:var(--sc-text-color);cursor:pointer}.filter-checkbox[data-v-8487462d]{margin:0}.date-range-filter[data-v-8487462d]{display:flex;gap:.25rem;align-items:center;width:100%}.date-range-filter .filter-input[data-v-8487462d]{flex:1;min-width:0}.date-separator[data-v-8487462d]{color:var(--sc-gray-50);font-weight:500;padding:0 .25rem;flex-shrink:0}.clear-btn[data-v-8487462d]{background:var(--sc-gray-10, #f0f0f0);border:1px solid var(--sc-form-border);border-radius:3px;color:var(--sc-gray-70);cursor:pointer;font-size:1rem;padding:.15rem .4rem;line-height:1;flex-shrink:0}.atable-header-row th{padding-left:.5ch!important;font-weight:700;min-width:3ch;padding-top:var(--sc-atable-row-padding);padding-bottom:var(--sc-atable-row-padding);box-sizing:border-box;color:var(--sc-header-text-color);position:relative}#header-index{padding-left:var(--sc-atable-row-padding);box-sizing:border-box;border-top:none}.tree-index{padding-right:0}th{order:1}.list-expansion-index{width:2ch;margin-left:5px}.cursor-pointer{cursor:pointer}.atable-filters-row th{padding:.25rem .5ch;vertical-align:top}.row-actions-header{width:2rem;min-width:2rem;padding:0 .25rem}:root{--sc-primary-color: #0098c9;--sc-primary-text-color: #ffffff;--sc-brand-color: #202a44;--sc-gray-5: #f2f2f2;--sc-gray-10: #e6e6e6;--sc-gray-20: #cccccc;--sc-gray-50: #808080;--sc-gray-60: #666666;--sc-gray-80: #333333;--sc-brand-danger: #e63c28;--sc-brand-success: #155724;--sc-brand-warning: #b99d3e;--sc-active-cell-background: #ffffff;--sc-active-cell-outline: #e6a92d;--sc-cell-border-color: #ffffff;--sc-cell-text-color: #3a3c41;--sc-focus-cell-background: #ffffff;--sc-focus-cell-outline: #000000;--sc-header-border-color: #ffffff;--sc-header-text-color: var(--sc-gray-20);--sc-row-border-color: var(--sc-gray-20);--sc-row-color-zebra-dark: #dddddd;--sc-row-color-zebra-light: #eeeeee;--sc-row-number-background-color: #ffffff;--sc-input-active-border-color: #000000;--sc-input-active-label-color: #000000;--sc-input-border-color: var(--sc-gray-20);--sc-input-label-color: var(--sc-gray-60);--sc-required-border: #e63c28;--sc-cell-changed-color: #d8edff;--sc-form-border: var(--sc-gray-5);--sc-form-background: #ffffff;--sc-input-field-background: #ffffff;--sc-input-field-disabled-background: var(--sc-gray-5);--sc-font-size: 10px;--sc-font-family: Arimo, Arial, sans-serif;--sc-table-font-size: 16px;--sc-atable-font-family: "Arimo", sans-serif;--sc-atable-row-padding: .125rem;--sc-atable-row-height: 1.5em;--sc-atable-cell-border-width: 2px;--sc-table-loading-color: 204, 204, 204;--sc-btn-border: #cccccc;--sc-btn-color: white;--sc-btn-hover: #f2f2f2;--sc-btn-label-color: black}.amodal{position:absolute;background-color:var(--sc-row-color-zebra-dark);z-index:5}.atable-container{position:relative}.sticky-index{position:sticky;left:0;z-index:10;order:0}.sticky-column,th.sticky-column,td.sticky-column,th.sticky-index,td.sticky-index{position:sticky;z-index:10;order:0;background:#fff}.sticky-column-edge,.atable th.sticky-column-edge{border-right:1px solid var(--sc-row-border-color)}[data-v-3d00d51b]:root{--sc-primary-color: #0098c9;--sc-primary-text-color: #ffffff;--sc-brand-color: #202a44;--sc-gray-5: #f2f2f2;--sc-gray-10: #e6e6e6;--sc-gray-20: #cccccc;--sc-gray-50: #808080;--sc-gray-60: #666666;--sc-gray-80: #333333;--sc-brand-danger: #e63c28;--sc-brand-success: #155724;--sc-brand-warning: #b99d3e;--sc-active-cell-background: #ffffff;--sc-active-cell-outline: #e6a92d;--sc-cell-border-color: #ffffff;--sc-cell-text-color: #3a3c41;--sc-focus-cell-background: #ffffff;--sc-focus-cell-outline: #000000;--sc-header-border-color: #ffffff;--sc-header-text-color: var(--sc-gray-20);--sc-row-border-color: var(--sc-gray-20);--sc-row-color-zebra-dark: #dddddd;--sc-row-color-zebra-light: #eeeeee;--sc-row-number-background-color: #ffffff;--sc-input-active-border-color: #000000;--sc-input-active-label-color: #000000;--sc-input-border-color: var(--sc-gray-20);--sc-input-label-color: var(--sc-gray-60);--sc-required-border: #e63c28;--sc-cell-changed-color: #d8edff;--sc-form-border: var(--sc-gray-5);--sc-form-background: #ffffff;--sc-input-field-background: #ffffff;--sc-input-field-disabled-background: var(--sc-gray-5);--sc-font-size: 10px;--sc-font-family: Arimo, Arial, sans-serif;--sc-table-font-size: 16px;--sc-atable-font-family: "Arimo", sans-serif;--sc-atable-row-padding: .125rem;--sc-atable-row-height: 1.5em;--sc-atable-cell-border-width: 2px;--sc-table-loading-color: 204, 204, 204;--sc-btn-border: #cccccc;--sc-btn-color: white;--sc-btn-hover: #f2f2f2;--sc-btn-label-color: black}.atable[data-v-3d00d51b]{position:relative;font-family:var(--sc-atable-font-family);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:var(--sc-table-font-size);border-collapse:collapse;box-sizing:border-box;table-layout:auto;width:auto;overflow:clip;height:1px}.atable th[data-v-3d00d51b]{border-width:0px;border-style:solid;border-radius:0;padding-left:.5ch;padding-right:.5ch;padding-top:var(--sc-atable-row-padding);padding-bottom:var(--sc-atable-row-padding);color:var(--sc-gray-60);height:var(--sc-atable-row-height);font-weight:300;letter-spacing:.05rem;order:1;box-sizing:border-box}.atable th[data-v-3d00d51b]:focus{outline:none}.atable[data-v-3d00d51b]:tbody{overflow:hidden;position:relative}.atable[data-v-3d00d51b]:tbody:before{content:"";position:absolute;top:0;left:0;right:0;height:1px;background-color:transparent;z-index:100}.aloading[data-v-a930a25b]{width:100%;border-top:1px solid var(--sc-row-border-color);border-bottom:1px solid var(--sc-row-border-color);display:flex;background-color:#fff;border-left:4px solid var(--sc-row-border-color);padding-left:.5ch!important;padding-right:.5ch;padding-top:var(--sc-atable-row-padding);padding-bottom:var(--sc-atable-row-padding);align-items:center;box-sizing:border-box;background:var(--sc-focus-cell-background);overflow:hidden;position:relative}.aloading-bar[data-v-a930a25b]{width:100%;height:100%;position:absolute;left:-100%;top:0;background:linear-gradient(90deg,rgba(var(--sc-table-loading-color),0),rgba(var(--sc-table-loading-color),1),rgba(var(--sc-table-loading-color),0));animation:gradient-a930a25b infinite 2s;z-index:0}.aloading-header[data-v-a930a25b]{color:var(--sc-cell-text-color);font-family:var(--sc-atable-font-family);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:var(--sc-table-font-size);padding:0;margin:0;font-weight:400;z-index:1}.aloading-header[data-v-a930a25b]:after{content:"...";animation:ellipse-a930a25b 2s;animation-iteration-count:infinite}@keyframes gradient-a930a25b{0%{left:-100%}to{left:100%}}@keyframes ellipse-a930a25b{0%{content:""}20%{content:""}40%{content:"."}60%{content:".."}80%{content:"..."}}.aloading[data-v-e1165876]{width:100%;border-top:1px solid var(--sc-row-border-color);border-bottom:1px solid var(--sc-row-border-color);display:flex;background-color:#fff;border-left:4px solid var(--sc-row-border-color);padding-left:.5ch!important;padding-right:.5ch;padding-top:var(--sc-atable-row-padding);padding-bottom:var(--sc-atable-row-padding);align-items:center;box-sizing:border-box;background:var(--sc-focus-cell-background);overflow:hidden;position:relative}.aloading-bar[data-v-e1165876]{width:50%;height:3px;position:absolute;left:-100%;bottom:0;background:var(--sc-row-border-color);animation:bar-left-e1165876 infinite 2s;z-index:0}.aloading-header[data-v-e1165876]{color:var(--sc-cell-text-color);font-family:var(--sc-atable-font-family);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-size:var(--sc-table-font-size);padding:0;margin:0;font-weight:400;z-index:1}.aloading-header[data-v-e1165876]:after{content:"...";animation:ellipse-e1165876 2s;animation-iteration-count:infinite}@keyframes bar-left-e1165876{0%{left:-50%}to{left:100%}}@keyframes ellipse-e1165876{0%{content:""}20%{content:""}40%{content:"."}60%{content:".."}80%{content:"..."}}.aform_checkbox[data-v-cc185b72]{cursor:pointer;width:auto;margin-top:0;display:block}.aform_checkbox[data-v-cc185b72]:checked{accent-color:var(--sc-primary-color);border:1px solid black}.aform_checkbox-container[data-v-cc185b72]{width:100%;display:inline-block;text-align:left}.aform_checkbox-container input[data-v-cc185b72]{width:auto}.aform_checkbox-container:hover+.aform_field-label[data-v-cc185b72]{color:var(--sc-input-active-label-color)}div[data-v-425aef3c]{min-width:40ch;width:100%;box-sizing:border-box;border:1px solid transparent;padding:0rem;margin:0rem;margin-right:1ch}input[data-v-425aef3c]{width:calc(100% - 1ch);box-sizing:border-box;outline:1px solid transparent;border:1px solid var(--sc-input-border-color);padding:1ch .5ch .5ch 1ch;margin:.575rem 0 0;min-height:1.15rem;border-radius:.25rem}p[data-v-425aef3c],label[data-v-425aef3c]{color:var(--sc-input-label-color);display:block;min-height:1.15rem;padding:0rem;margin:0rem 0rem .25rem;border:1px solid transparent;box-sizing:border-box}p[data-v-425aef3c]{width:100%;color:red;font-size:85%;box-sizing:border-box}label[data-v-425aef3c]{z-index:2;font-size:80%;position:absolute;background:#fff;margin:-2.575rem 0 0 1ch;padding:0 .25ch;box-sizing:border-box}input[data-v-425aef3c]:focus{border:1px solid var(--sc-input-active-border-color)}input:focus+label[data-v-425aef3c]{color:var(--sc-input-active-label-color)}.autocomplete[data-v-e25d4181]{position:relative}.input-wrapper[data-v-e25d4181]{border:1px solid transparent;padding:0rem;margin:0rem;margin-right:1ch}input[data-v-e25d4181]{width:calc(100% - 1ch);outline:1px solid transparent;border:1px solid var(--sc-input-border-color);padding:1ch .5ch .5ch 1ch;margin:.575rem 0 0;min-height:1.15rem;border-radius:.25rem}input[data-v-e25d4181]:focus{border:1px solid var(--sc-input-active-border-color);border-radius:.25rem .25rem 0 0;border-bottom:none}label[data-v-e25d4181]{display:block;min-height:1.15rem;padding:0rem;margin:0rem 0rem .25rem;border:1px solid transparent;z-index:2;font-size:80%;position:absolute;background:#fff;margin:-2.575rem 0 0 1ch;padding:0 .25ch}.autocomplete-results[data-v-e25d4181]{position:absolute;width:calc(100% - 1ch + 1.5px);z-index:999;padding:0;margin:0;color:var(--sc-input-active-border-color);border:1px solid var(--sc-input-active-border-color);border-radius:0 0 .25rem .25rem;border-top:none;background-color:#fff}.autocomplete-result[data-v-e25d4181]{list-style:none;text-align:left;padding:4px 6px;cursor:pointer;border-bottom:.5px solid lightgray}.autocomplete-result.is-active[data-v-e25d4181],.autocomplete-result[data-v-e25d4181]:hover{background-color:var(--sc-row-color-zebra-light);color:var(--sc-input-active-border-color)}.adatepicker[data-v-9da05d06]{font-size:var(--sc-table-font-size);display:inline-table;color:var(--sc-cell-text-color);outline:none;border-collapse:collapse}.adatepicker tr[data-v-9da05d06]{height:1.15rem;text-align:center;vertical-align:middle}.adatepicker td[data-v-9da05d06]{border:2px solid transparent;outline:2px solid transparent;min-width:3ch;max-width:3ch}.adatepicker td[data-v-9da05d06]:focus,.adatepicker td[data-v-9da05d06]:focus-within{outline:1px dashed black;box-shadow:none;min-height:1.15em;max-height:1.15em;overflow:hidden}.adatepicker .selectedDate[data-v-9da05d06]{outline:1px solid black;background:var(--sc-gray-20);font-weight:bolder}.adatepicker .todaysDate[data-v-9da05d06]{font-weight:bolder;text-decoration:underline;color:#000}.days-header>td[data-v-9da05d06]{font-weight:700}.prev-date[data-v-9da05d06]{color:var(--sc-gray-20)}.collapse-button[data-v-6f1c1b45]{width:2ch;min-width:calc(66px - 4ch);background-color:transparent;font-size:150%;text-align:center;border:none;margin-top:-.5rem}.rotated[data-v-6f1c1b45]{transform:rotate(45deg);-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transition:transform .25s;transform-origin:center center}.unrotated[data-v-6f1c1b45]{transform:rotate(0);-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg);-ms-transform:rotate(0deg);-o-transform:rotate(0deg);transition:transform .25s}.aform_form-element{padding:0;margin:0;position:relative;box-sizing:border-box;flex-grow:1;min-width:20ch;margin-bottom:1rem}.aform_input-field{outline:1px solid var(--sc-input-border-color);outline-offset:-1px;font-size:1rem;padding:.5rem;margin:0;border-radius:0;box-sizing:border-box;width:100%;min-height:auto;position:relative;color:var(--sc-cell-text-color);background:var(--sc-input-field-background)}.aform_input-field:focus{outline:1px solid var(--sc-input-active-border-color)}.aform_display-value{display:block;padding:.5rem;min-height:2rem;color:var(--sc-cell-text-color);word-break:break-word}.aform_input-field:focus+.aform_field-label{color:var(--sc-input-active-label-color)}.aform_field-label{color:var(--sc-input-label-color);display:inline-block;position:absolute;padding:0 .25rem;margin:0rem;z-index:2;font-size:.7rem;font-weight:300;letter-spacing:.05rem;background:linear-gradient(var(--sc-form-background) 50%,var(--sc-input-field-background) 50%);width:auto;box-sizing:border-box;background:#fff;margin:0;grid-row:1;top:0;left:10px;border:none;line-height:0;transform:translateY(-50%)}.aform_input-field:disabled{background:var(--sc-input-field-disabled-background)}.aform_input-field:disabled+.aform_field-label{background:linear-gradient(var(--sc-form-background) 50%,var(--sc-input-field-disabled-background) 50%)}.aform_input-field:disabled~p.aform_error{background:linear-gradient(var(--sc-form-background) 50%,var(--sc-input-field-disabled-background) 50%)}.aform_field-label:after{margin:0;padding:0;box-sizing:border-box;content:"";line-height:normal}p.aform_error{display:block;display:inline-block;display:none;background:linear-gradient(var(--sc-form-background) 50%,var(--sc-input-field-background) 50%);padding:0 .25rem;margin:0rem;width:auto;color:var(--sc-brand-danger);font-size:.7rem;position:absolute;right:0;top:0;line-height:0;background:#fff;padding:.25rem;transform:translate(-1rem,-50%);margin:0}.aform[data-v-5c01cea5]{display:flex;flex-wrap:wrap;gap:1rem;padding:1rem;border:1px solid var(--sc-form-border);border-left:4px solid var(--sc-form-border);margin-bottom:1rem;max-width:100%}@media screen and (max-width:400px){.aform[data-v-5c01cea5]{flex-direction:column}}.aform-nested-section[data-v-5c01cea5]{width:100%;padding:.5rem 0}.aform-nested-label[data-v-5c01cea5]{font-size:.9rem;font-weight:600;margin:0 0 .5rem;color:var(--sc-input-label-color, #666)}.aform-nested-section .aform[data-v-5c01cea5]{border-left-width:2px;margin-left:.5rem}fieldset[data-v-a3606386]{max-width:100%;width:100%;margin-right:2ch;border:1px solid transparent;border-bottom:1px solid var(--sc-gray-50)}legend[data-v-a3606386]{width:100%;height:1.15rem;border:1px solid transparent;padding-bottom:.5rem;font-size:110%;font-weight:600;-webkit-user-select:none;user-select:none}.collapse-button[data-v-a3606386]{float:right}.aform_file-attach[data-v-6543d39a]{padding:1rem;display:flex;flex-wrap:wrap;gap:1rem;flex-direction:row;justify-content:center;align-items:center;border:1px dashed var(--sc-input-border-color);width:100%}@media screen and (max-width:400px){.aform_file-attach>.aform_form-btn[data-v-6543d39a]{width:100%}}.aform_file-attach-feedback[data-v-6543d39a]{color:var(--sc-input-label-color);width:100%;padding:.5rem;text-align:center;align-self:center}.aform_file-attach-feedback>li[data-v-6543d39a]{list-style:none;font-style:italic}.aform_file-attach-feedback>p[data-v-6543d39a]{margin-top:0}.aform_form-btn[data-v-6543d39a]{padding:.5rem 2rem;width:auto;border:1px solid var(--sc-input-border-color);color:var(--sc-input-label-color);cursor:pointer;background-color:#fff}.aform_form-btn[data-v-6543d39a]:disabled{background-color:var(--sc-gray-5)}.login-container[data-v-d9ffd0a7]{width:100%;position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;font-family:var(--sc-font-family)}.account-container[data-v-d9ffd0a7]{width:100%;margin-left:auto;margin-top:.5rem;margin-right:auto;display:flex;flex-direction:column;justify-content:center}.account-header[data-v-d9ffd0a7]{display:flex;flex-direction:column;text-align:center;margin-top:.5rem}#account-title[data-v-d9ffd0a7]{font-size:1.5rem;line-height:2rem;font-weight:600;letter-spacing:-.025em;margin:0}#account-subtitle[data-v-d9ffd0a7]{font-size:.875rem;line-height:1.25rem;margin:1rem}.login-form-container[data-v-d9ffd0a7]{display:grid;gap:.5rem}.login-form-element[data-v-d9ffd0a7]{display:grid;margin:.5rem 0;position:relative}.login-field[data-v-d9ffd0a7]{padding:.5rem .25rem .25rem .5rem;outline:1px solid transparent;border:1px solid var(--sc-input-border-color);border-radius:.25rem}.login-field[data-v-d9ffd0a7]:focus{border:1px solid black}.btn[data-v-d9ffd0a7]{background-color:var(--sc-btn-color);color:var(--sc-btn-label-color);border:1px solid var(--sc-btn-border);margin:.5rem 0;padding:.25rem;position:relative;cursor:pointer}.btn[data-v-d9ffd0a7]:hover{background-color:var(--sc-btn-hover)}.btn[data-v-d9ffd0a7]:disabled{background-color:var(--sc-input-field-disabled-background)}.disabled[data-v-d9ffd0a7]{opacity:.5}.loading-icon[data-v-d9ffd0a7]{animation:spin-d9ffd0a7 1s linear infinite forwards;display:inline-block;margin-right:.2rem;line-height:0;font-size:1rem;position:relative;top:.2rem}@keyframes spin-d9ffd0a7{0%{transform:rotate(0)}to{transform:rotate(360deg)}}
|
package/dist/stonecrop.d.ts
CHANGED
|
@@ -50,7 +50,16 @@ export declare interface ActionRegistry {
|
|
|
50
50
|
* @public
|
|
51
51
|
*/
|
|
52
52
|
export declare type BaseStonecropReturn = {
|
|
53
|
+
/**
|
|
54
|
+
* Reactive reference to the Stonecrop singleton instance.
|
|
55
|
+
* Use this to access class methods like `getRecord()`, `addRecord()`, `runAction()`.
|
|
56
|
+
*/
|
|
53
57
|
stonecrop: Ref<Stonecrop | undefined>;
|
|
58
|
+
/**
|
|
59
|
+
* Operation log API for undo/redo functionality.
|
|
60
|
+
* Use `operationLog.undo()` and `operationLog.redo()` for user-triggered operations.
|
|
61
|
+
* Use `operationLog.startBatch()` / `operationLog.commitBatch()` for grouping operations.
|
|
62
|
+
*/
|
|
54
63
|
operationLog: OperationLogAPI;
|
|
55
64
|
};
|
|
56
65
|
|
|
@@ -71,6 +80,16 @@ export declare interface BatchOperation {
|
|
|
71
80
|
reversible: boolean;
|
|
72
81
|
}
|
|
73
82
|
|
|
83
|
+
/**
|
|
84
|
+
* Recursively collect nested data from HST using pre-resolved schemas
|
|
85
|
+
* @param resolvedSchema - The already-resolved schema (with nested schemas embedded)
|
|
86
|
+
* @param basePath - The base path in HST (e.g., "customer.123.address")
|
|
87
|
+
* @param hstStore - The HST store instance
|
|
88
|
+
* @returns The collected data object
|
|
89
|
+
* @public
|
|
90
|
+
*/
|
|
91
|
+
export declare function collectNestedData(resolvedSchema: SchemaTypes[], basePath: string, hstStore: HSTNode): Record<string, any>;
|
|
92
|
+
|
|
74
93
|
/**
|
|
75
94
|
* Factory function for HST creation
|
|
76
95
|
* Creates a new HSTNode proxy for hierarchical state tree navigation.
|
|
@@ -585,9 +604,13 @@ export declare class HST {
|
|
|
585
604
|
* @public
|
|
586
605
|
*/
|
|
587
606
|
export declare type HSTChangeData = {
|
|
607
|
+
/** Full HST path to the changed field */
|
|
588
608
|
path: string;
|
|
609
|
+
/** New value for the field */
|
|
589
610
|
value: any;
|
|
611
|
+
/** Field name that changed */
|
|
590
612
|
fieldname: string;
|
|
613
|
+
/** Optional record ID */
|
|
591
614
|
recordId?: string;
|
|
592
615
|
};
|
|
593
616
|
|
|
@@ -735,19 +758,77 @@ export declare type HSTOperationType = 'set' | 'delete' | 'batch' | 'transition'
|
|
|
735
758
|
* @public
|
|
736
759
|
*/
|
|
737
760
|
export declare type HSTStonecropReturn = BaseStonecropReturn & {
|
|
761
|
+
/**
|
|
762
|
+
* Generates a fully-qualified HST path for a field.
|
|
763
|
+
* Use this in nested components to create paths like "customer.123.address".
|
|
764
|
+
* @param fieldname - The field name to append to the path
|
|
765
|
+
* @param recordId - Optional record ID (defaults to current record)
|
|
766
|
+
* @returns The full HST path string
|
|
767
|
+
*/
|
|
738
768
|
provideHSTPath: (fieldname: string, recordId?: string) => string;
|
|
769
|
+
/**
|
|
770
|
+
* Handles a field value change and updates HST.
|
|
771
|
+
* Call this from form input handlers to persist changes to the store.
|
|
772
|
+
* @param changeData - Object containing path, value, fieldname, and optional recordId
|
|
773
|
+
*/
|
|
739
774
|
handleHSTChange: (changeData: HSTChangeData) => void;
|
|
775
|
+
/**
|
|
776
|
+
* Reactive reference to the HST node for this doctype/record.
|
|
777
|
+
* Use this to read current form state or subscribe to changes.
|
|
778
|
+
*/
|
|
740
779
|
hstStore: Ref<HSTNode | undefined>;
|
|
780
|
+
/**
|
|
781
|
+
* Reactive form data bound to HST.
|
|
782
|
+
* Use this as the v-model target for form inputs. Changes sync to hstStore.
|
|
783
|
+
*/
|
|
741
784
|
formData: Ref<Record<string, any>>;
|
|
785
|
+
/**
|
|
786
|
+
* Resolved schema with nested Doctype fields expanded.
|
|
787
|
+
* Use this to iterate over fields for rendering, excluding nested doctypes handled separately.
|
|
788
|
+
*/
|
|
742
789
|
resolvedSchema: Ref<SchemaTypes[]>;
|
|
790
|
+
/**
|
|
791
|
+
* Loads or initializes nested doctype data.
|
|
792
|
+
* Use this when rendering a nested form component. Checks HST first, then initializes defaults.
|
|
793
|
+
* @param parentPath - The HST path to check for existing data
|
|
794
|
+
* @param childDoctype - The nested doctype metadata
|
|
795
|
+
* @param recordId - Optional record ID (reserved for future API fetch)
|
|
796
|
+
* @returns The loaded or initialized data object
|
|
797
|
+
*/
|
|
743
798
|
loadNestedData: (parentPath: string, childDoctype: Doctype, recordId?: string) => Record<string, any>;
|
|
744
|
-
|
|
799
|
+
/**
|
|
800
|
+
* Collects a complete record payload with all nested data from HST.
|
|
801
|
+
* Use this before submitting to an API. Recursively includes 1:1 and 1:many nested records.
|
|
802
|
+
* @param doctype - The doctype metadata
|
|
803
|
+
* @param recordId - The record ID to collect
|
|
804
|
+
* @returns The complete record payload ready for API submission
|
|
805
|
+
*/
|
|
806
|
+
collectRecordPayload: (doctype: Doctype, recordId: string) => Record<string, any>;
|
|
807
|
+
/**
|
|
808
|
+
* Creates a nested context for a child doctype component.
|
|
809
|
+
* Use this in parent components to pass scoped handlers to child components.
|
|
810
|
+
* @param basePath - The parent HST path prefix
|
|
811
|
+
* @param childDoctype - The child doctype metadata
|
|
812
|
+
* @returns Scoped provideHSTPath and handleHSTChange functions
|
|
813
|
+
*/
|
|
745
814
|
createNestedContext: (basePath: string, childDoctype: Doctype) => {
|
|
746
815
|
provideHSTPath: (fieldname: string) => string;
|
|
747
816
|
handleHSTChange: (changeData: HSTChangeData) => void;
|
|
748
817
|
};
|
|
818
|
+
/**
|
|
819
|
+
* Loading state for async doctype resolution.
|
|
820
|
+
* True while fetching doctype by slug string from registry.
|
|
821
|
+
*/
|
|
749
822
|
isLoading: Ref<boolean>;
|
|
823
|
+
/**
|
|
824
|
+
* Error state for doctype resolution failures.
|
|
825
|
+
* Set when doctype slug lookup fails.
|
|
826
|
+
*/
|
|
750
827
|
error: Ref<Error | null>;
|
|
828
|
+
/**
|
|
829
|
+
* Resolved doctype instance.
|
|
830
|
+
* Available immediately if Doctype instance passed, after async resolution if slug string passed.
|
|
831
|
+
*/
|
|
751
832
|
resolvedDoctype: Ref<Doctype | undefined>;
|
|
752
833
|
};
|
|
753
834
|
|
|
@@ -816,8 +897,20 @@ export declare type MutableDoctype = {
|
|
|
816
897
|
* @public
|
|
817
898
|
*/
|
|
818
899
|
export declare type OperationLogAPI = {
|
|
900
|
+
/**
|
|
901
|
+
* List of all recorded operations in the log.
|
|
902
|
+
* Each operation represents a state change that can be undone/redone.
|
|
903
|
+
*/
|
|
819
904
|
operations: Ref<HSTOperation[]>;
|
|
905
|
+
/**
|
|
906
|
+
* Current position in the operation log.
|
|
907
|
+
* -1 means no operations, 0 means at first operation, etc.
|
|
908
|
+
*/
|
|
820
909
|
currentIndex: Ref<number>;
|
|
910
|
+
/**
|
|
911
|
+
* Computed snapshot of undo/redo state.
|
|
912
|
+
* Use this for UI indicators (buttons, menu state).
|
|
913
|
+
*/
|
|
821
914
|
undoRedoState: ComputedRef<{
|
|
822
915
|
canUndo: boolean;
|
|
823
916
|
canRedo: boolean;
|
|
@@ -825,20 +918,92 @@ export declare type OperationLogAPI = {
|
|
|
825
918
|
redoCount: number;
|
|
826
919
|
currentIndex: number;
|
|
827
920
|
}>;
|
|
921
|
+
/**
|
|
922
|
+
* Whether undo is currently available.
|
|
923
|
+
* True when there are operations that can be undone.
|
|
924
|
+
*/
|
|
828
925
|
canUndo: ComputedRef<boolean>;
|
|
926
|
+
/**
|
|
927
|
+
* Whether redo is currently available.
|
|
928
|
+
* True when there are undone operations that can be redone.
|
|
929
|
+
*/
|
|
829
930
|
canRedo: ComputedRef<boolean>;
|
|
931
|
+
/**
|
|
932
|
+
* Number of operations available to undo.
|
|
933
|
+
*/
|
|
830
934
|
undoCount: ComputedRef<number>;
|
|
935
|
+
/**
|
|
936
|
+
* Number of operations available to redo.
|
|
937
|
+
*/
|
|
831
938
|
redoCount: ComputedRef<number>;
|
|
939
|
+
/**
|
|
940
|
+
* Undo the last operation.
|
|
941
|
+
* @param hstStore - The HST node to apply the inverse operation to
|
|
942
|
+
* @returns True if undo succeeded, false if nothing to undo
|
|
943
|
+
*/
|
|
832
944
|
undo: (hstStore: HSTNode) => boolean;
|
|
945
|
+
/**
|
|
946
|
+
* Redo the last undone operation.
|
|
947
|
+
* @param hstStore - The HST node to apply the operation to
|
|
948
|
+
* @returns True if redo succeeded, false if nothing to redo
|
|
949
|
+
*/
|
|
833
950
|
redo: (hstStore: HSTNode) => boolean;
|
|
951
|
+
/**
|
|
952
|
+
* Start batching multiple operations together.
|
|
953
|
+
* Call before a series of changes that should be undone/redone as a unit.
|
|
954
|
+
*/
|
|
834
955
|
startBatch: () => void;
|
|
956
|
+
/**
|
|
957
|
+
* Commit the current batch of operations.
|
|
958
|
+
* @param description - Optional description for the batch
|
|
959
|
+
* @returns The batch operation ID, or null if no batch in progress
|
|
960
|
+
*/
|
|
835
961
|
commitBatch: (description?: string) => string | null;
|
|
962
|
+
/**
|
|
963
|
+
* Cancel the current batch without committing.
|
|
964
|
+
* Discards all operations added since startBatch().
|
|
965
|
+
*/
|
|
836
966
|
cancelBatch: () => void;
|
|
967
|
+
/**
|
|
968
|
+
* Clear all operations from the log.
|
|
969
|
+
* Resets the log to its initial empty state.
|
|
970
|
+
*/
|
|
837
971
|
clear: () => void;
|
|
972
|
+
/**
|
|
973
|
+
* Get all operations for a specific doctype.
|
|
974
|
+
* @param doctype - The doctype name to filter by
|
|
975
|
+
* @param recordId - Optional record ID to further filter
|
|
976
|
+
* @returns Array of matching operations
|
|
977
|
+
*/
|
|
838
978
|
getOperationsFor: (doctype: string, recordId?: string) => HSTOperation[];
|
|
979
|
+
/**
|
|
980
|
+
* Get a serializable snapshot of the operation log.
|
|
981
|
+
* Use for debugging, logging, or state persistence.
|
|
982
|
+
* @returns Snapshot containing operations and current index
|
|
983
|
+
*/
|
|
839
984
|
getSnapshot: () => OperationLogSnapshot;
|
|
985
|
+
/**
|
|
986
|
+
* Mark an operation as irreversible.
|
|
987
|
+
* Irreversible operations cannot be undone.
|
|
988
|
+
* @param operationId - The operation ID to mark
|
|
989
|
+
* @param reason - Human-readable reason why it cannot be undone
|
|
990
|
+
*/
|
|
840
991
|
markIrreversible: (operationId: string, reason: string) => void;
|
|
992
|
+
/**
|
|
993
|
+
* Log a custom action (non-HST operation).
|
|
994
|
+
* Use for tracking server calls, external side effects, etc.
|
|
995
|
+
* @param doctype - The doctype this action relates to
|
|
996
|
+
* @param actionName - Name of the action (e.g., 'save', 'submit')
|
|
997
|
+
* @param recordIds - Optional array of affected record IDs
|
|
998
|
+
* @param result - Optional result status
|
|
999
|
+
* @param error - Optional error message if result is 'failure'
|
|
1000
|
+
* @returns The logged operation ID
|
|
1001
|
+
*/
|
|
841
1002
|
logAction: (doctype: string, actionName: string, recordIds?: string[], result?: 'success' | 'failure' | 'pending', error?: string) => string;
|
|
1003
|
+
/**
|
|
1004
|
+
* Configure operation log options.
|
|
1005
|
+
* @param options - Partial configuration to merge with existing settings
|
|
1006
|
+
*/
|
|
842
1007
|
configure: (options: Partial<OperationLogConfig>) => void;
|
|
843
1008
|
};
|
|
844
1009
|
|
|
@@ -995,17 +1160,18 @@ export declare class Registry {
|
|
|
995
1160
|
*/
|
|
996
1161
|
addDoctype(doctype: Doctype): void;
|
|
997
1162
|
/**
|
|
998
|
-
* Resolve nested Doctype
|
|
1163
|
+
* Resolve nested Doctype fields in a schema by embedding child schemas inline.
|
|
999
1164
|
*
|
|
1000
1165
|
* @remarks
|
|
1001
1166
|
* Walks the schema array and for each field with `fieldtype: 'Doctype'` and a string
|
|
1002
|
-
* `options` value, looks up the referenced doctype in the registry and
|
|
1003
|
-
*
|
|
1167
|
+
* `options` value, looks up the referenced doctype in the registry and:
|
|
1168
|
+
*
|
|
1169
|
+
* - If `cardinality: 'many'`: auto-derives `columns` from the child doctype's schema,
|
|
1170
|
+
* sets `component: 'ATable'`, `config: { view: 'list' }`, and initializes `rows: []`.
|
|
1171
|
+
* - Otherwise (default/`cardinality: 'one'`): embeds the child schema as the field's
|
|
1172
|
+
* `schema` property for 1:1 nested forms.
|
|
1004
1173
|
*
|
|
1005
|
-
*
|
|
1006
|
-
* auto-derives `columns` from its schema fields (unless columns are already provided).
|
|
1007
|
-
* Also sets sensible defaults for `component` (`'ATable'`) and `config` (`{ view: 'list' }`).
|
|
1008
|
-
* Row data is expected to come from the parent form's data model at `data[fieldname]`.
|
|
1174
|
+
* Recurses for deeply nested doctypes. Circular references are protected against.
|
|
1009
1175
|
*
|
|
1010
1176
|
* Returns a new array — does not mutate the original schema.
|
|
1011
1177
|
*
|
|
@@ -1034,11 +1200,13 @@ export declare class Registry {
|
|
|
1034
1200
|
* - Data, Text → `''`
|
|
1035
1201
|
* - Check → `false`
|
|
1036
1202
|
* - Int, Float, Decimal, Currency, Quantity → `0`
|
|
1037
|
-
* -
|
|
1038
|
-
* -
|
|
1203
|
+
* - JSON → `{}`
|
|
1204
|
+
* - Doctype with `cardinality: 'many'` → `[]`
|
|
1205
|
+
* - Doctype without `cardinality` or `cardinality: 'one'` → recursively initializes nested record
|
|
1039
1206
|
* - All others → `null`
|
|
1040
1207
|
*
|
|
1041
|
-
* For Doctype fields with a resolved `schema` array, recursively
|
|
1208
|
+
* For Doctype fields with a resolved `schema` array (cardinality: 'one'), recursively
|
|
1209
|
+
* initializes the nested record.
|
|
1042
1210
|
*
|
|
1043
1211
|
* @param schema - The schema array to derive defaults from
|
|
1044
1212
|
* @returns A plain object with default values for each field
|
|
@@ -1137,6 +1305,13 @@ export declare function setFieldRollback(doctype: string, fieldname: string, ena
|
|
|
1137
1305
|
* @public
|
|
1138
1306
|
*/
|
|
1139
1307
|
export declare class Stonecrop {
|
|
1308
|
+
/**
|
|
1309
|
+
* Singleton instance of Stonecrop. Only one Stonecrop instance can exist
|
|
1310
|
+
* per application, ensuring consistent HST state and registry access.
|
|
1311
|
+
* Subsequent constructor calls return this instance instead of creating new ones.
|
|
1312
|
+
* @internal
|
|
1313
|
+
*/
|
|
1314
|
+
static _root: Stonecrop;
|
|
1140
1315
|
private hstStore;
|
|
1141
1316
|
private _operationLogStore?;
|
|
1142
1317
|
private _operationLogConfig?;
|
|
@@ -1144,7 +1319,7 @@ export declare class Stonecrop {
|
|
|
1144
1319
|
/** The registry instance containing all doctype definitions */
|
|
1145
1320
|
readonly registry: Registry;
|
|
1146
1321
|
/**
|
|
1147
|
-
* Creates a new Stonecrop instance with HST integration
|
|
1322
|
+
* Creates a new Stonecrop instance with HST integration (singleton pattern)
|
|
1148
1323
|
* @param registry - The Registry instance containing doctype definitions
|
|
1149
1324
|
* @param operationLogConfig - Optional configuration for the operation log
|
|
1150
1325
|
* @param options - Options including the data client (can be set later via setClient)
|
|
@@ -1259,7 +1434,7 @@ export declare class Stonecrop {
|
|
|
1259
1434
|
getSnapshot: () => OperationLogSnapshot;
|
|
1260
1435
|
markIrreversible: (operationId: string, reason: string) => void;
|
|
1261
1436
|
logAction: (doctype: string, actionName: string, recordIds?: string[], result?: "success" | "failure" | "pending", error?: string) => string;
|
|
1262
|
-
}, "operations" | "
|
|
1437
|
+
}, "operations" | "clientId" | "currentIndex" | "config">, Pick<{
|
|
1263
1438
|
operations: Ref< {
|
|
1264
1439
|
id: string;
|
|
1265
1440
|
type: HSTOperationType;
|
|
@@ -1548,6 +1723,23 @@ export declare class Stonecrop {
|
|
|
1548
1723
|
* @public
|
|
1549
1724
|
*/
|
|
1550
1725
|
getRecordState(doctype: string | Doctype, recordId: string): string;
|
|
1726
|
+
/**
|
|
1727
|
+
* Collect a record payload with all nested doctype fields from HST
|
|
1728
|
+
* @param doctype - The doctype metadata
|
|
1729
|
+
* @param recordId - The record ID to collect
|
|
1730
|
+
* @returns The complete record payload ready for API submission
|
|
1731
|
+
* @public
|
|
1732
|
+
*/
|
|
1733
|
+
collectRecordPayload(doctype: Doctype, recordId: string): Record<string, any>;
|
|
1734
|
+
/**
|
|
1735
|
+
* Load nested data from HST or initialize with defaults
|
|
1736
|
+
* @param parentPath - The HST path to check for existing data
|
|
1737
|
+
* @param childDoctype - The child doctype metadata
|
|
1738
|
+
* @param _recordId - Optional record ID to load
|
|
1739
|
+
* @returns The loaded or initialized data
|
|
1740
|
+
* @public
|
|
1741
|
+
*/
|
|
1742
|
+
loadNestedData(parentPath: string, childDoctype: Doctype, _recordId?: string): Record<string, any>;
|
|
1551
1743
|
}
|
|
1552
1744
|
|
|
1553
1745
|
/**
|
|
@@ -1832,7 +2024,7 @@ getOperationsFor: (doctype: string, recordId?: string) => HSTOperation[];
|
|
|
1832
2024
|
getSnapshot: () => OperationLogSnapshot;
|
|
1833
2025
|
markIrreversible: (operationId: string, reason: string) => void;
|
|
1834
2026
|
logAction: (doctype: string, actionName: string, recordIds?: string[], result?: "success" | "failure" | "pending", error?: string) => string;
|
|
1835
|
-
}, "operations" | "
|
|
2027
|
+
}, "operations" | "clientId" | "currentIndex" | "config">, Pick<{
|
|
1836
2028
|
operations: Ref< {
|
|
1837
2029
|
id: string;
|
|
1838
2030
|
type: HSTOperationType;
|