@cratis/scene.blueprint.default 4.40.0 → 4.42.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 +9 -0
- package/defaultBlueprint.ts +1 -0
- package/defaultBlueprintComponents.ts +4 -1
- package/dist/cjs/ComponentName.js +3 -0
- package/dist/cjs/ComponentName.js.map +1 -1
- package/dist/cjs/defaultBlueprint.js +20 -1
- package/dist/cjs/defaultBlueprint.js.map +1 -1
- package/dist/cjs/defaultBlueprintComponentMetadata.js +11 -0
- package/dist/cjs/defaultBlueprintComponentMetadata.js.map +1 -1
- package/dist/cjs/defaultBlueprintComponents.js +17 -0
- package/dist/cjs/defaultBlueprintComponents.js.map +1 -1
- package/dist/cjs/foundation/ActionButton.js.map +1 -1
- package/dist/cjs/foundation/ActionButtonControl.js +46 -0
- package/dist/cjs/foundation/ActionButtonControl.js.map +1 -0
- package/dist/cjs/foundation/DialogFrame.js +196 -0
- package/dist/cjs/foundation/DialogFrame.js.map +1 -0
- package/dist/cjs/foundation/FormScreenBody.js +13 -3
- package/dist/cjs/foundation/FormScreenBody.js.map +1 -1
- package/dist/cjs/foundation/Notice.js +51 -0
- package/dist/cjs/foundation/Notice.js.map +1 -0
- package/dist/cjs/foundation/formModel.js +1 -0
- package/dist/cjs/foundation/formModel.js.map +1 -1
- package/dist/cjs/foundation/foundationComponentMetadata.js +22 -0
- package/dist/cjs/foundation/foundationComponentMetadata.js.map +1 -1
- package/dist/cjs/foundation/foundationDescriptors.js +89 -0
- package/dist/cjs/foundation/foundationDescriptors.js.map +1 -1
- package/dist/cjs/foundation/foundationSamples.js +29 -0
- package/dist/cjs/foundation/foundationSamples.js.map +1 -1
- package/dist/cjs/foundation/foundationStrings.js +3 -1
- package/dist/cjs/foundation/foundationStrings.js.map +1 -1
- package/dist/cjs/foundation/templates/boardScreenTemplate.js +76 -0
- package/dist/cjs/foundation/templates/boardScreenTemplate.js.map +1 -0
- package/dist/cjs/foundation/templates/dashboardScreenTemplate.js +128 -0
- package/dist/cjs/foundation/templates/dashboardScreenTemplate.js.map +1 -0
- package/dist/cjs/foundation/templates/dialogTemplates.js +254 -0
- package/dist/cjs/foundation/templates/dialogTemplates.js.map +1 -0
- package/dist/cjs/foundation/templates/formScreenTemplate.js +71 -0
- package/dist/cjs/foundation/templates/formScreenTemplate.js.map +1 -0
- package/dist/cjs/foundation/templates/index.js +57 -0
- package/dist/cjs/foundation/templates/index.js.map +1 -0
- package/dist/cjs/foundation/templates/listScreenTemplate.js +124 -0
- package/dist/cjs/foundation/templates/listScreenTemplate.js.map +1 -0
- package/dist/cjs/foundation/templates/masterDetailScreenTemplate.js +79 -0
- package/dist/cjs/foundation/templates/masterDetailScreenTemplate.js.map +1 -0
- package/dist/cjs/foundation/templates/recordPageTemplate.js +137 -0
- package/dist/cjs/foundation/templates/recordPageTemplate.js.map +1 -0
- package/dist/cjs/foundation/templates/stateScreenTemplates.js +252 -0
- package/dist/cjs/foundation/templates/stateScreenTemplates.js.map +1 -0
- package/dist/cjs/foundation/templates/templateParts.js +38 -0
- package/dist/cjs/foundation/templates/templateParts.js.map +1 -0
- package/dist/cjs/foundation/templates/wizardScreenTemplate.js +95 -0
- package/dist/cjs/foundation/templates/wizardScreenTemplate.js.map +1 -0
- package/dist/cjs/foundation/templates/workspaceScreenTemplate.js +62 -0
- package/dist/cjs/foundation/templates/workspaceScreenTemplate.js.map +1 -0
- package/dist/cjs/gallery/GalleryDialogPreview.js +62 -0
- package/dist/cjs/gallery/GalleryDialogPreview.js.map +1 -0
- package/dist/cjs/gallery/GalleryScreenPreview.js +78 -4
- package/dist/cjs/gallery/GalleryScreenPreview.js.map +1 -1
- package/dist/cjs/gallery/applicationChrome.js +18 -1
- package/dist/cjs/gallery/applicationChrome.js.map +1 -1
- package/dist/cjs/gallery/composeScreen.js +5 -3
- package/dist/cjs/gallery/composeScreen.js.map +1 -1
- package/dist/cjs/gallery/dialogTemplates.js +41 -36
- package/dist/cjs/gallery/dialogTemplates.js.map +1 -1
- package/dist/cjs/gallery/screens.js +87 -3
- package/dist/cjs/gallery/screens.js.map +1 -1
- package/dist/cjs/index.js +61 -5
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/ComponentName.d.ts +3 -0
- package/dist/esm/ComponentName.d.ts.map +1 -1
- package/dist/esm/ComponentName.js +3 -0
- package/dist/esm/ComponentName.js.map +1 -1
- package/dist/esm/defaultBlueprint.d.ts.map +1 -1
- package/dist/esm/defaultBlueprint.js +20 -1
- package/dist/esm/defaultBlueprint.js.map +1 -1
- package/dist/esm/defaultBlueprintComponentMetadata.js +11 -0
- package/dist/esm/defaultBlueprintComponentMetadata.js.map +1 -1
- package/dist/esm/defaultBlueprintComponents.d.ts.map +1 -1
- package/dist/esm/defaultBlueprintComponents.js +17 -0
- package/dist/esm/defaultBlueprintComponents.js.map +1 -1
- package/dist/esm/foundation/ActionButton.d.ts +1 -1
- package/dist/esm/foundation/ActionButton.d.ts.map +1 -1
- package/dist/esm/foundation/ActionButton.js.map +1 -1
- package/dist/esm/foundation/ActionButtonControl.d.ts +3 -0
- package/dist/esm/foundation/ActionButtonControl.d.ts.map +1 -0
- package/dist/esm/foundation/ActionButtonControl.js +44 -0
- package/dist/esm/foundation/ActionButtonControl.js.map +1 -0
- package/dist/esm/foundation/DialogFrame.d.ts +14 -0
- package/dist/esm/foundation/DialogFrame.d.ts.map +1 -0
- package/dist/esm/foundation/DialogFrame.js +190 -0
- package/dist/esm/foundation/DialogFrame.js.map +1 -0
- package/dist/esm/foundation/FormScreenBody.d.ts.map +1 -1
- package/dist/esm/foundation/FormScreenBody.js +13 -3
- package/dist/esm/foundation/FormScreenBody.js.map +1 -1
- package/dist/esm/foundation/Notice.d.ts +3 -0
- package/dist/esm/foundation/Notice.d.ts.map +1 -0
- package/dist/esm/foundation/Notice.js +49 -0
- package/dist/esm/foundation/Notice.js.map +1 -0
- package/dist/esm/foundation/formModel.d.ts +2 -1
- package/dist/esm/foundation/formModel.d.ts.map +1 -1
- package/dist/esm/foundation/formModel.js +1 -0
- package/dist/esm/foundation/formModel.js.map +1 -1
- package/dist/esm/foundation/foundationComponentMetadata.d.ts.map +1 -1
- package/dist/esm/foundation/foundationComponentMetadata.js +22 -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 +89 -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 +29 -0
- package/dist/esm/foundation/foundationSamples.js.map +1 -1
- package/dist/esm/foundation/foundationStrings.d.ts +2 -0
- package/dist/esm/foundation/foundationStrings.d.ts.map +1 -1
- package/dist/esm/foundation/foundationStrings.js +3 -1
- package/dist/esm/foundation/foundationStrings.js.map +1 -1
- package/dist/esm/foundation/index.d.ts +4 -0
- package/dist/esm/foundation/index.d.ts.map +1 -1
- package/dist/esm/foundation/index.js +4 -0
- package/dist/esm/foundation/index.js.map +1 -1
- package/dist/esm/foundation/templates/boardScreenTemplate.d.ts +3 -0
- package/dist/esm/foundation/templates/boardScreenTemplate.d.ts.map +1 -0
- package/dist/esm/foundation/templates/boardScreenTemplate.js +74 -0
- package/dist/esm/foundation/templates/boardScreenTemplate.js.map +1 -0
- package/dist/esm/foundation/templates/dashboardScreenTemplate.d.ts +3 -0
- package/dist/esm/foundation/templates/dashboardScreenTemplate.d.ts.map +1 -0
- package/dist/esm/foundation/templates/dashboardScreenTemplate.js +126 -0
- package/dist/esm/foundation/templates/dashboardScreenTemplate.js.map +1 -0
- package/dist/esm/foundation/templates/dialogTemplates.d.ts +20 -0
- package/dist/esm/foundation/templates/dialogTemplates.d.ts.map +1 -0
- package/dist/esm/foundation/templates/dialogTemplates.js +243 -0
- package/dist/esm/foundation/templates/dialogTemplates.js.map +1 -0
- package/dist/esm/foundation/templates/formScreenTemplate.d.ts +3 -0
- package/dist/esm/foundation/templates/formScreenTemplate.d.ts.map +1 -0
- package/dist/esm/foundation/templates/formScreenTemplate.js +69 -0
- package/dist/esm/foundation/templates/formScreenTemplate.js.map +1 -0
- package/dist/esm/foundation/templates/index.d.ts +13 -0
- package/dist/esm/foundation/templates/index.d.ts.map +1 -0
- package/dist/esm/foundation/templates/index.js +27 -0
- package/dist/esm/foundation/templates/index.js.map +1 -0
- package/dist/esm/foundation/templates/listScreenTemplate.d.ts +3 -0
- package/dist/esm/foundation/templates/listScreenTemplate.d.ts.map +1 -0
- package/dist/esm/foundation/templates/listScreenTemplate.js +122 -0
- package/dist/esm/foundation/templates/listScreenTemplate.js.map +1 -0
- package/dist/esm/foundation/templates/masterDetailScreenTemplate.d.ts +3 -0
- package/dist/esm/foundation/templates/masterDetailScreenTemplate.d.ts.map +1 -0
- package/dist/esm/foundation/templates/masterDetailScreenTemplate.js +77 -0
- package/dist/esm/foundation/templates/masterDetailScreenTemplate.js.map +1 -0
- package/dist/esm/foundation/templates/recordPageTemplate.d.ts +3 -0
- package/dist/esm/foundation/templates/recordPageTemplate.d.ts.map +1 -0
- package/dist/esm/foundation/templates/recordPageTemplate.js +135 -0
- package/dist/esm/foundation/templates/recordPageTemplate.js.map +1 -0
- package/dist/esm/foundation/templates/stateScreenTemplates.d.ts +8 -0
- package/dist/esm/foundation/templates/stateScreenTemplates.d.ts.map +1 -0
- package/dist/esm/foundation/templates/stateScreenTemplates.js +245 -0
- package/dist/esm/foundation/templates/stateScreenTemplates.js.map +1 -0
- package/dist/esm/foundation/templates/templateParts.d.ts +6 -0
- package/dist/esm/foundation/templates/templateParts.d.ts.map +1 -0
- package/dist/esm/foundation/templates/templateParts.js +33 -0
- package/dist/esm/foundation/templates/templateParts.js.map +1 -0
- package/dist/esm/foundation/templates/wizardScreenTemplate.d.ts +3 -0
- package/dist/esm/foundation/templates/wizardScreenTemplate.d.ts.map +1 -0
- package/dist/esm/foundation/templates/wizardScreenTemplate.js +93 -0
- package/dist/esm/foundation/templates/wizardScreenTemplate.js.map +1 -0
- package/dist/esm/foundation/templates/workspaceScreenTemplate.d.ts +3 -0
- package/dist/esm/foundation/templates/workspaceScreenTemplate.d.ts.map +1 -0
- package/dist/esm/foundation/templates/workspaceScreenTemplate.js +60 -0
- package/dist/esm/foundation/templates/workspaceScreenTemplate.js.map +1 -0
- package/dist/esm/gallery/FoundationDialogs.stories.d.ts +35 -0
- package/dist/esm/gallery/FoundationDialogs.stories.d.ts.map +1 -0
- package/dist/esm/gallery/FoundationDialogs.stories.js +38 -0
- package/dist/esm/gallery/FoundationDialogs.stories.js.map +1 -0
- package/dist/esm/gallery/GalleryDialogPreview.d.ts +17 -0
- package/dist/esm/gallery/GalleryDialogPreview.d.ts.map +1 -0
- package/dist/esm/gallery/GalleryDialogPreview.js +59 -0
- package/dist/esm/gallery/GalleryDialogPreview.js.map +1 -0
- package/dist/esm/gallery/GalleryScreenPreview.d.ts +13 -2
- package/dist/esm/gallery/GalleryScreenPreview.d.ts.map +1 -1
- package/dist/esm/gallery/GalleryScreenPreview.js +77 -5
- package/dist/esm/gallery/GalleryScreenPreview.js.map +1 -1
- package/dist/esm/gallery/applicationChrome.d.ts.map +1 -1
- package/dist/esm/gallery/applicationChrome.js +18 -1
- package/dist/esm/gallery/applicationChrome.js.map +1 -1
- package/dist/esm/gallery/composeScreen.d.ts.map +1 -1
- package/dist/esm/gallery/composeScreen.js +5 -3
- package/dist/esm/gallery/composeScreen.js.map +1 -1
- package/dist/esm/gallery/dialogTemplates.d.ts.map +1 -1
- package/dist/esm/gallery/dialogTemplates.js +42 -37
- package/dist/esm/gallery/dialogTemplates.js.map +1 -1
- package/dist/esm/gallery/index.d.ts +1 -0
- package/dist/esm/gallery/index.d.ts.map +1 -1
- package/dist/esm/gallery/index.js +1 -0
- package/dist/esm/gallery/index.js.map +1 -1
- package/dist/esm/gallery/screens.d.ts.map +1 -1
- package/dist/esm/gallery/screens.js +87 -3
- package/dist/esm/gallery/screens.js.map +1 -1
- package/dist/esm/index.js +17 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/foundation/ActionButton.tsx +1 -1
- package/foundation/ActionButtonControl.tsx +37 -0
- package/foundation/DialogFrame.tsx +138 -0
- package/foundation/FormScreenBody.tsx +6 -3
- package/foundation/Notice.tsx +33 -0
- package/foundation/formModel.ts +1 -0
- package/foundation/foundationComponentMetadata.ts +3 -0
- package/foundation/foundationDescriptors.ts +41 -0
- package/foundation/foundationSamples.ts +3 -0
- package/foundation/foundationStrings.ts +2 -0
- package/foundation/index.ts +4 -0
- package/foundation/templates/boardScreenTemplate.ts +28 -0
- package/foundation/templates/dashboardScreenTemplate.ts +37 -0
- package/foundation/templates/dialogTemplates.ts +114 -0
- package/foundation/templates/formScreenTemplate.ts +28 -0
- package/foundation/templates/index.ts +28 -0
- package/foundation/templates/listScreenTemplate.ts +37 -0
- package/foundation/templates/masterDetailScreenTemplate.ts +28 -0
- package/foundation/templates/recordPageTemplate.ts +36 -0
- package/foundation/templates/stateScreenTemplates.ts +107 -0
- package/foundation/templates/templateParts.ts +30 -0
- package/foundation/templates/wizardScreenTemplate.ts +33 -0
- package/foundation/templates/workspaceScreenTemplate.ts +27 -0
- package/gallery/FoundationDialogs.stories.tsx +74 -0
- package/gallery/GalleryDialogPreview.tsx +68 -0
- package/gallery/GalleryScreenPreview.tsx +64 -5
- package/gallery/applicationChrome.ts +6 -1
- package/gallery/composeScreen.ts +4 -2
- package/gallery/dialogTemplates.ts +22 -17
- package/gallery/index.ts +1 -0
- package/gallery/screens.ts +18 -2
- package/package.json +10 -8
- package/sampleData/foundation-en.json +661 -0
- package/shell/layout.css +219 -0
- package/thumbnails/BoardScreen.svg +15 -0
- package/thumbnails/ConfirmDialog.svg +12 -0
- package/thumbnails/DashboardScreen.svg +18 -0
- package/thumbnails/DetailDialog.svg +11 -0
- package/thumbnails/ErrorScreen.svg +11 -0
- package/thumbnails/FilterDialog.svg +16 -0
- package/thumbnails/ForbiddenScreen.svg +10 -0
- package/thumbnails/FormDialog.svg +12 -0
- package/thumbnails/FormScreen.svg +14 -0
- package/thumbnails/ListScreen.svg +16 -0
- package/thumbnails/LoginScreen.svg +12 -0
- package/thumbnails/LookupDialog.svg +13 -0
- package/thumbnails/MasterDetailScreen.svg +22 -0
- package/thumbnails/NotFoundScreen.svg +9 -0
- package/thumbnails/QuickCreateDialog.svg +12 -0
- package/thumbnails/RecordPage.svg +17 -0
- package/thumbnails/SideSheet.svg +13 -0
- package/thumbnails/WizardScreen.svg +16 -0
- package/thumbnails/WorkspaceScreen.svg +12 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DialogFrame.js","sources":["../../../foundation/DialogFrame.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 { useCallback, useContext, useEffect, useId, useRef } from 'react';\nimport { RegisteredComponentProps, SceneNavigationContextInternal } from '@cratis/scene.react';\nimport { readOptionalString, readStrings } from '../shell/elementProperties';\nimport { FoundationIcon } from './FoundationIcon';\nimport { formatText, readFoundationStrings } from './foundationStrings';\nimport { isRightToLeft, readLocale } from './formatting';\nimport { useCompactWidth } from './useCompactWidth';\n\n/** Where a dialog is drawn: in the middle of the page, as a drawer from the inline end, or filling the page. */\nexport enum DialogPlacement {\n Center = 'center',\n Side = 'side',\n Full = 'full',\n}\n\n/** What a dialog is about: an ordinary one, or one that cannot be undone and is drawn in the danger colors. */\nexport enum DialogTone {\n Default = 'default',\n Danger = 'danger',\n}\n\nconst focusable = 'input:not([disabled]):not([type=\"hidden\"]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), [href], [tabindex]:not([tabindex=\"-1\"])';\n\n/** Reads the placement property, falling back to the center for anything that is not one of the three. */\nexport function readDialogPlacement(element: RegisteredComponentProps['element']): DialogPlacement {\n const value = readOptionalString(element, 'placement');\n return value === DialogPlacement.Side || value === DialogPlacement.Full ? value : DialogPlacement.Center;\n}\n\n/** The placement a dialog is drawn with in a window of the given width class: a phone gets every dialog at full height and width (spec Part B 2.10, 1.5). */\nexport const placementFor = (requested: DialogPlacement, compact: boolean): DialogPlacement => (compact ? DialogPlacement.Full : requested);\n\n/** The elements a dialog's focus can rest on, in document order, that are not hidden. */\nconst focusableIn = (host: HTMLElement): HTMLElement[] => Array.from(host.querySelectorAll<HTMLElement>(focusable)).filter(candidate => !candidate.hidden && candidate.closest('[hidden]') === null);\n\n/**\n * The `dialogFrame` component: the head of a dialog template and everything that makes what the host draws around it behave as a dialog.\n *\n * It draws the heading (`title`, `subtitle`), an optional `message` and `consequences` list - what a confirmation says will happen - and a close button.\n * The host draws the box a dialog template opens in (a `role=\"dialog\" aria-modal=\"true\"` element); this component takes that element on and gives it the\n * parts of a dialog that must not differ from one template to the next:\n *\n * - it is named by the heading, takes focus when it opens (the first field, else the primary action, else the close button), keeps Tab inside it, and\n * gives focus back to whatever opened it when it goes;\n * - Escape and the close button run the behaviors attached to this element (a `CloseDialog` action), and close the dialog themselves when none is attached;\n * - `placement` is `center` (default), `side` (a drawer from the inline end, which a right-to-left locale mirrors) or `full`; on a phone every dialog fills the page;\n * - `tone` `danger` draws a dialog that cannot be undone in the danger colors.\n *\n * Every text it says comes from the strings table and the locale of the element, so an application localizes it like any foundation component.\n */\nexport function DialogFrame({ element, interactions }: RegisteredComponentProps) {\n const frame = useRef<HTMLElement>(null);\n const heading = useId();\n const navigation = useContext(SceneNavigationContextInternal);\n const compact = useCompactWidth();\n const strings = readFoundationStrings(element);\n const locale = readLocale(element);\n const title = readOptionalString(element, 'title') ?? '';\n const subtitle = readOptionalString(element, 'subtitle');\n const message = readOptionalString(element, 'message');\n const consequences = readStrings(element, 'consequences');\n const placement = placementFor(readDialogPlacement(element), compact);\n const tone = element.properties.tone === DialogTone.Danger ? DialogTone.Danger : DialogTone.Default;\n\n const onClick = interactions?.onClick;\n const close = useCallback(() => {\n if (onClick) onClick({ stopPropagation: () => undefined });\n else navigation?.closeDialog();\n }, [onClick, navigation]);\n const closeRef = useRef(close);\n closeRef.current = close;\n\n useEffect(() => {\n const host = frame.current?.closest<HTMLElement>('[role=\"dialog\"]');\n if (!host) return;\n\n const opener = document.activeElement instanceof HTMLElement ? document.activeElement : undefined;\n const before = { className: host.className, labelledBy: host.getAttribute('aria-labelledby'), placement: host.getAttribute('data-placement'), tone: host.getAttribute('data-tone') };\n host.classList.add('foundation', 'foundation-dialog-host');\n host.setAttribute('aria-labelledby', heading);\n host.setAttribute('data-placement', placement);\n host.setAttribute('data-tone', tone);\n host.dir = isRightToLeft(locale) ? 'rtl' : host.dir;\n\n const closeButton = frame.current?.querySelector<HTMLElement>('.foundation-dialog-close');\n const targets = focusableIn(host);\n (targets.find(target => /^(INPUT|SELECT|TEXTAREA)$/.test(target.tagName)) ?? targets.find(target => target !== closeButton) ?? closeButton)?.focus();\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n closeRef.current();\n } else if (event.key === 'Tab') {\n const inside = focusableIn(host);\n if (inside.length === 0) { event.preventDefault(); return; }\n const first = inside[0];\n const last = inside[inside.length - 1];\n if (event.shiftKey && (document.activeElement === first || !host.contains(document.activeElement))) { event.preventDefault(); last.focus(); }\n else if (!event.shiftKey && (document.activeElement === last || !host.contains(document.activeElement))) { event.preventDefault(); first.focus(); }\n }\n };\n\n host.addEventListener('keydown', onKeyDown);\n return () => {\n host.removeEventListener('keydown', onKeyDown);\n host.className = before.className;\n for (const [name, value] of [['aria-labelledby', before.labelledBy], ['data-placement', before.placement], ['data-tone', before.tone]] as const) {\n if (value === null) host.removeAttribute(name);\n else host.setAttribute(name, value);\n }\n\n if (opener?.isConnected) opener.focus();\n };\n }, [heading, placement, tone, locale]);\n\n return (\n <header ref={frame} className='foundation foundation-dialog-frame' data-scene-id={element.id} data-placement={placement} data-tone={tone} lang={locale} dir={isRightToLeft(locale) ? 'rtl' : undefined}>\n <div className='foundation-dialog-heading'>\n <div className='foundation-dialog-titles'>\n <h2 id={heading} className='foundation-dialog-title'>{title}</h2>\n {subtitle && <p className='foundation-dialog-subtitle'>{subtitle}</p>}\n </div>\n <button type='button' className='foundation-dialog-close' aria-label={formatText(strings.dialogClose, { title })} onClick={close}>\n <FoundationIcon name='close' />\n </button>\n </div>\n {message && <p className='foundation-dialog-message'>{message}</p>}\n {consequences.length > 0 && (\n <ul className='foundation-dialog-consequences' aria-label={strings.dialogConsequences}>\n {consequences.map(consequence => <li key={consequence}>{consequence}</li>)}\n </ul>\n )}\n </header>\n );\n}\n"],"names":["DialogPlacement","DialogTone","focusable","readDialogPlacement","element","value","readOptionalString","placementFor","requested","compact","focusableIn","host","Array","from","querySelectorAll","filter","candidate","hidden","closest","DialogFrame","interactions","frame","useRef","heading","useId","navigation","useContext","SceneNavigationContextInternal","useCompactWidth","strings","readFoundationStrings","locale","readLocale","title","subtitle","message","consequences","readStrings","placement","tone","properties","onClick","close","useCallback","stopPropagation","undefined","closeDialog","closeRef","current","useEffect","opener","document","activeElement","HTMLElement","before","className","labelledBy","getAttribute","classList","add","setAttribute","dir","isRightToLeft","closeButton","querySelector","targets","find","target","test","tagName","focus","onKeyDown","event","key","preventDefault","inside","length","first","last","shiftKey","contains","addEventListener","removeEventListener","name","removeAttribute","isConnected","_jsxs","header","ref","data-scene-id","id","data-placement","data-tone","lang","div","_jsx","h2","p","button","type","aria-label","formatText","dialogClose","FoundationIcon","ul","dialogConsequences","map","consequence","li"],"mappings":";;;;;;;;;;;AAWA,iHACO,IAAKA,eAAAA,iBAAAA,SAAAA,eAAAA,EAAAA;;;;AAAAA,IAAAA,OAAAA,eAAAA;AAIX,CAAA,CAAA,EAAA;AAED,gHACO,IAAKC,UAAAA,iBAAAA,SAAAA,UAAAA,EAAAA;;;AAAAA,IAAAA,OAAAA,UAAAA;AAGX,CAAA,CAAA,EAAA;AAED,MAAMC,SAAAA,GAAY,+JAAA;AAElB,2GACO,SAASC,mBAAAA,CAAoBC,OAA4C,EAAA;IAC5E,MAAMC,KAAAA,GAAQC,qCAAmBF,OAAAA,EAAS,WAAA,CAAA;AAC1C,IAAA,OAAOC,oBAAkCA,KAAAA,KAAAA,MAAAA,GAAiCA,KAAAA,GAAAA,QAAAA;AAC9E;AAEA,8JACO,MAAME,YAAAA,GAAe,CAACC,SAAAA,EAA4BC,OAAAA,GAAuCA,mBAAiCD;AAEjI,0FACA,MAAME,WAAAA,GAAc,CAACC,OAAqCC,KAAAA,CAAMC,IAAI,CAACF,IAAAA,CAAKG,gBAAgB,CAAcZ,YAAYa,MAAM,CAACC,CAAAA,SAAAA,GAAa,CAACA,SAAAA,CAAUC,MAAM,IAAID,SAAAA,CAAUE,OAAO,CAAC,UAAA,CAAA,KAAgB,IAAA,CAAA;AAE/L;;;;;;;;;;;;;;AAcC,IACM,SAASC,WAAAA,CAAY,EAAEf,OAAO,EAAEgB,YAAY,EAA4B,EAAA;AAC3E,IAAA,MAAMC,QAAQC,YAAAA,CAAoB,IAAA,CAAA;AAClC,IAAA,MAAMC,OAAAA,GAAUC,WAAAA,EAAAA;AAChB,IAAA,MAAMC,aAAaC,gBAAAA,CAAWC,0CAAAA,CAAAA;AAC9B,IAAA,MAAMlB,OAAAA,GAAUmB,+BAAAA,EAAAA;AAChB,IAAA,MAAMC,UAAUC,uCAAAA,CAAsB1B,OAAAA,CAAAA;AACtC,IAAA,MAAM2B,SAASC,qBAAAA,CAAW5B,OAAAA,CAAAA;IAC1B,MAAM6B,KAAAA,GAAQ3B,oCAAAA,CAAmBF,OAAAA,EAAS,OAAA,CAAA,IAAY,EAAA;IACtD,MAAM8B,QAAAA,GAAW5B,qCAAmBF,OAAAA,EAAS,UAAA,CAAA;IAC7C,MAAM+B,OAAAA,GAAU7B,qCAAmBF,OAAAA,EAAS,SAAA,CAAA;IAC5C,MAAMgC,YAAAA,GAAeC,8BAAYjC,OAAAA,EAAS,cAAA,CAAA;IAC1C,MAAMkC,SAAAA,GAAY/B,YAAAA,CAAaJ,mBAAAA,CAAoBC,OAAAA,CAAAA,EAAUK,OAAAA,CAAAA;AAC7D,IAAA,MAAM8B,IAAAA,GAAOnC,OAAAA,CAAQoC,UAAU,CAACD,IAAI,KAAA,QAAA,GAAA,QAAA,GAAA,SAAA;AAEpC,IAAA,MAAME,UAAUrB,YAAAA,EAAcqB,OAAAA;AAC9B,IAAA,MAAMC,QAAQC,iBAAAA,CAAY,IAAA;AACtB,QAAA,IAAIF,SAASA,OAAAA,CAAQ;AAAEG,YAAAA,eAAAA,EAAiB,IAAMC;AAAU,SAAA,CAAA;aACnDpB,UAAAA,EAAYqB,WAAAA,EAAAA;IACrB,CAAA,EAAG;AAACL,QAAAA,OAAAA;AAAShB,QAAAA;AAAW,KAAA,CAAA;AACxB,IAAA,MAAMsB,WAAWzB,YAAAA,CAAOoB,KAAAA,CAAAA;AACxBK,IAAAA,QAAAA,CAASC,OAAO,GAAGN,KAAAA;IAEnBO,eAAAA,CAAU,IAAA;AACN,QAAA,MAAMtC,IAAAA,GAAOU,KAAAA,CAAM2B,OAAO,EAAE9B,OAAAA,CAAqB,iBAAA,CAAA;AACjD,QAAA,IAAI,CAACP,IAAAA,EAAM;AAEX,QAAA,MAAMuC,SAASC,QAAAA,CAASC,aAAa,YAAYC,WAAAA,GAAcF,QAAAA,CAASC,aAAa,GAAGP,SAAAA;AACxF,QAAA,MAAMS,MAAAA,GAAS;AAAEC,YAAAA,SAAAA,EAAW5C,KAAK4C,SAAS;YAAEC,UAAAA,EAAY7C,IAAAA,CAAK8C,YAAY,CAAC,iBAAA,CAAA;YAAoBnB,SAAAA,EAAW3B,IAAAA,CAAK8C,YAAY,CAAC,gBAAA,CAAA;YAAmBlB,IAAAA,EAAM5B,IAAAA,CAAK8C,YAAY,CAAC,WAAA;AAAa,SAAA;AACnL9C,QAAAA,IAAAA,CAAK+C,SAAS,CAACC,GAAG,CAAC,YAAA,EAAc,wBAAA,CAAA;QACjChD,IAAAA,CAAKiD,YAAY,CAAC,iBAAA,EAAmBrC,OAAAA,CAAAA;QACrCZ,IAAAA,CAAKiD,YAAY,CAAC,gBAAA,EAAkBtB,SAAAA,CAAAA;QACpC3B,IAAAA,CAAKiD,YAAY,CAAC,WAAA,EAAarB,IAAAA,CAAAA;AAC/B5B,QAAAA,IAAAA,CAAKkD,GAAG,GAAGC,wBAAAA,CAAc/B,MAAAA,CAAAA,GAAU,KAAA,GAAQpB,KAAKkD,GAAG;AAEnD,QAAA,MAAME,WAAAA,GAAc1C,KAAAA,CAAM2B,OAAO,EAAEgB,aAAAA,CAA2B,0BAAA,CAAA;AAC9D,QAAA,MAAMC,UAAUvD,WAAAA,CAAYC,IAAAA,CAAAA;AAC3BsD,QAAAA,CAAAA,QAAQC,IAAI,CAACC,CAAAA,MAAAA,GAAU,2BAAA,CAA4BC,IAAI,CAACD,MAAAA,CAAOE,OAAO,CAAA,CAAA,IAAMJ,OAAAA,CAAQC,IAAI,CAACC,CAAAA,SAAUA,MAAAA,KAAWJ,WAAAA,CAAAA,IAAgBA,WAAU,GAAIO,KAAAA,EAAAA;AAE7I,QAAA,MAAMC,YAAY,CAACC,KAAAA,GAAAA;YACf,IAAIA,KAAAA,CAAMC,GAAG,KAAK,QAAA,EAAU;AACxBD,gBAAAA,KAAAA,CAAME,cAAc,EAAA;AACpB3B,gBAAAA,QAAAA,CAASC,OAAO,EAAA;AACpB,YAAA,CAAA,MAAO,IAAIwB,KAAAA,CAAMC,GAAG,KAAK,KAAA,EAAO;AAC5B,gBAAA,MAAME,SAASjE,WAAAA,CAAYC,IAAAA,CAAAA;gBAC3B,IAAIgE,MAAAA,CAAOC,MAAM,KAAK,CAAA,EAAG;AAAEJ,oBAAAA,KAAAA,CAAME,cAAc,EAAA;AAAI,oBAAA;AAAQ,gBAAA;gBAC3D,MAAMG,KAAAA,GAAQF,MAAM,CAAC,CAAA,CAAE;AACvB,gBAAA,MAAMG,OAAOH,MAAM,CAACA,MAAAA,CAAOC,MAAM,GAAG,CAAA,CAAE;AACtC,gBAAA,IAAIJ,KAAAA,CAAMO,QAAQ,KAAK5B,SAASC,aAAa,KAAKyB,KAAAA,IAAS,CAAClE,KAAKqE,QAAQ,CAAC7B,QAAAA,CAASC,aAAa,CAAA,CAAA,EAAI;AAAEoB,oBAAAA,KAAAA,CAAME,cAAc,EAAA;AAAII,oBAAAA,IAAAA,CAAKR,KAAK,EAAA;AAAI,gBAAA,CAAA,MACvI,IAAI,CAACE,KAAAA,CAAMO,QAAQ,KAAK5B,QAAAA,CAASC,aAAa,KAAK0B,IAAAA,IAAQ,CAACnE,IAAAA,CAAKqE,QAAQ,CAAC7B,QAAAA,CAASC,aAAa,CAAA,CAAA,EAAI;AAAEoB,oBAAAA,KAAAA,CAAME,cAAc,EAAA;AAAIG,oBAAAA,KAAAA,CAAMP,KAAK,EAAA;AAAI,gBAAA;AACtJ,YAAA;AACJ,QAAA,CAAA;QAEA3D,IAAAA,CAAKsE,gBAAgB,CAAC,SAAA,EAAWV,SAAAA,CAAAA;QACjC,OAAO,IAAA;YACH5D,IAAAA,CAAKuE,mBAAmB,CAAC,SAAA,EAAWX,SAAAA,CAAAA;YACpC5D,IAAAA,CAAK4C,SAAS,GAAGD,MAAAA,CAAOC,SAAS;AACjC,YAAA,KAAK,MAAM,CAAC4B,IAAAA,EAAM9E,KAAAA,CAAM,IAAI;AAAC,gBAAA;AAAC,oBAAA,iBAAA;AAAmBiD,oBAAAA,MAAAA,CAAOE;AAAW,iBAAA;AAAE,gBAAA;AAAC,oBAAA,gBAAA;AAAkBF,oBAAAA,MAAAA,CAAOhB;AAAU,iBAAA;AAAE,gBAAA;AAAC,oBAAA,WAAA;AAAagB,oBAAAA,MAAAA,CAAOf;AAAK;aAAC,CAAW;AAC7I,gBAAA,IAAIlC,KAAAA,KAAU,IAAA,EAAMM,IAAAA,CAAKyE,eAAe,CAACD,IAAAA,CAAAA;qBACpCxE,IAAAA,CAAKiD,YAAY,CAACuB,IAAAA,EAAM9E,KAAAA,CAAAA;AACjC,YAAA;YAEA,IAAI6C,MAAAA,EAAQmC,WAAAA,EAAanC,MAAAA,CAAOoB,KAAK,EAAA;AACzC,QAAA,CAAA;IACJ,CAAA,EAAG;AAAC/C,QAAAA,OAAAA;AAASe,QAAAA,SAAAA;AAAWC,QAAAA,IAAAA;AAAMR,QAAAA;AAAO,KAAA,CAAA;AAErC,IAAA,qBACIuD,eAAA,CAACC,QAAAA,EAAAA;QAAOC,GAAAA,EAAKnE,KAAAA;QAAOkC,SAAAA,EAAU,oCAAA;AAAqCkC,QAAAA,eAAAA,EAAerF,QAAQsF,EAAE;QAAEC,gBAAAA,EAAgBrD,SAAAA;QAAWsD,WAAAA,EAAWrD,IAAAA;QAAMsD,IAAAA,EAAM9D,MAAAA;QAAQ8B,GAAAA,EAAKC,wBAAAA,CAAc/B,UAAU,KAAA,GAAQc,SAAAA;;0BACzLyC,eAAA,CAACQ,KAAAA,EAAAA;gBAAIvC,SAAAA,EAAU,2BAAA;;kCACX+B,eAAA,CAACQ,KAAAA,EAAAA;wBAAIvC,SAAAA,EAAU,0BAAA;;0CACXwC,cAAA,CAACC,IAAAA,EAAAA;gCAAGN,EAAAA,EAAInE,OAAAA;gCAASgC,SAAAA,EAAU,yBAAA;AAA2BtB,gCAAAA,QAAAA,EAAAA;;AACrDC,4BAAAA,QAAAA,kBAAY6D,cAAA,CAACE,GAAAA,EAAAA;gCAAE1C,SAAAA,EAAU,4BAAA;AAA8BrB,gCAAAA,QAAAA,EAAAA;;;;kCAE5D6D,cAAA,CAACG,QAAAA,EAAAA;wBAAOC,IAAAA,EAAK,QAAA;wBAAS5C,SAAAA,EAAU,yBAAA;wBAA0B6C,YAAAA,EAAYC,4BAAAA,CAAWxE,OAAAA,CAAQyE,WAAW,EAAE;AAAErE,4BAAAA;AAAM,yBAAA,CAAA;wBAAIQ,OAAAA,EAASC,KAAAA;AACvH,wBAAA,QAAA,gBAAAqD,cAAA,CAACQ,6BAAAA,EAAAA;4BAAepB,IAAAA,EAAK;;;;;AAG5BhD,YAAAA,OAAAA,kBAAW4D,cAAA,CAACE,GAAAA,EAAAA;gBAAE1C,SAAAA,EAAU,2BAAA;AAA6BpB,gBAAAA,QAAAA,EAAAA;;YACrDC,YAAAA,CAAawC,MAAM,GAAG,CAAA,kBACnBmB,cAAA,CAACS,IAAAA,EAAAA;gBAAGjD,SAAAA,EAAU,gCAAA;AAAiC6C,gBAAAA,YAAAA,EAAYvE,QAAQ4E,kBAAkB;AAChFrE,gBAAAA,QAAAA,EAAAA,YAAAA,CAAasE,GAAG,CAACC,CAAAA,WAAAA,iBAAeZ,cAAA,CAACa,IAAAA,EAAAA;AAAsBD,wBAAAA,QAAAA,EAAAA;AAAdA,qBAAAA,EAAAA,WAAAA,CAAAA;;;;AAK9D;;;;;;"}
|
|
@@ -129,6 +129,16 @@ function FieldInput({ field, value, error, readOnly, locale, required, choose, s
|
|
|
129
129
|
onChange: (event)=>set(event.target.value === '' ? '' : Number(event.target.value))
|
|
130
130
|
});
|
|
131
131
|
break;
|
|
132
|
+
case formModel.FormFieldType.Password:
|
|
133
|
+
input = /*#__PURE__*/ jsxRuntime.jsx("input", {
|
|
134
|
+
...common,
|
|
135
|
+
type: "password",
|
|
136
|
+
autoComplete: "current-password",
|
|
137
|
+
value: text,
|
|
138
|
+
placeholder: field.placeholder,
|
|
139
|
+
onChange: (event)=>set(event.target.value)
|
|
140
|
+
});
|
|
141
|
+
break;
|
|
132
142
|
case formModel.FormFieldType.Date:
|
|
133
143
|
input = /*#__PURE__*/ jsxRuntime.jsx("input", {
|
|
134
144
|
...common,
|
|
@@ -218,9 +228,9 @@ function FieldInput({ field, value, error, readOnly, locale, required, choose, s
|
|
|
218
228
|
* unsaved-changes guard.
|
|
219
229
|
*
|
|
220
230
|
* `sections` (`title`, `columns`, `fields`) and `values` come from the screen; a field is `text`, `number`, `currency`, `date`, `select`, `multiSelect`, `lookup`,
|
|
221
|
-
* `toggle`, `file`, `richText` or `
|
|
231
|
+
* `toggle`, `file`, `richText`, `address` or `password`. Validation is inline on blur and a summary on submit (an alert listing each field as a link back to it); a server's
|
|
222
232
|
* `errors` map onto the fields, and one for a field the form lacks is shown as a general error so it is never lost. Required fields are marked with an asterisk
|
|
223
|
-
* *and* the word. `mode` is `create`, `edit`, `readOnly` or `settings` - settings has one Save for each section. The edited values are the `value` output; Save
|
|
233
|
+
* *and* the word. `saveAndNew` false leaves out "Save and new" (a dialog that creates one record). `mode` is `create`, `edit`, `readOnly` or `settings` - settings has one Save for each section. The edited values are the `value` output; Save
|
|
224
234
|
* runs the behaviors attached to the element. While values differ from the saved ones the form says so, warns the browser before the page is left, and offers
|
|
225
235
|
* "Discard changes". The action bar sticks to the bottom as the form scrolls.
|
|
226
236
|
*/ function FormScreenBody({ element, interactions, bindingOutputs }) {
|
|
@@ -421,7 +431,7 @@ function FieldInput({ field, value, error, readOnly, locale, required, choose, s
|
|
|
421
431
|
}),
|
|
422
432
|
children: strings.formCancel
|
|
423
433
|
}),
|
|
424
|
-
mode === formModel.FormMode.Create && /*#__PURE__*/ jsxRuntime.jsx(ActionButton.ActionButton, {
|
|
434
|
+
mode === formModel.FormMode.Create && element.properties.saveAndNew !== false && /*#__PURE__*/ jsxRuntime.jsx(ActionButton.ActionButton, {
|
|
425
435
|
rule: canSave,
|
|
426
436
|
emphasis: "secondary",
|
|
427
437
|
disabledReason: strings.disabledNoPermission,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormScreenBody.js","sources":["../../../foundation/FormScreenBody.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 { useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { RegisteredComponentProps, useValueOutput } from '@cratis/scene.react';\nimport { ActionButton } from './ActionButton';\nimport { ComponentState, readComponentState } from './ComponentState';\nimport { FormField, FormFieldType, FormMode, FormSection, FormValues, addressLines, mapServerErrors, readFormMode, readFormSections, sameValues, validate } from './formModel';\nimport { readLocale } from './formatting';\nimport { formatText, readFoundationStrings } from './foundationStrings';\nimport { readPermissionRule } from './PermissionRule';\nimport { FoundationIcon } from './FoundationIcon';\nimport { FoundationFrame } from './StateFrame';\n\ninterface FieldProps {\n field: FormField;\n value: unknown;\n error?: string;\n readOnly: boolean;\n locale: string;\n required: string;\n choose: string;\n set(value: unknown): void;\n blur(): void;\n}\n\nfunction FieldInput({ field, value, error, readOnly, locale, required, choose, set, blur }: FieldProps) {\n const id = useId();\n const describedBy = [field.help ? `${id}-help` : undefined, error ? `${id}-error` : undefined].filter(Boolean).join(' ') || undefined;\n const common = { id, 'aria-invalid': error ? true : undefined, 'aria-required': field.required || undefined, 'aria-describedby': describedBy, disabled: readOnly, onBlur: blur } as const;\n const text = typeof value === 'string' || typeof value === 'number' ? String(value) : '';\n let input;\n\n switch (field.type) {\n case FormFieldType.Toggle:\n input = <input {...common} type='checkbox' role='switch' checked={value === true} onChange={event => set(event.target.checked)} />;\n break;\n case FormFieldType.Select:\n case FormFieldType.Lookup:\n input = <select {...common} value={text} onChange={event => set(event.target.value)}><option value=''>{choose}</option>{field.options.map(option => <option key={option} value={option}>{option}</option>)}</select>;\n break;\n case FormFieldType.MultiSelect:\n input = (\n <fieldset className='foundation-fieldset' aria-describedby={describedBy} disabled={readOnly}>\n {field.options.map(option => (\n <label key={option} className='foundation-check'>\n <input type='checkbox' checked={Array.isArray(value) && value.includes(option)} onBlur={blur}\n onChange={event => set(event.target.checked ? [...(Array.isArray(value) ? value : []), option] : (Array.isArray(value) ? value : []).filter(candidate => candidate !== option))} />\n <span>{option}</span>\n </label>\n ))}\n </fieldset>\n );\n break;\n case FormFieldType.RichText:\n input = <textarea {...common} rows={5} value={text} placeholder={field.placeholder} onChange={event => set(event.target.value)} />;\n break;\n case FormFieldType.File:\n input = <input {...common} type='file' onChange={event => set(Array.from(event.target.files ?? []).map(file => file.name))} />;\n break;\n case FormFieldType.Address: {\n const lines = typeof value === 'object' && value !== null ? (value as Record<string, string>) : {};\n input = (\n <div className='foundation-address' role='group' aria-describedby={describedBy}>\n {addressLines.map(line => (\n <input key={line} type='text' aria-label={`${field.label}: ${line}`} placeholder={line} disabled={readOnly} value={lines[line] ?? ''} onBlur={blur} onChange={event => set({ ...lines, [line]: event.target.value })} />\n ))}\n </div>\n );\n break;\n }\n case FormFieldType.Number:\n case FormFieldType.Currency:\n input = <input {...common} type='number' inputMode='decimal' value={text} placeholder={field.placeholder} onChange={event => set(event.target.value === '' ? '' : Number(event.target.value))} />;\n break;\n case FormFieldType.Date:\n input = <input {...common} type='date' lang={locale} value={text} onChange={event => set(event.target.value)} />;\n break;\n default:\n input = <input {...common} type='text' value={text} placeholder={field.placeholder} onChange={event => set(event.target.value)} />;\n }\n\n const grouped = field.type === FormFieldType.MultiSelect || field.type === FormFieldType.Address;\n return (\n <div className='foundation-field' style={{ gridColumn: `span ${field.span}` }} data-invalid={error ? true : undefined}>\n {grouped ? <span className='foundation-field-label' id={`${id}-label`}>{field.label}{field.required && <span className='foundation-required' title={required}> *<span className='foundation-visually-hidden'> ({required})</span></span>}</span>\n : <label htmlFor={id} className='foundation-field-label'>{field.label}{field.required && <span className='foundation-required' title={required}> *<span className='foundation-visually-hidden'> ({required})</span></span>}</label>}\n {input}\n {field.help && <span id={`${id}-help`} className='foundation-count'>{field.help}</span>}\n {error && <span id={`${id}-error`} className='foundation-field-error' role='alert'>{error}</span>}\n </div>\n );\n}\n\n/**\n * The `formScreenBody` component: titled sections of fields in a one-to-three column grid, validated, with the Save / Save and new / Cancel bar and the\n * unsaved-changes guard.\n *\n * `sections` (`title`, `columns`, `fields`) and `values` come from the screen; a field is `text`, `number`, `currency`, `date`, `select`, `multiSelect`, `lookup`,\n * `toggle`, `file`, `richText` or `address`. Validation is inline on blur and a summary on submit (an alert listing each field as a link back to it); a server's\n * `errors` map onto the fields, and one for a field the form lacks is shown as a general error so it is never lost. Required fields are marked with an asterisk\n * *and* the word. `mode` is `create`, `edit`, `readOnly` or `settings` - settings has one Save for each section. The edited values are the `value` output; Save\n * runs the behaviors attached to the element. While values differ from the saved ones the form says so, warns the browser before the page is left, and offers\n * \"Discard changes\". The action bar sticks to the bottom as the form scrolls.\n */\nexport function FormScreenBody({ element, interactions, bindingOutputs }: RegisteredComponentProps) {\n const sections = useMemo(() => readFormSections(element.properties.sections), [element.properties.sections]);\n const mode = readFormMode(element.properties.mode);\n const suppliedValues = (typeof element.properties.values === 'object' && element.properties.values !== null && !Array.isArray(element.properties.values) ? element.properties.values : {}) as FormValues;\n const suppliedKey = JSON.stringify(suppliedValues);\n const [saved, setSaved] = useState<FormValues>(suppliedValues);\n const [values, setValues] = useState<FormValues>(suppliedValues);\n const [touched, setTouched] = useState<Set<string>>(new Set());\n const [submitted, setSubmitted] = useState(false);\n const [justSaved, setJustSaved] = useState(false);\n const summary = useRef<HTMLDivElement>(null);\n const strings = readFoundationStrings(element);\n const locale = readLocale(element);\n const state = readComponentState(element, sections.length > 0);\n const readOnly = mode === FormMode.ReadOnly || readPermissionRule(element, 'editPermission') !== 'enabled';\n const canSave = readPermissionRule(element, 'savePermission');\n const problems = validate(sections, values);\n const server = useMemo(() => mapServerErrors(sections, element.properties.errors), [sections, element.properties.errors]);\n const dirty = !sameValues(values, saved);\n const labelOf = (name: string) => sections.flatMap(section => section.fields).find(field => field.name === name)?.label ?? name;\n const wording = (name: string, kind: 'required' | 'invalid') => formatText(kind === 'required' ? strings.formRequiredField : strings.formInvalidField, { label: labelOf(name) });\n const errorOf = (name: string) => server.byField[name] ?? ((touched.has(name) || submitted) && problems[name] ? wording(name, problems[name]) : undefined);\n const invalid = Object.keys(problems);\n\n useEffect(() => { setSaved(suppliedValues); setValues(suppliedValues); setTouched(new Set()); setSubmitted(false); }, [suppliedKey]);\n useValueOutput(bindingOutputs, values);\n useEffect(() => {\n if (!dirty || typeof window === 'undefined') return;\n const guard = (event: BeforeUnloadEvent) => { event.preventDefault(); event.returnValue = ''; };\n window.addEventListener('beforeunload', guard);\n return () => window.removeEventListener('beforeunload', guard);\n }, [dirty]);\n\n const submit = (scope?: FormSection) => {\n setSubmitted(true);\n const scoped = scope ? scope.fields.filter(field => problems[field.name]) : invalid.map(name => ({ name }));\n if (scoped.length > 0) { requestAnimationFrame(() => summary.current?.focus()); return; }\n setSaved(values);\n setJustSaved(true);\n interactions?.onClick?.({ stopPropagation: () => undefined });\n };\n const edit = (name: string, value: unknown) => { setValues(current => ({ ...current, [name]: value })); setJustSaved(false); interactions?.onChange?.(); };\n\n return (\n <FoundationFrame element={element} interactions={interactions} name='form-screen' state={state} skeleton={[40, 100, 100, 70]}>\n {state !== ComponentState.Loading && (\n <form noValidate onSubmit={event => { event.preventDefault(); if (mode !== FormMode.Settings) submit(); }}>\n {readOnly && mode === FormMode.ReadOnly && <p className='foundation-count' role='status'>{strings.formReadOnly}</p>}\n {(submitted && invalid.length > 0 || server.general.length > 0) && (\n <div ref={summary} tabIndex={-1} role='alert' className='foundation-message' data-tone='danger'>\n <FoundationIcon name='alert' />\n <div className='foundation-message-text'>\n <strong>{invalid.length === 1 ? strings.formSummaryOne : formatText(strings.formSummary, { count: invalid.length })}</strong>\n <ul>\n {invalid.map(name => <li key={name}>{wording(name, problems[name])}</li>)}\n {server.general.map(message => <li key={message}>{message}</li>)}\n </ul>\n </div>\n </div>\n )}\n {sections.map(section => (\n <fieldset key={section.id} className='foundation-form-section' disabled={false}>\n {section.title && <legend>{section.title}</legend>}\n <div className='foundation-form-grid' style={{ gridTemplateColumns: `repeat(${section.columns}, minmax(0, 1fr))` }} data-columns={section.columns}>\n {section.fields.map(field => (\n <FieldInput key={field.name} field={field} value={values[field.name]} error={errorOf(field.name)} readOnly={readOnly} locale={locale} required={strings.formRequired} choose={strings.formChoose}\n set={value => edit(field.name, value)} blur={() => setTouched(current => new Set(current).add(field.name))} />\n ))}\n </div>\n {mode === FormMode.Settings && !readOnly && (\n <div className='foundation-form-section-actions'>\n <ActionButton rule={canSave} emphasis='secondary' disabledReason={strings.disabledNoPermission} onClick={() => submit(section)}>{formatText(strings.formSectionSave, { section: section.title })}</ActionButton>\n </div>\n )}\n </fieldset>\n ))}\n {mode !== FormMode.Settings && mode !== FormMode.ReadOnly && (\n <div className='foundation-form-actions' role='group' aria-label={strings.listActions}>\n <span role='status' className='foundation-count'>{dirty ? strings.formUnsaved : justSaved ? strings.formSaved : ''}</span>\n <span className='foundation-wizard-spacer' />\n {dirty && <ActionButton emphasis='quiet' disabledReason={strings.disabledNoPermission} onClick={() => { setValues(saved); setTouched(new Set()); setSubmitted(false); }}>{strings.formDiscard}</ActionButton>}\n <ActionButton emphasis='secondary' disabledReason={strings.disabledNoPermission} onClick={() => interactions?.onClick?.({ stopPropagation: () => undefined })}>{strings.formCancel}</ActionButton>\n {mode === FormMode.Create && <ActionButton rule={canSave} emphasis='secondary' disabledReason={strings.disabledNoPermission} onClick={() => { submit(); }}>{strings.formSaveAndNew}</ActionButton>}\n <ActionButton rule={canSave} disabledReason={strings.disabledNoPermission} onClick={() => submit()}>{strings.formSave}</ActionButton>\n </div>\n )}\n </form>\n )}\n </FoundationFrame>\n );\n}\n"],"names":["FieldInput","field","value","error","readOnly","locale","required","choose","set","blur","id","useId","describedBy","help","undefined","filter","Boolean","join","common","disabled","onBlur","text","String","input","type","FormFieldType","Toggle","_jsx","role","checked","onChange","event","target","Select","Lookup","_jsxs","select","option","options","map","MultiSelect","fieldset","className","aria-describedby","label","Array","isArray","includes","candidate","span","RichText","textarea","rows","placeholder","File","from","files","file","name","Address","lines","div","addressLines","line","aria-label","Number","Currency","inputMode","Date","lang","grouped","style","gridColumn","data-invalid","title","htmlFor","FormScreenBody","element","interactions","bindingOutputs","sections","useMemo","readFormSections","properties","mode","readFormMode","suppliedValues","values","suppliedKey","JSON","stringify","saved","setSaved","useState","setValues","touched","setTouched","Set","submitted","setSubmitted","justSaved","setJustSaved","summary","useRef","strings","readFoundationStrings","readLocale","state","readComponentState","length","FormMode","ReadOnly","readPermissionRule","canSave","problems","validate","server","mapServerErrors","errors","dirty","sameValues","labelOf","flatMap","section","fields","find","wording","kind","formatText","formRequiredField","formInvalidField","errorOf","byField","has","invalid","Object","keys","useEffect","useValueOutput","window","guard","preventDefault","returnValue","addEventListener","removeEventListener","submit","scope","scoped","requestAnimationFrame","current","focus","onClick","stopPropagation","edit","FoundationFrame","skeleton","ComponentState","Loading","form","noValidate","onSubmit","Settings","p","formReadOnly","general","ref","tabIndex","data-tone","FoundationIcon","strong","formSummaryOne","formSummary","count","ul","li","message","legend","gridTemplateColumns","columns","data-columns","formRequired","formChoose","add","ActionButton","rule","emphasis","disabledReason","disabledNoPermission","formSectionSave","listActions","formUnsaved","formSaved","formDiscard","formCancel","Create","formSaveAndNew","formSave"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FormScreenBody.js","sources":["../../../foundation/FormScreenBody.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 { useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { RegisteredComponentProps, useValueOutput } from '@cratis/scene.react';\nimport { ActionButton } from './ActionButton';\nimport { ComponentState, readComponentState } from './ComponentState';\nimport { FormField, FormFieldType, FormMode, FormSection, FormValues, addressLines, mapServerErrors, readFormMode, readFormSections, sameValues, validate } from './formModel';\nimport { readLocale } from './formatting';\nimport { formatText, readFoundationStrings } from './foundationStrings';\nimport { readPermissionRule } from './PermissionRule';\nimport { FoundationIcon } from './FoundationIcon';\nimport { FoundationFrame } from './StateFrame';\n\ninterface FieldProps {\n field: FormField;\n value: unknown;\n error?: string;\n readOnly: boolean;\n locale: string;\n required: string;\n choose: string;\n set(value: unknown): void;\n blur(): void;\n}\n\nfunction FieldInput({ field, value, error, readOnly, locale, required, choose, set, blur }: FieldProps) {\n const id = useId();\n const describedBy = [field.help ? `${id}-help` : undefined, error ? `${id}-error` : undefined].filter(Boolean).join(' ') || undefined;\n const common = { id, 'aria-invalid': error ? true : undefined, 'aria-required': field.required || undefined, 'aria-describedby': describedBy, disabled: readOnly, onBlur: blur } as const;\n const text = typeof value === 'string' || typeof value === 'number' ? String(value) : '';\n let input;\n\n switch (field.type) {\n case FormFieldType.Toggle:\n input = <input {...common} type='checkbox' role='switch' checked={value === true} onChange={event => set(event.target.checked)} />;\n break;\n case FormFieldType.Select:\n case FormFieldType.Lookup:\n input = <select {...common} value={text} onChange={event => set(event.target.value)}><option value=''>{choose}</option>{field.options.map(option => <option key={option} value={option}>{option}</option>)}</select>;\n break;\n case FormFieldType.MultiSelect:\n input = (\n <fieldset className='foundation-fieldset' aria-describedby={describedBy} disabled={readOnly}>\n {field.options.map(option => (\n <label key={option} className='foundation-check'>\n <input type='checkbox' checked={Array.isArray(value) && value.includes(option)} onBlur={blur}\n onChange={event => set(event.target.checked ? [...(Array.isArray(value) ? value : []), option] : (Array.isArray(value) ? value : []).filter(candidate => candidate !== option))} />\n <span>{option}</span>\n </label>\n ))}\n </fieldset>\n );\n break;\n case FormFieldType.RichText:\n input = <textarea {...common} rows={5} value={text} placeholder={field.placeholder} onChange={event => set(event.target.value)} />;\n break;\n case FormFieldType.File:\n input = <input {...common} type='file' onChange={event => set(Array.from(event.target.files ?? []).map(file => file.name))} />;\n break;\n case FormFieldType.Address: {\n const lines = typeof value === 'object' && value !== null ? (value as Record<string, string>) : {};\n input = (\n <div className='foundation-address' role='group' aria-describedby={describedBy}>\n {addressLines.map(line => (\n <input key={line} type='text' aria-label={`${field.label}: ${line}`} placeholder={line} disabled={readOnly} value={lines[line] ?? ''} onBlur={blur} onChange={event => set({ ...lines, [line]: event.target.value })} />\n ))}\n </div>\n );\n break;\n }\n case FormFieldType.Number:\n case FormFieldType.Currency:\n input = <input {...common} type='number' inputMode='decimal' value={text} placeholder={field.placeholder} onChange={event => set(event.target.value === '' ? '' : Number(event.target.value))} />;\n break;\n case FormFieldType.Password:\n input = <input {...common} type='password' autoComplete='current-password' value={text} placeholder={field.placeholder} onChange={event => set(event.target.value)} />;\n break;\n case FormFieldType.Date:\n input = <input {...common} type='date' lang={locale} value={text} onChange={event => set(event.target.value)} />;\n break;\n default:\n input = <input {...common} type='text' value={text} placeholder={field.placeholder} onChange={event => set(event.target.value)} />;\n }\n\n const grouped = field.type === FormFieldType.MultiSelect || field.type === FormFieldType.Address;\n return (\n <div className='foundation-field' style={{ gridColumn: `span ${field.span}` }} data-invalid={error ? true : undefined}>\n {grouped ? <span className='foundation-field-label' id={`${id}-label`}>{field.label}{field.required && <span className='foundation-required' title={required}> *<span className='foundation-visually-hidden'> ({required})</span></span>}</span>\n : <label htmlFor={id} className='foundation-field-label'>{field.label}{field.required && <span className='foundation-required' title={required}> *<span className='foundation-visually-hidden'> ({required})</span></span>}</label>}\n {input}\n {field.help && <span id={`${id}-help`} className='foundation-count'>{field.help}</span>}\n {error && <span id={`${id}-error`} className='foundation-field-error' role='alert'>{error}</span>}\n </div>\n );\n}\n\n/**\n * The `formScreenBody` component: titled sections of fields in a one-to-three column grid, validated, with the Save / Save and new / Cancel bar and the\n * unsaved-changes guard.\n *\n * `sections` (`title`, `columns`, `fields`) and `values` come from the screen; a field is `text`, `number`, `currency`, `date`, `select`, `multiSelect`, `lookup`,\n * `toggle`, `file`, `richText`, `address` or `password`. Validation is inline on blur and a summary on submit (an alert listing each field as a link back to it); a server's\n * `errors` map onto the fields, and one for a field the form lacks is shown as a general error so it is never lost. Required fields are marked with an asterisk\n * *and* the word. `saveAndNew` false leaves out \"Save and new\" (a dialog that creates one record). `mode` is `create`, `edit`, `readOnly` or `settings` - settings has one Save for each section. The edited values are the `value` output; Save\n * runs the behaviors attached to the element. While values differ from the saved ones the form says so, warns the browser before the page is left, and offers\n * \"Discard changes\". The action bar sticks to the bottom as the form scrolls.\n */\nexport function FormScreenBody({ element, interactions, bindingOutputs }: RegisteredComponentProps) {\n const sections = useMemo(() => readFormSections(element.properties.sections), [element.properties.sections]);\n const mode = readFormMode(element.properties.mode);\n const suppliedValues = (typeof element.properties.values === 'object' && element.properties.values !== null && !Array.isArray(element.properties.values) ? element.properties.values : {}) as FormValues;\n const suppliedKey = JSON.stringify(suppliedValues);\n const [saved, setSaved] = useState<FormValues>(suppliedValues);\n const [values, setValues] = useState<FormValues>(suppliedValues);\n const [touched, setTouched] = useState<Set<string>>(new Set());\n const [submitted, setSubmitted] = useState(false);\n const [justSaved, setJustSaved] = useState(false);\n const summary = useRef<HTMLDivElement>(null);\n const strings = readFoundationStrings(element);\n const locale = readLocale(element);\n const state = readComponentState(element, sections.length > 0);\n const readOnly = mode === FormMode.ReadOnly || readPermissionRule(element, 'editPermission') !== 'enabled';\n const canSave = readPermissionRule(element, 'savePermission');\n const problems = validate(sections, values);\n const server = useMemo(() => mapServerErrors(sections, element.properties.errors), [sections, element.properties.errors]);\n const dirty = !sameValues(values, saved);\n const labelOf = (name: string) => sections.flatMap(section => section.fields).find(field => field.name === name)?.label ?? name;\n const wording = (name: string, kind: 'required' | 'invalid') => formatText(kind === 'required' ? strings.formRequiredField : strings.formInvalidField, { label: labelOf(name) });\n const errorOf = (name: string) => server.byField[name] ?? ((touched.has(name) || submitted) && problems[name] ? wording(name, problems[name]) : undefined);\n const invalid = Object.keys(problems);\n\n useEffect(() => { setSaved(suppliedValues); setValues(suppliedValues); setTouched(new Set()); setSubmitted(false); }, [suppliedKey]);\n useValueOutput(bindingOutputs, values);\n useEffect(() => {\n if (!dirty || typeof window === 'undefined') return;\n const guard = (event: BeforeUnloadEvent) => { event.preventDefault(); event.returnValue = ''; };\n window.addEventListener('beforeunload', guard);\n return () => window.removeEventListener('beforeunload', guard);\n }, [dirty]);\n\n const submit = (scope?: FormSection) => {\n setSubmitted(true);\n const scoped = scope ? scope.fields.filter(field => problems[field.name]) : invalid.map(name => ({ name }));\n if (scoped.length > 0) { requestAnimationFrame(() => summary.current?.focus()); return; }\n setSaved(values);\n setJustSaved(true);\n interactions?.onClick?.({ stopPropagation: () => undefined });\n };\n const edit = (name: string, value: unknown) => { setValues(current => ({ ...current, [name]: value })); setJustSaved(false); interactions?.onChange?.(); };\n\n return (\n <FoundationFrame element={element} interactions={interactions} name='form-screen' state={state} skeleton={[40, 100, 100, 70]}>\n {state !== ComponentState.Loading && (\n <form noValidate onSubmit={event => { event.preventDefault(); if (mode !== FormMode.Settings) submit(); }}>\n {readOnly && mode === FormMode.ReadOnly && <p className='foundation-count' role='status'>{strings.formReadOnly}</p>}\n {(submitted && invalid.length > 0 || server.general.length > 0) && (\n <div ref={summary} tabIndex={-1} role='alert' className='foundation-message' data-tone='danger'>\n <FoundationIcon name='alert' />\n <div className='foundation-message-text'>\n <strong>{invalid.length === 1 ? strings.formSummaryOne : formatText(strings.formSummary, { count: invalid.length })}</strong>\n <ul>\n {invalid.map(name => <li key={name}>{wording(name, problems[name])}</li>)}\n {server.general.map(message => <li key={message}>{message}</li>)}\n </ul>\n </div>\n </div>\n )}\n {sections.map(section => (\n <fieldset key={section.id} className='foundation-form-section' disabled={false}>\n {section.title && <legend>{section.title}</legend>}\n <div className='foundation-form-grid' style={{ gridTemplateColumns: `repeat(${section.columns}, minmax(0, 1fr))` }} data-columns={section.columns}>\n {section.fields.map(field => (\n <FieldInput key={field.name} field={field} value={values[field.name]} error={errorOf(field.name)} readOnly={readOnly} locale={locale} required={strings.formRequired} choose={strings.formChoose}\n set={value => edit(field.name, value)} blur={() => setTouched(current => new Set(current).add(field.name))} />\n ))}\n </div>\n {mode === FormMode.Settings && !readOnly && (\n <div className='foundation-form-section-actions'>\n <ActionButton rule={canSave} emphasis='secondary' disabledReason={strings.disabledNoPermission} onClick={() => submit(section)}>{formatText(strings.formSectionSave, { section: section.title })}</ActionButton>\n </div>\n )}\n </fieldset>\n ))}\n {mode !== FormMode.Settings && mode !== FormMode.ReadOnly && (\n <div className='foundation-form-actions' role='group' aria-label={strings.listActions}>\n <span role='status' className='foundation-count'>{dirty ? strings.formUnsaved : justSaved ? strings.formSaved : ''}</span>\n <span className='foundation-wizard-spacer' />\n {dirty && <ActionButton emphasis='quiet' disabledReason={strings.disabledNoPermission} onClick={() => { setValues(saved); setTouched(new Set()); setSubmitted(false); }}>{strings.formDiscard}</ActionButton>}\n <ActionButton emphasis='secondary' disabledReason={strings.disabledNoPermission} onClick={() => interactions?.onClick?.({ stopPropagation: () => undefined })}>{strings.formCancel}</ActionButton>\n {mode === FormMode.Create && element.properties.saveAndNew !== false && <ActionButton rule={canSave} emphasis='secondary' disabledReason={strings.disabledNoPermission} onClick={() => { submit(); }}>{strings.formSaveAndNew}</ActionButton>}\n <ActionButton rule={canSave} disabledReason={strings.disabledNoPermission} onClick={() => submit()}>{strings.formSave}</ActionButton>\n </div>\n )}\n </form>\n )}\n </FoundationFrame>\n );\n}\n"],"names":["FieldInput","field","value","error","readOnly","locale","required","choose","set","blur","id","useId","describedBy","help","undefined","filter","Boolean","join","common","disabled","onBlur","text","String","input","type","FormFieldType","Toggle","_jsx","role","checked","onChange","event","target","Select","Lookup","_jsxs","select","option","options","map","MultiSelect","fieldset","className","aria-describedby","label","Array","isArray","includes","candidate","span","RichText","textarea","rows","placeholder","File","from","files","file","name","Address","lines","div","addressLines","line","aria-label","Number","Currency","inputMode","Password","autoComplete","Date","lang","grouped","style","gridColumn","data-invalid","title","htmlFor","FormScreenBody","element","interactions","bindingOutputs","sections","useMemo","readFormSections","properties","mode","readFormMode","suppliedValues","values","suppliedKey","JSON","stringify","saved","setSaved","useState","setValues","touched","setTouched","Set","submitted","setSubmitted","justSaved","setJustSaved","summary","useRef","strings","readFoundationStrings","readLocale","state","readComponentState","length","FormMode","ReadOnly","readPermissionRule","canSave","problems","validate","server","mapServerErrors","errors","dirty","sameValues","labelOf","flatMap","section","fields","find","wording","kind","formatText","formRequiredField","formInvalidField","errorOf","byField","has","invalid","Object","keys","useEffect","useValueOutput","window","guard","preventDefault","returnValue","addEventListener","removeEventListener","submit","scope","scoped","requestAnimationFrame","current","focus","onClick","stopPropagation","edit","FoundationFrame","skeleton","ComponentState","Loading","form","noValidate","onSubmit","Settings","p","formReadOnly","general","ref","tabIndex","data-tone","FoundationIcon","strong","formSummaryOne","formSummary","count","ul","li","message","legend","gridTemplateColumns","columns","data-columns","formRequired","formChoose","add","ActionButton","rule","emphasis","disabledReason","disabledNoPermission","formSectionSave","listActions","formUnsaved","formSaved","formDiscard","formCancel","Create","saveAndNew","formSaveAndNew","formSave"],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var elementProperties = require('../shell/elementProperties.js');
|
|
5
|
+
var FoundationIcon = require('./FoundationIcon.js');
|
|
6
|
+
var formatting = require('./formatting.js');
|
|
7
|
+
var StatusChip = require('./StatusChip.js');
|
|
8
|
+
|
|
9
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
10
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
11
|
+
/**
|
|
12
|
+
* The `notice` component: one message about the region it sits in - a sign-in error, a warning above a form, a note under a field.
|
|
13
|
+
*
|
|
14
|
+
* It is a live region: a danger or warning notice is an `alert` and any other a `status`, and the region is on the page even while empty, so the
|
|
15
|
+
* message is announced when it arrives rather than only when the page loads. With no `text` nothing is drawn but the empty region, which is what a
|
|
16
|
+
* sign-in screen's error area is until a sign-in fails. `tone` picks the icon and the status colors; the message is always words, never color alone.
|
|
17
|
+
*/ function Notice({ element }) {
|
|
18
|
+
const tone = StatusChip.readStatusTone(element.properties.tone ?? StatusChip.StatusTone.Danger);
|
|
19
|
+
const text = elementProperties.readOptionalString(element, 'text') ?? '';
|
|
20
|
+
const title = elementProperties.readOptionalString(element, 'title');
|
|
21
|
+
const urgent = tone === StatusChip.StatusTone.Danger || tone === StatusChip.StatusTone.Warning;
|
|
22
|
+
return /*#__PURE__*/ jsxRuntime.jsx("div", {
|
|
23
|
+
className: "foundation foundation-notice",
|
|
24
|
+
"data-scene-id": element.id,
|
|
25
|
+
"data-tone": tone,
|
|
26
|
+
"data-empty": text === '' || undefined,
|
|
27
|
+
role: urgent ? 'alert' : 'status',
|
|
28
|
+
lang: formatting.readLocale(element),
|
|
29
|
+
children: text !== '' && /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
|
|
30
|
+
children: [
|
|
31
|
+
/*#__PURE__*/ jsxRuntime.jsx(FoundationIcon.FoundationIcon, {
|
|
32
|
+
name: StatusChip.statusToneIcons[tone]
|
|
33
|
+
}),
|
|
34
|
+
/*#__PURE__*/ jsxRuntime.jsxs("p", {
|
|
35
|
+
children: [
|
|
36
|
+
title && /*#__PURE__*/ jsxRuntime.jsxs("strong", {
|
|
37
|
+
children: [
|
|
38
|
+
title,
|
|
39
|
+
" "
|
|
40
|
+
]
|
|
41
|
+
}),
|
|
42
|
+
text
|
|
43
|
+
]
|
|
44
|
+
})
|
|
45
|
+
]
|
|
46
|
+
})
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
exports.Notice = Notice;
|
|
51
|
+
//# sourceMappingURL=Notice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Notice.js","sources":["../../../foundation/Notice.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 { RegisteredComponentProps } from '@cratis/scene.react';\nimport { readOptionalString } from '../shell/elementProperties';\nimport { FoundationIcon } from './FoundationIcon';\nimport { readLocale } from './formatting';\nimport { StatusTone, readStatusTone, statusToneIcons } from './StatusChip';\n\n/**\n * The `notice` component: one message about the region it sits in - a sign-in error, a warning above a form, a note under a field.\n *\n * It is a live region: a danger or warning notice is an `alert` and any other a `status`, and the region is on the page even while empty, so the\n * message is announced when it arrives rather than only when the page loads. With no `text` nothing is drawn but the empty region, which is what a\n * sign-in screen's error area is until a sign-in fails. `tone` picks the icon and the status colors; the message is always words, never color alone.\n */\nexport function Notice({ element }: RegisteredComponentProps) {\n const tone = readStatusTone(element.properties.tone ?? StatusTone.Danger);\n const text = readOptionalString(element, 'text') ?? '';\n const title = readOptionalString(element, 'title');\n const urgent = tone === StatusTone.Danger || tone === StatusTone.Warning;\n\n return (\n <div className='foundation foundation-notice' data-scene-id={element.id} data-tone={tone} data-empty={text === '' || undefined} role={urgent ? 'alert' : 'status'} lang={readLocale(element)}>\n {text !== '' && (\n <>\n <FoundationIcon name={statusToneIcons[tone]} />\n <p>{title && <strong>{title} </strong>}{text}</p>\n </>\n )}\n </div>\n );\n}\n"],"names":["Notice","element","tone","readStatusTone","properties","StatusTone","Danger","text","readOptionalString","title","urgent","Warning","_jsx","div","className","data-scene-id","id","data-tone","data-empty","undefined","role","lang","readLocale","_jsxs","_Fragment","FoundationIcon","name","statusToneIcons","p","strong"],"mappings":";;;;;;;;AAAA;AACA;AAQA;;;;;;AAMC,IACM,SAASA,MAAAA,CAAO,EAAEC,OAAO,EAA4B,EAAA;IACxD,MAAMC,IAAAA,GAAOC,0BAAeF,OAAAA,CAAQG,UAAU,CAACF,IAAI,IAAIG,sBAAWC,MAAM,CAAA;IACxE,MAAMC,IAAAA,GAAOC,oCAAAA,CAAmBP,OAAAA,EAAS,MAAA,CAAA,IAAW,EAAA;IACpD,MAAMQ,KAAAA,GAAQD,qCAAmBP,OAAAA,EAAS,OAAA,CAAA;AAC1C,IAAA,MAAMS,SAASR,IAAAA,KAASG,qBAAAA,CAAWC,MAAM,IAAIJ,IAAAA,KAASG,sBAAWM,OAAO;AAExE,IAAA,qBACIC,cAAA,CAACC,KAAAA,EAAAA;QAAIC,SAAAA,EAAU,8BAAA;AAA+BC,QAAAA,eAAAA,EAAed,QAAQe,EAAE;QAAEC,WAAAA,EAAWf,IAAAA;AAAMgB,QAAAA,YAAAA,EAAYX,SAAS,EAAA,IAAMY,SAAAA;AAAWC,QAAAA,IAAAA,EAAMV,SAAS,OAAA,GAAU,QAAA;AAAUW,QAAAA,IAAAA,EAAMC,qBAAAA,CAAWrB,OAAAA,CAAAA;AAC/KM,QAAAA,QAAAA,EAAAA,IAAAA,KAAS,EAAA,kBACNgB,eAAA,CAAAC,mBAAA,EAAA;;8BACIZ,cAAA,CAACa,6BAAAA,EAAAA;oBAAeC,IAAAA,EAAMC,0BAAe,CAACzB,IAAAA;;8BACtCqB,eAAA,CAACK,GAAAA,EAAAA;;AAAGnB,wBAAAA,KAAAA,kBAASc,eAAA,CAACM,QAAAA,EAAAA;;AAAQpB,gCAAAA,KAAAA;AAAM,gCAAA;;;AAAYF,wBAAAA;;;;;;AAK5D;;"}
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
FormFieldType["File"] = "file";
|
|
15
15
|
FormFieldType["RichText"] = "richText";
|
|
16
16
|
FormFieldType["Address"] = "address";
|
|
17
|
+
FormFieldType["Password"] = "password";
|
|
17
18
|
return FormFieldType;
|
|
18
19
|
}({});
|
|
19
20
|
/** The ways the one form can be used (Part B 2.8). */ var FormMode = /*#__PURE__*/ function(FormMode) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formModel.js","sources":["../../../foundation/formModel.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/** The field types a form offers (Part B 2.8). */\nexport enum FormFieldType {\n Text = 'text',\n Number = 'number',\n Currency = 'currency',\n Date = 'date',\n Select = 'select',\n MultiSelect = 'multiSelect',\n Lookup = 'lookup',\n Toggle = 'toggle',\n File = 'file',\n RichText = 'richText',\n Address = 'address',\n}\n\n/** One field of a form section. */\nexport interface FormField {\n name: string;\n label: string;\n type: FormFieldType;\n required: boolean;\n options: string[];\n /** The columns of the section grid the field spans (1 to 3). */\n span: number;\n placeholder?: string;\n help?: string;\n}\n\n/** A titled group of fields in a grid of one to three columns. */\nexport interface FormSection {\n id: string;\n title: string;\n columns: number;\n fields: FormField[];\n}\n\n/** The values of a form by field name; a multi-select is an array, a toggle a boolean, an address an object of lines. */\nexport type FormValues = Record<string, unknown>;\n\n/** The ways the one form can be used (Part B 2.8). */\nexport enum FormMode {\n Create = 'create',\n Edit = 'edit',\n ReadOnly = 'readOnly',\n Settings = 'settings',\n}\n\n/** The lines of an address, in the order they are asked. */\nexport const addressLines = ['street', 'postalCode', 'city', 'country'] as const;\n\nconst records = (value: unknown): Record<string, unknown>[] =>\n Array.isArray(value) ? value.filter((entry): entry is Record<string, unknown> => typeof entry === 'object' && entry !== null && !Array.isArray(entry)) : [];\n\n/** Reads the mode, defaulting to create. */\nexport const readFormMode = (value: unknown): FormMode => ((Object.values(FormMode) as string[]).includes(value as string) ? (value as FormMode) : FormMode.Create);\n\n/** Reads sections, with their fields, dropping fields without a name and repeated names; a section grid is clamped to one to three columns. */\nexport function readFormSections(value: unknown): FormSection[] {\n const names = new Set<string>();\n return records(value).flatMap((section, index) => {\n const columns = typeof section.columns === 'number' ? Math.min(3, Math.max(1, Math.floor(section.columns))) : 1;\n const fields = records(section.fields).flatMap((entry): FormField[] => {\n if (typeof entry.name !== 'string' || entry.name.length === 0 || names.has(entry.name)) return [];\n names.add(entry.name);\n return [{\n name: entry.name,\n label: typeof entry.label === 'string' && entry.label.length > 0 ? entry.label : entry.name,\n type: (Object.values(FormFieldType) as string[]).includes(entry.type as string) ? (entry.type as FormFieldType) : FormFieldType.Text,\n required: entry.required === true,\n options: Array.isArray(entry.options) ? entry.options.filter((option): option is string => typeof option === 'string') : [],\n span: typeof entry.span === 'number' ? Math.min(columns, Math.max(1, Math.floor(entry.span))) : 1,\n ...(typeof entry.placeholder === 'string' ? { placeholder: entry.placeholder } : {}),\n ...(typeof entry.help === 'string' ? { help: entry.help } : {}),\n }];\n });\n return [{ id: typeof section.id === 'string' && section.id.length > 0 ? section.id : `section-${index}`, title: typeof section.title === 'string' ? section.title : '', columns, fields }];\n });\n}\n\n/** Whether a field holds a value: an empty or blank text, an empty list, a toggle left false (a required toggle must be on) or an address with no street and city are empty. */\nexport function isFilled(field: FormField, value: unknown): boolean {\n switch (field.type) {\n case FormFieldType.Toggle: return value === true;\n case FormFieldType.MultiSelect: return Array.isArray(value) && value.length > 0;\n case FormFieldType.File: return Array.isArray(value) ? value.length > 0 : typeof value === 'string' && value.trim().length > 0;\n case FormFieldType.Address: return typeof value === 'object' && value !== null && ['street', 'city'].every(line => typeof (value as Record<string, unknown>)[line] === 'string' && ((value as Record<string, unknown>)[line] as string).trim().length > 0);\n case FormFieldType.Number: case FormFieldType.Currency: return typeof value === 'number' ? Number.isFinite(value) : typeof value === 'string' && value.trim().length > 0 && Number.isFinite(Number(value));\n default: return typeof value === 'string' ? value.trim().length > 0 : value !== undefined && value !== null && value !== '';\n }\n}\n\n/** Why a field is invalid, as a kind the component words in the locale: `required`, `invalid`, or undefined when it is fine. An empty optional field is fine. */\nexport function problemOf(field: FormField, value: unknown): 'required' | 'invalid' | undefined {\n if (!isFilled(field, value)) {\n const empty = value === undefined || value === null || value === '' || (typeof value === 'string' && value.trim() === '') || (Array.isArray(value) && value.length === 0) || value === false;\n return field.required ? 'required' : empty ? undefined : 'invalid';\n }\n\n if (field.type === FormFieldType.Date && typeof value === 'string' && Number.isNaN(new Date(value).getTime())) return 'invalid';\n if ((field.type === FormFieldType.Select || field.type === FormFieldType.Lookup) && field.options.length > 0 && typeof value === 'string' && !field.options.includes(value)) return 'invalid';\n return undefined;\n}\n\n/** The problems of every field, by field name, for the fields in the given sections. */\nexport function validate(sections: FormSection[], values: FormValues): Record<string, 'required' | 'invalid'> {\n const problems: Record<string, 'required' | 'invalid'> = {};\n for (const field of sections.flatMap(section => section.fields)) {\n const problem = problemOf(field, values[field.name]);\n if (problem) problems[field.name] = problem;\n }\n\n return problems;\n}\n\n/** Whether two sets of values are the same, field by field and in depth, so the unsaved-changes guard compares what the person sees. */\nexport function sameValues(left: FormValues, right: FormValues): boolean {\n const keys = new Set([...Object.keys(left), ...Object.keys(right)]);\n return [...keys].every(key => JSON.stringify(normalizeValue(left[key])) === JSON.stringify(normalizeValue(right[key])));\n}\n\nfunction normalizeValue(value: unknown): unknown {\n if (value === undefined || value === null || value === '' || value === false) return null;\n if (Array.isArray(value)) return value.length === 0 ? null : value;\n if (typeof value === 'object') { const entries = Object.entries(value as Record<string, unknown>).filter(([, line]) => line !== '' && line !== undefined).sort(([a], [b]) => a.localeCompare(b)); return entries.length === 0 ? null : entries; }\n return value;\n}\n\n/** Maps a server's field errors (`{ field: message }` or `[{ field, message }]`) onto the fields of the form; an error for a field the form does not have is returned as a general one so it is never lost. */\nexport function mapServerErrors(sections: FormSection[], errors: unknown): { byField: Record<string, string>; general: string[] } {\n const known = new Set(sections.flatMap(section => section.fields.map(field => field.name)));\n const pairs: [string, string][] = Array.isArray(errors)\n ? records(errors).flatMap(entry => (typeof entry.message === 'string' ? [[typeof entry.field === 'string' ? entry.field : '', entry.message] as [string, string]] : []))\n : typeof errors === 'object' && errors !== null ? Object.entries(errors as Record<string, unknown>).flatMap(([field, message]) => (typeof message === 'string' ? [[field, message] as [string, string]] : [])) : [];\n\n const byField: Record<string, string> = {};\n const general: string[] = [];\n for (const [field, message] of pairs) {\n if (known.has(field) && byField[field] === undefined) byField[field] = message;\n else general.push(field && !known.has(field) ? `${field}: ${message}` : message);\n }\n\n return { byField, general };\n}\n"],"names":["FormFieldType","FormMode","addressLines","records","value","Array","isArray","filter","entry","readFormMode","Object","values","includes","readFormSections","names","Set","flatMap","section","index","columns","Math","min","max","floor","fields","name","length","has","add","label","type","required","options","option","span","placeholder","help","id","title","isFilled","field","trim","every","line","Number","isFinite","undefined","problemOf","empty","isNaN","Date","getTime","validate","sections","problems","problem","sameValues","left","right","keys","key","JSON","stringify","normalizeValue","entries","sort","a","b","localeCompare","mapServerErrors","errors","known","map","pairs","message","byField","general","push"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"formModel.js","sources":["../../../foundation/formModel.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/** The field types a form offers (Part B 2.8). */\nexport enum FormFieldType {\n Text = 'text',\n Number = 'number',\n Currency = 'currency',\n Date = 'date',\n Select = 'select',\n MultiSelect = 'multiSelect',\n Lookup = 'lookup',\n Toggle = 'toggle',\n File = 'file',\n RichText = 'richText',\n Address = 'address',\n Password = 'password',\n}\n\n/** One field of a form section. */\nexport interface FormField {\n name: string;\n label: string;\n type: FormFieldType;\n required: boolean;\n options: string[];\n /** The columns of the section grid the field spans (1 to 3). */\n span: number;\n placeholder?: string;\n help?: string;\n}\n\n/** A titled group of fields in a grid of one to three columns. */\nexport interface FormSection {\n id: string;\n title: string;\n columns: number;\n fields: FormField[];\n}\n\n/** The values of a form by field name; a multi-select is an array, a toggle a boolean, an address an object of lines. */\nexport type FormValues = Record<string, unknown>;\n\n/** The ways the one form can be used (Part B 2.8). */\nexport enum FormMode {\n Create = 'create',\n Edit = 'edit',\n ReadOnly = 'readOnly',\n Settings = 'settings',\n}\n\n/** The lines of an address, in the order they are asked. */\nexport const addressLines = ['street', 'postalCode', 'city', 'country'] as const;\n\nconst records = (value: unknown): Record<string, unknown>[] =>\n Array.isArray(value) ? value.filter((entry): entry is Record<string, unknown> => typeof entry === 'object' && entry !== null && !Array.isArray(entry)) : [];\n\n/** Reads the mode, defaulting to create. */\nexport const readFormMode = (value: unknown): FormMode => ((Object.values(FormMode) as string[]).includes(value as string) ? (value as FormMode) : FormMode.Create);\n\n/** Reads sections, with their fields, dropping fields without a name and repeated names; a section grid is clamped to one to three columns. */\nexport function readFormSections(value: unknown): FormSection[] {\n const names = new Set<string>();\n return records(value).flatMap((section, index) => {\n const columns = typeof section.columns === 'number' ? Math.min(3, Math.max(1, Math.floor(section.columns))) : 1;\n const fields = records(section.fields).flatMap((entry): FormField[] => {\n if (typeof entry.name !== 'string' || entry.name.length === 0 || names.has(entry.name)) return [];\n names.add(entry.name);\n return [{\n name: entry.name,\n label: typeof entry.label === 'string' && entry.label.length > 0 ? entry.label : entry.name,\n type: (Object.values(FormFieldType) as string[]).includes(entry.type as string) ? (entry.type as FormFieldType) : FormFieldType.Text,\n required: entry.required === true,\n options: Array.isArray(entry.options) ? entry.options.filter((option): option is string => typeof option === 'string') : [],\n span: typeof entry.span === 'number' ? Math.min(columns, Math.max(1, Math.floor(entry.span))) : 1,\n ...(typeof entry.placeholder === 'string' ? { placeholder: entry.placeholder } : {}),\n ...(typeof entry.help === 'string' ? { help: entry.help } : {}),\n }];\n });\n return [{ id: typeof section.id === 'string' && section.id.length > 0 ? section.id : `section-${index}`, title: typeof section.title === 'string' ? section.title : '', columns, fields }];\n });\n}\n\n/** Whether a field holds a value: an empty or blank text, an empty list, a toggle left false (a required toggle must be on) or an address with no street and city are empty. */\nexport function isFilled(field: FormField, value: unknown): boolean {\n switch (field.type) {\n case FormFieldType.Toggle: return value === true;\n case FormFieldType.MultiSelect: return Array.isArray(value) && value.length > 0;\n case FormFieldType.File: return Array.isArray(value) ? value.length > 0 : typeof value === 'string' && value.trim().length > 0;\n case FormFieldType.Address: return typeof value === 'object' && value !== null && ['street', 'city'].every(line => typeof (value as Record<string, unknown>)[line] === 'string' && ((value as Record<string, unknown>)[line] as string).trim().length > 0);\n case FormFieldType.Number: case FormFieldType.Currency: return typeof value === 'number' ? Number.isFinite(value) : typeof value === 'string' && value.trim().length > 0 && Number.isFinite(Number(value));\n default: return typeof value === 'string' ? value.trim().length > 0 : value !== undefined && value !== null && value !== '';\n }\n}\n\n/** Why a field is invalid, as a kind the component words in the locale: `required`, `invalid`, or undefined when it is fine. An empty optional field is fine. */\nexport function problemOf(field: FormField, value: unknown): 'required' | 'invalid' | undefined {\n if (!isFilled(field, value)) {\n const empty = value === undefined || value === null || value === '' || (typeof value === 'string' && value.trim() === '') || (Array.isArray(value) && value.length === 0) || value === false;\n return field.required ? 'required' : empty ? undefined : 'invalid';\n }\n\n if (field.type === FormFieldType.Date && typeof value === 'string' && Number.isNaN(new Date(value).getTime())) return 'invalid';\n if ((field.type === FormFieldType.Select || field.type === FormFieldType.Lookup) && field.options.length > 0 && typeof value === 'string' && !field.options.includes(value)) return 'invalid';\n return undefined;\n}\n\n/** The problems of every field, by field name, for the fields in the given sections. */\nexport function validate(sections: FormSection[], values: FormValues): Record<string, 'required' | 'invalid'> {\n const problems: Record<string, 'required' | 'invalid'> = {};\n for (const field of sections.flatMap(section => section.fields)) {\n const problem = problemOf(field, values[field.name]);\n if (problem) problems[field.name] = problem;\n }\n\n return problems;\n}\n\n/** Whether two sets of values are the same, field by field and in depth, so the unsaved-changes guard compares what the person sees. */\nexport function sameValues(left: FormValues, right: FormValues): boolean {\n const keys = new Set([...Object.keys(left), ...Object.keys(right)]);\n return [...keys].every(key => JSON.stringify(normalizeValue(left[key])) === JSON.stringify(normalizeValue(right[key])));\n}\n\nfunction normalizeValue(value: unknown): unknown {\n if (value === undefined || value === null || value === '' || value === false) return null;\n if (Array.isArray(value)) return value.length === 0 ? null : value;\n if (typeof value === 'object') { const entries = Object.entries(value as Record<string, unknown>).filter(([, line]) => line !== '' && line !== undefined).sort(([a], [b]) => a.localeCompare(b)); return entries.length === 0 ? null : entries; }\n return value;\n}\n\n/** Maps a server's field errors (`{ field: message }` or `[{ field, message }]`) onto the fields of the form; an error for a field the form does not have is returned as a general one so it is never lost. */\nexport function mapServerErrors(sections: FormSection[], errors: unknown): { byField: Record<string, string>; general: string[] } {\n const known = new Set(sections.flatMap(section => section.fields.map(field => field.name)));\n const pairs: [string, string][] = Array.isArray(errors)\n ? records(errors).flatMap(entry => (typeof entry.message === 'string' ? [[typeof entry.field === 'string' ? entry.field : '', entry.message] as [string, string]] : []))\n : typeof errors === 'object' && errors !== null ? Object.entries(errors as Record<string, unknown>).flatMap(([field, message]) => (typeof message === 'string' ? [[field, message] as [string, string]] : [])) : [];\n\n const byField: Record<string, string> = {};\n const general: string[] = [];\n for (const [field, message] of pairs) {\n if (known.has(field) && byField[field] === undefined) byField[field] = message;\n else general.push(field && !known.has(field) ? `${field}: ${message}` : message);\n }\n\n return { byField, general };\n}\n"],"names":["FormFieldType","FormMode","addressLines","records","value","Array","isArray","filter","entry","readFormMode","Object","values","includes","readFormSections","names","Set","flatMap","section","index","columns","Math","min","max","floor","fields","name","length","has","add","label","type","required","options","option","span","placeholder","help","id","title","isFilled","field","trim","every","line","Number","isFinite","undefined","problemOf","empty","isNaN","Date","getTime","validate","sections","problems","problem","sameValues","left","right","keys","key","JSON","stringify","normalizeValue","entries","sort","a","b","localeCompare","mapServerErrors","errors","known","map","pairs","message","byField","general","push"],"mappings":"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"}
|
|
@@ -129,6 +129,28 @@ var ComponentName = require('../ComponentName.js');
|
|
|
129
129
|
'rail',
|
|
130
130
|
'tabs'
|
|
131
131
|
]),
|
|
132
|
+
[ComponentName.ComponentName.DialogFrame]: scene_react.componentMetadata('Dialog frame', scene_model.ComponentCategory.Feedback, 'panel-top', [
|
|
133
|
+
'dialog',
|
|
134
|
+
'modal',
|
|
135
|
+
'sheet',
|
|
136
|
+
'drawer',
|
|
137
|
+
'confirm',
|
|
138
|
+
'header'
|
|
139
|
+
]),
|
|
140
|
+
[ComponentName.ComponentName.ActionButton]: scene_react.componentMetadata('Action button', scene_model.ComponentCategory.Actions, 'mouse-pointer-click', [
|
|
141
|
+
'button',
|
|
142
|
+
'action',
|
|
143
|
+
'submit',
|
|
144
|
+
'cancel',
|
|
145
|
+
'confirm'
|
|
146
|
+
]),
|
|
147
|
+
[ComponentName.ComponentName.Notice]: scene_react.componentMetadata('Notice', scene_model.ComponentCategory.Feedback, 'circle-alert', [
|
|
148
|
+
'message',
|
|
149
|
+
'error',
|
|
150
|
+
'alert',
|
|
151
|
+
'banner',
|
|
152
|
+
'warning'
|
|
153
|
+
]),
|
|
132
154
|
[ComponentName.ComponentName.BulkBar]: scene_react.componentMetadata('Bulk bar', scene_model.ComponentCategory.Actions, 'check-check', [
|
|
133
155
|
'selection',
|
|
134
156
|
'bulk',
|
|
@@ -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 [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 [ComponentName.DataList]: m('Data list', ComponentCategory.DataDisplay, 'table', ['table', 'grid', 'records', 'cards', 'collection', 'list']),\n [ComponentName.TabSet]: m('Tab set', ComponentCategory.Navigation, 'panel-top', ['tabs', 'sections', 'panels']),\n [ComponentName.SubNavigation]: m('Sub-navigation', ComponentCategory.Navigation, 'panel-left', ['module', 'sections', 'rail', 'tabs']),\n [ComponentName.BulkBar]: m('Bulk bar', ComponentCategory.Actions, 'check-check', ['selection', 'bulk', 'batch', 'actions']),\n [ComponentName.GlobalSearch]: m('Search', ComponentCategory.Input, 'search', ['search', 'find', 'query']),\n [ComponentName.NotificationsButton]: m('Notifications button', ComponentCategory.Actions, 'bell', ['bell', 'alerts', 'unread']),\n [ComponentName.KanbanBoard]: m('Kanban board', ComponentCategory.DataDisplay, 'kanban', ['board', 'kanban', 'columns', 'pipeline', 'cards']),\n [ComponentName.WizardProgress]: m('Wizard', ComponentCategory.Navigation, 'footprints', ['wizard', 'steps', 'stepper', 'multi-step']),\n [ComponentName.FormScreenBody]: m('Form', ComponentCategory.Forms, 'text-cursor-input', ['form', 'fields', 'sections', 'validation']),\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","DataList","TabSet","SubNavigation","BulkBar","GlobalSearch","NotificationsButton","KanbanBoard","WizardProgress","FormScreenBody","Forms"],"mappings":"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
|
|
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 [ComponentName.DataList]: m('Data list', ComponentCategory.DataDisplay, 'table', ['table', 'grid', 'records', 'cards', 'collection', 'list']),\n [ComponentName.TabSet]: m('Tab set', ComponentCategory.Navigation, 'panel-top', ['tabs', 'sections', 'panels']),\n [ComponentName.SubNavigation]: m('Sub-navigation', ComponentCategory.Navigation, 'panel-left', ['module', 'sections', 'rail', 'tabs']),\n [ComponentName.DialogFrame]: m('Dialog frame', ComponentCategory.Feedback, 'panel-top', ['dialog', 'modal', 'sheet', 'drawer', 'confirm', 'header']),\n [ComponentName.ActionButton]: m('Action button', ComponentCategory.Actions, 'mouse-pointer-click', ['button', 'action', 'submit', 'cancel', 'confirm']),\n [ComponentName.Notice]: m('Notice', ComponentCategory.Feedback, 'circle-alert', ['message', 'error', 'alert', 'banner', 'warning']),\n [ComponentName.BulkBar]: m('Bulk bar', ComponentCategory.Actions, 'check-check', ['selection', 'bulk', 'batch', 'actions']),\n [ComponentName.GlobalSearch]: m('Search', ComponentCategory.Input, 'search', ['search', 'find', 'query']),\n [ComponentName.NotificationsButton]: m('Notifications button', ComponentCategory.Actions, 'bell', ['bell', 'alerts', 'unread']),\n [ComponentName.KanbanBoard]: m('Kanban board', ComponentCategory.DataDisplay, 'kanban', ['board', 'kanban', 'columns', 'pipeline', 'cards']),\n [ComponentName.WizardProgress]: m('Wizard', ComponentCategory.Navigation, 'footprints', ['wizard', 'steps', 'stepper', 'multi-step']),\n [ComponentName.FormScreenBody]: m('Form', ComponentCategory.Forms, 'text-cursor-input', ['form', 'fields', 'sections', 'validation']),\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","DataList","TabSet","SubNavigation","DialogFrame","ActionButton","Notice","BulkBar","GlobalSearch","NotificationsButton","KanbanBoard","WizardProgress","FormScreenBody","Forms"],"mappings":"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"}
|
|
@@ -792,6 +792,92 @@ const formats = {
|
|
|
792
792
|
...standardStateProperties.filter((property)=>property.path !== 'label')
|
|
793
793
|
]
|
|
794
794
|
},
|
|
795
|
+
{
|
|
796
|
+
component: key(ComponentName.ComponentName.DialogFrame),
|
|
797
|
+
displayName: 'Dialog frame',
|
|
798
|
+
description: 'The head of a dialog: its title, a message and the consequences it states, and a close button. It makes the dialog it opens in keep focus inside, restore it, close on Escape and be drawn centered, as a side sheet or full height.',
|
|
799
|
+
properties: [
|
|
800
|
+
text('title', 'Title', 'Content', undefined, {
|
|
801
|
+
constraints: {
|
|
802
|
+
required: true
|
|
803
|
+
}
|
|
804
|
+
}),
|
|
805
|
+
text('subtitle', 'Subtitle', 'Content'),
|
|
806
|
+
text('message', 'Message', 'Content', 'What the dialog asks or says.'),
|
|
807
|
+
{
|
|
808
|
+
path: 'consequences',
|
|
809
|
+
label: 'Consequences',
|
|
810
|
+
group: 'Content',
|
|
811
|
+
valueType: scene_model.PropertyValueType.Json,
|
|
812
|
+
editorKind: scene_model.PropertyEditorKind.StringList,
|
|
813
|
+
default: [],
|
|
814
|
+
description: 'What will happen if the person goes ahead, one line each.'
|
|
815
|
+
},
|
|
816
|
+
choice('placement', 'Placement', 'Appearance', {
|
|
817
|
+
center: 'Centered',
|
|
818
|
+
side: 'Side sheet',
|
|
819
|
+
full: 'Full height'
|
|
820
|
+
}, 'center', 'Where the dialog is drawn; on a phone every dialog fills the page.'),
|
|
821
|
+
choice('tone', 'Tone', 'Appearance', {
|
|
822
|
+
default: 'Default',
|
|
823
|
+
danger: 'Destructive'
|
|
824
|
+
}, 'default', 'A destructive dialog is drawn in the danger colors.'),
|
|
825
|
+
text('locale', 'Locale', 'Content'),
|
|
826
|
+
{
|
|
827
|
+
path: 'strings',
|
|
828
|
+
label: 'Text overrides',
|
|
829
|
+
group: 'Content',
|
|
830
|
+
valueType: scene_model.PropertyValueType.Object,
|
|
831
|
+
editorKind: scene_model.PropertyEditorKind.StringMap
|
|
832
|
+
}
|
|
833
|
+
]
|
|
834
|
+
},
|
|
835
|
+
{
|
|
836
|
+
component: key(ComponentName.ComponentName.ActionButton),
|
|
837
|
+
displayName: 'Action button',
|
|
838
|
+
description: 'One action, drawn as every action of the foundation is, that is enabled, disabled with its reason, or hidden by the permission of the user.',
|
|
839
|
+
properties: [
|
|
840
|
+
text('label', 'Label', 'Content', 'What it does - a verb, never "OK".', {
|
|
841
|
+
constraints: {
|
|
842
|
+
required: true
|
|
843
|
+
}
|
|
844
|
+
}),
|
|
845
|
+
choice('emphasis', 'Emphasis', 'Appearance', {
|
|
846
|
+
primary: 'Primary',
|
|
847
|
+
secondary: 'Secondary',
|
|
848
|
+
quiet: 'Quiet',
|
|
849
|
+
danger: 'Destructive'
|
|
850
|
+
}, 'primary'),
|
|
851
|
+
rule('permission', 'Permission', 'Whether the action works, refuses with a reason or is not shown.'),
|
|
852
|
+
text('disabledReason', 'Reason when disabled', 'Permissions'),
|
|
853
|
+
text('targetScreen', 'Go to screen', 'Behavior', 'The screen it goes to when no behavior is attached.'),
|
|
854
|
+
text('locale', 'Locale', 'Content'),
|
|
855
|
+
{
|
|
856
|
+
path: 'strings',
|
|
857
|
+
label: 'Text overrides',
|
|
858
|
+
group: 'Content',
|
|
859
|
+
valueType: scene_model.PropertyValueType.Object,
|
|
860
|
+
editorKind: scene_model.PropertyEditorKind.StringMap
|
|
861
|
+
}
|
|
862
|
+
]
|
|
863
|
+
},
|
|
864
|
+
{
|
|
865
|
+
component: key(ComponentName.ComponentName.Notice),
|
|
866
|
+
displayName: 'Notice',
|
|
867
|
+
description: 'One message about the region it sits in, announced when it arrives. Empty until it has something to say.',
|
|
868
|
+
properties: [
|
|
869
|
+
text('text', 'Message', 'Data', 'Bind to the error or note to show; empty draws nothing.'),
|
|
870
|
+
text('title', 'Title', 'Content'),
|
|
871
|
+
choice('tone', 'Tone', 'Appearance', {
|
|
872
|
+
danger: 'Error',
|
|
873
|
+
warning: 'Warning',
|
|
874
|
+
info: 'Information',
|
|
875
|
+
success: 'Success',
|
|
876
|
+
neutral: 'Neutral'
|
|
877
|
+
}, 'danger'),
|
|
878
|
+
text('locale', 'Locale', 'Content')
|
|
879
|
+
]
|
|
880
|
+
},
|
|
795
881
|
{
|
|
796
882
|
component: key(ComponentName.ComponentName.BulkBar),
|
|
797
883
|
displayName: 'Bulk bar',
|
|
@@ -947,6 +1033,9 @@ const formats = {
|
|
|
947
1033
|
displayName: 'Form',
|
|
948
1034
|
description: 'Titled sections of fields in a one-to-three column grid, with inline validation, a save bar, the unsaved-changes guard and four modes.',
|
|
949
1035
|
properties: [
|
|
1036
|
+
flag('saveAndNew', 'Offer Save and new', 'Behavior', 'Whether a create form offers Save and new next to Save; a dialog that creates one record leaves it out.', {
|
|
1037
|
+
default: true
|
|
1038
|
+
}),
|
|
950
1039
|
{
|
|
951
1040
|
...list('sections', 'Sections', 'Data', 'Section', [
|
|
952
1041
|
text('id', 'Id', 'Data'),
|