@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaultBlueprintComponents.js","sources":["../../defaultBlueprintComponents.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 { ComponentRegistry, componentRegistryKey } from '@cratis/scene.react';\nimport { ComponentName } from './ComponentName';\nimport { defaultBlueprintName } from './packageName';\nimport { ChartWrapper, ColumnChooser, EmptyState, FilterBuilder, SavedViewsMenu, StatCard, StatusChip, TrendChip } from './foundation';\nimport {\n AppShell,\n Breadcrumb,\n ConfigPanel,\n Footer,\n FullPageShell,\n LayoutModeSwitcher,\n Logo,\n Mask,\n Menu,\n MenuItem,\n PageHeader,\n RightPanel,\n Sidebar,\n ThemeSwitcher,\n Topbar,\n UserMenu,\n} from './shell';\n\n/**\n * The components this package registers, keyed the way the renderer looks them up.\n *\n * Every key is built with `componentRegistryKey` rather than written out, because the separator between\n * package and component name is the registry's own business - it is deliberately not the `.` a screen uses\n * to qualify a name, so that a package name containing dots stays unambiguous. Building a key by hand is\n * how a component ends up registered under something no lookup will ever produce.\n */\nexport const defaultBlueprintComponents: ComponentRegistry = {\n [componentRegistryKey(defaultBlueprintName, ComponentName.AppShell)]: AppShell,\n [componentRegistryKey(defaultBlueprintName, ComponentName.FullPageShell)]: FullPageShell,\n [componentRegistryKey(defaultBlueprintName, ComponentName.Topbar)]: Topbar,\n [componentRegistryKey(defaultBlueprintName, ComponentName.Sidebar)]: Sidebar,\n [componentRegistryKey(defaultBlueprintName, ComponentName.Menu)]: Menu,\n [componentRegistryKey(defaultBlueprintName, ComponentName.MenuItem)]: MenuItem,\n [componentRegistryKey(defaultBlueprintName, ComponentName.Breadcrumb)]: Breadcrumb,\n [componentRegistryKey(defaultBlueprintName, ComponentName.Footer)]: Footer,\n [componentRegistryKey(defaultBlueprintName, ComponentName.RightPanel)]: RightPanel,\n [componentRegistryKey(defaultBlueprintName, ComponentName.ConfigPanel)]: ConfigPanel,\n [componentRegistryKey(defaultBlueprintName, ComponentName.PageHeader)]: PageHeader,\n [componentRegistryKey(defaultBlueprintName, ComponentName.Mask)]: Mask,\n [componentRegistryKey(defaultBlueprintName, ComponentName.Logo)]: Logo,\n [componentRegistryKey(defaultBlueprintName, ComponentName.UserMenu)]: UserMenu,\n [componentRegistryKey(defaultBlueprintName, ComponentName.ThemeSwitcher)]: ThemeSwitcher,\n [componentRegistryKey(defaultBlueprintName, ComponentName.LayoutModeSwitcher)]: LayoutModeSwitcher,\n [componentRegistryKey(defaultBlueprintName, ComponentName.EmptyState)]: EmptyState,\n [componentRegistryKey(defaultBlueprintName, ComponentName.StatCard)]: StatCard,\n [componentRegistryKey(defaultBlueprintName, ComponentName.TrendChip)]: TrendChip,\n [componentRegistryKey(defaultBlueprintName, ComponentName.StatusChip)]: StatusChip,\n [componentRegistryKey(defaultBlueprintName, ComponentName.ChartWrapper)]: ChartWrapper,\n [componentRegistryKey(defaultBlueprintName, ComponentName.FilterBuilder)]: FilterBuilder,\n [componentRegistryKey(defaultBlueprintName, ComponentName.ColumnChooser)]: ColumnChooser,\n [componentRegistryKey(defaultBlueprintName, ComponentName.SavedViewsMenu)]: SavedViewsMenu,\n};\n"],"names":["defaultBlueprintComponents","componentRegistryKey","defaultBlueprintName","ComponentName","AppShell","FullPageShell","Topbar","Sidebar","Menu","MenuItem","Breadcrumb","Footer","RightPanel","ConfigPanel","PageHeader","Mask","Logo","UserMenu","ThemeSwitcher","LayoutModeSwitcher","EmptyState","StatCard","TrendChip","StatusChip","ChartWrapper","FilterBuilder","ColumnChooser","SavedViewsMenu"],"mappings":"
|
|
1
|
+
{"version":3,"file":"defaultBlueprintComponents.js","sources":["../../defaultBlueprintComponents.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 { ComponentRegistry, componentRegistryKey } from '@cratis/scene.react';\nimport { ComponentName } from './ComponentName';\nimport { defaultBlueprintName } from './packageName';\nimport { ActivityFeed, ApprovalChainStepper, AvatarStack, ChartWrapper, ChecklistSection, ColumnChooser, FileUploader, EmptyState, FilterBuilder, OrgTree, PermissionMatrix, SavedViewsMenu, StatCard, StatusChip, TrendChip } from './foundation';\nimport {\n AppShell,\n Breadcrumb,\n ConfigPanel,\n Footer,\n FullPageShell,\n LayoutModeSwitcher,\n Logo,\n Mask,\n Menu,\n MenuItem,\n PageHeader,\n RightPanel,\n Sidebar,\n ThemeSwitcher,\n Topbar,\n UserMenu,\n} from './shell';\n\n/**\n * The components this package registers, keyed the way the renderer looks them up.\n *\n * Every key is built with `componentRegistryKey` rather than written out, because the separator between\n * package and component name is the registry's own business - it is deliberately not the `.` a screen uses\n * to qualify a name, so that a package name containing dots stays unambiguous. Building a key by hand is\n * how a component ends up registered under something no lookup will ever produce.\n */\nexport const defaultBlueprintComponents: ComponentRegistry = {\n [componentRegistryKey(defaultBlueprintName, ComponentName.AppShell)]: AppShell,\n [componentRegistryKey(defaultBlueprintName, ComponentName.FullPageShell)]: FullPageShell,\n [componentRegistryKey(defaultBlueprintName, ComponentName.Topbar)]: Topbar,\n [componentRegistryKey(defaultBlueprintName, ComponentName.Sidebar)]: Sidebar,\n [componentRegistryKey(defaultBlueprintName, ComponentName.Menu)]: Menu,\n [componentRegistryKey(defaultBlueprintName, ComponentName.MenuItem)]: MenuItem,\n [componentRegistryKey(defaultBlueprintName, ComponentName.Breadcrumb)]: Breadcrumb,\n [componentRegistryKey(defaultBlueprintName, ComponentName.Footer)]: Footer,\n [componentRegistryKey(defaultBlueprintName, ComponentName.RightPanel)]: RightPanel,\n [componentRegistryKey(defaultBlueprintName, ComponentName.ConfigPanel)]: ConfigPanel,\n [componentRegistryKey(defaultBlueprintName, ComponentName.PageHeader)]: PageHeader,\n [componentRegistryKey(defaultBlueprintName, ComponentName.Mask)]: Mask,\n [componentRegistryKey(defaultBlueprintName, ComponentName.Logo)]: Logo,\n [componentRegistryKey(defaultBlueprintName, ComponentName.UserMenu)]: UserMenu,\n [componentRegistryKey(defaultBlueprintName, ComponentName.ThemeSwitcher)]: ThemeSwitcher,\n [componentRegistryKey(defaultBlueprintName, ComponentName.LayoutModeSwitcher)]: LayoutModeSwitcher,\n [componentRegistryKey(defaultBlueprintName, ComponentName.EmptyState)]: EmptyState,\n [componentRegistryKey(defaultBlueprintName, ComponentName.StatCard)]: StatCard,\n [componentRegistryKey(defaultBlueprintName, ComponentName.TrendChip)]: TrendChip,\n [componentRegistryKey(defaultBlueprintName, ComponentName.StatusChip)]: StatusChip,\n [componentRegistryKey(defaultBlueprintName, ComponentName.ChartWrapper)]: ChartWrapper,\n [componentRegistryKey(defaultBlueprintName, ComponentName.FilterBuilder)]: FilterBuilder,\n [componentRegistryKey(defaultBlueprintName, ComponentName.ColumnChooser)]: ColumnChooser,\n [componentRegistryKey(defaultBlueprintName, ComponentName.SavedViewsMenu)]: SavedViewsMenu,\n [componentRegistryKey(defaultBlueprintName, ComponentName.ChecklistSection)]: ChecklistSection,\n [componentRegistryKey(defaultBlueprintName, ComponentName.ActivityFeed)]: ActivityFeed,\n [componentRegistryKey(defaultBlueprintName, ComponentName.AvatarStack)]: AvatarStack,\n [componentRegistryKey(defaultBlueprintName, ComponentName.FileUploader)]: FileUploader,\n [componentRegistryKey(defaultBlueprintName, ComponentName.ApprovalChainStepper)]: ApprovalChainStepper,\n [componentRegistryKey(defaultBlueprintName, ComponentName.OrgTree)]: OrgTree,\n [componentRegistryKey(defaultBlueprintName, ComponentName.PermissionMatrix)]: PermissionMatrix,\n};\n"],"names":["defaultBlueprintComponents","componentRegistryKey","defaultBlueprintName","ComponentName","AppShell","FullPageShell","Topbar","Sidebar","Menu","MenuItem","Breadcrumb","Footer","RightPanel","ConfigPanel","PageHeader","Mask","Logo","UserMenu","ThemeSwitcher","LayoutModeSwitcher","EmptyState","StatCard","TrendChip","StatusChip","ChartWrapper","FilterBuilder","ColumnChooser","SavedViewsMenu","ChecklistSection","ActivityFeed","AvatarStack","FileUploader","ApprovalChainStepper","OrgTree","PermissionMatrix"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActivityFeed.d.ts","sourceRoot":"","sources":["../../../foundation/ActivityFeed.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAqB/D,wBAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,wBAAwB,+BAkC/E"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { useMemo } from 'react';
|
|
3
|
+
import { readOptionalString } from '../shell/elementProperties.js';
|
|
4
|
+
import { readActivity, groupByDay, ActivityKind } from './activityModel.js';
|
|
5
|
+
import { readComponentState, ComponentState } from './ComponentState.js';
|
|
6
|
+
import { FoundationIcon } from './FoundationIcon.js';
|
|
7
|
+
import { readLocale, formatDay, formatDate } from './formatting.js';
|
|
8
|
+
import { readFoundationStrings } from './foundationStrings.js';
|
|
9
|
+
import { FoundationFrame } from './StateFrame.js';
|
|
10
|
+
|
|
11
|
+
const icons = {
|
|
12
|
+
[ActivityKind.Comment]: 'user',
|
|
13
|
+
[ActivityKind.Change]: 'refresh',
|
|
14
|
+
[ActivityKind.Status]: 'check',
|
|
15
|
+
[ActivityKind.System]: 'info'
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* The `activityFeed` component: what happened to a record, newest first, under a heading for each day.
|
|
19
|
+
*
|
|
20
|
+
* `entries` carry an id, who (`actor`), what (`action`), the instant (`at`, ISO 8601), a `kind` and an optional `body` such as a comment's
|
|
21
|
+
* text. The feed is an ordered list; each entry names its kind in words for assistive technology as well as by icon, and its time is a
|
|
22
|
+
* `time` element formatted for the locale. Content is supplied by the application - this only lays it out - and a feed of any length
|
|
23
|
+
* stays one list. `order="ascending"` reads oldest first, and `timeZone` fixes the zone days are cut in.
|
|
24
|
+
*/ function ActivityFeed({ element, interactions }) {
|
|
25
|
+
const entries = useMemo(()=>readActivity(element.properties.entries), [
|
|
26
|
+
element.properties.entries
|
|
27
|
+
]);
|
|
28
|
+
const strings = readFoundationStrings(element);
|
|
29
|
+
const locale = readLocale(element);
|
|
30
|
+
const timeZone = readOptionalString(element, 'timeZone');
|
|
31
|
+
const days = useMemo(()=>groupByDay(entries, element.properties.order === 'ascending', timeZone), [
|
|
32
|
+
entries,
|
|
33
|
+
element.properties.order,
|
|
34
|
+
timeZone
|
|
35
|
+
]);
|
|
36
|
+
const state = readComponentState(element, entries.length > 0);
|
|
37
|
+
const kindText = {
|
|
38
|
+
comment: strings.activityComment,
|
|
39
|
+
change: strings.activityChange,
|
|
40
|
+
status: strings.activityStatus,
|
|
41
|
+
system: strings.activitySystem
|
|
42
|
+
};
|
|
43
|
+
const emptyElement = state === ComponentState.Empty ? {
|
|
44
|
+
...element,
|
|
45
|
+
properties: {
|
|
46
|
+
emptyHeadline: strings.activityEmpty,
|
|
47
|
+
...element.properties
|
|
48
|
+
}
|
|
49
|
+
} : element;
|
|
50
|
+
return /*#__PURE__*/ jsx(FoundationFrame, {
|
|
51
|
+
element: emptyElement,
|
|
52
|
+
interactions: interactions,
|
|
53
|
+
name: "activity-feed",
|
|
54
|
+
state: state,
|
|
55
|
+
skeleton: [
|
|
56
|
+
60,
|
|
57
|
+
90,
|
|
58
|
+
70,
|
|
59
|
+
85
|
|
60
|
+
],
|
|
61
|
+
children: (state === ComponentState.Ready || state === ComponentState.Partial) && days.map((day)=>/*#__PURE__*/ jsxs("section", {
|
|
62
|
+
className: "foundation-activity-day",
|
|
63
|
+
children: [
|
|
64
|
+
/*#__PURE__*/ jsx("h3", {
|
|
65
|
+
className: "foundation-activity-heading",
|
|
66
|
+
children: /*#__PURE__*/ jsx("time", {
|
|
67
|
+
dateTime: day.day,
|
|
68
|
+
children: formatDay(day.day, locale)
|
|
69
|
+
})
|
|
70
|
+
}),
|
|
71
|
+
/*#__PURE__*/ jsx("ol", {
|
|
72
|
+
className: "foundation-activity-list",
|
|
73
|
+
children: day.entries.map((entry)=>/*#__PURE__*/ jsxs("li", {
|
|
74
|
+
className: "foundation-activity-entry",
|
|
75
|
+
"data-kind": entry.kind,
|
|
76
|
+
children: [
|
|
77
|
+
/*#__PURE__*/ jsx("span", {
|
|
78
|
+
className: "foundation-activity-icon",
|
|
79
|
+
children: /*#__PURE__*/ jsx(FoundationIcon, {
|
|
80
|
+
name: icons[entry.kind]
|
|
81
|
+
})
|
|
82
|
+
}),
|
|
83
|
+
/*#__PURE__*/ jsxs("div", {
|
|
84
|
+
className: "foundation-activity-content",
|
|
85
|
+
children: [
|
|
86
|
+
/*#__PURE__*/ jsxs("p", {
|
|
87
|
+
className: "foundation-activity-summary",
|
|
88
|
+
children: [
|
|
89
|
+
/*#__PURE__*/ jsx("span", {
|
|
90
|
+
className: "foundation-visually-hidden",
|
|
91
|
+
children: `${kindText[entry.kind]}: `
|
|
92
|
+
}),
|
|
93
|
+
/*#__PURE__*/ jsx("strong", {
|
|
94
|
+
children: entry.actor
|
|
95
|
+
}),
|
|
96
|
+
" ",
|
|
97
|
+
entry.action
|
|
98
|
+
]
|
|
99
|
+
}),
|
|
100
|
+
entry.body && /*#__PURE__*/ jsx("p", {
|
|
101
|
+
className: "foundation-activity-body",
|
|
102
|
+
children: entry.body
|
|
103
|
+
}),
|
|
104
|
+
/*#__PURE__*/ jsx("time", {
|
|
105
|
+
className: "foundation-count",
|
|
106
|
+
dateTime: entry.at,
|
|
107
|
+
children: formatDate(entry.at, locale, true)
|
|
108
|
+
})
|
|
109
|
+
]
|
|
110
|
+
})
|
|
111
|
+
]
|
|
112
|
+
}, entry.id))
|
|
113
|
+
})
|
|
114
|
+
]
|
|
115
|
+
}, day.day))
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export { ActivityFeed };
|
|
120
|
+
//# sourceMappingURL=ActivityFeed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ActivityFeed.js","sources":["../../../foundation/ActivityFeed.tsx"],"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 { useMemo } from 'react';\nimport { RegisteredComponentProps } from '@cratis/scene.react';\nimport { readOptionalString } from '../shell/elementProperties';\nimport { ActivityKind, groupByDay, readActivity } from './activityModel';\nimport { ComponentState, readComponentState } from './ComponentState';\nimport { FoundationIcon, FoundationIconName } from './FoundationIcon';\nimport { formatDate, formatDay, readLocale } from './formatting';\nimport { readFoundationStrings } from './foundationStrings';\nimport { FoundationFrame } from './StateFrame';\n\nconst icons: Record<ActivityKind, FoundationIconName> = {\n [ActivityKind.Comment]: 'user', [ActivityKind.Change]: 'refresh', [ActivityKind.Status]: 'check', [ActivityKind.System]: 'info',\n};\n\n/**\n * The `activityFeed` component: what happened to a record, newest first, under a heading for each day.\n *\n * `entries` carry an id, who (`actor`), what (`action`), the instant (`at`, ISO 8601), a `kind` and an optional `body` such as a comment's\n * text. The feed is an ordered list; each entry names its kind in words for assistive technology as well as by icon, and its time is a\n * `time` element formatted for the locale. Content is supplied by the application - this only lays it out - and a feed of any length\n * stays one list. `order=\"ascending\"` reads oldest first, and `timeZone` fixes the zone days are cut in.\n */\nexport function ActivityFeed({ element, interactions }: RegisteredComponentProps) {\n const entries = useMemo(() => readActivity(element.properties.entries), [element.properties.entries]);\n const strings = readFoundationStrings(element);\n const locale = readLocale(element);\n const timeZone = readOptionalString(element, 'timeZone');\n const days = useMemo(() => groupByDay(entries, element.properties.order === 'ascending', timeZone), [entries, element.properties.order, timeZone]);\n const state = readComponentState(element, entries.length > 0);\n const kindText: Record<ActivityKind, string> = { comment: strings.activityComment, change: strings.activityChange, status: strings.activityStatus, system: strings.activitySystem };\n const emptyElement = state === ComponentState.Empty ? { ...element, properties: { emptyHeadline: strings.activityEmpty, ...element.properties } } : element;\n\n return (\n <FoundationFrame element={emptyElement} interactions={interactions} name='activity-feed' state={state} skeleton={[60, 90, 70, 85]}>\n {(state === ComponentState.Ready || state === ComponentState.Partial) && days.map(day => (\n <section key={day.day} className='foundation-activity-day'>\n <h3 className='foundation-activity-heading'><time dateTime={day.day}>{formatDay(day.day, locale)}</time></h3>\n <ol className='foundation-activity-list'>\n {day.entries.map(entry => (\n <li key={entry.id} className='foundation-activity-entry' data-kind={entry.kind}>\n <span className='foundation-activity-icon'><FoundationIcon name={icons[entry.kind]} /></span>\n <div className='foundation-activity-content'>\n <p className='foundation-activity-summary'>\n <span className='foundation-visually-hidden'>{`${kindText[entry.kind]}: `}</span>\n <strong>{entry.actor}</strong> {entry.action}\n </p>\n {entry.body && <p className='foundation-activity-body'>{entry.body}</p>}\n <time className='foundation-count' dateTime={entry.at}>{formatDate(entry.at, locale, true)}</time>\n </div>\n </li>\n ))}\n </ol>\n </section>\n ))}\n </FoundationFrame>\n );\n}\n\n"],"names":["icons","ActivityKind","Comment","Change","Status","System","ActivityFeed","element","interactions","entries","useMemo","readActivity","properties","strings","readFoundationStrings","locale","readLocale","timeZone","readOptionalString","days","groupByDay","order","state","readComponentState","length","kindText","comment","activityComment","change","activityChange","status","activityStatus","system","activitySystem","emptyElement","ComponentState","Empty","emptyHeadline","activityEmpty","_jsx","FoundationFrame","name","skeleton","Ready","Partial","map","day","_jsxs","section","className","h3","time","dateTime","formatDay","ol","entry","li","data-kind","kind","span","FoundationIcon","div","p","strong","actor","action","body","at","formatDate","id"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApprovalChainStepper.d.ts","sourceRoot":"","sources":["../../../foundation/ApprovalChainStepper.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAwB/D,wBAAgB,oBAAoB,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,wBAAwB,+BAqCvF"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { useMemo } from 'react';
|
|
3
|
+
import { readSteps, effectiveSteps, chainOutcome, ApprovalState } from './approvalModel.js';
|
|
4
|
+
import { readComponentState, ComponentState } from './ComponentState.js';
|
|
5
|
+
import { FoundationIcon } from './FoundationIcon.js';
|
|
6
|
+
import { readLocale, formatDate } from './formatting.js';
|
|
7
|
+
import { readFoundationStrings, formatText } from './foundationStrings.js';
|
|
8
|
+
import { FoundationFrame } from './StateFrame.js';
|
|
9
|
+
|
|
10
|
+
const icons = {
|
|
11
|
+
[ApprovalState.Pending]: 'circle',
|
|
12
|
+
[ApprovalState.Current]: 'clock',
|
|
13
|
+
[ApprovalState.Approved]: 'check',
|
|
14
|
+
[ApprovalState.Rejected]: 'close',
|
|
15
|
+
[ApprovalState.Skipped]: 'minus'
|
|
16
|
+
};
|
|
17
|
+
const tones = {
|
|
18
|
+
[ApprovalState.Pending]: 'neutral',
|
|
19
|
+
[ApprovalState.Current]: 'info',
|
|
20
|
+
[ApprovalState.Approved]: 'success',
|
|
21
|
+
[ApprovalState.Rejected]: 'danger',
|
|
22
|
+
[ApprovalState.Skipped]: 'neutral'
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* The `approvalChainStepper` component: the steps a request goes through, who decides each, and where it stands.
|
|
26
|
+
*
|
|
27
|
+
* `steps` are written in order with a `label`, an `approver`, a `state` (pending, current, approved, rejected, skipped), and when it was
|
|
28
|
+
* decided (`at`) and a `comment`. The chain applies its own rules - a rejection stops the chain and the steps after it read "Not reached", and
|
|
29
|
+
* with no current step the first undecided one is it - so a request page needs no logic of its own. Every step says its state in words as
|
|
30
|
+
* well as by icon and color, the current step carries `aria-current="step"`, and the whole is an ordered list with the overall outcome
|
|
31
|
+
* stated above it. `orientation` is `horizontal` or `vertical`; below a phone's width it is always vertical.
|
|
32
|
+
*/ function ApprovalChainStepper({ element, interactions }) {
|
|
33
|
+
const written = useMemo(()=>readSteps(element.properties.steps), [
|
|
34
|
+
element.properties.steps
|
|
35
|
+
]);
|
|
36
|
+
const steps = useMemo(()=>effectiveSteps(written), [
|
|
37
|
+
written
|
|
38
|
+
]);
|
|
39
|
+
const outcome = chainOutcome(written);
|
|
40
|
+
const strings = readFoundationStrings(element);
|
|
41
|
+
const locale = readLocale(element);
|
|
42
|
+
const state = readComponentState(element, written.length > 0);
|
|
43
|
+
const stateText = {
|
|
44
|
+
pending: strings.approvalPending,
|
|
45
|
+
current: strings.approvalCurrent,
|
|
46
|
+
approved: strings.approvalApproved,
|
|
47
|
+
rejected: strings.approvalRejected,
|
|
48
|
+
skipped: strings.approvalSkipped
|
|
49
|
+
};
|
|
50
|
+
const outcomeText = {
|
|
51
|
+
approved: strings.approvalOutcomeApproved,
|
|
52
|
+
rejected: strings.approvalOutcomeRejected,
|
|
53
|
+
inProgress: strings.approvalOutcomeInProgress,
|
|
54
|
+
pending: strings.approvalOutcomePending
|
|
55
|
+
};
|
|
56
|
+
return /*#__PURE__*/ jsx(FoundationFrame, {
|
|
57
|
+
element: element,
|
|
58
|
+
interactions: interactions,
|
|
59
|
+
name: "approval-chain",
|
|
60
|
+
state: state,
|
|
61
|
+
skeleton: [
|
|
62
|
+
100,
|
|
63
|
+
100
|
|
64
|
+
],
|
|
65
|
+
children: (state === ComponentState.Ready || state === ComponentState.Partial) && /*#__PURE__*/ jsxs(Fragment, {
|
|
66
|
+
children: [
|
|
67
|
+
/*#__PURE__*/ jsx("p", {
|
|
68
|
+
className: "foundation-approval-outcome",
|
|
69
|
+
"data-outcome": outcome,
|
|
70
|
+
children: outcomeText[outcome]
|
|
71
|
+
}),
|
|
72
|
+
/*#__PURE__*/ jsx("ol", {
|
|
73
|
+
className: "foundation-approval-steps",
|
|
74
|
+
"aria-label": strings.approvalChain,
|
|
75
|
+
"data-orientation": element.properties.orientation === 'vertical' ? 'vertical' : 'horizontal',
|
|
76
|
+
children: steps.map((step, index)=>/*#__PURE__*/ jsxs("li", {
|
|
77
|
+
className: "foundation-approval-step",
|
|
78
|
+
"data-state": step.state,
|
|
79
|
+
"aria-current": step.state === ApprovalState.Current ? 'step' : undefined,
|
|
80
|
+
children: [
|
|
81
|
+
/*#__PURE__*/ jsxs("span", {
|
|
82
|
+
className: "foundation-chip",
|
|
83
|
+
"data-tone": tones[step.state],
|
|
84
|
+
children: [
|
|
85
|
+
/*#__PURE__*/ jsx(FoundationIcon, {
|
|
86
|
+
name: icons[step.state]
|
|
87
|
+
}),
|
|
88
|
+
/*#__PURE__*/ jsx("span", {
|
|
89
|
+
children: step.notReached ? strings.approvalNotReached : stateText[step.state]
|
|
90
|
+
})
|
|
91
|
+
]
|
|
92
|
+
}),
|
|
93
|
+
/*#__PURE__*/ jsxs("strong", {
|
|
94
|
+
className: "foundation-approval-label",
|
|
95
|
+
children: [
|
|
96
|
+
/*#__PURE__*/ jsx("span", {
|
|
97
|
+
className: "foundation-visually-hidden",
|
|
98
|
+
children: `${formatText(strings.approvalStep, {
|
|
99
|
+
n: index + 1,
|
|
100
|
+
total: steps.length
|
|
101
|
+
})}: `
|
|
102
|
+
}),
|
|
103
|
+
step.label
|
|
104
|
+
]
|
|
105
|
+
}),
|
|
106
|
+
step.approver && /*#__PURE__*/ jsx("span", {
|
|
107
|
+
className: "foundation-count",
|
|
108
|
+
children: step.approver
|
|
109
|
+
}),
|
|
110
|
+
step.at && /*#__PURE__*/ jsx("time", {
|
|
111
|
+
className: "foundation-count",
|
|
112
|
+
dateTime: step.at,
|
|
113
|
+
children: formatDate(step.at, locale, true)
|
|
114
|
+
}),
|
|
115
|
+
step.comment && /*#__PURE__*/ jsx("span", {
|
|
116
|
+
className: "foundation-approval-comment",
|
|
117
|
+
children: step.comment
|
|
118
|
+
})
|
|
119
|
+
]
|
|
120
|
+
}, step.label + index))
|
|
121
|
+
})
|
|
122
|
+
]
|
|
123
|
+
})
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export { ApprovalChainStepper };
|
|
128
|
+
//# sourceMappingURL=ApprovalChainStepper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApprovalChainStepper.js","sources":["../../../foundation/ApprovalChainStepper.tsx"],"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 { useMemo } from 'react';\nimport { RegisteredComponentProps } from '@cratis/scene.react';\nimport { ApprovalState, ChainOutcome, chainOutcome, effectiveSteps, readSteps } from './approvalModel';\nimport { ComponentState, readComponentState } from './ComponentState';\nimport { FoundationIcon, FoundationIconName } from './FoundationIcon';\nimport { formatDate, readLocale } from './formatting';\nimport { formatText, readFoundationStrings } from './foundationStrings';\nimport { FoundationFrame } from './StateFrame';\n\nconst icons: Record<ApprovalState, FoundationIconName> = {\n [ApprovalState.Pending]: 'circle', [ApprovalState.Current]: 'clock', [ApprovalState.Approved]: 'check', [ApprovalState.Rejected]: 'close', [ApprovalState.Skipped]: 'minus',\n};\nconst tones: Record<ApprovalState, string> = {\n [ApprovalState.Pending]: 'neutral', [ApprovalState.Current]: 'info', [ApprovalState.Approved]: 'success', [ApprovalState.Rejected]: 'danger', [ApprovalState.Skipped]: 'neutral',\n};\n\n/**\n * The `approvalChainStepper` component: the steps a request goes through, who decides each, and where it stands.\n *\n * `steps` are written in order with a `label`, an `approver`, a `state` (pending, current, approved, rejected, skipped), and when it was\n * decided (`at`) and a `comment`. The chain applies its own rules - a rejection stops the chain and the steps after it read \"Not reached\", and\n * with no current step the first undecided one is it - so a request page needs no logic of its own. Every step says its state in words as\n * well as by icon and color, the current step carries `aria-current=\"step\"`, and the whole is an ordered list with the overall outcome\n * stated above it. `orientation` is `horizontal` or `vertical`; below a phone's width it is always vertical.\n */\nexport function ApprovalChainStepper({ element, interactions }: RegisteredComponentProps) {\n const written = useMemo(() => readSteps(element.properties.steps), [element.properties.steps]);\n const steps = useMemo(() => effectiveSteps(written), [written]);\n const outcome = chainOutcome(written);\n const strings = readFoundationStrings(element);\n const locale = readLocale(element);\n const state = readComponentState(element, written.length > 0);\n const stateText: Record<ApprovalState, string> = {\n pending: strings.approvalPending, current: strings.approvalCurrent, approved: strings.approvalApproved, rejected: strings.approvalRejected, skipped: strings.approvalSkipped,\n };\n const outcomeText: Record<ChainOutcome, string> = {\n approved: strings.approvalOutcomeApproved, rejected: strings.approvalOutcomeRejected, inProgress: strings.approvalOutcomeInProgress, pending: strings.approvalOutcomePending,\n };\n\n return (\n <FoundationFrame element={element} interactions={interactions} name='approval-chain' state={state} skeleton={[100, 100]}>\n {(state === ComponentState.Ready || state === ComponentState.Partial) && (\n <>\n <p className='foundation-approval-outcome' data-outcome={outcome}>{outcomeText[outcome]}</p>\n <ol className='foundation-approval-steps' aria-label={strings.approvalChain} data-orientation={element.properties.orientation === 'vertical' ? 'vertical' : 'horizontal'}>\n {steps.map((step, index) => (\n <li key={step.label + index} className='foundation-approval-step' data-state={step.state} aria-current={step.state === ApprovalState.Current ? 'step' : undefined}>\n <span className='foundation-chip' data-tone={tones[step.state]}><FoundationIcon name={icons[step.state]} /><span>{step.notReached ? strings.approvalNotReached : stateText[step.state]}</span></span>\n <strong className='foundation-approval-label'>\n <span className='foundation-visually-hidden'>{`${formatText(strings.approvalStep, { n: index + 1, total: steps.length })}: `}</span>\n {step.label}\n </strong>\n {step.approver && <span className='foundation-count'>{step.approver}</span>}\n {step.at && <time className='foundation-count' dateTime={step.at}>{formatDate(step.at, locale, true)}</time>}\n {step.comment && <span className='foundation-approval-comment'>{step.comment}</span>}\n </li>\n ))}\n </ol>\n </>\n )}\n </FoundationFrame>\n );\n}\n"],"names":["icons","ApprovalState","Pending","Current","Approved","Rejected","Skipped","tones","ApprovalChainStepper","element","interactions","written","useMemo","readSteps","properties","steps","effectiveSteps","outcome","chainOutcome","strings","readFoundationStrings","locale","readLocale","state","readComponentState","length","stateText","pending","approvalPending","current","approvalCurrent","approved","approvalApproved","rejected","approvalRejected","skipped","approvalSkipped","outcomeText","approvalOutcomeApproved","approvalOutcomeRejected","inProgress","approvalOutcomeInProgress","approvalOutcomePending","_jsx","FoundationFrame","name","skeleton","ComponentState","Ready","Partial","_jsxs","_Fragment","p","className","data-outcome","ol","aria-label","approvalChain","data-orientation","orientation","map","step","index","li","data-state","aria-current","undefined","span","data-tone","FoundationIcon","notReached","approvalNotReached","strong","formatText","approvalStep","n","total","label","approver","at","time","dateTime","formatDate","comment"],"mappings":";;;;;;;;;AAYA,MAAMA,KAAAA,GAAmD;IACrD,CAACC,aAAAA,CAAcC,OAAO,GAAG,QAAA;IAAU,CAACD,aAAAA,CAAcE,OAAO,GAAG,OAAA;IAAS,CAACF,aAAAA,CAAcG,QAAQ,GAAG,OAAA;IAAS,CAACH,aAAAA,CAAcI,QAAQ,GAAG,OAAA;IAAS,CAACJ,aAAAA,CAAcK,OAAO,GAAG;AACxK,CAAA;AACA,MAAMC,KAAAA,GAAuC;IACzC,CAACN,aAAAA,CAAcC,OAAO,GAAG,SAAA;IAAW,CAACD,aAAAA,CAAcE,OAAO,GAAG,MAAA;IAAQ,CAACF,aAAAA,CAAcG,QAAQ,GAAG,SAAA;IAAW,CAACH,aAAAA,CAAcI,QAAQ,GAAG,QAAA;IAAU,CAACJ,aAAAA,CAAcK,OAAO,GAAG;AAC3K,CAAA;AAEA;;;;;;;;AAQC,IACM,SAASE,oBAAAA,CAAqB,EAAEC,OAAO,EAAEC,YAAY,EAA4B,EAAA;IACpF,MAAMC,OAAAA,GAAUC,QAAQ,IAAMC,SAAAA,CAAUJ,QAAQK,UAAU,CAACC,KAAK,CAAA,EAAG;QAACN,OAAAA,CAAQK,UAAU,CAACC;AAAM,KAAA,CAAA;AAC7F,IAAA,MAAMA,KAAAA,GAAQH,OAAAA,CAAQ,IAAMI,cAAAA,CAAeL,OAAAA,CAAAA,EAAU;AAACA,QAAAA;AAAQ,KAAA,CAAA;AAC9D,IAAA,MAAMM,UAAUC,YAAAA,CAAaP,OAAAA,CAAAA;AAC7B,IAAA,MAAMQ,UAAUC,qBAAAA,CAAsBX,OAAAA,CAAAA;AACtC,IAAA,MAAMY,SAASC,UAAAA,CAAWb,OAAAA,CAAAA;AAC1B,IAAA,MAAMc,KAAAA,GAAQC,kBAAAA,CAAmBf,OAAAA,EAASE,OAAAA,CAAQc,MAAM,GAAG,CAAA,CAAA;AAC3D,IAAA,MAAMC,SAAAA,GAA2C;AAC7CC,QAAAA,OAAAA,EAASR,QAAQS,eAAe;AAAEC,QAAAA,OAAAA,EAASV,QAAQW,eAAe;AAAEC,QAAAA,QAAAA,EAAUZ,QAAQa,gBAAgB;AAAEC,QAAAA,QAAAA,EAAUd,QAAQe,gBAAgB;AAAEC,QAAAA,OAAAA,EAAShB,QAAQiB;AACjK,KAAA;AACA,IAAA,MAAMC,WAAAA,GAA4C;AAC9CN,QAAAA,QAAAA,EAAUZ,QAAQmB,uBAAuB;AAAEL,QAAAA,QAAAA,EAAUd,QAAQoB,uBAAuB;AAAEC,QAAAA,UAAAA,EAAYrB,QAAQsB,yBAAyB;AAAEd,QAAAA,OAAAA,EAASR,QAAQuB;AAC1J,KAAA;AAEA,IAAA,qBACIC,GAAA,CAACC,eAAAA,EAAAA;QAAgBnC,OAAAA,EAASA,OAAAA;QAASC,YAAAA,EAAcA,YAAAA;QAAcmC,IAAAA,EAAK,gBAAA;QAAiBtB,KAAAA,EAAOA,KAAAA;QAAOuB,QAAAA,EAAU;AAAC,YAAA,GAAA;AAAK,YAAA;AAAI,SAAA;kBAClH,CAACvB,UAAUwB,cAAAA,CAAeC,KAAK,IAAIzB,KAAAA,KAAUwB,cAAAA,CAAeE,OAAM,mBAC/DC,IAAA,CAAAC,QAAA,EAAA;;8BACIR,GAAA,CAACS,GAAAA,EAAAA;oBAAEC,SAAAA,EAAU,6BAAA;oBAA8BC,cAAAA,EAAcrC,OAAAA;AAAUoB,oBAAAA,QAAAA,EAAAA,WAAW,CAACpB,OAAAA;;8BAC/E0B,GAAA,CAACY,IAAAA,EAAAA;oBAAGF,SAAAA,EAAU,2BAAA;AAA4BG,oBAAAA,YAAAA,EAAYrC,QAAQsC,aAAa;AAAEC,oBAAAA,kBAAAA,EAAkBjD,QAAQK,UAAU,CAAC6C,WAAW,KAAK,aAAa,UAAA,GAAa,YAAA;AACvJ5C,oBAAAA,QAAAA,EAAAA,KAAAA,CAAM6C,GAAG,CAAC,CAACC,IAAAA,EAAMC,sBACdZ,IAAA,CAACa,IAAAA,EAAAA;4BAA4BV,SAAAA,EAAU,0BAAA;AAA2BW,4BAAAA,YAAAA,EAAYH,KAAKtC,KAAK;AAAE0C,4BAAAA,cAAAA,EAAcJ,KAAKtC,KAAK,KAAKtB,aAAAA,CAAcE,OAAO,GAAG,MAAA,GAAS+D,SAAAA;;8CACpJhB,IAAA,CAACiB,MAAAA,EAAAA;oCAAKd,SAAAA,EAAU,iBAAA;AAAkBe,oCAAAA,WAAAA,EAAW7D,KAAK,CAACsD,IAAAA,CAAKtC,KAAK,CAAC;;sDAAEoB,GAAA,CAAC0B,cAAAA,EAAAA;AAAexB,4CAAAA,IAAAA,EAAM7C,KAAK,CAAC6D,IAAAA,CAAKtC,KAAK;;sDAAKoB,GAAA,CAACwB,MAAAA,EAAAA;sDAAMN,IAAAA,CAAKS,UAAU,GAAGnD,OAAAA,CAAQoD,kBAAkB,GAAG7C,SAAS,CAACmC,IAAAA,CAAKtC,KAAK;;;;8CACrL2B,IAAA,CAACsB,QAAAA,EAAAA;oCAAOnB,SAAAA,EAAU,2BAAA;;sDACdV,GAAA,CAACwB,MAAAA,EAAAA;4CAAKd,SAAAA,EAAU,4BAAA;sDAA8B,CAAA,EAAGoB,UAAAA,CAAWtD,OAAAA,CAAQuD,YAAY,EAAE;AAAEC,gDAAAA,CAAAA,EAAGb,KAAAA,GAAQ,CAAA;AAAGc,gDAAAA,KAAAA,EAAO7D,MAAMU;AAAO,6CAAA,CAAA,CAAG,EAAE;;AAC1HoC,wCAAAA,IAAAA,CAAKgB;;;gCAEThB,IAAAA,CAAKiB,QAAQ,kBAAInC,GAAA,CAACwB,MAAAA,EAAAA;oCAAKd,SAAAA,EAAU,kBAAA;AAAoBQ,oCAAAA,QAAAA,EAAAA,IAAAA,CAAKiB;;gCAC1DjB,IAAAA,CAAKkB,EAAE,kBAAIpC,GAAA,CAACqC,MAAAA,EAAAA;oCAAK3B,SAAAA,EAAU,kBAAA;AAAmB4B,oCAAAA,QAAAA,EAAUpB,KAAKkB,EAAE;8CAAGG,UAAAA,CAAWrB,IAAAA,CAAKkB,EAAE,EAAE1D,MAAAA,EAAQ,IAAA;;gCAC9FwC,IAAAA,CAAKsB,OAAO,kBAAIxC,GAAA,CAACwB,MAAAA,EAAAA;oCAAKd,SAAAA,EAAU,6BAAA;AAA+BQ,oCAAAA,QAAAA,EAAAA,IAAAA,CAAKsB;;;AARhEtB,yBAAAA,EAAAA,IAAAA,CAAKgB,KAAK,GAAGf,KAAAA,CAAAA;;;;;AAgBlD;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AvatarStack.d.ts","sourceRoot":"","sources":["../../../foundation/AvatarStack.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAa/D,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,EAAE,wBAAwB,+BAyB9E"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { useMemo } from 'react';
|
|
3
|
+
import { readPeople, visiblePeople, initialsOf } from './avatarModel.js';
|
|
4
|
+
import { readComponentState, ComponentState } from './ComponentState.js';
|
|
5
|
+
import { readFoundationStrings, formatText } from './foundationStrings.js';
|
|
6
|
+
import { FoundationFrame } from './StateFrame.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* The `avatarStack` component: overlapping avatars for the people on a record, with a "+N" chip for the rest.
|
|
10
|
+
*
|
|
11
|
+
* `people` are names with an optional picture; without one the avatar shows the person's initials. The stack is a labelled group ("5 people"),
|
|
12
|
+
* each avatar is an image named after its person, and the overflow chip says how many more in words. `max` is how many are shown (4 by
|
|
13
|
+
* default) and `size` is `small` or `medium`.
|
|
14
|
+
*/ function AvatarStack({ element, interactions }) {
|
|
15
|
+
const people = useMemo(()=>readPeople(element.properties.people), [
|
|
16
|
+
element.properties.people
|
|
17
|
+
]);
|
|
18
|
+
const strings = readFoundationStrings(element);
|
|
19
|
+
const { shown, hidden } = visiblePeople(people, typeof element.properties.max === 'number' ? element.properties.max : 4);
|
|
20
|
+
const state = readComponentState(element, people.length > 0);
|
|
21
|
+
const size = element.properties.size === 'small' ? 'small' : 'medium';
|
|
22
|
+
return /*#__PURE__*/ jsx(FoundationFrame, {
|
|
23
|
+
element: element,
|
|
24
|
+
interactions: interactions,
|
|
25
|
+
name: "avatar-stack",
|
|
26
|
+
state: state,
|
|
27
|
+
skeleton: [
|
|
28
|
+
35
|
|
29
|
+
],
|
|
30
|
+
children: (state === ComponentState.Ready || state === ComponentState.Partial) && /*#__PURE__*/ jsxs("ul", {
|
|
31
|
+
className: "foundation-avatars",
|
|
32
|
+
role: "group",
|
|
33
|
+
"aria-label": formatText(strings.avatarPeople, {
|
|
34
|
+
count: people.length
|
|
35
|
+
}),
|
|
36
|
+
"data-size": size,
|
|
37
|
+
children: [
|
|
38
|
+
shown.map((person)=>/*#__PURE__*/ jsx("li", {
|
|
39
|
+
className: "foundation-avatar",
|
|
40
|
+
role: "img",
|
|
41
|
+
"aria-label": person.name,
|
|
42
|
+
title: person.name,
|
|
43
|
+
children: person.imageUrl ? /*#__PURE__*/ jsx("img", {
|
|
44
|
+
src: person.imageUrl,
|
|
45
|
+
alt: ""
|
|
46
|
+
}) : /*#__PURE__*/ jsx("span", {
|
|
47
|
+
"aria-hidden": "true",
|
|
48
|
+
children: initialsOf(person.name)
|
|
49
|
+
})
|
|
50
|
+
}, person.name)),
|
|
51
|
+
hidden > 0 && /*#__PURE__*/ jsx("li", {
|
|
52
|
+
className: "foundation-avatar foundation-avatar-more",
|
|
53
|
+
role: "img",
|
|
54
|
+
"aria-label": formatText(strings.avatarOverflow, {
|
|
55
|
+
count: hidden
|
|
56
|
+
}),
|
|
57
|
+
children: /*#__PURE__*/ jsxs("span", {
|
|
58
|
+
"aria-hidden": "true",
|
|
59
|
+
children: [
|
|
60
|
+
"+",
|
|
61
|
+
hidden
|
|
62
|
+
]
|
|
63
|
+
})
|
|
64
|
+
})
|
|
65
|
+
]
|
|
66
|
+
})
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export { AvatarStack };
|
|
71
|
+
//# sourceMappingURL=AvatarStack.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AvatarStack.js","sources":["../../../foundation/AvatarStack.tsx"],"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 { useMemo } from 'react';\nimport { RegisteredComponentProps } from '@cratis/scene.react';\nimport { initialsOf, readPeople, visiblePeople } from './avatarModel';\nimport { ComponentState, readComponentState } from './ComponentState';\nimport { formatText, readFoundationStrings } from './foundationStrings';\nimport { FoundationFrame } from './StateFrame';\n\n/**\n * The `avatarStack` component: overlapping avatars for the people on a record, with a \"+N\" chip for the rest.\n *\n * `people` are names with an optional picture; without one the avatar shows the person's initials. The stack is a labelled group (\"5 people\"),\n * each avatar is an image named after its person, and the overflow chip says how many more in words. `max` is how many are shown (4 by\n * default) and `size` is `small` or `medium`.\n */\nexport function AvatarStack({ element, interactions }: RegisteredComponentProps) {\n const people = useMemo(() => readPeople(element.properties.people), [element.properties.people]);\n const strings = readFoundationStrings(element);\n const { shown, hidden } = visiblePeople(people, typeof element.properties.max === 'number' ? element.properties.max : 4);\n const state = readComponentState(element, people.length > 0);\n const size = element.properties.size === 'small' ? 'small' : 'medium';\n\n return (\n <FoundationFrame element={element} interactions={interactions} name='avatar-stack' state={state} skeleton={[35]}>\n {(state === ComponentState.Ready || state === ComponentState.Partial) && (\n <ul className='foundation-avatars' role='group' aria-label={formatText(strings.avatarPeople, { count: people.length })} data-size={size}>\n {shown.map(person => (\n <li key={person.name} className='foundation-avatar' role='img' aria-label={person.name} title={person.name}>\n {person.imageUrl ? <img src={person.imageUrl} alt='' /> : <span aria-hidden='true'>{initialsOf(person.name)}</span>}\n </li>\n ))}\n {hidden > 0 && (\n <li className='foundation-avatar foundation-avatar-more' role='img' aria-label={formatText(strings.avatarOverflow, { count: hidden })}>\n <span aria-hidden='true'>+{hidden}</span>\n </li>\n )}\n </ul>\n )}\n </FoundationFrame>\n );\n}\n"],"names":["AvatarStack","element","interactions","people","useMemo","readPeople","properties","strings","readFoundationStrings","shown","hidden","visiblePeople","max","state","readComponentState","length","size","_jsx","FoundationFrame","name","skeleton","ComponentState","Ready","Partial","_jsxs","ul","className","role","aria-label","formatText","avatarPeople","count","data-size","map","person","li","title","imageUrl","img","src","alt","span","aria-hidden","initialsOf","avatarOverflow"],"mappings":";;;;;;;AAUA;;;;;;AAMC,IACM,SAASA,WAAAA,CAAY,EAAEC,OAAO,EAAEC,YAAY,EAA4B,EAAA;IAC3E,MAAMC,MAAAA,GAASC,QAAQ,IAAMC,UAAAA,CAAWJ,QAAQK,UAAU,CAACH,MAAM,CAAA,EAAG;QAACF,OAAAA,CAAQK,UAAU,CAACH;AAAO,KAAA,CAAA;AAC/F,IAAA,MAAMI,UAAUC,qBAAAA,CAAsBP,OAAAA,CAAAA;AACtC,IAAA,MAAM,EAAEQ,KAAK,EAAEC,MAAM,EAAE,GAAGC,cAAcR,MAAAA,EAAQ,OAAOF,QAAQK,UAAU,CAACM,GAAG,KAAK,QAAA,GAAWX,QAAQK,UAAU,CAACM,GAAG,GAAG,CAAA,CAAA;AACtH,IAAA,MAAMC,KAAAA,GAAQC,kBAAAA,CAAmBb,OAAAA,EAASE,MAAAA,CAAOY,MAAM,GAAG,CAAA,CAAA;AAC1D,IAAA,MAAMC,OAAOf,OAAAA,CAAQK,UAAU,CAACU,IAAI,KAAK,UAAU,OAAA,GAAU,QAAA;AAE7D,IAAA,qBACIC,GAAA,CAACC,eAAAA,EAAAA;QAAgBjB,OAAAA,EAASA,OAAAA;QAASC,YAAAA,EAAcA,YAAAA;QAAciB,IAAAA,EAAK,cAAA;QAAeN,KAAAA,EAAOA,KAAAA;QAAOO,QAAAA,EAAU;AAAC,YAAA;AAAG,SAAA;kBAC1G,CAACP,KAAAA,KAAUQ,cAAAA,CAAeC,KAAK,IAAIT,UAAUQ,cAAAA,CAAeE,OAAO,mBAChEC,IAAA,CAACC,IAAAA,EAAAA;YAAGC,SAAAA,EAAU,oBAAA;YAAqBC,IAAAA,EAAK,OAAA;YAAQC,YAAAA,EAAYC,UAAAA,CAAWtB,OAAAA,CAAQuB,YAAY,EAAE;AAAEC,gBAAAA,KAAAA,EAAO5B,OAAOY;AAAO,aAAA,CAAA;YAAIiB,WAAAA,EAAWhB,IAAAA;;AAC9HP,gBAAAA,KAAAA,CAAMwB,GAAG,CAACC,CAAAA,MAAAA,iBACPjB,GAAA,CAACkB,IAAAA,EAAAA;wBAAqBT,SAAAA,EAAU,mBAAA;wBAAoBC,IAAAA,EAAK,KAAA;AAAMC,wBAAAA,YAAAA,EAAYM,OAAOf,IAAI;AAAEiB,wBAAAA,KAAAA,EAAOF,OAAOf,IAAI;kCACrGe,MAAAA,CAAOG,QAAQ,iBAAGpB,GAAA,CAACqB,KAAAA,EAAAA;AAAIC,4BAAAA,GAAAA,EAAKL,OAAOG,QAAQ;4BAAEG,GAAAA,EAAI;2CAAQvB,GAAA,CAACwB,MAAAA,EAAAA;4BAAKC,aAAAA,EAAY,MAAA;AAAQC,4BAAAA,QAAAA,EAAAA,UAAAA,CAAWT,OAAOf,IAAI;;AADrGe,qBAAAA,EAAAA,MAAAA,CAAOf,IAAI,CAAA,CAAA;AAIvBT,gBAAAA,MAAAA,GAAS,mBACNO,GAAA,CAACkB,IAAAA,EAAAA;oBAAGT,SAAAA,EAAU,0CAAA;oBAA2CC,IAAAA,EAAK,KAAA;oBAAMC,YAAAA,EAAYC,UAAAA,CAAWtB,OAAAA,CAAQqC,cAAc,EAAE;wBAAEb,KAAAA,EAAOrB;AAAO,qBAAA,CAAA;AAC/H,oBAAA,QAAA,gBAAAc,IAAA,CAACiB,MAAAA,EAAAA;wBAAKC,aAAAA,EAAY,MAAA;;AAAO,4BAAA,GAAA;AAAEhC,4BAAAA;;;;;;;AAOvD;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChecklistSection.d.ts","sourceRoot":"","sources":["../../../foundation/ChecklistSection.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,wBAAwB,EAAkB,MAAM,qBAAqB,CAAC;AAiB/E,wBAAgB,gBAAgB,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,EAAE,wBAAwB,+BA0DnG"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { useMemo, useState, useEffect } from 'react';
|
|
3
|
+
import { useValueOutput } from '@cratis/scene.react';
|
|
4
|
+
import { readChecklist, doneTaskIds, completed, isOverdue, toggleTask } from './checklistModel.js';
|
|
5
|
+
import { readComponentState, ComponentState } from './ComponentState.js';
|
|
6
|
+
import { FoundationIcon } from './FoundationIcon.js';
|
|
7
|
+
import { readLocale, formatDate } from './formatting.js';
|
|
8
|
+
import { readFoundationStrings, formatText } from './foundationStrings.js';
|
|
9
|
+
import { readPermissionRule } from './PermissionRule.js';
|
|
10
|
+
import { FoundationFrame } from './StateFrame.js';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* The `checklistSection` component: sections of tasks, each with its owner and due date, and a progress bar per section.
|
|
14
|
+
*
|
|
15
|
+
* `sections` give the structure (`title`, and `items` with `id`, `label`, `owner`, `due`, `done`). Ticking a task publishes the ids of all
|
|
16
|
+
* done tasks as the `value` output and runs the behaviors attached to the element. An open task past its due date says "Overdue" in
|
|
17
|
+
* words as well as in color. Progress is a labelled progress bar, so "2 of 5 complete" is read, not just seen. With `editPermission`
|
|
18
|
+
* not enabled the tasks are shown and cannot be changed.
|
|
19
|
+
*/ function ChecklistSection({ element, interactions, bindingOutputs }) {
|
|
20
|
+
const supplied = useMemo(()=>readChecklist(element.properties.sections), [
|
|
21
|
+
element.properties.sections
|
|
22
|
+
]);
|
|
23
|
+
const suppliedKey = JSON.stringify(supplied);
|
|
24
|
+
const [groups, setGroups] = useState(supplied);
|
|
25
|
+
const strings = readFoundationStrings(element);
|
|
26
|
+
const locale = readLocale(element);
|
|
27
|
+
const state = readComponentState(element, supplied.some((group)=>group.items.length > 0));
|
|
28
|
+
const locked = readPermissionRule(element, 'editPermission') !== 'enabled';
|
|
29
|
+
const now = useMemo(()=>typeof element.properties.today === 'string' ? new Date(element.properties.today) : new Date(), [
|
|
30
|
+
element.properties.today
|
|
31
|
+
]);
|
|
32
|
+
useEffect(()=>setGroups(supplied), [
|
|
33
|
+
suppliedKey
|
|
34
|
+
]);
|
|
35
|
+
useValueOutput(bindingOutputs, doneTaskIds(groups));
|
|
36
|
+
return /*#__PURE__*/ jsx(FoundationFrame, {
|
|
37
|
+
element: element,
|
|
38
|
+
interactions: interactions,
|
|
39
|
+
name: "checklist",
|
|
40
|
+
state: state,
|
|
41
|
+
skeleton: [
|
|
42
|
+
40,
|
|
43
|
+
100,
|
|
44
|
+
90,
|
|
45
|
+
95
|
|
46
|
+
],
|
|
47
|
+
children: (state === ComponentState.Ready || state === ComponentState.Partial) && groups.map((group, groupIndex)=>{
|
|
48
|
+
const done = completed(group);
|
|
49
|
+
const total = group.items.length;
|
|
50
|
+
return /*#__PURE__*/ jsxs("section", {
|
|
51
|
+
className: "foundation-checklist-group",
|
|
52
|
+
"aria-labelledby": `${element.id}-group-${groupIndex}`,
|
|
53
|
+
children: [
|
|
54
|
+
/*#__PURE__*/ jsxs("header", {
|
|
55
|
+
className: "foundation-checklist-header",
|
|
56
|
+
children: [
|
|
57
|
+
/*#__PURE__*/ jsx("h3", {
|
|
58
|
+
id: `${element.id}-group-${groupIndex}`,
|
|
59
|
+
children: group.title
|
|
60
|
+
}),
|
|
61
|
+
/*#__PURE__*/ jsx("span", {
|
|
62
|
+
className: "foundation-count",
|
|
63
|
+
children: formatText(strings.checklistProgress, {
|
|
64
|
+
done,
|
|
65
|
+
total
|
|
66
|
+
})
|
|
67
|
+
})
|
|
68
|
+
]
|
|
69
|
+
}),
|
|
70
|
+
/*#__PURE__*/ jsx("div", {
|
|
71
|
+
className: "foundation-progress",
|
|
72
|
+
role: "progressbar",
|
|
73
|
+
"aria-label": formatText(strings.checklistItemProgress, {
|
|
74
|
+
title: group.title
|
|
75
|
+
}),
|
|
76
|
+
"aria-valuemin": 0,
|
|
77
|
+
"aria-valuemax": total,
|
|
78
|
+
"aria-valuenow": done,
|
|
79
|
+
"aria-valuetext": formatText(strings.checklistProgress, {
|
|
80
|
+
done,
|
|
81
|
+
total
|
|
82
|
+
}),
|
|
83
|
+
children: /*#__PURE__*/ jsx("span", {
|
|
84
|
+
className: "foundation-progress-bar",
|
|
85
|
+
style: {
|
|
86
|
+
inlineSize: total === 0 ? '0%' : `${done / total * 100}%`
|
|
87
|
+
}
|
|
88
|
+
})
|
|
89
|
+
}),
|
|
90
|
+
total === 0 ? /*#__PURE__*/ jsx("p", {
|
|
91
|
+
className: "foundation-count",
|
|
92
|
+
children: strings.checklistNone
|
|
93
|
+
}) : /*#__PURE__*/ jsx("ul", {
|
|
94
|
+
className: "foundation-checklist-items",
|
|
95
|
+
children: group.items.map((item)=>{
|
|
96
|
+
const overdue = isOverdue(item, now);
|
|
97
|
+
return /*#__PURE__*/ jsxs("li", {
|
|
98
|
+
className: "foundation-checklist-item",
|
|
99
|
+
"data-done": item.done,
|
|
100
|
+
"data-overdue": overdue,
|
|
101
|
+
children: [
|
|
102
|
+
/*#__PURE__*/ jsxs("label", {
|
|
103
|
+
className: "foundation-check",
|
|
104
|
+
children: [
|
|
105
|
+
/*#__PURE__*/ jsx("input", {
|
|
106
|
+
type: "checkbox",
|
|
107
|
+
checked: item.done,
|
|
108
|
+
disabled: locked,
|
|
109
|
+
onChange: ()=>{
|
|
110
|
+
setGroups(toggleTask(groups, item.id));
|
|
111
|
+
interactions?.onChange?.();
|
|
112
|
+
}
|
|
113
|
+
}),
|
|
114
|
+
/*#__PURE__*/ jsx("span", {
|
|
115
|
+
className: "foundation-checklist-label",
|
|
116
|
+
children: item.label
|
|
117
|
+
})
|
|
118
|
+
]
|
|
119
|
+
}),
|
|
120
|
+
/*#__PURE__*/ jsxs("span", {
|
|
121
|
+
className: "foundation-checklist-meta",
|
|
122
|
+
children: [
|
|
123
|
+
item.owner && /*#__PURE__*/ jsxs("span", {
|
|
124
|
+
children: [
|
|
125
|
+
/*#__PURE__*/ jsx("span", {
|
|
126
|
+
className: "foundation-visually-hidden",
|
|
127
|
+
children: `${strings.checklistOwner}: `
|
|
128
|
+
}),
|
|
129
|
+
/*#__PURE__*/ jsx(FoundationIcon, {
|
|
130
|
+
name: "user"
|
|
131
|
+
}),
|
|
132
|
+
" ",
|
|
133
|
+
item.owner
|
|
134
|
+
]
|
|
135
|
+
}),
|
|
136
|
+
item.due && /*#__PURE__*/ jsxs("span", {
|
|
137
|
+
children: [
|
|
138
|
+
/*#__PURE__*/ jsx("span", {
|
|
139
|
+
className: "foundation-visually-hidden",
|
|
140
|
+
children: `${strings.checklistDue}: `
|
|
141
|
+
}),
|
|
142
|
+
/*#__PURE__*/ jsx("time", {
|
|
143
|
+
dateTime: item.due,
|
|
144
|
+
children: formatDate(item.due, locale)
|
|
145
|
+
}),
|
|
146
|
+
overdue && /*#__PURE__*/ jsxs("strong", {
|
|
147
|
+
className: "foundation-overdue",
|
|
148
|
+
children: [
|
|
149
|
+
" · ",
|
|
150
|
+
/*#__PURE__*/ jsx(FoundationIcon, {
|
|
151
|
+
name: "alert"
|
|
152
|
+
}),
|
|
153
|
+
" ",
|
|
154
|
+
strings.checklistOverdue
|
|
155
|
+
]
|
|
156
|
+
})
|
|
157
|
+
]
|
|
158
|
+
})
|
|
159
|
+
]
|
|
160
|
+
})
|
|
161
|
+
]
|
|
162
|
+
}, item.id);
|
|
163
|
+
})
|
|
164
|
+
})
|
|
165
|
+
]
|
|
166
|
+
}, group.title + groupIndex);
|
|
167
|
+
})
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export { ChecklistSection };
|
|
172
|
+
//# sourceMappingURL=ChecklistSection.js.map
|