@cratis/scene.blueprint.default 4.35.0 → 4.37.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/ComponentName.ts +21 -0
- package/defaultBlueprintComponents.ts +8 -1
- package/dist/cjs/ComponentName.js +7 -0
- package/dist/cjs/ComponentName.js.map +1 -1
- package/dist/cjs/defaultBlueprint.js +2 -0
- package/dist/cjs/defaultBlueprint.js.map +1 -1
- package/dist/cjs/defaultBlueprintComponentMetadata.js +2 -0
- package/dist/cjs/defaultBlueprintComponentMetadata.js.map +1 -1
- package/dist/cjs/defaultBlueprintComponents.js +15 -1
- package/dist/cjs/defaultBlueprintComponents.js.map +1 -1
- package/dist/cjs/foundation/ActivityFeed.js +122 -0
- package/dist/cjs/foundation/ActivityFeed.js.map +1 -0
- package/dist/cjs/foundation/ApprovalChainStepper.js +130 -0
- package/dist/cjs/foundation/ApprovalChainStepper.js.map +1 -0
- package/dist/cjs/foundation/AvatarStack.js +73 -0
- package/dist/cjs/foundation/AvatarStack.js.map +1 -0
- package/dist/cjs/foundation/ChecklistSection.js +174 -0
- package/dist/cjs/foundation/ChecklistSection.js.map +1 -0
- package/dist/cjs/foundation/FileUploader.js +218 -0
- package/dist/cjs/foundation/FileUploader.js.map +1 -0
- package/dist/cjs/foundation/FileUploaderHandler.js +17 -0
- package/dist/cjs/foundation/FileUploaderHandler.js.map +1 -0
- package/dist/cjs/foundation/OrgTree.js +188 -0
- package/dist/cjs/foundation/OrgTree.js.map +1 -0
- package/dist/cjs/foundation/PermissionMatrix.js +136 -0
- package/dist/cjs/foundation/PermissionMatrix.js.map +1 -0
- package/dist/cjs/foundation/activityModel.js +63 -0
- package/dist/cjs/foundation/activityModel.js.map +1 -0
- package/dist/cjs/foundation/approvalModel.js +87 -0
- package/dist/cjs/foundation/approvalModel.js.map +1 -0
- package/dist/cjs/foundation/avatarModel.js +42 -0
- package/dist/cjs/foundation/avatarModel.js.map +1 -0
- package/dist/cjs/foundation/checklistModel.js +59 -0
- package/dist/cjs/foundation/checklistModel.js.map +1 -0
- package/dist/cjs/foundation/formatting.js +11 -0
- package/dist/cjs/foundation/formatting.js.map +1 -1
- package/dist/cjs/foundation/foundationComponentMetadata.js +47 -0
- package/dist/cjs/foundation/foundationComponentMetadata.js.map +1 -1
- package/dist/cjs/foundation/foundationDescriptors.js +246 -0
- package/dist/cjs/foundation/foundationDescriptors.js.map +1 -1
- package/dist/cjs/foundation/foundationSamples.js +230 -0
- package/dist/cjs/foundation/foundationSamples.js.map +1 -1
- package/dist/cjs/foundation/foundationStrings.js +27 -1
- package/dist/cjs/foundation/foundationStrings.js.map +1 -1
- package/dist/cjs/foundation/orgModel.js +106 -0
- package/dist/cjs/foundation/orgModel.js.map +1 -0
- package/dist/cjs/foundation/permissionModel.js +84 -0
- package/dist/cjs/foundation/permissionModel.js.map +1 -0
- package/dist/cjs/foundation/uploadModel.js +71 -0
- package/dist/cjs/foundation/uploadModel.js.map +1 -0
- package/dist/cjs/index.js +59 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/ComponentName.d.ts +8 -1
- package/dist/esm/ComponentName.d.ts.map +1 -1
- package/dist/esm/ComponentName.js +7 -0
- package/dist/esm/ComponentName.js.map +1 -1
- package/dist/esm/defaultBlueprint.js +2 -0
- package/dist/esm/defaultBlueprint.js.map +1 -1
- package/dist/esm/defaultBlueprintComponentMetadata.js +2 -0
- package/dist/esm/defaultBlueprintComponentMetadata.js.map +1 -1
- package/dist/esm/defaultBlueprintComponents.d.ts.map +1 -1
- package/dist/esm/defaultBlueprintComponents.js +15 -1
- package/dist/esm/defaultBlueprintComponents.js.map +1 -1
- package/dist/esm/foundation/ActivityFeed.d.ts +3 -0
- package/dist/esm/foundation/ActivityFeed.d.ts.map +1 -0
- package/dist/esm/foundation/ActivityFeed.js +120 -0
- package/dist/esm/foundation/ActivityFeed.js.map +1 -0
- package/dist/esm/foundation/ApprovalChainStepper.d.ts +3 -0
- package/dist/esm/foundation/ApprovalChainStepper.d.ts.map +1 -0
- package/dist/esm/foundation/ApprovalChainStepper.js +128 -0
- package/dist/esm/foundation/ApprovalChainStepper.js.map +1 -0
- package/dist/esm/foundation/AvatarStack.d.ts +3 -0
- package/dist/esm/foundation/AvatarStack.d.ts.map +1 -0
- package/dist/esm/foundation/AvatarStack.js +71 -0
- package/dist/esm/foundation/AvatarStack.js.map +1 -0
- package/dist/esm/foundation/ChecklistSection.d.ts +3 -0
- package/dist/esm/foundation/ChecklistSection.d.ts.map +1 -0
- package/dist/esm/foundation/ChecklistSection.js +172 -0
- package/dist/esm/foundation/ChecklistSection.js.map +1 -0
- package/dist/esm/foundation/FileUploader.d.ts +3 -0
- package/dist/esm/foundation/FileUploader.d.ts.map +1 -0
- package/dist/esm/foundation/FileUploader.js +216 -0
- package/dist/esm/foundation/FileUploader.js.map +1 -0
- package/dist/esm/foundation/FileUploaderHandler.d.ts +8 -0
- package/dist/esm/foundation/FileUploaderHandler.d.ts.map +1 -0
- package/dist/esm/foundation/FileUploaderHandler.js +14 -0
- package/dist/esm/foundation/FileUploaderHandler.js.map +1 -0
- package/dist/esm/foundation/Foundation.stories.d.ts +16 -0
- package/dist/esm/foundation/Foundation.stories.d.ts.map +1 -1
- package/dist/esm/foundation/Foundation.stories.js +16 -0
- package/dist/esm/foundation/Foundation.stories.js.map +1 -1
- package/dist/esm/foundation/OrgTree.d.ts +3 -0
- package/dist/esm/foundation/OrgTree.d.ts.map +1 -0
- package/dist/esm/foundation/OrgTree.js +186 -0
- package/dist/esm/foundation/OrgTree.js.map +1 -0
- package/dist/esm/foundation/PermissionMatrix.d.ts +3 -0
- package/dist/esm/foundation/PermissionMatrix.d.ts.map +1 -0
- package/dist/esm/foundation/PermissionMatrix.js +134 -0
- package/dist/esm/foundation/PermissionMatrix.js.map +1 -0
- package/dist/esm/foundation/activityModel.d.ts +22 -0
- package/dist/esm/foundation/activityModel.d.ts.map +1 -0
- package/dist/esm/foundation/activityModel.js +58 -0
- package/dist/esm/foundation/activityModel.js.map +1 -0
- package/dist/esm/foundation/approvalModel.d.ts +27 -0
- package/dist/esm/foundation/approvalModel.d.ts.map +1 -0
- package/dist/esm/foundation/approvalModel.js +81 -0
- package/dist/esm/foundation/approvalModel.js.map +1 -0
- package/dist/esm/foundation/avatarModel.d.ts +11 -0
- package/dist/esm/foundation/avatarModel.d.ts.map +1 -0
- package/dist/esm/foundation/avatarModel.js +38 -0
- package/dist/esm/foundation/avatarModel.js.map +1 -0
- package/dist/esm/foundation/checklistModel.d.ts +17 -0
- package/dist/esm/foundation/checklistModel.d.ts.map +1 -0
- package/dist/esm/foundation/checklistModel.js +53 -0
- package/dist/esm/foundation/checklistModel.js.map +1 -0
- package/dist/esm/foundation/formatting.d.ts +1 -0
- package/dist/esm/foundation/formatting.d.ts.map +1 -1
- package/dist/esm/foundation/formatting.js +11 -1
- package/dist/esm/foundation/formatting.js.map +1 -1
- package/dist/esm/foundation/foundationComponentMetadata.d.ts.map +1 -1
- package/dist/esm/foundation/foundationComponentMetadata.js +47 -0
- package/dist/esm/foundation/foundationComponentMetadata.js.map +1 -1
- package/dist/esm/foundation/foundationDescriptors.d.ts.map +1 -1
- package/dist/esm/foundation/foundationDescriptors.js +246 -0
- package/dist/esm/foundation/foundationDescriptors.js.map +1 -1
- package/dist/esm/foundation/foundationSamples.d.ts.map +1 -1
- package/dist/esm/foundation/foundationSamples.js +230 -0
- package/dist/esm/foundation/foundationSamples.js.map +1 -1
- package/dist/esm/foundation/foundationStrings.d.ts +26 -0
- package/dist/esm/foundation/foundationStrings.d.ts.map +1 -1
- package/dist/esm/foundation/foundationStrings.js +27 -1
- package/dist/esm/foundation/foundationStrings.js.map +1 -1
- package/dist/esm/foundation/index.d.ts +15 -0
- package/dist/esm/foundation/index.d.ts.map +1 -1
- package/dist/esm/foundation/index.js +15 -0
- package/dist/esm/foundation/index.js.map +1 -1
- package/dist/esm/foundation/orgModel.d.ts +20 -0
- package/dist/esm/foundation/orgModel.d.ts.map +1 -0
- package/dist/esm/foundation/orgModel.js +99 -0
- package/dist/esm/foundation/orgModel.js.map +1 -0
- package/dist/esm/foundation/permissionModel.d.ts +24 -0
- package/dist/esm/foundation/permissionModel.d.ts.map +1 -0
- package/dist/esm/foundation/permissionModel.js +77 -0
- package/dist/esm/foundation/permissionModel.js.map +1 -0
- package/dist/esm/foundation/uploadModel.d.ts +31 -0
- package/dist/esm/foundation/uploadModel.d.ts.map +1 -0
- package/dist/esm/foundation/uploadModel.js +65 -0
- package/dist/esm/foundation/uploadModel.js.map +1 -0
- package/dist/esm/index.js +16 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/foundation/ActivityFeed.tsx +61 -0
- package/foundation/ApprovalChainStepper.tsx +66 -0
- package/foundation/AvatarStack.tsx +43 -0
- package/foundation/ChecklistSection.tsx +80 -0
- package/foundation/FileUploader.tsx +122 -0
- package/foundation/FileUploaderHandler.tsx +22 -0
- package/foundation/Foundation.stories.tsx +16 -0
- package/foundation/OrgTree.tsx +101 -0
- package/foundation/PermissionMatrix.tsx +82 -0
- package/foundation/activityModel.ts +65 -0
- package/foundation/approvalModel.ts +88 -0
- package/foundation/avatarModel.ts +36 -0
- package/foundation/checklistModel.ts +62 -0
- package/foundation/formatting.ts +9 -0
- package/foundation/foundationComponentMetadata.ts +7 -0
- package/foundation/foundationDescriptors.ts +153 -0
- package/foundation/foundationSamples.ts +59 -0
- package/foundation/foundationStrings.ts +26 -0
- package/foundation/index.ts +15 -0
- package/foundation/orgModel.ts +85 -0
- package/foundation/permissionModel.ts +85 -0
- package/foundation/uploadModel.ts +66 -0
- package/package.json +8 -8
- package/shell/layout.css +418 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
4
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
5
|
+
/** One task of a checklist. */ /** Reads checklist groups out of a property value; a task needs an id and a label, and is open unless it says it is done. */ function readChecklist(value) {
|
|
6
|
+
if (!Array.isArray(value)) return [];
|
|
7
|
+
return value.flatMap((entry)=>{
|
|
8
|
+
if (typeof entry !== 'object' || entry === null || Array.isArray(entry)) return [];
|
|
9
|
+
const { title, items } = entry;
|
|
10
|
+
if (typeof title !== 'string' || !Array.isArray(items)) return [];
|
|
11
|
+
return [
|
|
12
|
+
{
|
|
13
|
+
title,
|
|
14
|
+
items: items.flatMap((item)=>{
|
|
15
|
+
if (typeof item !== 'object' || item === null || Array.isArray(item)) return [];
|
|
16
|
+
const { id, label, owner, due, done } = item;
|
|
17
|
+
if (typeof id !== 'string' || typeof label !== 'string') return [];
|
|
18
|
+
return [
|
|
19
|
+
{
|
|
20
|
+
id,
|
|
21
|
+
label,
|
|
22
|
+
done: done === true,
|
|
23
|
+
...typeof owner === 'string' ? {
|
|
24
|
+
owner
|
|
25
|
+
} : {},
|
|
26
|
+
...typeof due === 'string' ? {
|
|
27
|
+
due
|
|
28
|
+
} : {}
|
|
29
|
+
}
|
|
30
|
+
];
|
|
31
|
+
})
|
|
32
|
+
}
|
|
33
|
+
];
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
/** How many of a group's tasks are done. */ const completed = (group)=>group.items.filter((item)=>item.done).length;
|
|
37
|
+
/** Whether an open task is past its due date, today counting as not yet late. */ function isOverdue(item, now) {
|
|
38
|
+
if (item.done || item.due === undefined) return false;
|
|
39
|
+
const due = new Date(item.due);
|
|
40
|
+
if (Number.isNaN(due.getTime())) return false;
|
|
41
|
+
const endOfDue = new Date(due);
|
|
42
|
+
endOfDue.setUTCHours(23, 59, 59, 999);
|
|
43
|
+
return endOfDue.getTime() < now.getTime();
|
|
44
|
+
}
|
|
45
|
+
/** Marks one task done or open, leaving every other as it was. */ const toggleTask = (groups, id)=>groups.map((group)=>group.items.some((item)=>item.id === id) ? {
|
|
46
|
+
...group,
|
|
47
|
+
items: group.items.map((item)=>item.id === id ? {
|
|
48
|
+
...item,
|
|
49
|
+
done: !item.done
|
|
50
|
+
} : item)
|
|
51
|
+
} : group);
|
|
52
|
+
/** The ids of every done task: what the checklist publishes. */ const doneTaskIds = (groups)=>groups.flatMap((group)=>group.items.filter((item)=>item.done).map((item)=>item.id));
|
|
53
|
+
|
|
54
|
+
exports.completed = completed;
|
|
55
|
+
exports.doneTaskIds = doneTaskIds;
|
|
56
|
+
exports.isOverdue = isOverdue;
|
|
57
|
+
exports.readChecklist = readChecklist;
|
|
58
|
+
exports.toggleTask = toggleTask;
|
|
59
|
+
//# sourceMappingURL=checklistModel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checklistModel.js","sources":["../../../foundation/checklistModel.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\n/** One task of a checklist. */\nexport interface ChecklistItem {\n id: string;\n label: string;\n owner?: string;\n due?: string;\n done: boolean;\n}\n\n/** A titled group of tasks. */\nexport interface ChecklistGroup {\n title: string;\n items: ChecklistItem[];\n}\n\n/** Reads checklist groups out of a property value; a task needs an id and a label, and is open unless it says it is done. */\nexport function readChecklist(value: unknown): ChecklistGroup[] {\n if (!Array.isArray(value)) return [];\n\n return value.flatMap((entry): ChecklistGroup[] => {\n if (typeof entry !== 'object' || entry === null || Array.isArray(entry)) return [];\n const { title, items } = entry as Record<string, unknown>;\n if (typeof title !== 'string' || !Array.isArray(items)) return [];\n\n return [{\n title,\n items: items.flatMap((item): ChecklistItem[] => {\n if (typeof item !== 'object' || item === null || Array.isArray(item)) return [];\n const { id, label, owner, due, done } = item as Record<string, unknown>;\n if (typeof id !== 'string' || typeof label !== 'string') return [];\n return [{ id, label, done: done === true, ...(typeof owner === 'string' ? { owner } : {}), ...(typeof due === 'string' ? { due } : {}) }];\n }),\n }];\n });\n}\n\n/** How many of a group's tasks are done. */\nexport const completed = (group: ChecklistGroup): number => group.items.filter(item => item.done).length;\n\n/** Whether an open task is past its due date, today counting as not yet late. */\nexport function isOverdue(item: ChecklistItem, now: Date): boolean {\n if (item.done || item.due === undefined) return false;\n\n const due = new Date(item.due);\n if (Number.isNaN(due.getTime())) return false;\n\n const endOfDue = new Date(due);\n endOfDue.setUTCHours(23, 59, 59, 999);\n return endOfDue.getTime() < now.getTime();\n}\n\n/** Marks one task done or open, leaving every other as it was. */\nexport const toggleTask = (groups: ChecklistGroup[], id: string): ChecklistGroup[] =>\n groups.map(group => (group.items.some(item => item.id === id)\n ? { ...group, items: group.items.map(item => (item.id === id ? { ...item, done: !item.done } : item)) }\n : group));\n\n/** The ids of every done task: what the checklist publishes. */\nexport const doneTaskIds = (groups: ChecklistGroup[]): string[] => groups.flatMap(group => group.items.filter(item => item.done).map(item => item.id));\n"],"names":["readChecklist","value","Array","isArray","flatMap","entry","title","items","item","id","label","owner","due","done","completed","group","filter","length","isOverdue","now","undefined","Date","Number","isNaN","getTime","endOfDue","setUTCHours","toggleTask","groups","map","some","doneTaskIds"],"mappings":"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"}
|
|
@@ -75,9 +75,20 @@
|
|
|
75
75
|
return date.toISOString();
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
|
+
/** Formats a calendar day (`YYYY-MM-DD`) for a locale, as that day and never shifted by the reader's time zone. */ function formatDay(day, locale) {
|
|
79
|
+
try {
|
|
80
|
+
return new Intl.DateTimeFormat(locale, {
|
|
81
|
+
dateStyle: 'full',
|
|
82
|
+
timeZone: 'UTC'
|
|
83
|
+
}).format(new Date(`${day}T12:00:00Z`));
|
|
84
|
+
} catch {
|
|
85
|
+
return day;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
78
88
|
|
|
79
89
|
exports.NumberFormat = NumberFormat;
|
|
80
90
|
exports.formatDate = formatDate;
|
|
91
|
+
exports.formatDay = formatDay;
|
|
81
92
|
exports.formatNumber = formatNumber;
|
|
82
93
|
exports.isRightToLeft = isRightToLeft;
|
|
83
94
|
exports.readLocale = readLocale;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formatting.js","sources":["../../../foundation/formatting.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 { ExternalComponent } from '@cratis/scene.model';\n\n/** How a number is presented. */\nexport enum NumberFormat {\n Number = 'number',\n Currency = 'currency',\n Percent = 'percent',\n Compact = 'compact',\n}\n\n/**\n * The locale a component formats dates, numbers and currency in: the element's `locale`, else the document language, else the\n * runtime's. Formatting never goes through a fixed locale, so the same screen reads correctly in every one.\n */\nexport function readLocale(element: ExternalComponent): string {\n const supplied = element.properties.locale;\n if (typeof supplied === 'string' && supplied.length > 0) return supplied;\n if (typeof document !== 'undefined' && document.documentElement.lang) return document.documentElement.lang;\n return typeof navigator !== 'undefined' && navigator.language ? navigator.language : 'en';\n}\n\n/** Whether the locale reads right to left, so a component can mirror what direction-sensitive CSS cannot. */\nexport function isRightToLeft(locale: string): boolean {\n try {\n const info = new Intl.Locale(locale) as Intl.Locale & { getTextInfo?: () => { direction: string }; textInfo?: { direction: string } };\n const direction = info.getTextInfo?.().direction ?? info.textInfo?.direction;\n return direction === 'rtl';\n } catch {\n return false;\n }\n}\n\n/** Formats a number for a locale, as a plain number, currency, percent (the value is the percentage, 12.5 is 12.5%) or compact. */\nexport function formatNumber(value: number, locale: string, format: NumberFormat = NumberFormat.Number, currency = 'USD', maximumFractionDigits?: number): string {\n try {\n switch (format) {\n case NumberFormat.Currency:\n return new Intl.NumberFormat(locale, { style: 'currency', currency, ...(maximumFractionDigits === undefined ? {} : { maximumFractionDigits }) }).format(value);\n case NumberFormat.Percent:\n return new Intl.NumberFormat(locale, { style: 'percent', maximumFractionDigits: maximumFractionDigits ?? 1 }).format(value / 100);\n case NumberFormat.Compact:\n return new Intl.NumberFormat(locale, { notation: 'compact', maximumFractionDigits: maximumFractionDigits ?? 1 }).format(value);\n default:\n return new Intl.NumberFormat(locale, { maximumFractionDigits: maximumFractionDigits ?? 2 }).format(value);\n }\n } catch {\n return String(value);\n }\n}\n\n/** Reads a number format name, defaulting to a plain number. */\nexport function readNumberFormat(element: ExternalComponent, property = 'format'): NumberFormat {\n const value = element.properties[property];\n return (Object.values(NumberFormat) as string[]).includes(value as string) ? (value as NumberFormat) : NumberFormat.Number;\n}\n\n/** Formats a date or an ISO 8601 date-time for a locale; a value that is not a date is returned as it was written. */\nexport function formatDate(value: unknown, locale: string, withTime = false): string {\n const date = value instanceof Date ? value : typeof value === 'string' || typeof value === 'number' ? new Date(value) : undefined;\n if (!date || Number.isNaN(date.getTime())) return typeof value === 'string' ? value : '';\n try {\n return new Intl.DateTimeFormat(locale, withTime ? { dateStyle: 'medium', timeStyle: 'short' } : { dateStyle: 'medium' }).format(date);\n } catch {\n return date.toISOString();\n }\n}\n"],"names":["NumberFormat","readLocale","element","supplied","properties","locale","length","document","documentElement","lang","navigator","language","isRightToLeft","info","Intl","Locale","direction","getTextInfo","textInfo","formatNumber","value","format","currency","maximumFractionDigits","style","undefined","notation","String","readNumberFormat","property","Object","values","includes","formatDate","withTime","date","Date","Number","isNaN","getTime","DateTimeFormat","dateStyle","timeStyle","toISOString"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"formatting.js","sources":["../../../foundation/formatting.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 { ExternalComponent } from '@cratis/scene.model';\n\n/** How a number is presented. */\nexport enum NumberFormat {\n Number = 'number',\n Currency = 'currency',\n Percent = 'percent',\n Compact = 'compact',\n}\n\n/**\n * The locale a component formats dates, numbers and currency in: the element's `locale`, else the document language, else the\n * runtime's. Formatting never goes through a fixed locale, so the same screen reads correctly in every one.\n */\nexport function readLocale(element: ExternalComponent): string {\n const supplied = element.properties.locale;\n if (typeof supplied === 'string' && supplied.length > 0) return supplied;\n if (typeof document !== 'undefined' && document.documentElement.lang) return document.documentElement.lang;\n return typeof navigator !== 'undefined' && navigator.language ? navigator.language : 'en';\n}\n\n/** Whether the locale reads right to left, so a component can mirror what direction-sensitive CSS cannot. */\nexport function isRightToLeft(locale: string): boolean {\n try {\n const info = new Intl.Locale(locale) as Intl.Locale & { getTextInfo?: () => { direction: string }; textInfo?: { direction: string } };\n const direction = info.getTextInfo?.().direction ?? info.textInfo?.direction;\n return direction === 'rtl';\n } catch {\n return false;\n }\n}\n\n/** Formats a number for a locale, as a plain number, currency, percent (the value is the percentage, 12.5 is 12.5%) or compact. */\nexport function formatNumber(value: number, locale: string, format: NumberFormat = NumberFormat.Number, currency = 'USD', maximumFractionDigits?: number): string {\n try {\n switch (format) {\n case NumberFormat.Currency:\n return new Intl.NumberFormat(locale, { style: 'currency', currency, ...(maximumFractionDigits === undefined ? {} : { maximumFractionDigits }) }).format(value);\n case NumberFormat.Percent:\n return new Intl.NumberFormat(locale, { style: 'percent', maximumFractionDigits: maximumFractionDigits ?? 1 }).format(value / 100);\n case NumberFormat.Compact:\n return new Intl.NumberFormat(locale, { notation: 'compact', maximumFractionDigits: maximumFractionDigits ?? 1 }).format(value);\n default:\n return new Intl.NumberFormat(locale, { maximumFractionDigits: maximumFractionDigits ?? 2 }).format(value);\n }\n } catch {\n return String(value);\n }\n}\n\n/** Reads a number format name, defaulting to a plain number. */\nexport function readNumberFormat(element: ExternalComponent, property = 'format'): NumberFormat {\n const value = element.properties[property];\n return (Object.values(NumberFormat) as string[]).includes(value as string) ? (value as NumberFormat) : NumberFormat.Number;\n}\n\n/** Formats a date or an ISO 8601 date-time for a locale; a value that is not a date is returned as it was written. */\nexport function formatDate(value: unknown, locale: string, withTime = false): string {\n const date = value instanceof Date ? value : typeof value === 'string' || typeof value === 'number' ? new Date(value) : undefined;\n if (!date || Number.isNaN(date.getTime())) return typeof value === 'string' ? value : '';\n try {\n return new Intl.DateTimeFormat(locale, withTime ? { dateStyle: 'medium', timeStyle: 'short' } : { dateStyle: 'medium' }).format(date);\n } catch {\n return date.toISOString();\n }\n}\n\n/** Formats a calendar day (`YYYY-MM-DD`) for a locale, as that day and never shifted by the reader's time zone. */\nexport function formatDay(day: string, locale: string): string {\n try {\n return new Intl.DateTimeFormat(locale, { dateStyle: 'full', timeZone: 'UTC' }).format(new Date(`${day}T12:00:00Z`));\n } catch {\n return day;\n }\n}\n"],"names":["NumberFormat","readLocale","element","supplied","properties","locale","length","document","documentElement","lang","navigator","language","isRightToLeft","info","Intl","Locale","direction","getTextInfo","textInfo","formatNumber","value","format","currency","maximumFractionDigits","style","undefined","notation","String","readNumberFormat","property","Object","values","includes","formatDate","withTime","date","Date","Number","isNaN","getTime","DateTimeFormat","dateStyle","timeStyle","toISOString","formatDay","day","timeZone"],"mappings":"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"}
|
|
@@ -62,6 +62,53 @@ var ComponentName = require('../ComponentName.js');
|
|
|
62
62
|
'views',
|
|
63
63
|
'presets',
|
|
64
64
|
'saved filters'
|
|
65
|
+
]),
|
|
66
|
+
[ComponentName.ComponentName.ChecklistSection]: scene_react.componentMetadata('Checklist', scene_model.ComponentCategory.DataDisplay, 'list-checks', [
|
|
67
|
+
'tasks',
|
|
68
|
+
'todo',
|
|
69
|
+
'onboarding',
|
|
70
|
+
'progress',
|
|
71
|
+
'steps'
|
|
72
|
+
]),
|
|
73
|
+
[ComponentName.ComponentName.ActivityFeed]: scene_react.componentMetadata('Activity feed', scene_model.ComponentCategory.DataDisplay, 'activity', [
|
|
74
|
+
'timeline',
|
|
75
|
+
'history',
|
|
76
|
+
'comments',
|
|
77
|
+
'audit',
|
|
78
|
+
'log'
|
|
79
|
+
]),
|
|
80
|
+
[ComponentName.ComponentName.AvatarStack]: scene_react.componentMetadata('Avatar stack', scene_model.ComponentCategory.DataDisplay, 'users', [
|
|
81
|
+
'people',
|
|
82
|
+
'members',
|
|
83
|
+
'assignees',
|
|
84
|
+
'team'
|
|
85
|
+
]),
|
|
86
|
+
[ComponentName.ComponentName.FileUploader]: scene_react.componentMetadata('File uploader', scene_model.ComponentCategory.Input, 'upload', [
|
|
87
|
+
'attachments',
|
|
88
|
+
'files',
|
|
89
|
+
'drop zone',
|
|
90
|
+
'documents'
|
|
91
|
+
]),
|
|
92
|
+
[ComponentName.ComponentName.ApprovalChainStepper]: scene_react.componentMetadata('Approval chain', scene_model.ComponentCategory.Navigation, 'workflow', [
|
|
93
|
+
'approvals',
|
|
94
|
+
'steps',
|
|
95
|
+
'workflow',
|
|
96
|
+
'sign off',
|
|
97
|
+
'stepper'
|
|
98
|
+
]),
|
|
99
|
+
[ComponentName.ComponentName.OrgTree]: scene_react.componentMetadata('Org tree', scene_model.ComponentCategory.DataDisplay, 'network', [
|
|
100
|
+
'organization',
|
|
101
|
+
'hierarchy',
|
|
102
|
+
'org chart',
|
|
103
|
+
'reports to',
|
|
104
|
+
'tree'
|
|
105
|
+
]),
|
|
106
|
+
[ComponentName.ComponentName.PermissionMatrix]: scene_react.componentMetadata('Permission matrix', scene_model.ComponentCategory.Input, 'shield-check', [
|
|
107
|
+
'roles',
|
|
108
|
+
'permissions',
|
|
109
|
+
'access',
|
|
110
|
+
'grants',
|
|
111
|
+
'rbac'
|
|
65
112
|
])
|
|
66
113
|
};
|
|
67
114
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"foundationComponentMetadata.js","sources":["../../../foundation/foundationComponentMetadata.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 { ComponentCategory } from '@cratis/scene.model';\nimport { ComponentMetadata, componentMetadata as m } from '@cratis/scene.react';\nimport { ComponentName } from '../ComponentName';\n\n/**\n * The category, icon, keywords and picker badge of every foundation component (CMP1), keyed by bare component name.\n * The names are those of `ComponentName`; the metadata of the rest of the package lives in `defaultBlueprintComponentMetadata`.\n */\nexport const foundationComponentMetadata: Record<string, ComponentMetadata> = {\n [ComponentName.EmptyState]: m('Empty state', ComponentCategory.Feedback, 'inbox', ['no data', 'nothing', 'blank slate', 'zero state']),\n [ComponentName.StatCard]: m('Stat card', ComponentCategory.DataDisplay, 'gauge', ['kpi', 'metric', 'figure', 'number', 'dashboard']),\n [ComponentName.TrendChip]: m('Trend chip', ComponentCategory.DataDisplay, 'trending-up', ['delta', 'change', 'arrow', 'comparison']),\n [ComponentName.StatusChip]: m('Status chip', ComponentCategory.DataDisplay, 'badge-check', ['badge', 'state', 'tag', 'label']),\n [ComponentName.ChartWrapper]: m('Chart', ComponentCategory.DataDisplay, 'chart-line', ['graph', 'line', 'bar', 'stacked', 'donut', 'pie', 'funnel', 'plot']),\n [ComponentName.FilterBuilder]: m('Filter builder', ComponentCategory.Input, 'list-filter', ['filter', 'query', 'conditions', 'and or', 'search']),\n [ComponentName.ColumnChooser]: m('Column chooser', ComponentCategory.Actions, 'columns-3', ['columns', 'fields', 'show hide', 'table']),\n [ComponentName.SavedViewsMenu]: m('Saved views menu', ComponentCategory.Actions, 'bookmark', ['views', 'presets', 'saved filters']),\n};\n"],"names":["foundationComponentMetadata","ComponentName","EmptyState","m","ComponentCategory","Feedback","StatCard","DataDisplay","TrendChip","StatusChip","ChartWrapper","FilterBuilder","Input","ColumnChooser","Actions","SavedViewsMenu"],"mappings":";;;;;;AAAA;AACA;AAMA;;;UAIaA,2BAAAA,GAAiE;IAC1E,CAACC,2BAAAA,CAAcC,UAAU,GAAGC,8BAAE,aAAA,EAAeC,6BAAAA,CAAkBC,QAAQ,EAAE,OAAA,EAAS;AAAC,QAAA,SAAA;AAAW,QAAA,SAAA;AAAW,QAAA,aAAA;AAAe,QAAA;AAAa,KAAA,CAAA;IACrI,CAACJ,2BAAAA,CAAcK,QAAQ,GAAGH,8BAAE,WAAA,EAAaC,6BAAAA,CAAkBG,WAAW,EAAE,OAAA,EAAS;AAAC,QAAA,KAAA;AAAO,QAAA,QAAA;AAAU,QAAA,QAAA;AAAU,QAAA,QAAA;AAAU,QAAA;AAAY,KAAA,CAAA;IACnI,CAACN,2BAAAA,CAAcO,SAAS,GAAGL,8BAAE,YAAA,EAAcC,6BAAAA,CAAkBG,WAAW,EAAE,aAAA,EAAe;AAAC,QAAA,OAAA;AAAS,QAAA,QAAA;AAAU,QAAA,OAAA;AAAS,QAAA;AAAa,KAAA,CAAA;IACnI,CAACN,2BAAAA,CAAcQ,UAAU,GAAGN,8BAAE,aAAA,EAAeC,6BAAAA,CAAkBG,WAAW,EAAE,aAAA,EAAe;AAAC,QAAA,OAAA;AAAS,QAAA,OAAA;AAAS,QAAA,KAAA;AAAO,QAAA;AAAQ,KAAA,CAAA;IAC7H,CAACN,2BAAAA,CAAcS,YAAY,GAAGP,8BAAE,OAAA,EAASC,6BAAAA,CAAkBG,WAAW,EAAE,YAAA,EAAc;AAAC,QAAA,OAAA;AAAS,QAAA,MAAA;AAAQ,QAAA,KAAA;AAAO,QAAA,SAAA;AAAW,QAAA,OAAA;AAAS,QAAA,KAAA;AAAO,QAAA,QAAA;AAAU,QAAA;AAAO,KAAA,CAAA;IAC3J,CAACN,2BAAAA,CAAcU,aAAa,GAAGR,8BAAE,gBAAA,EAAkBC,6BAAAA,CAAkBQ,KAAK,EAAE,aAAA,EAAe;AAAC,QAAA,QAAA;AAAU,QAAA,OAAA;AAAS,QAAA,YAAA;AAAc,QAAA,QAAA;AAAU,QAAA;AAAS,KAAA,CAAA;IAChJ,CAACX,2BAAAA,CAAcY,aAAa,GAAGV,8BAAE,gBAAA,EAAkBC,6BAAAA,CAAkBU,OAAO,EAAE,WAAA,EAAa;AAAC,QAAA,SAAA;AAAW,QAAA,QAAA;AAAU,QAAA,WAAA;AAAa,QAAA;AAAQ,KAAA,CAAA;IACtI,CAACb,2BAAAA,CAAcc,cAAc,GAAGZ,8BAAE,kBAAA,EAAoBC,6BAAAA,CAAkBU,OAAO,EAAE,UAAA,EAAY;AAAC,QAAA,OAAA;AAAS,QAAA,SAAA;AAAW,QAAA;AAAgB,KAAA;
|
|
1
|
+
{"version":3,"file":"foundationComponentMetadata.js","sources":["../../../foundation/foundationComponentMetadata.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 { ComponentCategory } from '@cratis/scene.model';\nimport { ComponentMetadata, componentMetadata as m } from '@cratis/scene.react';\nimport { ComponentName } from '../ComponentName';\n\n/**\n * The category, icon, keywords and picker badge of every foundation component (CMP1), keyed by bare component name.\n * The names are those of `ComponentName`; the metadata of the rest of the package lives in `defaultBlueprintComponentMetadata`.\n */\nexport const foundationComponentMetadata: Record<string, ComponentMetadata> = {\n [ComponentName.EmptyState]: m('Empty state', ComponentCategory.Feedback, 'inbox', ['no data', 'nothing', 'blank slate', 'zero state']),\n [ComponentName.StatCard]: m('Stat card', ComponentCategory.DataDisplay, 'gauge', ['kpi', 'metric', 'figure', 'number', 'dashboard']),\n [ComponentName.TrendChip]: m('Trend chip', ComponentCategory.DataDisplay, 'trending-up', ['delta', 'change', 'arrow', 'comparison']),\n [ComponentName.StatusChip]: m('Status chip', ComponentCategory.DataDisplay, 'badge-check', ['badge', 'state', 'tag', 'label']),\n [ComponentName.ChartWrapper]: m('Chart', ComponentCategory.DataDisplay, 'chart-line', ['graph', 'line', 'bar', 'stacked', 'donut', 'pie', 'funnel', 'plot']),\n [ComponentName.FilterBuilder]: m('Filter builder', ComponentCategory.Input, 'list-filter', ['filter', 'query', 'conditions', 'and or', 'search']),\n [ComponentName.ColumnChooser]: m('Column chooser', ComponentCategory.Actions, 'columns-3', ['columns', 'fields', 'show hide', 'table']),\n [ComponentName.SavedViewsMenu]: m('Saved views menu', ComponentCategory.Actions, 'bookmark', ['views', 'presets', 'saved filters']),\n [ComponentName.ChecklistSection]: m('Checklist', ComponentCategory.DataDisplay, 'list-checks', ['tasks', 'todo', 'onboarding', 'progress', 'steps']),\n [ComponentName.ActivityFeed]: m('Activity feed', ComponentCategory.DataDisplay, 'activity', ['timeline', 'history', 'comments', 'audit', 'log']),\n [ComponentName.AvatarStack]: m('Avatar stack', ComponentCategory.DataDisplay, 'users', ['people', 'members', 'assignees', 'team']),\n [ComponentName.FileUploader]: m('File uploader', ComponentCategory.Input, 'upload', ['attachments', 'files', 'drop zone', 'documents']),\n [ComponentName.ApprovalChainStepper]: m('Approval chain', ComponentCategory.Navigation, 'workflow', ['approvals', 'steps', 'workflow', 'sign off', 'stepper']),\n [ComponentName.OrgTree]: m('Org tree', ComponentCategory.DataDisplay, 'network', ['organization', 'hierarchy', 'org chart', 'reports to', 'tree']),\n [ComponentName.PermissionMatrix]: m('Permission matrix', ComponentCategory.Input, 'shield-check', ['roles', 'permissions', 'access', 'grants', 'rbac']),\n};\n"],"names":["foundationComponentMetadata","ComponentName","EmptyState","m","ComponentCategory","Feedback","StatCard","DataDisplay","TrendChip","StatusChip","ChartWrapper","FilterBuilder","Input","ColumnChooser","Actions","SavedViewsMenu","ChecklistSection","ActivityFeed","AvatarStack","FileUploader","ApprovalChainStepper","Navigation","OrgTree","PermissionMatrix"],"mappings":"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"}
|
|
@@ -4,6 +4,8 @@ var scene_model = require('@cratis/scene.model');
|
|
|
4
4
|
var scene_react = require('@cratis/scene.react');
|
|
5
5
|
var ComponentName = require('../ComponentName.js');
|
|
6
6
|
var packageName = require('../packageName.js');
|
|
7
|
+
var activityModel = require('./activityModel.js');
|
|
8
|
+
var approvalModel = require('./approvalModel.js');
|
|
7
9
|
var chartGeometry = require('./chartGeometry.js');
|
|
8
10
|
var ComponentState = require('./ComponentState.js');
|
|
9
11
|
var filterModel = require('./filterModel.js');
|
|
@@ -375,6 +377,250 @@ const formats = {
|
|
|
375
377
|
},
|
|
376
378
|
...standardStateProperties
|
|
377
379
|
]
|
|
380
|
+
},
|
|
381
|
+
{
|
|
382
|
+
component: key(ComponentName.ComponentName.ChecklistSection),
|
|
383
|
+
displayName: 'Checklist',
|
|
384
|
+
description: 'Sections of tasks with an owner and due date each and a progress bar per section. Publishes the ids of the done tasks as the value output.',
|
|
385
|
+
properties: [
|
|
386
|
+
{
|
|
387
|
+
...list('sections', 'Sections', 'Data', 'Section', [
|
|
388
|
+
text('title', 'Title', 'Content', undefined, {
|
|
389
|
+
constraints: {
|
|
390
|
+
required: true
|
|
391
|
+
}
|
|
392
|
+
}),
|
|
393
|
+
list('items', 'Tasks', 'Data', 'Task', [
|
|
394
|
+
text('id', 'Id', 'Data', undefined, {
|
|
395
|
+
constraints: {
|
|
396
|
+
required: true
|
|
397
|
+
}
|
|
398
|
+
}),
|
|
399
|
+
text('label', 'Task', 'Content', undefined, {
|
|
400
|
+
constraints: {
|
|
401
|
+
required: true
|
|
402
|
+
}
|
|
403
|
+
}),
|
|
404
|
+
text('owner', 'Owner', 'Data'),
|
|
405
|
+
text('due', 'Due date', 'Data', 'An ISO 8601 date.'),
|
|
406
|
+
flag('done', 'Done', 'Data')
|
|
407
|
+
])
|
|
408
|
+
], 'The groups of tasks.'),
|
|
409
|
+
acceptedBindingKinds: bindable
|
|
410
|
+
},
|
|
411
|
+
text('today', 'Today', 'Content', 'The date overdue is judged against; empty is the current date.'),
|
|
412
|
+
rule('editPermission', 'Edit permission', 'Enabled lets the user tick tasks; otherwise they are shown read-only.'),
|
|
413
|
+
scene_react.valueOutputProperty(scene_model.PropertyValueType.Json, 'The ids of the done tasks, published as the user ticks them.'),
|
|
414
|
+
...standardStateProperties
|
|
415
|
+
]
|
|
416
|
+
},
|
|
417
|
+
{
|
|
418
|
+
component: key(ComponentName.ComponentName.ActivityFeed),
|
|
419
|
+
displayName: 'Activity feed',
|
|
420
|
+
description: 'What happened to a record, grouped by day. Content is supplied by the application; this lays it out.',
|
|
421
|
+
properties: [
|
|
422
|
+
{
|
|
423
|
+
...list('entries', 'Entries', 'Data', 'Entry', [
|
|
424
|
+
text('id', 'Id', 'Data', undefined, {
|
|
425
|
+
constraints: {
|
|
426
|
+
required: true
|
|
427
|
+
}
|
|
428
|
+
}),
|
|
429
|
+
text('actor', 'Who', 'Data'),
|
|
430
|
+
text('action', 'What', 'Data'),
|
|
431
|
+
choice('kind', 'Kind', 'Data', {
|
|
432
|
+
[activityModel.ActivityKind.Comment]: 'Comment',
|
|
433
|
+
[activityModel.ActivityKind.Change]: 'Change',
|
|
434
|
+
[activityModel.ActivityKind.Status]: 'Status',
|
|
435
|
+
[activityModel.ActivityKind.System]: 'System'
|
|
436
|
+
}, activityModel.ActivityKind.System),
|
|
437
|
+
text('at', 'When', 'Data', 'An ISO 8601 date and time.', {
|
|
438
|
+
constraints: {
|
|
439
|
+
required: true
|
|
440
|
+
}
|
|
441
|
+
}),
|
|
442
|
+
text('body', 'Text', 'Data', 'A comment\'s text or the detail of a change.', {
|
|
443
|
+
editorOptions: {
|
|
444
|
+
multiline: true
|
|
445
|
+
}
|
|
446
|
+
})
|
|
447
|
+
], 'What happened.'),
|
|
448
|
+
acceptedBindingKinds: bindable
|
|
449
|
+
},
|
|
450
|
+
choice('order', 'Order', 'Appearance', {
|
|
451
|
+
descending: 'Newest first',
|
|
452
|
+
ascending: 'Oldest first'
|
|
453
|
+
}, 'descending'),
|
|
454
|
+
text('timeZone', 'Time zone', 'Content', 'The IANA zone days are cut in; empty is the reader\'s.'),
|
|
455
|
+
...standardStateProperties
|
|
456
|
+
]
|
|
457
|
+
},
|
|
458
|
+
{
|
|
459
|
+
component: key(ComponentName.ComponentName.AvatarStack),
|
|
460
|
+
displayName: 'Avatar stack',
|
|
461
|
+
description: 'Overlapping avatars for the people on a record, with a "+N" chip for the rest.',
|
|
462
|
+
properties: [
|
|
463
|
+
{
|
|
464
|
+
...list('people', 'People', 'Data', 'Person', [
|
|
465
|
+
text('name', 'Name', 'Data', undefined, {
|
|
466
|
+
constraints: {
|
|
467
|
+
required: true
|
|
468
|
+
}
|
|
469
|
+
}),
|
|
470
|
+
text('imageUrl', 'Picture', 'Data', 'Without one the initials are shown.')
|
|
471
|
+
], 'Who is shown.'),
|
|
472
|
+
acceptedBindingKinds: bindable
|
|
473
|
+
},
|
|
474
|
+
number('max', 'Shown at most', 'Appearance', 'How many avatars before the rest fold into "+N".', {
|
|
475
|
+
default: 4,
|
|
476
|
+
constraints: {
|
|
477
|
+
minimum: 1,
|
|
478
|
+
integer: true
|
|
479
|
+
}
|
|
480
|
+
}),
|
|
481
|
+
choice('size', 'Size', 'Appearance', {
|
|
482
|
+
small: 'Small',
|
|
483
|
+
medium: 'Medium'
|
|
484
|
+
}, 'medium'),
|
|
485
|
+
...standardStateProperties
|
|
486
|
+
]
|
|
487
|
+
},
|
|
488
|
+
{
|
|
489
|
+
component: key(ComponentName.ComponentName.FileUploader),
|
|
490
|
+
displayName: 'File uploader',
|
|
491
|
+
description: 'A drop zone and a button to choose files, checked against type and size before anything is sent. Publishes the selection as the value output.',
|
|
492
|
+
properties: [
|
|
493
|
+
text('accept', 'Accepted types', 'Behavior', 'Extensions, MIME types and wildcards separated by commas, for example ".pdf, image/*".'),
|
|
494
|
+
number('maxSizeMb', 'Largest file (MB)', 'Behavior', undefined, {
|
|
495
|
+
constraints: {
|
|
496
|
+
minimum: 0
|
|
497
|
+
}
|
|
498
|
+
}),
|
|
499
|
+
flag('multiple', 'Several files', 'Behavior', undefined, {
|
|
500
|
+
default: true
|
|
501
|
+
}),
|
|
502
|
+
text('serverUrl', 'Upload address', 'Behavior', 'Handed to the host\'s upload handler.'),
|
|
503
|
+
rule('actionPermission', 'Upload permission', 'Whether files can be chosen or dropped, refused with a reason, or the control is hidden.'),
|
|
504
|
+
scene_react.valueOutputProperty(scene_model.PropertyValueType.Json, 'The files chosen - name, size, type and status - published as they change.'),
|
|
505
|
+
...standardStateProperties.filter((property)=>property.path !== 'actionPermission')
|
|
506
|
+
]
|
|
507
|
+
},
|
|
508
|
+
{
|
|
509
|
+
component: key(ComponentName.ComponentName.ApprovalChainStepper),
|
|
510
|
+
displayName: 'Approval chain',
|
|
511
|
+
description: 'The steps a request goes through, who decides each and where it stands. A rejection stops the chain; the first undecided step is the current one.',
|
|
512
|
+
properties: [
|
|
513
|
+
{
|
|
514
|
+
...list('steps', 'Steps', 'Data', 'Step', [
|
|
515
|
+
text('label', 'Step', 'Content', undefined, {
|
|
516
|
+
constraints: {
|
|
517
|
+
required: true
|
|
518
|
+
}
|
|
519
|
+
}),
|
|
520
|
+
text('approver', 'Approver', 'Data'),
|
|
521
|
+
choice('state', 'State', 'Data', {
|
|
522
|
+
[approvalModel.ApprovalState.Pending]: 'Pending',
|
|
523
|
+
[approvalModel.ApprovalState.Current]: 'Awaiting decision',
|
|
524
|
+
[approvalModel.ApprovalState.Approved]: 'Approved',
|
|
525
|
+
[approvalModel.ApprovalState.Rejected]: 'Rejected',
|
|
526
|
+
[approvalModel.ApprovalState.Skipped]: 'Skipped'
|
|
527
|
+
}, approvalModel.ApprovalState.Pending),
|
|
528
|
+
text('at', 'Decided at', 'Data', 'An ISO 8601 date and time.'),
|
|
529
|
+
text('comment', 'Comment', 'Data')
|
|
530
|
+
], 'The approvers in order.'),
|
|
531
|
+
acceptedBindingKinds: bindable
|
|
532
|
+
},
|
|
533
|
+
choice('orientation', 'Orientation', 'Appearance', {
|
|
534
|
+
horizontal: 'Horizontal',
|
|
535
|
+
vertical: 'Vertical'
|
|
536
|
+
}, 'horizontal', 'A phone always reads vertically.'),
|
|
537
|
+
...standardStateProperties
|
|
538
|
+
]
|
|
539
|
+
},
|
|
540
|
+
{
|
|
541
|
+
component: key(ComponentName.ComponentName.OrgTree),
|
|
542
|
+
displayName: 'Org tree',
|
|
543
|
+
description: 'An organization as an expandable tree built from rows of who reports to whom. Publishes the selected id as the value output.',
|
|
544
|
+
properties: [
|
|
545
|
+
{
|
|
546
|
+
...list('nodes', 'People', 'Data', 'Person', [
|
|
547
|
+
text('id', 'Id', 'Data', undefined, {
|
|
548
|
+
constraints: {
|
|
549
|
+
required: true
|
|
550
|
+
},
|
|
551
|
+
editorKind: scene_model.PropertyEditorKind.Field
|
|
552
|
+
}),
|
|
553
|
+
text('label', 'Name', 'Data', undefined, {
|
|
554
|
+
editorKind: scene_model.PropertyEditorKind.Field
|
|
555
|
+
}),
|
|
556
|
+
text('title', 'Title', 'Data', undefined, {
|
|
557
|
+
editorKind: scene_model.PropertyEditorKind.Field
|
|
558
|
+
}),
|
|
559
|
+
text('parentId', 'Reports to', 'Data', 'The id of the person above; empty for the top.', {
|
|
560
|
+
editorKind: scene_model.PropertyEditorKind.Field
|
|
561
|
+
})
|
|
562
|
+
], 'One row per person or unit.'),
|
|
563
|
+
acceptedBindingKinds: bindable
|
|
564
|
+
},
|
|
565
|
+
number('expandedDepth', 'Levels open at first', 'Appearance', undefined, {
|
|
566
|
+
default: 2,
|
|
567
|
+
constraints: {
|
|
568
|
+
minimum: 1,
|
|
569
|
+
integer: true
|
|
570
|
+
}
|
|
571
|
+
}),
|
|
572
|
+
text('selected', 'Selected', 'Data', 'The id of the selected node; bind it to start from one.'),
|
|
573
|
+
scene_react.valueOutputProperty(scene_model.PropertyValueType.String, 'The id of the selected node, published as the user selects.'),
|
|
574
|
+
...standardStateProperties
|
|
575
|
+
]
|
|
576
|
+
},
|
|
577
|
+
{
|
|
578
|
+
component: key(ComponentName.ComponentName.PermissionMatrix),
|
|
579
|
+
displayName: 'Permission matrix',
|
|
580
|
+
description: 'Roles across, permissions down, a checkbox where they meet. Publishes the grants as the value output.',
|
|
581
|
+
properties: [
|
|
582
|
+
{
|
|
583
|
+
...list('roles', 'Roles', 'Data', 'Role', [
|
|
584
|
+
text('id', 'Id', 'Data', undefined, {
|
|
585
|
+
constraints: {
|
|
586
|
+
required: true
|
|
587
|
+
}
|
|
588
|
+
}),
|
|
589
|
+
text('label', 'Name', 'Data')
|
|
590
|
+
], 'The columns.'),
|
|
591
|
+
acceptedBindingKinds: bindable
|
|
592
|
+
},
|
|
593
|
+
{
|
|
594
|
+
...list('permissions', 'Permissions', 'Data', 'Permission', [
|
|
595
|
+
text('id', 'Id', 'Data', undefined, {
|
|
596
|
+
constraints: {
|
|
597
|
+
required: true
|
|
598
|
+
}
|
|
599
|
+
}),
|
|
600
|
+
text('label', 'Name', 'Data'),
|
|
601
|
+
text('group', 'Group', 'Data', 'A heading the permission is listed under.')
|
|
602
|
+
], 'The rows.'),
|
|
603
|
+
acceptedBindingKinds: bindable
|
|
604
|
+
},
|
|
605
|
+
{
|
|
606
|
+
...list('grants', 'Grants', 'Data', 'Grant', [
|
|
607
|
+
text('role', 'Role', 'Data', 'The id of a role.', {
|
|
608
|
+
constraints: {
|
|
609
|
+
required: true
|
|
610
|
+
}
|
|
611
|
+
}),
|
|
612
|
+
text('permission', 'Permission', 'Data', 'The id of a permission.', {
|
|
613
|
+
constraints: {
|
|
614
|
+
required: true
|
|
615
|
+
}
|
|
616
|
+
})
|
|
617
|
+
], 'What each role holds.'),
|
|
618
|
+
acceptedBindingKinds: bindable
|
|
619
|
+
},
|
|
620
|
+
rule('editPermission', 'Edit permission', 'Enabled lets the user change grants; otherwise the matrix is read-only.'),
|
|
621
|
+
scene_react.valueOutputProperty(scene_model.PropertyValueType.Json, 'The grants as the user has changed them: rows of role and permission, published as they change.'),
|
|
622
|
+
...standardStateProperties
|
|
623
|
+
]
|
|
378
624
|
}
|
|
379
625
|
];
|
|
380
626
|
|