@cratis/scene.blueprint.approvals 0.0.0-stage → 4.53.0
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/README.md +66 -2
- package/approvalsApplication.ts +28 -0
- package/approvalsParts.ts +50 -0
- package/approvalsQueries.ts +58 -0
- package/approvalsScreenSet.ts +24 -0
- package/blueprint.ts +16 -0
- package/blueprintCatalog.json +171 -0
- package/dist/cjs/approvalsApplication.js +49 -0
- package/dist/cjs/approvalsApplication.js.map +1 -0
- package/dist/cjs/approvalsParts.js +131 -0
- package/dist/cjs/approvalsParts.js.map +1 -0
- package/dist/cjs/approvalsQueries.js +68 -0
- package/dist/cjs/approvalsQueries.js.map +1 -0
- package/dist/cjs/approvalsScreenSet.js +61 -0
- package/dist/cjs/approvalsScreenSet.js.map +1 -0
- package/dist/cjs/blueprint.js +19 -0
- package/dist/cjs/blueprint.js.map +1 -0
- package/dist/cjs/index.js +67 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/manifest.js +71 -0
- package/dist/cjs/manifest.js.map +1 -0
- package/dist/cjs/navigation.js +117 -0
- package/dist/cjs/navigation.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/packageName.js +8 -0
- package/dist/cjs/packageName.js.map +1 -0
- package/dist/cjs/screens/index.js +23 -0
- package/dist/cjs/screens/index.js.map +1 -0
- package/dist/cjs/templateProvenance.js +24 -0
- package/dist/cjs/templateProvenance.js.map +1 -0
- package/dist/cjs/templates/formTemplates.js +111 -0
- package/dist/cjs/templates/formTemplates.js.map +1 -0
- package/dist/cjs/templates/index.js +31 -0
- package/dist/cjs/templates/index.js.map +1 -0
- package/dist/cjs/templates/listTemplates.js +221 -0
- package/dist/cjs/templates/listTemplates.js.map +1 -0
- package/dist/cjs/templates/recordTemplates.js +97 -0
- package/dist/cjs/templates/recordTemplates.js.map +1 -0
- package/dist/cjs/templates/wizardTemplate.js +77 -0
- package/dist/cjs/templates/wizardTemplate.js.map +1 -0
- package/dist/esm/approvalsApplication.d.ts +10 -0
- package/dist/esm/approvalsApplication.d.ts.map +1 -0
- package/dist/esm/approvalsApplication.js +44 -0
- package/dist/esm/approvalsApplication.js.map +1 -0
- package/dist/esm/approvalsParts.d.ts +13 -0
- package/dist/esm/approvalsParts.d.ts.map +1 -0
- package/dist/esm/approvalsParts.js +114 -0
- package/dist/esm/approvalsParts.js.map +1 -0
- package/dist/esm/approvalsQueries.d.ts +51 -0
- package/dist/esm/approvalsQueries.d.ts.map +1 -0
- package/dist/esm/approvalsQueries.js +63 -0
- package/dist/esm/approvalsQueries.js.map +1 -0
- package/dist/esm/approvalsScreenSet.d.ts +7 -0
- package/dist/esm/approvalsScreenSet.d.ts.map +1 -0
- package/dist/esm/approvalsScreenSet.js +59 -0
- package/dist/esm/approvalsScreenSet.js.map +1 -0
- package/dist/esm/blueprint.d.ts +3 -0
- package/dist/esm/blueprint.d.ts.map +1 -0
- package/dist/esm/blueprint.js +17 -0
- package/dist/esm/blueprint.js.map +1 -0
- package/dist/esm/index.d.ts +12 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +17 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/manifest.d.ts +3 -0
- package/dist/esm/manifest.d.ts.map +1 -0
- package/dist/esm/manifest.js +69 -0
- package/dist/esm/manifest.js.map +1 -0
- package/dist/esm/navigation.d.ts +5 -0
- package/dist/esm/navigation.d.ts.map +1 -0
- package/dist/esm/navigation.js +113 -0
- package/dist/esm/navigation.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/packageName.d.ts +2 -0
- package/dist/esm/packageName.d.ts.map +1 -0
- package/dist/esm/packageName.js +6 -0
- package/dist/esm/packageName.js.map +1 -0
- package/dist/esm/screens/index.d.ts +3 -0
- package/dist/esm/screens/index.d.ts.map +1 -0
- package/dist/esm/screens/index.js +21 -0
- package/dist/esm/screens/index.js.map +1 -0
- package/dist/esm/templateProvenance.d.ts +3 -0
- package/dist/esm/templateProvenance.d.ts.map +1 -0
- package/dist/esm/templateProvenance.js +22 -0
- package/dist/esm/templateProvenance.js.map +1 -0
- package/dist/esm/templates/formTemplates.d.ts +6 -0
- package/dist/esm/templates/formTemplates.d.ts.map +1 -0
- package/dist/esm/templates/formTemplates.js +106 -0
- package/dist/esm/templates/formTemplates.js.map +1 -0
- package/dist/esm/templates/index.d.ts +7 -0
- package/dist/esm/templates/index.d.ts.map +1 -0
- package/dist/esm/templates/index.js +20 -0
- package/dist/esm/templates/index.js.map +1 -0
- package/dist/esm/templates/listTemplates.d.ts +6 -0
- package/dist/esm/templates/listTemplates.d.ts.map +1 -0
- package/dist/esm/templates/listTemplates.js +216 -0
- package/dist/esm/templates/listTemplates.js.map +1 -0
- package/dist/esm/templates/recordTemplates.d.ts +3 -0
- package/dist/esm/templates/recordTemplates.d.ts.map +1 -0
- package/dist/esm/templates/recordTemplates.js +95 -0
- package/dist/esm/templates/recordTemplates.js.map +1 -0
- package/dist/esm/templates/wizardTemplate.d.ts +3 -0
- package/dist/esm/templates/wizardTemplate.d.ts.map +1 -0
- package/dist/esm/templates/wizardTemplate.js +75 -0
- package/dist/esm/templates/wizardTemplate.js.map +1 -0
- package/dist/esm/tsconfig.tsbuildinfo +1 -0
- package/index.ts +14 -0
- package/manifest.ts +44 -0
- package/navigation.ts +54 -0
- package/package.json +79 -5
- package/packageName.ts +5 -0
- package/sampleData/approvals-general.json +1269 -0
- package/sampleData/approvals-nordic.json +1269 -0
- package/screens/index.ts +21 -0
- package/templateProvenance.ts +15 -0
- package/templates/formTemplates.ts +61 -0
- package/templates/index.ts +19 -0
- package/templates/listTemplates.ts +116 -0
- package/templates/recordTemplates.ts +45 -0
- package/templates/wizardTemplate.ts +33 -0
- package/thumbnails/AllRequests.svg +13 -0
- package/thumbnails/ApprovalInbox.svg +23 -0
- package/thumbnails/DecisionDialog.svg +11 -0
- package/thumbnails/MyRequests.svg +13 -0
- package/thumbnails/NewRequestWizard.svg +14 -0
- package/thumbnails/RequestPage.svg +11 -0
- package/thumbnails/RequestTypeEditForm.svg +14 -0
- package/thumbnails/RequestTypeQuickCreate.svg +11 -0
- package/thumbnails/RequestTypes.svg +13 -0
- package/thumbnails/approvals.svg +9 -0
package/README.md
CHANGED
|
@@ -1,3 +1,67 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Scene
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**Describing a user interface without describing a platform** — Scene is the UI model of the Cratis
|
|
4
|
+
model-first layer (experimental).
|
|
5
|
+
|
|
6
|
+
The object model and runtime for Screenplay-based UIs: `Scene.Model` (platform-agnostic screens, layouts,
|
|
7
|
+
forms, contribution points, ui profiles and themes), `Scene.Engine` (binding/resolution runtime), and
|
|
8
|
+
`Scene.React` (the React renderer).
|
|
9
|
+
|
|
10
|
+
## Packages / Deployables
|
|
11
|
+
|
|
12
|
+
[](http://nuget.org/packages/Cratis.Scene.Model)
|
|
13
|
+
[](https://www.npmjs.com/package/@cratis/scene.model)
|
|
14
|
+
[](https://www.npmjs.com/package/@cratis/scene.engine)
|
|
15
|
+
[](https://www.npmjs.com/package/@cratis/scene.react)
|
|
16
|
+
|
|
17
|
+
## Builds
|
|
18
|
+
|
|
19
|
+
[](https://github.com/cratis/scene/actions/workflows/dotnet-build.yml)
|
|
20
|
+
[](https://github.com/cratis/scene/actions/workflows/javascript-build.yml)
|
|
21
|
+
|
|
22
|
+
## Description
|
|
23
|
+
|
|
24
|
+
Scene owns the *object model and runtime* half of the Screenplay stack. In the model-first pipeline,
|
|
25
|
+
[Screenplay](https://github.com/Cratis/Screenplay) describes an event-sourced, CQRS system,
|
|
26
|
+
[Stage](https://github.com/Cratis/Stage) renders it into a running application, and Scene is how that
|
|
27
|
+
application's user interface is described — independently of any rendering platform.
|
|
28
|
+
|
|
29
|
+
`Scene.Model` is the platform-agnostic
|
|
30
|
+
C# object model that [Stage](https://github.com/Cratis/Stage) translates Screenplay's parsed language constructs into, and that [Studio](https://github.com/Cratis/Studio)'s
|
|
31
|
+
design-time tooling reads and writes. `Scene.Engine` walks that graph, resolves bindings (data, action, form,
|
|
32
|
+
navigation contribution) and drives whichever renderer is plugged in — it does not know React exists.
|
|
33
|
+
`Scene.React` is one renderer implementing the abstract vocabulary against real React/DOM; sibling positions
|
|
34
|
+
are reserved for future `Scene.Native` / `Scene.Desktop` renderers. Vendor and internal component packages
|
|
35
|
+
(PrimeReact, internal widget libraries) are adapters plugging into the renderer contract, not part of it.
|
|
36
|
+
|
|
37
|
+
The design-time editor built on top of this object model lives in Studio, not here — see
|
|
38
|
+
[StudioIssues#156](https://github.com/Cratis/StudioIssues/issues/156).
|
|
39
|
+
|
|
40
|
+
## Support
|
|
41
|
+
|
|
42
|
+
Cratis is an open community, and we are glad to help users, teams evaluating the stack, and contributors.
|
|
43
|
+
|
|
44
|
+
| Channel | Details |
|
|
45
|
+
|---|---|
|
|
46
|
+
| Discord | Join the community on [Discord](https://discord.gg/kt4AMpV8WV) for questions and discussions |
|
|
47
|
+
| GitHub Issues | [Report bugs or request features](https://github.com/Cratis/Scene/issues) |
|
|
48
|
+
| Documentation | Read the docs at [cratis.io](https://cratis.io) |
|
|
49
|
+
|
|
50
|
+
## The Cratis ecosystem
|
|
51
|
+
|
|
52
|
+
This project is part of [Cratis](https://www.cratis.io) — free, MIT-licensed tools for building event-sourced and CQRS applications.
|
|
53
|
+
|
|
54
|
+
- **[Chronicle](https://github.com/Cratis/Chronicle)** — event-sourcing database and runtime. Orleans-based kernel, pluggable storage (MongoDB default; PostgreSQL, SQL Server, SQLite, in-memory), language-agnostic gRPC contracts. [Docs](https://www.cratis.io/chronicle/)
|
|
55
|
+
- **Chronicle clients** — first-class [.NET SDK](https://github.com/Cratis/Chronicle), plus [TypeScript](https://github.com/Cratis/Chronicle.TypeScript), [Kotlin/Java](https://github.com/Cratis/Chronicle.Kotlin), and [Elixir](https://github.com/Cratis/Chronicle.Elixir); [Python](https://github.com/Cratis/Chronicle.Python) coming soon (pre-alpha). AI agents connect through the [Chronicle MCP server](https://github.com/Cratis/Chronicle.Mcp).
|
|
56
|
+
- **[Arc](https://github.com/Cratis/Arc)** — opinionated CQRS framework for ASP.NET Core with commands, queries, validation, authorization, and TypeScript proxy generation. Works without event sourcing. [Docs](https://www.cratis.io/arc/)
|
|
57
|
+
- **[Components](https://github.com/Cratis/Components)** — React components aligned with Arc patterns. [Docs](https://www.cratis.io/components/)
|
|
58
|
+
- **[CLI](https://github.com/Cratis/cli) + Workbench** — inspect and diagnose Chronicle from the terminal or the browser. [Docs](https://www.cratis.io/cli/)
|
|
59
|
+
- **Model-first layer (experimental)** — [Studio](https://github.com/Cratis/Studio), [Screenplay](https://github.com/Cratis/Screenplay), [Stage](https://github.com/Cratis/Stage), Scene (this repository), [Prologue](https://github.com/Cratis/Prologue)
|
|
60
|
+
- **Supporting** — [Fundamentals](https://github.com/Cratis/Fundamentals), [Specifications](https://github.com/Cratis/Specifications), [Synopsis](https://github.com/Cratis/Synopsis), [Lens](https://github.com/Cratis/Lens), [Narrator](https://github.com/Cratis/Narrator), and free [AI tooling](https://github.com/Cratis/AI) (preview); [Ensemble](https://github.com/Cratis/Ensemble) coming soon (pre-release)
|
|
61
|
+
- **[Samples](https://github.com/Cratis/Samples)** — runnable event sourcing and CQRS samples for the whole stack
|
|
62
|
+
|
|
63
|
+
Everything Cratis publishes today is MIT licensed and free to use.
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
Part of the [Cratis](https://www.cratis.io) platform · [MIT](./LICENSE)
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import { UiProfile } from '@cratis/scene.model';
|
|
5
|
+
import { ApplicationStructureIndex } from '@cratis/scene.engine';
|
|
6
|
+
import { ApplicationDocument, CompositionOptions, defaultLayouts, previewProfile } from '@cratis/scene.blueprint.default';
|
|
7
|
+
import { approvalsNavigation, approvalsStructure } from './navigation';
|
|
8
|
+
import { approvalsScreens } from './screens';
|
|
9
|
+
import { approvalsDialogTemplates, approvalsScreenTemplates } from './templates';
|
|
10
|
+
|
|
11
|
+
/** The id of the sample-data pack a new application starts with. */
|
|
12
|
+
export const approvalsDefaultSampleDataId = 'approvals-general';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* The example application of the blueprint: the foundation's layouts, the approvals application's templates and dialogs and its seven screens, rendering against the
|
|
16
|
+
* foundation's packages with the default sample-data pack chosen. This is what a gallery previews and what the conformance fixture
|
|
17
|
+
* (`Samples/Approvals/approvals.play`) declares in Screenplay: the document, the structure and the navigation are the three things an application is made of.
|
|
18
|
+
*/
|
|
19
|
+
export function approvalsApplication(sampleData: string = approvalsDefaultSampleDataId): ApplicationDocument {
|
|
20
|
+
const profile: UiProfile = { ...previewProfile(undefined), name: 'Approvals', sampleData: { activePack: sampleData, mappings: [], bindings: [] } };
|
|
21
|
+
return { layouts: defaultLayouts, screenTemplates: approvalsScreenTemplates, dialogTemplates: approvalsDialogTemplates, screens: approvalsScreens, uiProfiles: [profile] };
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** What a host composes the screens with: the application's logo, which the shell's topbar shows. */
|
|
25
|
+
export const approvalsComposition: CompositionOptions = { logo: approvalsNavigation.application.logo };
|
|
26
|
+
|
|
27
|
+
/** The structure and navigation the shell's regions show and the items' destinations resolve against. */
|
|
28
|
+
export const approvalsNavigationModel = () => ({ structure: new ApplicationStructureIndex(approvalsStructure), navigation: approvalsNavigation });
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
Behavior, BindingSourceKind, ExternalComponent, InteractionActionKind, InteractionTriggerKind, NavigateAction, OpenDialogAction, SceneElement, TemplateMetadata, TemplateScope,
|
|
6
|
+
} from '@cratis/scene.model';
|
|
7
|
+
import { component, panel } from '@cratis/scene.blueprint.default';
|
|
8
|
+
import { approvalsTemplateProvenance } from './templateProvenance';
|
|
9
|
+
|
|
10
|
+
export { component, panel };
|
|
11
|
+
|
|
12
|
+
/** The category of every template of this blueprint (spec Part B 1.2: `Business / <domain>`). */
|
|
13
|
+
export const approvalsCategory = 'Business / Approvals';
|
|
14
|
+
|
|
15
|
+
/** The package-relative thumbnail of a template. */
|
|
16
|
+
export const thumbnailOf = (templateName: string): string => `thumbnails/${templateName}.svg`;
|
|
17
|
+
|
|
18
|
+
/** The metadata of a screen template of this blueprint: provenance, a type from the vocabulary, the category, a thumbnail and the levels it applies at. */
|
|
19
|
+
export const approvalsMetadata = (name: string, type: 'Dashboard' | 'List' | 'Board' | 'Detail' | 'Form' | 'Dialog' | 'Workspace' | 'Wizard', scopes: TemplateScope[]): TemplateMetadata =>
|
|
20
|
+
({ ...approvalsTemplateProvenance, type, category: approvalsCategory, thumbnail: thumbnailOf(name), scopes });
|
|
21
|
+
|
|
22
|
+
/** A button of the foundation: a verb, its emphasis, and the permission rule every action declares (spec Part B 1.5). */
|
|
23
|
+
export const actionButton = (id: string, label: string, emphasis: 'primary' | 'secondary' | 'quiet' | 'danger', extra: Record<string, unknown> = {}, behaviors?: Behavior[]): ExternalComponent =>
|
|
24
|
+
({ ...component(id, 'actionButton', { label, emphasis, permission: 'enabled', ...extra }), ...(behaviors ? { behaviors } : {}) });
|
|
25
|
+
|
|
26
|
+
/** What pressing an element does: open the named dialog template over the page. */
|
|
27
|
+
export const opensDialog = (dialogTemplate: string): Behavior[] =>
|
|
28
|
+
[{ bindings: [{ trigger: { kind: InteractionTriggerKind.Click }, actions: [{ kind: InteractionActionKind.OpenDialog, dialogTemplate } as OpenDialogAction] }] }];
|
|
29
|
+
|
|
30
|
+
/** What pressing an element does: go to the named screen. */
|
|
31
|
+
export const goesTo = (screen: string): Behavior[] =>
|
|
32
|
+
[{ bindings: [{ trigger: { kind: InteractionTriggerKind.Click }, actions: [{ kind: InteractionActionKind.Navigate, screen } as NavigateAction] }] }];
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* What choosing a row of a list does: open the record page, handing it the chosen row's id. The list is single-selection, so choosing a row is
|
|
36
|
+
* opening it - the way a table of records works everywhere.
|
|
37
|
+
*/
|
|
38
|
+
export const opensRecordOnSelect = (listId: string, screen: string): Behavior[] => [{
|
|
39
|
+
bindings: [{
|
|
40
|
+
trigger: { kind: InteractionTriggerKind.Select },
|
|
41
|
+
actions: [{ kind: InteractionActionKind.Navigate, screen, arguments: [{ name: 'id', value: { kind: BindingSourceKind.ComponentProperty, componentId: listId, path: 'value' } }] } as NavigateAction],
|
|
42
|
+
}],
|
|
43
|
+
}];
|
|
44
|
+
|
|
45
|
+
/** What a Cancel or Close control does: close the dialog it was opened from. */
|
|
46
|
+
export const closesDialog = (): Behavior[] => [{ bindings: [{ trigger: { kind: InteractionTriggerKind.Click }, actions: [{ kind: InteractionActionKind.CloseDialog }] }] }];
|
|
47
|
+
|
|
48
|
+
/** An element with the given behaviors attached. */
|
|
49
|
+
export const withBehaviors = <T extends SceneElement>(element: T, behaviors: Behavior[]): T => ({ ...element, behaviors });
|
|
50
|
+
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import { BindingExpression, BindingSourceKind } from '@cratis/scene.model';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* A property taken from a query result - never a value. A template declares *where* its data comes from and the sample-data pack, or the real
|
|
8
|
+
* query, supplies the rows (spec SD1); `path` reaches into the result (`0.value` is the first row's `value`, an empty path is the whole result).
|
|
9
|
+
*/
|
|
10
|
+
export const fromQuery = (query: string, path = ''): BindingExpression => ({ kind: BindingSourceKind.QueryResult, query, path });
|
|
11
|
+
|
|
12
|
+
/** The queries of the approvals application, each a shape the sample-data packs supply rows for. */
|
|
13
|
+
export const ApprovalsQuery = {
|
|
14
|
+
/** One row: the `locale` and the `currency` the figures and dates are formatted in. */
|
|
15
|
+
Settings: 'ApprovalsSettings',
|
|
16
|
+
Inbox: 'InboxRequests',
|
|
17
|
+
InboxColumns: 'InboxColumns',
|
|
18
|
+
InboxFilterFields: 'InboxFilterFields',
|
|
19
|
+
InboxViews: 'InboxViews',
|
|
20
|
+
MyRequests: 'MyRequests',
|
|
21
|
+
MyRequestColumns: 'MyRequestColumns',
|
|
22
|
+
MyRequestFilterFields: 'MyRequestFilterFields',
|
|
23
|
+
MyRequestViews: 'MyRequestViews',
|
|
24
|
+
MyRequestColumnChoices: 'MyRequestColumnChoices',
|
|
25
|
+
MyRequestSelection: 'MyRequestSelection',
|
|
26
|
+
AllRequests: 'AllRequests',
|
|
27
|
+
AllRequestColumns: 'AllRequestColumns',
|
|
28
|
+
AllRequestFilterFields: 'AllRequestFilterFields',
|
|
29
|
+
AllRequestViews: 'AllRequestViews',
|
|
30
|
+
AllRequestColumnChoices: 'AllRequestColumnChoices',
|
|
31
|
+
AllRequestSelection: 'AllRequestSelection',
|
|
32
|
+
RequestTypes: 'RequestTypes',
|
|
33
|
+
RequestTypeColumns: 'RequestTypeColumns',
|
|
34
|
+
RequestTypeFilterFields: 'RequestTypeFilterFields',
|
|
35
|
+
RequestTypeViews: 'RequestTypeViews',
|
|
36
|
+
RequestTypeColumnChoices: 'RequestTypeColumnChoices',
|
|
37
|
+
RequestTypeSelection: 'RequestTypeSelection',
|
|
38
|
+
WizardSteps: 'RequestWizardSteps',
|
|
39
|
+
TypeSections: 'RequestTypeSections',
|
|
40
|
+
DetailSections: 'RequestDetailSections',
|
|
41
|
+
ReviewSections: 'RequestReviewSections',
|
|
42
|
+
ReviewValues: 'RequestReviewValues',
|
|
43
|
+
Request: 'RequestRecord',
|
|
44
|
+
RequestSummary: 'RequestSummary',
|
|
45
|
+
RequestSections: 'RequestSections',
|
|
46
|
+
Chain: 'RequestChain',
|
|
47
|
+
Attachments: 'RequestAttachments',
|
|
48
|
+
AttachmentColumns: 'AttachmentColumns',
|
|
49
|
+
Comments: 'RequestComments',
|
|
50
|
+
RequestTabs: 'RequestTabs',
|
|
51
|
+
DecisionSections: 'DecisionSections',
|
|
52
|
+
TypeEditorSections: 'RequestTypeEditorSections',
|
|
53
|
+
FormErrors: 'ApprovalsFormErrors',
|
|
54
|
+
} as const;
|
|
55
|
+
|
|
56
|
+
/** The locale and currency of the data, bound onto every component that formats a figure or a date. */
|
|
57
|
+
export const localeOfData = { locale: fromQuery(ApprovalsQuery.Settings, '0.locale') };
|
|
58
|
+
export const currencyOfData = { ...localeOfData, currency: fromQuery(ApprovalsQuery.Settings, '0.currency') };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import { BlueprintScreen } from '@cratis/scene.model';
|
|
5
|
+
|
|
6
|
+
/** One ready-to-use screen: the qualified name that is also its place in the application (`approvals.requests.new` is the `new` feature of `requests` in the `approvals` module). */
|
|
7
|
+
export interface ApprovalsScreenDefinition extends BlueprintScreen {
|
|
8
|
+
template: string;
|
|
9
|
+
description: string;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* The screens the blueprint brings, in navigation order. This one list is what the manifest's screen set, the `Screen` instances, the application structure
|
|
14
|
+
* and the navigation are all derived from, so they cannot disagree about which screens exist or where they sit.
|
|
15
|
+
*/
|
|
16
|
+
export const approvalsScreenDefinitions: ApprovalsScreenDefinition[] = [
|
|
17
|
+
{ name: 'approvals.inbox', title: 'Inbox', template: 'ApprovalInbox', order: 0, description: 'The requests waiting for my decision, with Approve, Reject and Request changes on each.' },
|
|
18
|
+
{ name: 'approvals.requests', title: 'My requests', template: 'MyRequests', order: 1, description: 'The requests I made, with draft, submitted, approved and rejected as chips.' },
|
|
19
|
+
{ name: 'approvals.requests.new', title: 'New request', template: 'NewRequestWizard', parent: 'approvals.requests', description: 'Request type, details, attachments, then review and submit.' },
|
|
20
|
+
{ name: 'approvals.requests.page', title: 'Request', template: 'RequestPage', parent: 'approvals.requests', description: 'One request: its summary, its approval chain, its attachments and the comments.' },
|
|
21
|
+
{ name: 'approvals.all', title: 'All requests', template: 'AllRequests', order: 2, description: 'Every request in the organisation.' },
|
|
22
|
+
{ name: 'approvals.templates', title: 'Templates', template: 'RequestTypes', order: 3, description: 'The request types an organisation offers, for administrators.' },
|
|
23
|
+
{ name: 'approvals.templates.edit', title: 'Edit request type', template: 'RequestTypeEditForm', parent: 'approvals.templates', description: 'Edits what a request type asks for and who approves it.' },
|
|
24
|
+
];
|
package/blueprint.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import { ScenePackageBundle } from '@cratis/scene.react';
|
|
5
|
+
import { approvalsBlueprintManifest } from './manifest';
|
|
6
|
+
import { approvalsScreens } from './screens';
|
|
7
|
+
import { approvalsDialogTemplates, approvalsScreenTemplates } from './templates';
|
|
8
|
+
|
|
9
|
+
/** This blueprint as a loadable bundle: the manifest names things, this provides them. It provides no component - every component is the foundation's. */
|
|
10
|
+
export const approvalsBlueprint: ScenePackageBundle = {
|
|
11
|
+
manifest: approvalsBlueprintManifest,
|
|
12
|
+
components: {},
|
|
13
|
+
screenTemplates: approvalsScreenTemplates,
|
|
14
|
+
dialogTemplates: approvalsDialogTemplates,
|
|
15
|
+
screens: approvalsScreens,
|
|
16
|
+
};
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schema": 1,
|
|
3
|
+
"blueprints": [
|
|
4
|
+
{
|
|
5
|
+
"package": "Cratis.Blueprint.Approvals",
|
|
6
|
+
"version": "1.0.0",
|
|
7
|
+
"domain": "approvals",
|
|
8
|
+
"displayName": "Approvals and Requests",
|
|
9
|
+
"description": "Requests and approvals: an approver's inbox, my requests, a new-request wizard, request pages with their approval chain and the request types an organisation offers.",
|
|
10
|
+
"thumbnail": "thumbnails/approvals.svg",
|
|
11
|
+
"license": "MIT",
|
|
12
|
+
"licenseUrl": "https://github.com/Cratis/Scene/blob/main/LICENSE",
|
|
13
|
+
"dependencies": [
|
|
14
|
+
{
|
|
15
|
+
"name": "Cratis.Blueprint.Default",
|
|
16
|
+
"versionRange": "^1.0.0"
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
"screens": [
|
|
20
|
+
{
|
|
21
|
+
"name": "approvals.inbox",
|
|
22
|
+
"title": "Inbox",
|
|
23
|
+
"description": "The requests waiting for my decision, with Approve, Reject and Request changes on each.",
|
|
24
|
+
"template": "ApprovalInbox",
|
|
25
|
+
"order": 0
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"name": "approvals.requests",
|
|
29
|
+
"title": "My requests",
|
|
30
|
+
"description": "The requests I made, with draft, submitted, approved and rejected as chips.",
|
|
31
|
+
"template": "MyRequests",
|
|
32
|
+
"order": 1
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"name": "approvals.requests.new",
|
|
36
|
+
"title": "New request",
|
|
37
|
+
"description": "Request type, details, attachments, then review and submit.",
|
|
38
|
+
"template": "NewRequestWizard",
|
|
39
|
+
"parent": "approvals.requests"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"name": "approvals.requests.page",
|
|
43
|
+
"title": "Request",
|
|
44
|
+
"description": "One request: its summary, its approval chain, its attachments and the comments.",
|
|
45
|
+
"template": "RequestPage",
|
|
46
|
+
"parent": "approvals.requests"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"name": "approvals.all",
|
|
50
|
+
"title": "All requests",
|
|
51
|
+
"description": "Every request in the organisation.",
|
|
52
|
+
"template": "AllRequests",
|
|
53
|
+
"order": 2
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"name": "approvals.templates",
|
|
57
|
+
"title": "Templates",
|
|
58
|
+
"description": "The request types an organisation offers, for administrators.",
|
|
59
|
+
"template": "RequestTypes",
|
|
60
|
+
"order": 3
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"name": "approvals.templates.edit",
|
|
64
|
+
"title": "Edit request type",
|
|
65
|
+
"description": "Edits what a request type asks for and who approves it.",
|
|
66
|
+
"template": "RequestTypeEditForm",
|
|
67
|
+
"parent": "approvals.templates"
|
|
68
|
+
}
|
|
69
|
+
],
|
|
70
|
+
"templates": [
|
|
71
|
+
{
|
|
72
|
+
"name": "ApprovalInbox",
|
|
73
|
+
"kind": "ScreenTemplate",
|
|
74
|
+
"displayName": "Approval inbox",
|
|
75
|
+
"description": "The requests waiting for my decision as cards, with Approve, Reject and Request changes inline.",
|
|
76
|
+
"type": "List",
|
|
77
|
+
"category": "Business / Approvals",
|
|
78
|
+
"thumbnail": "thumbnails/ApprovalInbox.svg"
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"name": "MyRequests",
|
|
82
|
+
"kind": "ScreenTemplate",
|
|
83
|
+
"displayName": "My requests",
|
|
84
|
+
"description": "The requests I made, with draft, submitted, approved and rejected as chips.",
|
|
85
|
+
"type": "List",
|
|
86
|
+
"category": "Business / Approvals",
|
|
87
|
+
"thumbnail": "thumbnails/MyRequests.svg"
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"name": "NewRequestWizard",
|
|
91
|
+
"kind": "ScreenTemplate",
|
|
92
|
+
"displayName": "New request",
|
|
93
|
+
"description": "Request type, details, attachments, then review and submit; the step survives a refresh and a draft can be saved.",
|
|
94
|
+
"type": "Wizard",
|
|
95
|
+
"category": "Business / Approvals",
|
|
96
|
+
"thumbnail": "thumbnails/NewRequestWizard.svg"
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"name": "RequestPage",
|
|
100
|
+
"kind": "ScreenTemplate",
|
|
101
|
+
"displayName": "Request page",
|
|
102
|
+
"description": "One request: summary, approval chain, fields, attachments and comments, and the decision buttons.",
|
|
103
|
+
"type": "Detail",
|
|
104
|
+
"category": "Business / Approvals",
|
|
105
|
+
"thumbnail": "thumbnails/RequestPage.svg"
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
"name": "AllRequests",
|
|
109
|
+
"kind": "ScreenTemplate",
|
|
110
|
+
"displayName": "All requests",
|
|
111
|
+
"description": "Every request of the organisation with its type, requester, current approver and status.",
|
|
112
|
+
"type": "List",
|
|
113
|
+
"category": "Business / Approvals",
|
|
114
|
+
"thumbnail": "thumbnails/AllRequests.svg"
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"name": "RequestTypes",
|
|
118
|
+
"kind": "ScreenTemplate",
|
|
119
|
+
"displayName": "Request types",
|
|
120
|
+
"description": "The request types an organisation offers, with the steps that approve each and whether it is active.",
|
|
121
|
+
"type": "List",
|
|
122
|
+
"category": "Business / Approvals",
|
|
123
|
+
"thumbnail": "thumbnails/RequestTypes.svg"
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
"name": "RequestTypeEditForm",
|
|
127
|
+
"kind": "ScreenTemplate",
|
|
128
|
+
"displayName": "Edit request type",
|
|
129
|
+
"description": "A form that edits a request type: its name, what it asks for and its approval steps.",
|
|
130
|
+
"type": "Form",
|
|
131
|
+
"category": "Business / Approvals",
|
|
132
|
+
"thumbnail": "thumbnails/RequestTypeEditForm.svg"
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"name": "DecisionDialog",
|
|
136
|
+
"kind": "DialogTemplate",
|
|
137
|
+
"displayName": "Decision",
|
|
138
|
+
"description": "A confirmation with a decision (approve, reject or request changes) and a comment for the requester.",
|
|
139
|
+
"type": "Dialog",
|
|
140
|
+
"category": "Business / Approvals",
|
|
141
|
+
"thumbnail": "thumbnails/DecisionDialog.svg"
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
"name": "RequestTypeQuickCreate",
|
|
145
|
+
"kind": "DialogTemplate",
|
|
146
|
+
"displayName": "New request type",
|
|
147
|
+
"description": "A short form that adds a request type without leaving the page.",
|
|
148
|
+
"type": "Dialog",
|
|
149
|
+
"category": "Business / Approvals",
|
|
150
|
+
"thumbnail": "thumbnails/RequestTypeQuickCreate.svg"
|
|
151
|
+
}
|
|
152
|
+
],
|
|
153
|
+
"sampleData": [
|
|
154
|
+
{
|
|
155
|
+
"id": "approvals-general",
|
|
156
|
+
"title": "Approvals · General",
|
|
157
|
+
"locale": "en-GB",
|
|
158
|
+
"path": "sampleData/approvals-general.json",
|
|
159
|
+
"default": true
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
"id": "approvals-nordic",
|
|
163
|
+
"title": "Approvals · Nordic",
|
|
164
|
+
"locale": "nb-NO",
|
|
165
|
+
"path": "sampleData/approvals-nordic.json",
|
|
166
|
+
"default": false
|
|
167
|
+
}
|
|
168
|
+
]
|
|
169
|
+
}
|
|
170
|
+
]
|
|
171
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var scene_engine = require('@cratis/scene.engine');
|
|
4
|
+
var scene_blueprint_default = require('@cratis/scene.blueprint.default');
|
|
5
|
+
var navigation = require('./navigation.js');
|
|
6
|
+
var index = require('./screens/index.js');
|
|
7
|
+
var index$1 = require('./templates/index.js');
|
|
8
|
+
var formTemplates = require('./templates/formTemplates.js');
|
|
9
|
+
|
|
10
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
11
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
12
|
+
/** The id of the sample-data pack a new application starts with. */ const approvalsDefaultSampleDataId = 'approvals-general';
|
|
13
|
+
/**
|
|
14
|
+
* The example application of the blueprint: the foundation's layouts, the approvals application's templates and dialogs and its seven screens, rendering against the
|
|
15
|
+
* foundation's packages with the default sample-data pack chosen. This is what a gallery previews and what the conformance fixture
|
|
16
|
+
* (`Samples/Approvals/approvals.play`) declares in Screenplay: the document, the structure and the navigation are the three things an application is made of.
|
|
17
|
+
*/ function approvalsApplication(sampleData = approvalsDefaultSampleDataId) {
|
|
18
|
+
const profile = {
|
|
19
|
+
...scene_blueprint_default.previewProfile(undefined),
|
|
20
|
+
name: 'Approvals',
|
|
21
|
+
sampleData: {
|
|
22
|
+
activePack: sampleData,
|
|
23
|
+
mappings: [],
|
|
24
|
+
bindings: []
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
return {
|
|
28
|
+
layouts: scene_blueprint_default.defaultLayouts,
|
|
29
|
+
screenTemplates: index$1.approvalsScreenTemplates,
|
|
30
|
+
dialogTemplates: formTemplates.approvalsDialogTemplates,
|
|
31
|
+
screens: index.approvalsScreens,
|
|
32
|
+
uiProfiles: [
|
|
33
|
+
profile
|
|
34
|
+
]
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/** What a host composes the screens with: the application's logo, which the shell's topbar shows. */ const approvalsComposition = {
|
|
38
|
+
logo: navigation.approvalsNavigation.application.logo
|
|
39
|
+
};
|
|
40
|
+
/** The structure and navigation the shell's regions show and the items' destinations resolve against. */ const approvalsNavigationModel = ()=>({
|
|
41
|
+
structure: new scene_engine.ApplicationStructureIndex(navigation.approvalsStructure),
|
|
42
|
+
navigation: navigation.approvalsNavigation
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
exports.approvalsApplication = approvalsApplication;
|
|
46
|
+
exports.approvalsComposition = approvalsComposition;
|
|
47
|
+
exports.approvalsDefaultSampleDataId = approvalsDefaultSampleDataId;
|
|
48
|
+
exports.approvalsNavigationModel = approvalsNavigationModel;
|
|
49
|
+
//# sourceMappingURL=approvalsApplication.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approvalsApplication.js","sources":["../../approvalsApplication.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { UiProfile } from '@cratis/scene.model';\nimport { ApplicationStructureIndex } from '@cratis/scene.engine';\nimport { ApplicationDocument, CompositionOptions, defaultLayouts, previewProfile } from '@cratis/scene.blueprint.default';\nimport { approvalsNavigation, approvalsStructure } from './navigation';\nimport { approvalsScreens } from './screens';\nimport { approvalsDialogTemplates, approvalsScreenTemplates } from './templates';\n\n/** The id of the sample-data pack a new application starts with. */\nexport const approvalsDefaultSampleDataId = 'approvals-general';\n\n/**\n * The example application of the blueprint: the foundation's layouts, the approvals application's templates and dialogs and its seven screens, rendering against the\n * foundation's packages with the default sample-data pack chosen. This is what a gallery previews and what the conformance fixture\n * (`Samples/Approvals/approvals.play`) declares in Screenplay: the document, the structure and the navigation are the three things an application is made of.\n */\nexport function approvalsApplication(sampleData: string = approvalsDefaultSampleDataId): ApplicationDocument {\n const profile: UiProfile = { ...previewProfile(undefined), name: 'Approvals', sampleData: { activePack: sampleData, mappings: [], bindings: [] } };\n return { layouts: defaultLayouts, screenTemplates: approvalsScreenTemplates, dialogTemplates: approvalsDialogTemplates, screens: approvalsScreens, uiProfiles: [profile] };\n}\n\n/** What a host composes the screens with: the application's logo, which the shell's topbar shows. */\nexport const approvalsComposition: CompositionOptions = { logo: approvalsNavigation.application.logo };\n\n/** The structure and navigation the shell's regions show and the items' destinations resolve against. */\nexport const approvalsNavigationModel = () => ({ structure: new ApplicationStructureIndex(approvalsStructure), navigation: approvalsNavigation });\n"],"names":["approvalsDefaultSampleDataId","approvalsApplication","sampleData","profile","previewProfile","undefined","name","activePack","mappings","bindings","layouts","defaultLayouts","screenTemplates","approvalsScreenTemplates","dialogTemplates","approvalsDialogTemplates","screens","approvalsScreens","uiProfiles","approvalsComposition","logo","approvalsNavigation","application","approvalsNavigationModel","structure","ApplicationStructureIndex","approvalsStructure","navigation"],"mappings":";;;;;;;;;AAAA;AACA;AASA,qEACO,MAAMA,4BAAAA,GAA+B;AAE5C;;;;AAIC,IACM,SAASC,oBAAAA,CAAqBC,UAAAA,GAAqBF,4BAA4B,EAAA;AAClF,IAAA,MAAMG,OAAAA,GAAqB;AAAE,QAAA,GAAGC,uCAAeC,SAAAA,CAAU;QAAEC,IAAAA,EAAM,WAAA;QAAaJ,UAAAA,EAAY;YAAEK,UAAAA,EAAYL,UAAAA;AAAYM,YAAAA,QAAAA,EAAU,EAAE;AAAEC,YAAAA,QAAAA,EAAU;AAAG;AAAE,KAAA;IACjJ,OAAO;QAAEC,OAAAA,EAASC,sCAAAA;QAAgBC,eAAAA,EAAiBC,gCAAAA;QAA0BC,eAAAA,EAAiBC,sCAAAA;QAA0BC,OAAAA,EAASC,sBAAAA;QAAkBC,UAAAA,EAAY;AAACf,YAAAA;AAAQ;AAAC,KAAA;AAC7K;AAEA,sGACO,MAAMgB,oBAAAA,GAA2C;IAAEC,IAAAA,EAAMC,8BAAAA,CAAoBC,WAAW,CAACF;AAAK;AAErG,0GACO,MAAMG,wBAAAA,GAA2B,KAAO;AAAEC,QAAAA,SAAAA,EAAW,IAAIC,sCAAAA,CAA0BC,6BAAAA,CAAAA;QAAqBC,UAAAA,EAAYN;AAAoB,KAAA;;;;;"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var scene_model = require('@cratis/scene.model');
|
|
4
|
+
var scene_blueprint_default = require('@cratis/scene.blueprint.default');
|
|
5
|
+
var templateProvenance = require('./templateProvenance.js');
|
|
6
|
+
|
|
7
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
8
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
9
|
+
/** The category of every template of this blueprint (spec Part B 1.2: `Business / <domain>`). */ const approvalsCategory = 'Business / Approvals';
|
|
10
|
+
/** The package-relative thumbnail of a template. */ const thumbnailOf = (templateName)=>`thumbnails/${templateName}.svg`;
|
|
11
|
+
/** The metadata of a screen template of this blueprint: provenance, a type from the vocabulary, the category, a thumbnail and the levels it applies at. */ const approvalsMetadata = (name, type, scopes)=>({
|
|
12
|
+
...templateProvenance.approvalsTemplateProvenance,
|
|
13
|
+
type,
|
|
14
|
+
category: approvalsCategory,
|
|
15
|
+
thumbnail: thumbnailOf(name),
|
|
16
|
+
scopes
|
|
17
|
+
});
|
|
18
|
+
/** A button of the foundation: a verb, its emphasis, and the permission rule every action declares (spec Part B 1.5). */ const actionButton = (id, label, emphasis, extra = {}, behaviors)=>({
|
|
19
|
+
...scene_blueprint_default.component(id, 'actionButton', {
|
|
20
|
+
label,
|
|
21
|
+
emphasis,
|
|
22
|
+
permission: 'enabled',
|
|
23
|
+
...extra
|
|
24
|
+
}),
|
|
25
|
+
...behaviors ? {
|
|
26
|
+
behaviors
|
|
27
|
+
} : {}
|
|
28
|
+
});
|
|
29
|
+
/** What pressing an element does: open the named dialog template over the page. */ const opensDialog = (dialogTemplate)=>[
|
|
30
|
+
{
|
|
31
|
+
bindings: [
|
|
32
|
+
{
|
|
33
|
+
trigger: {
|
|
34
|
+
kind: scene_model.InteractionTriggerKind.Click
|
|
35
|
+
},
|
|
36
|
+
actions: [
|
|
37
|
+
{
|
|
38
|
+
kind: scene_model.InteractionActionKind.OpenDialog,
|
|
39
|
+
dialogTemplate
|
|
40
|
+
}
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
}
|
|
45
|
+
];
|
|
46
|
+
/** What pressing an element does: go to the named screen. */ const goesTo = (screen)=>[
|
|
47
|
+
{
|
|
48
|
+
bindings: [
|
|
49
|
+
{
|
|
50
|
+
trigger: {
|
|
51
|
+
kind: scene_model.InteractionTriggerKind.Click
|
|
52
|
+
},
|
|
53
|
+
actions: [
|
|
54
|
+
{
|
|
55
|
+
kind: scene_model.InteractionActionKind.Navigate,
|
|
56
|
+
screen
|
|
57
|
+
}
|
|
58
|
+
]
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
];
|
|
63
|
+
/**
|
|
64
|
+
* What choosing a row of a list does: open the record page, handing it the chosen row's id. The list is single-selection, so choosing a row is
|
|
65
|
+
* opening it - the way a table of records works everywhere.
|
|
66
|
+
*/ const opensRecordOnSelect = (listId, screen)=>[
|
|
67
|
+
{
|
|
68
|
+
bindings: [
|
|
69
|
+
{
|
|
70
|
+
trigger: {
|
|
71
|
+
kind: scene_model.InteractionTriggerKind.Select
|
|
72
|
+
},
|
|
73
|
+
actions: [
|
|
74
|
+
{
|
|
75
|
+
kind: scene_model.InteractionActionKind.Navigate,
|
|
76
|
+
screen,
|
|
77
|
+
arguments: [
|
|
78
|
+
{
|
|
79
|
+
name: 'id',
|
|
80
|
+
value: {
|
|
81
|
+
kind: scene_model.BindingSourceKind.ComponentProperty,
|
|
82
|
+
componentId: listId,
|
|
83
|
+
path: 'value'
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
]
|
|
87
|
+
}
|
|
88
|
+
]
|
|
89
|
+
}
|
|
90
|
+
]
|
|
91
|
+
}
|
|
92
|
+
];
|
|
93
|
+
/** What a Cancel or Close control does: close the dialog it was opened from. */ const closesDialog = ()=>[
|
|
94
|
+
{
|
|
95
|
+
bindings: [
|
|
96
|
+
{
|
|
97
|
+
trigger: {
|
|
98
|
+
kind: scene_model.InteractionTriggerKind.Click
|
|
99
|
+
},
|
|
100
|
+
actions: [
|
|
101
|
+
{
|
|
102
|
+
kind: scene_model.InteractionActionKind.CloseDialog
|
|
103
|
+
}
|
|
104
|
+
]
|
|
105
|
+
}
|
|
106
|
+
]
|
|
107
|
+
}
|
|
108
|
+
];
|
|
109
|
+
/** An element with the given behaviors attached. */ const withBehaviors = (element, behaviors)=>({
|
|
110
|
+
...element,
|
|
111
|
+
behaviors
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
Object.defineProperty(exports, "component", {
|
|
115
|
+
enumerable: true,
|
|
116
|
+
get: function () { return scene_blueprint_default.component; }
|
|
117
|
+
});
|
|
118
|
+
Object.defineProperty(exports, "panel", {
|
|
119
|
+
enumerable: true,
|
|
120
|
+
get: function () { return scene_blueprint_default.panel; }
|
|
121
|
+
});
|
|
122
|
+
exports.actionButton = actionButton;
|
|
123
|
+
exports.approvalsCategory = approvalsCategory;
|
|
124
|
+
exports.approvalsMetadata = approvalsMetadata;
|
|
125
|
+
exports.closesDialog = closesDialog;
|
|
126
|
+
exports.goesTo = goesTo;
|
|
127
|
+
exports.opensDialog = opensDialog;
|
|
128
|
+
exports.opensRecordOnSelect = opensRecordOnSelect;
|
|
129
|
+
exports.thumbnailOf = thumbnailOf;
|
|
130
|
+
exports.withBehaviors = withBehaviors;
|
|
131
|
+
//# sourceMappingURL=approvalsParts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approvalsParts.js","sources":["../../approvalsParts.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport {\n Behavior, BindingSourceKind, ExternalComponent, InteractionActionKind, InteractionTriggerKind, NavigateAction, OpenDialogAction, SceneElement, TemplateMetadata, TemplateScope,\n} from '@cratis/scene.model';\nimport { component, panel } from '@cratis/scene.blueprint.default';\nimport { approvalsTemplateProvenance } from './templateProvenance';\n\nexport { component, panel };\n\n/** The category of every template of this blueprint (spec Part B 1.2: `Business / <domain>`). */\nexport const approvalsCategory = 'Business / Approvals';\n\n/** The package-relative thumbnail of a template. */\nexport const thumbnailOf = (templateName: string): string => `thumbnails/${templateName}.svg`;\n\n/** The metadata of a screen template of this blueprint: provenance, a type from the vocabulary, the category, a thumbnail and the levels it applies at. */\nexport const approvalsMetadata = (name: string, type: 'Dashboard' | 'List' | 'Board' | 'Detail' | 'Form' | 'Dialog' | 'Workspace' | 'Wizard', scopes: TemplateScope[]): TemplateMetadata =>\n ({ ...approvalsTemplateProvenance, type, category: approvalsCategory, thumbnail: thumbnailOf(name), scopes });\n\n/** A button of the foundation: a verb, its emphasis, and the permission rule every action declares (spec Part B 1.5). */\nexport const actionButton = (id: string, label: string, emphasis: 'primary' | 'secondary' | 'quiet' | 'danger', extra: Record<string, unknown> = {}, behaviors?: Behavior[]): ExternalComponent =>\n ({ ...component(id, 'actionButton', { label, emphasis, permission: 'enabled', ...extra }), ...(behaviors ? { behaviors } : {}) });\n\n/** What pressing an element does: open the named dialog template over the page. */\nexport const opensDialog = (dialogTemplate: string): Behavior[] =>\n [{ bindings: [{ trigger: { kind: InteractionTriggerKind.Click }, actions: [{ kind: InteractionActionKind.OpenDialog, dialogTemplate } as OpenDialogAction] }] }];\n\n/** What pressing an element does: go to the named screen. */\nexport const goesTo = (screen: string): Behavior[] =>\n [{ bindings: [{ trigger: { kind: InteractionTriggerKind.Click }, actions: [{ kind: InteractionActionKind.Navigate, screen } as NavigateAction] }] }];\n\n/**\n * What choosing a row of a list does: open the record page, handing it the chosen row's id. The list is single-selection, so choosing a row is\n * opening it - the way a table of records works everywhere.\n */\nexport const opensRecordOnSelect = (listId: string, screen: string): Behavior[] => [{\n bindings: [{\n trigger: { kind: InteractionTriggerKind.Select },\n actions: [{ kind: InteractionActionKind.Navigate, screen, arguments: [{ name: 'id', value: { kind: BindingSourceKind.ComponentProperty, componentId: listId, path: 'value' } }] } as NavigateAction],\n }],\n}];\n\n/** What a Cancel or Close control does: close the dialog it was opened from. */\nexport const closesDialog = (): Behavior[] => [{ bindings: [{ trigger: { kind: InteractionTriggerKind.Click }, actions: [{ kind: InteractionActionKind.CloseDialog }] }] }];\n\n/** An element with the given behaviors attached. */\nexport const withBehaviors = <T extends SceneElement>(element: T, behaviors: Behavior[]): T => ({ ...element, behaviors });\n\n"],"names":["approvalsCategory","thumbnailOf","templateName","approvalsMetadata","name","type","scopes","approvalsTemplateProvenance","category","thumbnail","actionButton","id","label","emphasis","extra","behaviors","component","permission","opensDialog","dialogTemplate","bindings","trigger","kind","InteractionTriggerKind","Click","actions","InteractionActionKind","OpenDialog","goesTo","screen","Navigate","opensRecordOnSelect","listId","Select","arguments","value","BindingSourceKind","ComponentProperty","componentId","path","closesDialog","CloseDialog","withBehaviors","element"],"mappings":";;;;;;AAAA;AACA;AAUA,kGACO,MAAMA,iBAAAA,GAAoB;AAEjC,qDACO,MAAMC,WAAAA,GAAc,CAACC,YAAAA,GAAiC,CAAC,WAAW,EAAEA,YAAAA,CAAa,IAAI;AAE5F,4JACO,MAAMC,iBAAAA,GAAoB,CAACC,IAAAA,EAAcC,IAAAA,EAA8FC,UACzI;AAAE,QAAA,GAAGC,8CAA2B;AAAEF,QAAAA,IAAAA;QAAMG,QAAAA,EAAUR,iBAAAA;AAAmBS,QAAAA,SAAAA,EAAWR,WAAAA,CAAYG,IAAAA,CAAAA;AAAOE,QAAAA;AAAO,KAAA;AAE/G,0HACO,MAAMI,YAAAA,GAAe,CAACC,EAAAA,EAAYC,KAAAA,EAAeC,QAAAA,EAAwDC,KAAAA,GAAiC,EAAE,EAAEC,aAChJ;QAAE,GAAGC,iCAAAA,CAAUL,IAAI,cAAA,EAAgB;AAAEC,YAAAA,KAAAA;AAAOC,YAAAA,QAAAA;YAAUI,UAAAA,EAAY,SAAA;AAAW,YAAA,GAAGH;SAAM,CAAE;AAAE,QAAA,GAAIC,SAAAA,GAAY;AAAEA,YAAAA;AAAU,SAAA,GAAI;AAAI,KAAA;AAEnI,oFACO,MAAMG,WAAAA,GAAc,CAACC,cAAAA,GACxB;AAAC,QAAA;YAAEC,QAAAA,EAAU;AAAC,gBAAA;oBAAEC,OAAAA,EAAS;AAAEC,wBAAAA,IAAAA,EAAMC,mCAAuBC;AAAM,qBAAA;oBAAGC,OAAAA,EAAS;AAAC,wBAAA;AAAEH,4BAAAA,IAAAA,EAAMI,kCAAsBC,UAAU;AAAER,4BAAAA;AAAe;AAAsB;AAAC;AAAE;AAAC;;AAElK,8DACO,MAAMS,MAAAA,GAAS,CAACC,MAAAA,GACnB;AAAC,QAAA;YAAET,QAAAA,EAAU;AAAC,gBAAA;oBAAEC,OAAAA,EAAS;AAAEC,wBAAAA,IAAAA,EAAMC,mCAAuBC;AAAM,qBAAA;oBAAGC,OAAAA,EAAS;AAAC,wBAAA;AAAEH,4BAAAA,IAAAA,EAAMI,kCAAsBI,QAAQ;AAAED,4BAAAA;AAAO;AAAoB;AAAC;AAAE;AAAC;;AAEtJ;;;AAGC,IACM,MAAME,mBAAAA,GAAsB,CAACC,QAAgBH,MAAAA,GAA+B;AAAC,QAAA;YAChFT,QAAAA,EAAU;AAAC,gBAAA;oBACPC,OAAAA,EAAS;AAAEC,wBAAAA,IAAAA,EAAMC,mCAAuBU;AAAO,qBAAA;oBAC/CR,OAAAA,EAAS;AAAC,wBAAA;AAAEH,4BAAAA,IAAAA,EAAMI,kCAAsBI,QAAQ;AAAED,4BAAAA,MAAAA;4BAAQK,SAAAA,EAAW;AAAC,gCAAA;oCAAE9B,IAAAA,EAAM,IAAA;oCAAM+B,KAAAA,EAAO;AAAEb,wCAAAA,IAAAA,EAAMc,8BAAkBC,iBAAiB;wCAAEC,WAAAA,EAAaN,MAAAA;wCAAQO,IAAAA,EAAM;AAAQ;AAAE;AAAE;AAAC;AAAoB;AACxM;AAAE;AACN;;AAEA,iFACO,MAAMC,YAAAA,GAAe,IAAkB;AAAC,QAAA;YAAEpB,QAAAA,EAAU;AAAC,gBAAA;oBAAEC,OAAAA,EAAS;AAAEC,wBAAAA,IAAAA,EAAMC,mCAAuBC;AAAM,qBAAA;oBAAGC,OAAAA,EAAS;AAAC,wBAAA;AAAEH,4BAAAA,IAAAA,EAAMI,kCAAsBe;AAAY;AAAE;AAAC;AAAE;AAAC;;AAEzK,qDACO,MAAMC,gBAAgB,CAAyBC,OAAAA,EAAY5B,aAA8B;AAAE,QAAA,GAAG4B,OAAO;AAAE5B,QAAAA;AAAU,KAAA;;;;;;;;;;;;;;;;;;"}
|